Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
34c68a1
bump version to v2.4.1
SpicyMarinara Aug 2, 2026
6701a3d
fix v2.4.1 issue sweep
SpicyMarinara Aug 2, 2026
38af406
address CodeRabbit review
SpicyMarinara Aug 2, 2026
b12cf0f
Merge pull request #4447 from Pasta-Devs/agent/v2.4.1-issue-sweep
SpicyMarinara Aug 2, 2026
52023ce
fix clipped sidebar and call settings rows
SpicyMarinara Aug 2, 2026
c44c2a3
fix sidebar action overlay hit targets
SpicyMarinara Aug 2, 2026
6af7370
fix coarse pointer sidebar actions
SpicyMarinara Aug 2, 2026
af42abb
fix touch sidebar action layout
SpicyMarinara Aug 2, 2026
80a10ea
fix keyboard access to sidebar actions
SpicyMarinara Aug 2, 2026
b726914
fix sidebar action keyboard events
SpicyMarinara Aug 2, 2026
164fbc4
Merge pull request #4450 from Pasta-Devs/agent/4449-sidebar-clip-layout
SpicyMarinara Aug 2, 2026
5374008
Fix theme editor live preview lag
SpicyMarinara Aug 2, 2026
7fec2b4
Merge pull request #4453 from Pasta-Devs/agent/fix-theme-editor-previ…
SpicyMarinara Aug 2, 2026
4bb031a
fix: preserve sparse sprite expression state
SpicyMarinara Aug 2, 2026
b88e693
Merge pull request #4455 from Pasta-Devs/agent/fix-retained-group-cha…
SpicyMarinara Aug 2, 2026
6434673
fix(noodle): send image instructions to the timeline model, not the i…
Gunterlie Aug 2, 2026
7ea5d2a
Document Storyboard Agent workflows
thetopham Aug 2, 2026
c94c301
fix(noodle): drop LLM-facing framing from the image prompt blocks
Gunterlie Aug 2, 2026
2e24e90
feat(themes): expose translation text styling hook
Aug 2, 2026
e9e853a
fix: normalize workspace lockfile line endings
Promansis Aug 2, 2026
7376f73
fix(image): keep prompt labels out of the diffusion prompt
Gunterlie Aug 2, 2026
b2ed0a9
test: cover lone carriage return lockfiles
Promansis Aug 2, 2026
8c4db5b
Merge pull request #4464 from Promansis/fix/4460-windows-lockfile-val…
SpicyMarinara Aug 2, 2026
23d0e52
Merge branch 'staging' into translation-style-hook
SpicyMarinara Aug 2, 2026
305f7f6
fix(ci): stabilize required PR checks
SpicyMarinara Aug 2, 2026
1191ef8
Merge branch 'staging' into fix/noodle-image-instructions-bypass-llm
Gunterlie Aug 2, 2026
b66f248
test(noodle): cover the shared appearance block, and scope the change…
Gunterlie Aug 2, 2026
bd671a3
Merge remote-tracking branch 'origin/fix/noodle-image-instructions-by…
Gunterlie Aug 2, 2026
d38367c
fix(ci): use native owner review gate
SpicyMarinara Aug 2, 2026
0d172fa
test(ci): harden triage topology checks
SpicyMarinara Aug 2, 2026
289f898
test(ci): require trusted triage structure
SpicyMarinara Aug 2, 2026
83dd067
test(ci): validate exact exemption step
SpicyMarinara Aug 2, 2026
9ca49d2
Merge pull request #4468 from Pasta-Devs/agent/stabilize-required-pr-…
SpicyMarinara Aug 2, 2026
71022ff
Merge branch 'staging' into translation-style-hook
SpicyMarinara Aug 2, 2026
2f81ab4
Merge pull request #4466 from minikkeuen/translation-style-hook
SpicyMarinara Aug 2, 2026
d521992
Merge branch 'staging' into fix/noodle-image-instructions-bypass-llm
Gunterlie Aug 2, 2026
81ad769
Merge branch 'staging' into agent/storyboard-agent-guide
thetopham Aug 2, 2026
453d201
Merge pull request #4457 from Pasta-Devs/fix/noodle-image-instruction…
Gunterlie Aug 2, 2026
9d6d55a
Merge branch 'staging' into agent/storyboard-agent-guide
thetopham Aug 2, 2026
5bc5825
fix(noodle): hide uninvited profiles from search
Gunterlie Aug 2, 2026
ffe7f4a
Merge pull request #4463 from thetopham/agent/storyboard-agent-guide
thetopham Aug 2, 2026
7d870cf
Offer Hindi as a documentation language and fix the Language dropdown…
kolacheee Aug 2, 2026
d941305
Reference #4471 in the changelog entries
kolacheee Aug 2, 2026
20dee9e
Merge branch 'staging' into agent/docs-language-hi
kolacheee Aug 2, 2026
fdb3741
Remove the duplicate Fixed heading introduced by the branch update
kolacheee Aug 2, 2026
ae6ff6b
fix(noodle): recompute account search when invites change
Gunterlie Aug 2, 2026
a2fd2b5
Merge branch 'staging' into fix/noodle-search-profile-access
Gunterlie Aug 2, 2026
6ceedd3
Merge pull request #4471 from Pasta-Devs/agent/docs-language-hi
kolacheee Aug 2, 2026
5fc0fef
fix(ci): restore member approval status
SpicyMarinara Aug 2, 2026
691bd05
fix(storyboard): contain settings on narrow screens
thetopham Aug 2, 2026
de82f2a
Merge branch 'staging' into fix/noodle-search-profile-access
Gunterlie Aug 2, 2026
fffc53e
Merge pull request #4472 from Pasta-Devs/fix/noodle-search-profile-ac…
Gunterlie Aug 2, 2026
c1a4b41
fix(ui): raise roleplay context overlays
SpicyMarinara Aug 2, 2026
c02b056
Merge branch 'staging' into fix/4476-roleplay-overlay-depth
SpicyMarinara Aug 2, 2026
28c17ea
fix(storyboard): group settings by chat scope
thetopham Aug 2, 2026
acde959
Merge remote-tracking branch 'origin/staging' into fix/storyboard-set…
thetopham Aug 2, 2026
6923c0b
fix(ci): harden approval review refresh
SpicyMarinara Aug 2, 2026
206afa7
Merge remote-tracking branch 'origin/staging' into agent/restore-memb…
SpicyMarinara Aug 2, 2026
6843bd0
test(ui): prove roleplay overlays escape toolbar
SpicyMarinara Aug 2, 2026
ec44413
Merge remote-tracking branch 'origin/fix/4476-roleplay-overlay-depth'…
SpicyMarinara Aug 2, 2026
5a9fe01
Merge pull request #4474 from Pasta-Devs/agent/restore-member-approva…
SpicyMarinara Aug 2, 2026
88e23a2
Merge remote-tracking branch 'origin/staging' into fix/4476-roleplay-…
SpicyMarinara Aug 2, 2026
a4b1d93
fix(ui): refine active context anchoring
SpicyMarinara Aug 2, 2026
e3c7592
Merge pull request #4477 from Pasta-Devs/fix/4476-roleplay-overlay-depth
SpicyMarinara Aug 2, 2026
e606c57
fix(storyboard): address review feedback
thetopham Aug 2, 2026
7db6c36
Merge branch 'staging' into fix/storyboard-settings-layout
thetopham Aug 2, 2026
32222f5
Merge pull request #4475 from thetopham/fix/storyboard-settings-layout
thetopham Aug 2, 2026
19d9003
chore: start assigned issues sweep
SpicyMarinara Aug 2, 2026
a6a0c6d
fix: resolve assigned roleplay and import issues
SpicyMarinara Aug 2, 2026
e0f92a0
fix: address CodeRabbit review feedback
SpicyMarinara Aug 2, 2026
2795dfa
Merge remote-tracking branch 'origin/staging' into agent/fix-assigned…
SpicyMarinara Aug 2, 2026
c1b4515
Merge pull request #4484 from Pasta-Devs/agent/fix-assigned-issues-sweep
SpicyMarinara Aug 2, 2026
c029fb6
Add right-to-left rendering support to the docs viewer
kolacheee Aug 2, 2026
8277c71
Reference #4489 in the changelog entry
kolacheee Aug 2, 2026
52a7b53
Merge branch 'staging' into agent/docs-rtl-viewer
kolacheee Aug 2, 2026
96004f2
fix(maps): refresh host lorebooks after imports
thetopham Aug 2, 2026
f9ea2ae
style(client): order world map cache imports
thetopham Aug 3, 2026
284ff0c
Merge pull request #4491 from Pasta-Devs/agent/4490-world-map-lore-re…
thetopham Aug 3, 2026
f51b669
chore: start open issue sweep
SpicyMarinara Aug 3, 2026
0234e08
fix: address assigned issue sweep
SpicyMarinara Aug 3, 2026
debd71f
docs: clarify privileged Docker sandbox runtime
SpicyMarinara Aug 3, 2026
c2fd7a9
fix: address review feedback
SpicyMarinara Aug 3, 2026
c3a4d09
test: cover character reference cap
SpicyMarinara Aug 3, 2026
0fbc166
fix: serialize summary prompt saves
SpicyMarinara Aug 3, 2026
58d86d6
Merge pull request #4493 from Pasta-Devs/agent/fix-open-issues-4492
SpicyMarinara Aug 3, 2026
d3bcdb9
chore: start issue 4495
thetopham Aug 3, 2026
60f7eca
fix: canonicalize Game Mode party aliases
thetopham Aug 3, 2026
c27bd3f
fix: normalize persisted Game speaker labels
thetopham Aug 3, 2026
a89b71f
Merge pull request #4496 from Pasta-Devs/agent/4495-game-name-canonic…
thetopham Aug 3, 2026
f2a621d
chore: start open issue sweep
SpicyMarinara Aug 3, 2026
cae80d0
fix: address remaining assigned issues
SpicyMarinara Aug 3, 2026
1776531
fix: address review feedback
SpicyMarinara Aug 3, 2026
7f30081
fix: close incremental review gaps
SpicyMarinara Aug 3, 2026
e5a13f8
fix: harden prompt and continuation handling
SpicyMarinara Aug 3, 2026
cbeaded
test: strengthen summary prompt save contract
SpicyMarinara Aug 3, 2026
80093d2
Merge pull request #4500 from Pasta-Devs/agent/fix-open-issues-4497-4499
SpicyMarinara Aug 3, 2026
a5bc629
chore: start grouped conversation and ID marker work
SpicyMarinara Aug 3, 2026
0885af1
Merge branch 'staging' into agent/docs-rtl-viewer
kolacheee Aug 3, 2026
6496ff1
fix: preserve grouped speakers and place ID macro cards
SpicyMarinara Aug 3, 2026
e5a3c75
fix: address ID marker review edge cases
SpicyMarinara Aug 3, 2026
6a6fccb
Merge pull request #4507 from Pasta-Devs/fix/4504-id-macro-cards-marker
SpicyMarinara Aug 3, 2026
464518d
Merge branch 'staging' into agent/docs-rtl-viewer
kolacheee Aug 3, 2026
e0d5ae1
Merge pull request #4489 from Pasta-Devs/agent/docs-rtl-viewer
kolacheee Aug 3, 2026
8d95131
chore: start Professor Mari UI sweep
SpicyMarinara Aug 3, 2026
d9d3af4
fix(generation): centralize connection admission and provider fallback
Gunterlie Aug 3, 2026
ddb9c4d
feat(noodler): Slice 8f access model, creator replies, reserve, and g…
Gunterlie Aug 3, 2026
895feb2
fix: improve Professor Mari and extension UI
SpicyMarinara Aug 3, 2026
e875480
fix: address Professor Mari review feedback
SpicyMarinara Aug 3, 2026
503940e
test: ensure Professor Mari fixtures are cleaned
SpicyMarinara Aug 3, 2026
01233a7
Merge pull request #4513 from Pasta-Devs/agent/professor-mari-ui-sweep
SpicyMarinara Aug 3, 2026
7f4bb3d
fix(generation): wire background admission and share one attempt acro…
Gunterlie Aug 3, 2026
1357665
chore: start avatar issue fixes
SpicyMarinara Aug 3, 2026
b63cf27
Merge branch 'staging' into fix/connection-admission
Gunterlie Aug 3, 2026
dd1443a
fix(noodle): let connection admission failures defer automatic image …
Gunterlie Aug 3, 2026
1b6ddb3
Merge remote-tracking branch 'origin/fix/connection-admission' into f…
Gunterlie Aug 3, 2026
7a2d104
fix: stabilize roleplay image references and avatars
SpicyMarinara Aug 3, 2026
2207d52
feat(gallery): portable card://self/gallery references for chat images
kolacheee Aug 3, 2026
5d35faf
fix(generation): settle a fallback chain on the chain's own outcome
Gunterlie Aug 3, 2026
03bbf7c
fix: address review feedback
SpicyMarinara Aug 3, 2026
4d8fcb6
fix(generation): settle a fallback chain completed once usable output…
Gunterlie Aug 3, 2026
269aa7d
Merge pull request #4514 from Pasta-Devs/fix/connection-admission
Gunterlie Aug 3, 2026
60c358a
Merge branch 'staging' into agent/avatar-reference-and-narrator-controls
SpicyMarinara Aug 3, 2026
6011227
fix(gallery): address multi-agent review of portable references
kolacheee Aug 3, 2026
92f0cc0
Merge remote-tracking branch 'origin/staging' into feat/noodler-slice-8f
Gunterlie Aug 3, 2026
1fe28fc
fix: harden review edge cases
SpicyMarinara Aug 3, 2026
3e8e235
fix: synchronize narrator cycle reset
SpicyMarinara Aug 3, 2026
0c74e73
Merge pull request #4519 from Pasta-Devs/agent/avatar-reference-and-n…
SpicyMarinara Aug 3, 2026
9567c2c
fix(noodler): address CodeRabbit review findings on Slice 8f
Gunterlie Aug 3, 2026
cd22b20
feat(gallery): resolve card://self from any chat character's gallery …
kolacheee Aug 3, 2026
54c1a29
perf(noodler): derive the public identity from the linked account alr…
Gunterlie Aug 3, 2026
8070b4d
docs(gallery): system messages show self refs as literal text, not br…
kolacheee Aug 3, 2026
b365d8f
docs(gallery): remove em dashes from the new prose
kolacheee Aug 3, 2026
efc6e5b
fix(noodler): contain auto-posting failures in the bulk uniqueness-ra…
Gunterlie Aug 3, 2026
0121141
Merge branch 'staging' into feat/card-self-gallery
kolacheee Aug 3, 2026
f4f62b8
fix(gallery): no cross-character fallback while the speaker's gallery…
kolacheee Aug 3, 2026
ce90b08
Merge pull request #4522 from kolacheee/feat/card-self-gallery
kolacheee Aug 3, 2026
2c04eba
fix(noodler): address Slice 8f review findings on access, reserve, an…
Gunterlie Aug 3, 2026
25dd04f
Add per-character sprite layouts and polish roleplay overlays
SpicyMarinara Aug 3, 2026
b8478bd
Add olud.ai project badge
SpicyMarinara Aug 3, 2026
e6cf19a
Split oversized chat settings components
SpicyMarinara Aug 3, 2026
3cb7fe6
Address sprite layout review feedback
SpicyMarinara Aug 3, 2026
a986675
Merge pull request #4529 from Pasta-Devs/agent/per-character-sprite-l…
SpicyMarinara Aug 3, 2026
a919734
fix(noodler): close the remaining Slice 8f review gaps
Gunterlie Aug 3, 2026
f7e0ed6
Merge remote-tracking branch 'origin/staging' into feat/noodler-slice-8f
Gunterlie Aug 3, 2026
73222fc
Fix Quick Replies overlay and delete styling
SpicyMarinara Aug 3, 2026
fc5ebb7
fix(noodler): address CodeRabbit review on Slice 8f
Gunterlie Aug 3, 2026
9f2da30
refactor(noodle): consolidate add creators flow into shared settings
Gunterlie Aug 3, 2026
1b3a413
fix(client): address quick reply menu review
SpicyMarinara Aug 3, 2026
de209a5
Merge pull request #4531 from Pasta-Devs/fix/quick-replies-overlay
SpicyMarinara Aug 3, 2026
6517ef9
refactor(noodle): unify creator addition with onboarding flow
Gunterlie Aug 3, 2026
4f4cec5
refactor(noodle): redesign creator profile UI with R badges
Gunterlie Aug 3, 2026
09319e0
Extract NoodleR marks to shared constants
Gunterlie Aug 3, 2026
dfaf2da
Merge branch 'staging' into feat/noodler-slice-8f
Gunterlie Aug 3, 2026
96d8014
Merge pull request #4515 from Pasta-Devs/feat/noodler-slice-8f
SpicyMarinara Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,517 changes: 1,517 additions & 0 deletions .github/plans/noodl-split/noodler-access-and-onboarding.md

Large diffs are not rendered by default.

867 changes: 572 additions & 295 deletions .github/plans/noodl-split/noodler-pr-split-living-plan.md

Large diffs are not rendered by default.

15 changes: 15 additions & 0 deletions .github/workflows/owner-approval-review-signal.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
name: Owner Approval Review Signal

on:
pull_request_review:
types: [submitted, edited, dismissed]

permissions: {}

jobs:
signal:
name: Signal trusted owner approval refresh
runs-on: ubuntu-latest
steps:
- name: Record review event
run: echo "A trusted workflow will re-evaluate the staging owner-approval status."
73 changes: 73 additions & 0 deletions .github/workflows/owner-approval-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: Owner Approval Review Evaluator

on:
workflow_run:
workflows: [Owner Approval Review Signal]
types: [completed]

concurrency:
group: owner-approval-review-${{ github.event.workflow_run.pull_requests[0].number || github.event.workflow_run.head_sha }}
cancel-in-progress: true

jobs:
evaluate:
name: Re-evaluate staging owner approval
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
pull-requests: read
statuses: write
steps:
- name: Resolve pull request
id: pull-request
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
with:
script: |
let pullRequests = context.payload.workflow_run.pull_requests || [];
if (pullRequests.length === 0) {
const response = await github.request(
'GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls',
{
owner: context.repo.owner,
repo: context.repo.repo,
commit_sha: context.payload.workflow_run.head_sha,
},
);
pullRequests = response.data;
}

const pullNumbers = [...new Set(pullRequests.map((pullRequest) => pullRequest.number))];
if (pullNumbers.length === 0) {
core.notice('The review signal is not associated with a pull request.');
return;
}
if (pullNumbers.length !== 1) {
core.setFailed('The review signal is associated with more than one pull request.');
return;
}

core.setOutput('number', String(pullNumbers[0]));

- name: Checkout trusted default branch
if: steps.pull-request.outputs.number != ''
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.repository.default_branch }}
persist-credentials: false

- name: Set up Node.js
if: steps.pull-request.outputs.number != ''
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24

- name: Publish owner approval status
if: steps.pull-request.outputs.number != ''
env:
GITHUB_TOKEN: ${{ github.token }}
MEMBERS_TOKEN_CONFIGURED: ${{ secrets.PASTA_DEVS_MEMBERS_TOKEN != '' }}
PASTA_DEVS_MEMBERS_TOKEN: ${{ secrets.PASTA_DEVS_MEMBERS_TOKEN }}
PR_NUMBER: ${{ steps.pull-request.outputs.number }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: node scripts/evaluate-owner-approval.mjs
6 changes: 6 additions & 0 deletions .github/workflows/pull-request-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ jobs:
- name: Run project checks
run: pnpm check

- name: Validate pull request gate topology
run: node scripts/validate-pr-triage.mjs

- name: Test owner approval evaluator
run: node scripts/test-owner-approval.mjs

- name: Check version drift
run: pnpm version:check

Expand Down
134 changes: 31 additions & 103 deletions .github/workflows/pull-request-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ on:
pull_request_target:
types: [opened, reopened, edited, synchronize, ready_for_review]
branches: [staging, main]
pull_request_review:
types: [submitted, dismissed]

concurrency:
group: pull-request-triage-${{ github.event.pull_request.number }}
Expand All @@ -14,9 +12,6 @@ concurrency:
jobs:
branch-policy:
name: Branch policy check
if: >-
github.event_name == 'pull_request_target' &&
(github.event.action != 'edited' || contains(toJSON(github.event.changes), '"base"'))
runs-on: ubuntu-latest
permissions: {}
steps:
Expand Down Expand Up @@ -49,107 +44,34 @@ jobs:
echo "::error::Contributions must target staging. Main accepts only SpicyMarinara's same-repository staging promotion or hotfix/* PR."
exit 1

external-contributor-approval:
name: "${{ github.event.pull_request.base.ref == 'staging' && ((github.event_name == 'pull_request_target' && (github.event.action != 'edited' || contains(toJSON(github.event.changes), '\"base\"'))) || (github.event_name == 'pull_request_review' && github.event.review.user.login == 'SpicyMarinara' && (github.event.action == 'dismissed' || github.event.review.state == 'approved' || github.event.review.state == 'changes_requested' || github.event.review.state == 'commented'))) && 'Owner approval for outside contributors' || 'Ignore unrelated triage event' }}"
owner-approval:
name: Evaluate staging owner approval
if: github.event.pull_request.base.ref == 'staging'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
env:
APPROVAL_EVENT_RELEVANT: "${{ github.event.pull_request.base.ref == 'staging' && ((github.event_name == 'pull_request_target' && (github.event.action != 'edited' || contains(toJSON(github.event.changes), '\"base\"'))) || (github.event_name == 'pull_request_review' && github.event.review.user.login == 'SpicyMarinara' && (github.event.action == 'dismissed' || github.event.review.state == 'approved' || github.event.review.state == 'changes_requested' || github.event.review.state == 'commented'))) }}"
statuses: write
steps:
- name: Ignore unrelated triage event
if: env.APPROVAL_EVENT_RELEVANT != 'true'
run: exit 0

- name: Classify pull request author
if: env.APPROVAL_EVENT_RELEVANT == 'true'
id: internal-author
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
env:
MEMBERS_TOKEN_CONFIGURED: ${{ secrets.PASTA_DEVS_MEMBERS_TOKEN != '' }}
- name: Checkout trusted base revision
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
# Fine-grained PAT or GitHub App token with Pasta-Devs "Members: read".
github-token: ${{ secrets.PASTA_DEVS_MEMBERS_TOKEN || github.token }}
script: |
const organization = context.repo.owner;
const ownerLogin = 'SpicyMarinara';
const authorLogin = context.payload.pull_request.user.login;

if (authorLogin.toLowerCase() === ownerLogin.toLowerCase()) {
core.notice(`${authorLogin} is the repository owner; owner approval is not required.`);
core.setOutput('internal', 'true');
return;
}
ref: ${{ github.event.pull_request.base.sha }}
persist-credentials: false

if (process.env.MEMBERS_TOKEN_CONFIGURED !== 'true') {
core.setFailed('PASTA_DEVS_MEMBERS_TOKEN is required to verify Pasta-Devs organization membership.');
return;
}

async function getOrganizationMembership(username) {
return github.request('GET /orgs/{org}/memberships/{username}', {
org: organization,
username,
});
}

let organizationMembership;
try {
({ data: organizationMembership } = await getOrganizationMembership(authorLogin));
} catch (error) {
if (error.status === 404) {
core.notice(`${authorLogin} is not a ${organization} organization member; owner approval is required.`);
core.setOutput('internal', 'false');
return;
}
core.setFailed(`Could not verify ${authorLogin}'s ${organization} membership (${error.status ?? 'unknown status'}).`);
return;
}

if (organizationMembership.state !== 'active') {
core.notice(`${authorLogin}'s ${organization} membership is not active; owner approval is required.`);
core.setOutput('internal', 'false');
return;
}

if (organizationMembership.role === 'admin' || organizationMembership.role === 'member') {
core.notice(`${authorLogin} is an active ${organization} ${organizationMembership.role}; owner approval is not required.`);
core.setOutput('internal', 'true');
return;
}

core.notice(`${authorLogin} does not have a trusted ${organization} organization role; owner approval is required.`);
core.setOutput('internal', 'false');

- name: Require owner approval for outside staging contributions
if: env.APPROVAL_EVENT_RELEVANT == 'true' && steps.internal-author.outputs.internal != 'true'
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
script: |
const pullNumber = context.payload.pull_request.number;
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pullNumber,
});

const reviews = await github.paginate(github.rest.pulls.listReviews, {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pullNumber,
per_page: 100,
});
const ownerReviews = reviews
.filter((review) => review.user?.login?.toLowerCase() === 'spicymarinara')
.sort((left, right) => left.id - right.id);
const latestOwnerReview = ownerReviews.at(-1);

if (latestOwnerReview?.state === 'APPROVED' && latestOwnerReview.commit_id === pr.head?.sha) {
core.notice('Outside contribution approved by SpicyMarinara.');
return;
}
node-version: 24

core.setFailed('Outside and first-time contributions to staging require an approving review from SpicyMarinara.');
- name: Publish owner approval status
env:
GITHUB_TOKEN: ${{ github.token }}
MEMBERS_TOKEN_CONFIGURED: ${{ secrets.PASTA_DEVS_MEMBERS_TOKEN != '' }}
PASTA_DEVS_MEMBERS_TOKEN: ${{ secrets.PASTA_DEVS_MEMBERS_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: node scripts/evaluate-owner-approval.mjs

label:
name: Auto-label
Expand Down Expand Up @@ -214,16 +136,22 @@ jobs:
template-check:
name: Pull Request template check
runs-on: ubuntu-latest
if: >-
github.event_name == 'pull_request_target' &&
github.event.pull_request.author_association != 'MEMBER' &&
github.event.pull_request.author_association != 'OWNER' &&
github.event.pull_request.author_association != 'COLLABORATOR'
permissions:
contents: read
pull-requests: read
steps:
- name: Exempt trusted contributor
if: >-
github.event.pull_request.author_association == 'MEMBER' ||
github.event.pull_request.author_association == 'OWNER' ||
github.event.pull_request.author_association == 'COLLABORATOR'
run: echo "Trusted contributor; pull request template validation is not required."

- name: Check Pull Request body against template
if: >-
github.event.pull_request.author_association != 'MEMBER' &&
github.event.pull_request.author_association != 'OWNER' &&
github.event.pull_request.author_association != 'COLLABORATOR'
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
Expand Down
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,41 @@ This file is the release-notes source of truth for Marinara Engine. Reuse these

## [Unreleased]

### Added

- Added portable character-gallery image references: `card://self/gallery/<filename>` in a greeting or message resolves to whichever character is speaking, so gallery images embedded in a card keep working after export and import (character ids are regenerated on import, which broke id-based links). The character gallery gains a **Copy image reference** button that produces the portable form, editor field previews resolve it for the edited character, group-chat replies resolve `self` per speaker segment, and the native-export importer now preserves gallery filenames (sanitized, collision-safe) instead of renaming every image, which is the fix that makes the references survive the round trip. Documented in the Character Galleries and Sending & Streaming guides.
- Added the **Hindi** documentation language pack, covering all 124 in-app guides (developer docs included) in natural Hindi, with English UI control names preserved for following instructions against the interface and Hindi sidebar category labels in the docs viewer. Select it under **Settings → General → Documentation Language** via **Download & Replace** (#4471).
- Taught the docs viewer to render right-to-left documentation, ahead of the planned Arabic pack: each guide follows its served language's reading direction (untranslated English fallbacks stay left-to-right), code spans and fences keep their left-to-right order inside RTL prose, and lists/tables/panels use direction-aware styling. Three deliberate refinements are visible today: search highlights lose their slight inset so they can no longer sever cursive letter joining, sidebars whose category headers use non-Latin scripts (Japanese, Korean, Chinese, Hindi) drop the small-caps letter-spacing that misfit them, and the "Last updated" dates now follow the app's language instead of the browser's. Everything else renders identically for existing packs (#4489).

### Fixed

- Preserved full JannyAI definition fields by falling back to recovered page data when the original PNG is blocked, and stopped incomplete search metadata from masquerading as a complete character import (#4497).
- Matched PocketTTS's official `localhost:8000` multipart `/tts` API and built-in voice catalog while retaining automatic compatibility with existing OpenAI-style PocketTTS wrapper URLs (#4499).
- Let custom post-processing agents evaluate activation keywords against the completed assistant response, so Scan Depth 1 now sees the message the agent is meant to process (#4498).
- Refined Roleplay Chat Summary controls with a centered Backfill action, a Chat Summary/Combine prompt switcher, and one Edit path that keeps the active prompt visible above template editing (#4501).
- Sorted the **Settings → General → Language** dropdown by language code with English pinned first, matching the Documentation Language selector. The previous native-label sort used a different collation per entry, which scrambled the order across scripts (#4471).
- Sent Noodle image instructions to the timeline model, and stopped the default Noodle Post Image template from appending them to the image-generation prompt, so directions like "mention build, clothing, pose, lighting" now shape the generated image description instead of reaching ComfyUI as literal prompt text. Custom templates that still reference `{{userInstructions}}` continue to append it verbatim. Raw style tokens belong in an image style profile, which applies to every Noodle image.
- Stripped label text and language-model framing from the character personality and image-habit blocks in the Noodle image prompt, so the image model receives the descriptive values instead of sentences written for an LLM.
- Dropped the `Character appearance notes:` header from the shared illustrator appearance block, which every caller appends directly to an image prompt, so diffusion models stop receiving the label as drawable text.

## [2.4.1]

### Added

- Added optional prompt-preset targeting to regex scripts and refreshed the existing character target picker so scoped regexes follow the selected preset or characters without clipped controls (#4446).

### Changed

- Advanced the stable release identity to v2.4.1 across the Engine, PWA manifest, Windows installer, Android bootstrap APK, update checks, Home page, and release references. Android uses `versionName` `2.4.1` with `versionCode` `42` so it updates over every previously published APK.

### Fixed

- Let Characters, Personas, Lorebooks, Agents, Presets, and Connections sidebar labels use the full desktop row width beneath hover actions, and made Conversation Call clip-length rows size to their panel instead of clipping labels beside fixed-width fields (#4449).
- Removed accumulated duplicate built-in **Default** settings profiles during startup normalization while preserving one stable profile and active selection per chat mode (#4442).
- Kept `/scene` chats and standalone conversions out of Conversation branch groups so original conversations remain visible in the Conversation sidebar (#4443).
- Taught Professor Mari the supported custom `image_prompt` agent configuration, including marker activation and the image-generation capability, so she creates requested image agents instead of falsely refusing them (#4444).
- Kept Google Gemini API keys in the `x-goog-api-key` header when fetching models instead of duplicating them in the URL, preventing compatible proxies from rejecting the query token with HTTP 401 (#4448).

## [2.4.0]

### Added
Expand Down
Loading
Loading