@bongos/core 1.19.687 → 1.19.689
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +16 -16
- package/docs/copy-inventory.md +31 -31
- package/docs/copy-registry.json +36 -36
- package/docs/module-api-changelog.md +4 -0
- package/modules/hall-ui/public/settings.js +30 -10
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/bongos/cascade-dispatch.js +24 -3
- package/src/module-api.js +1 -1
- package/tests/cascade-dispatch.mjs +78 -1
- package/tests/hall_settings_world.mjs +28 -2
- package/tests/sound_player.mjs +54 -21
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.689",
|
|
6
|
+
"core_contract": "1.19.689",
|
|
7
|
+
"source_commit": "636af32c2114ecf4e8b2fe03d2146106f8123776",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-12T23:
|
|
9
|
+
"built_at": "2026-09-12T23:51:28.908Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 477,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2626,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "480885e76086019b4dc2565be23ed784e8181134410c41afc8ef25da3374d72e",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -1952,12 +1952,12 @@
|
|
|
1952
1952
|
{
|
|
1953
1953
|
"path": "docs/copy-inventory.md",
|
|
1954
1954
|
"mode": "0000644",
|
|
1955
|
-
"sha256": "
|
|
1955
|
+
"sha256": "06669e4ff16041426605f0a419c090bc1bb703cfe0ca6ee420651d0081424e29"
|
|
1956
1956
|
},
|
|
1957
1957
|
{
|
|
1958
1958
|
"path": "docs/copy-registry.json",
|
|
1959
1959
|
"mode": "0000644",
|
|
1960
|
-
"sha256": "
|
|
1960
|
+
"sha256": "aae00576adf9a4beb3658a181f0d8b0b2616f7c4c9ddf5809740fd84bd5db45c"
|
|
1961
1961
|
},
|
|
1962
1962
|
{
|
|
1963
1963
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2802,7 +2802,7 @@
|
|
|
2802
2802
|
{
|
|
2803
2803
|
"path": "docs/module-api-changelog.md",
|
|
2804
2804
|
"mode": "0000644",
|
|
2805
|
-
"sha256": "
|
|
2805
|
+
"sha256": "837ec3c7ddeb36761a1b67b765e28fa117b85f1e8e58795798024e1cd432d9c1"
|
|
2806
2806
|
},
|
|
2807
2807
|
{
|
|
2808
2808
|
"path": "docs/modules-contract.md",
|
|
@@ -5412,7 +5412,7 @@
|
|
|
5412
5412
|
{
|
|
5413
5413
|
"path": "modules/hall-ui/public/settings.js",
|
|
5414
5414
|
"mode": "0000644",
|
|
5415
|
-
"sha256": "
|
|
5415
|
+
"sha256": "f96c78c7411e60810c8f1149217d2b7c1be21c22a5fac6f4feea4881ce20c9e4"
|
|
5416
5416
|
},
|
|
5417
5417
|
{
|
|
5418
5418
|
"path": "modules/hall-ui/public/settings.states.json",
|
|
@@ -7782,12 +7782,12 @@
|
|
|
7782
7782
|
{
|
|
7783
7783
|
"path": "package-lock.json",
|
|
7784
7784
|
"mode": "0000644",
|
|
7785
|
-
"sha256": "
|
|
7785
|
+
"sha256": "973f657a0c063434dec755b53ee29e1b8348c9f1f3f7e8762d937d79aead985e"
|
|
7786
7786
|
},
|
|
7787
7787
|
{
|
|
7788
7788
|
"path": "package.json",
|
|
7789
7789
|
"mode": "0000644",
|
|
7790
|
-
"sha256": "
|
|
7790
|
+
"sha256": "defc3109442ff69bb93889c12a876641ec174585697a93f12722e31a548c4848"
|
|
7791
7791
|
},
|
|
7792
7792
|
{
|
|
7793
7793
|
"path": "public-docs/index.html",
|
|
@@ -9287,7 +9287,7 @@
|
|
|
9287
9287
|
{
|
|
9288
9288
|
"path": "src/bongos/cascade-dispatch.js",
|
|
9289
9289
|
"mode": "0000644",
|
|
9290
|
-
"sha256": "
|
|
9290
|
+
"sha256": "7290d5d15b4c8283ebb17e28b17739b9dc5de4da3e916e9491248ba8acc24619"
|
|
9291
9291
|
},
|
|
9292
9292
|
{
|
|
9293
9293
|
"path": "src/bongos/db-kernel.js",
|
|
@@ -9547,7 +9547,7 @@
|
|
|
9547
9547
|
{
|
|
9548
9548
|
"path": "src/module-api.js",
|
|
9549
9549
|
"mode": "0000644",
|
|
9550
|
-
"sha256": "
|
|
9550
|
+
"sha256": "95a7e92acae45c56f040be85ecb6a2b65a6c240290af7f383b18672da4764ec8"
|
|
9551
9551
|
},
|
|
9552
9552
|
{
|
|
9553
9553
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10072,7 +10072,7 @@
|
|
|
10072
10072
|
{
|
|
10073
10073
|
"path": "tests/cascade-dispatch.mjs",
|
|
10074
10074
|
"mode": "0000644",
|
|
10075
|
-
"sha256": "
|
|
10075
|
+
"sha256": "5a537d6c4a3bcde720b95420fb41224f5169ae578d56b8d80f55043ddaa8113e"
|
|
10076
10076
|
},
|
|
10077
10077
|
{
|
|
10078
10078
|
"path": "tests/catalog_only_client.mjs",
|
|
@@ -11177,7 +11177,7 @@
|
|
|
11177
11177
|
{
|
|
11178
11178
|
"path": "tests/hall_settings_world.mjs",
|
|
11179
11179
|
"mode": "0000644",
|
|
11180
|
-
"sha256": "
|
|
11180
|
+
"sha256": "5e2429ec47f2037d26a18b3813dd145fab1e83af232fb1a883093d6c4d563118"
|
|
11181
11181
|
},
|
|
11182
11182
|
{
|
|
11183
11183
|
"path": "tests/hall_signout.mjs",
|
|
@@ -12757,7 +12757,7 @@
|
|
|
12757
12757
|
{
|
|
12758
12758
|
"path": "tests/sound_player.mjs",
|
|
12759
12759
|
"mode": "0000644",
|
|
12760
|
-
"sha256": "
|
|
12760
|
+
"sha256": "8d65bc64902312731e6b194af5be6336bcb59882adb930299cf43cf083977ca1"
|
|
12761
12761
|
},
|
|
12762
12762
|
{
|
|
12763
12763
|
"path": "tests/sound_prefs.mjs",
|
package/docs/copy-inventory.md
CHANGED
|
@@ -225,7 +225,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
225
225
|
| `e6982a9ff948` | certain | Charter library | `modules/hall-ui/public/government.js:799` |
|
|
226
226
|
| `f8725cf3ba62` | certain | Checking dependency order… | `modules/hall-ui/public/work.js:853` |
|
|
227
227
|
| `7a41b18c0de8` | certain | Checking for conflicts… | `modules/hall-ui/public/work.js:832` |
|
|
228
|
-
| `aa3ba7d28a76` | certain | Checking your key… | `modules/hall-ui/public/settings.js:
|
|
228
|
+
| `aa3ba7d28a76` | certain | Checking your key… | `modules/hall-ui/public/settings.js:1138` |
|
|
229
229
|
| `b3d0e2af5176` | certain | Choose a goal first. | `modules/hall-ui/public/task.js:666` |
|
|
230
230
|
| `1c6b0e3ffc0e` | certain | Choose a setup | `modules/hall-ui/public/hall-render.js:779` |
|
|
231
231
|
| `6c88cdf417f1` | certain | Choose which sound plays for each build event — one when Claude waits for your input, another when a task ship | `modules/hall-ui/public/settings.html:329` |
|
|
@@ -291,7 +291,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
291
291
|
| `b9e53fbd90e6` | certain | Could not change standing: {…} | `modules/hall-ui/public/watch.js:845` |
|
|
292
292
|
| `1ef1efc15b6c` | certain | Could not change that just now. | `modules/hall-ui/public/goals-render.js:1235` |
|
|
293
293
|
| `78e18ea59b9f` | certain | Could not close: {…} | `modules/hall-ui/public/harbor.js:136` |
|
|
294
|
-
| `c3f99e7c6e6b` | certain | Could not copy automatically — select and copy manually. ({…}) | `modules/hall-ui/public/settings.js:
|
|
294
|
+
| `c3f99e7c6e6b` | certain | Could not copy automatically — select and copy manually. ({…}) | `modules/hall-ui/public/settings.js:1017` |
|
|
295
295
|
| `e3fd1febf63d` | certain | Could not copy to the clipboard. Try again. | `modules/hall-ui/public/goals-page.js:374` |
|
|
296
296
|
| `e3fd1febf63d` | certain | Could not copy to the clipboard. Try again. | `modules/hall-ui/public/work.js:614` |
|
|
297
297
|
| `487e0b39ac8f` | certain | Could not copy — select and copy by hand. | `modules/hall-ui/public/box-panel.js:413` |
|
|
@@ -313,22 +313,22 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
313
313
|
| `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:550` |
|
|
314
314
|
| `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
|
|
315
315
|
| `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1311` |
|
|
316
|
-
| `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:
|
|
316
|
+
| `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:1396` |
|
|
317
317
|
| `2a9fb4046bc4` | certain | Could not load your rank. Return to the hall and try again. | `modules/hall-ui/public/ranks.js:196` |
|
|
318
318
|
| `9d533e811dec` | certain | Could not load your sessions: {…} | `modules/hall-ui/public/settings-sessions.js:114` |
|
|
319
|
-
| `64f9d51f0fa2` | certain | Could not load your settings. | `modules/hall-ui/public/settings.js:
|
|
319
|
+
| `64f9d51f0fa2` | certain | Could not load your settings. | `modules/hall-ui/public/settings.js:1399` |
|
|
320
320
|
| `de244c45d916` | certain | Could not load {…} | `modules/hall-ui/public/task.js:703` |
|
|
321
321
|
| `2366356926b4` | certain | Could not mark the primer just now. Try again. | `modules/hall-ui/public/primer.js:260` |
|
|
322
322
|
| `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:297` |
|
|
323
323
|
| `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:640` |
|
|
324
|
-
| `8b470cebf53d` | certain | Could not remove your key. Try again. | `modules/hall-ui/public/settings.js:
|
|
325
|
-
| `4cf6bc8b377b` | certain | Could not remove. Try again. | `modules/hall-ui/public/settings.js:
|
|
324
|
+
| `8b470cebf53d` | certain | Could not remove your key. Try again. | `modules/hall-ui/public/settings.js:1218` |
|
|
325
|
+
| `4cf6bc8b377b` | certain | Could not remove. Try again. | `modules/hall-ui/public/settings.js:1217` |
|
|
326
326
|
| `7a778d188e87` | certain | Could not remove: {…} | `modules/hall-ui/public/government.js:369` |
|
|
327
327
|
| `bb5a7753e62b` | certain | Could not reset: {…} | `modules/hall-ui/public/government.js:301` |
|
|
328
328
|
| `b526ee0b8c48` | certain | Could not save just now. Try again. | `modules/hall-ui/public/builders.js:464` |
|
|
329
329
|
| `41a351aea8d4` | certain | Could not save the volume. Try again. | `modules/hall-ui/public/settings.js:221` |
|
|
330
330
|
| `5305186a4154` | certain | Could not save your choice. Try again. | `modules/hall-ui/public/settings.js:104` |
|
|
331
|
-
| `ea4fb30debd0` | certain | Could not save your key. Try again. | `modules/hall-ui/public/settings.js:
|
|
331
|
+
| `ea4fb30debd0` | certain | Could not save your key. Try again. | `modules/hall-ui/public/settings.js:1162` |
|
|
332
332
|
| `ef609f2c0cb3` | certain | Could not save your name. Try again. | `modules/hall-ui/public/settings.js:863` |
|
|
333
333
|
| `59ecd5c52f59` | certain | Could not save your preference. Try again. | `modules/hall-ui/public/builders.js:361` |
|
|
334
334
|
| `59ecd5c52f59` | certain | Could not save your preference. Try again. | `modules/hall-ui/public/settings.js:783` |
|
|
@@ -343,10 +343,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
343
343
|
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:683` |
|
|
344
344
|
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:782` |
|
|
345
345
|
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:862` |
|
|
346
|
-
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:
|
|
346
|
+
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:1161` |
|
|
347
347
|
| `31c6e3fd754b` | certain | Could not send the request just now. | `modules/hall-ui/public/goals-render.js:1250` |
|
|
348
|
-
| `1f4d9a989606` | certain | Could not set up key storage. Try again. | `modules/hall-ui/public/settings.js:
|
|
349
|
-
| `e65b392144ac` | certain | Could not set up storage. Try again. | `modules/hall-ui/public/settings.js:
|
|
348
|
+
| `1f4d9a989606` | certain | Could not set up key storage. Try again. | `modules/hall-ui/public/settings.js:1198` |
|
|
349
|
+
| `e65b392144ac` | certain | Could not set up storage. Try again. | `modules/hall-ui/public/settings.js:1197` |
|
|
350
350
|
| `d4601887a058` | certain | Could not sign out everywhere: {…} | `modules/hall-ui/public/settings-sessions.js:102` |
|
|
351
351
|
| `b1602d01f4bb` | certain | Could not unblock: {…} | `modules/hall-ui/public/harbor.js:187` |
|
|
352
352
|
| `3db890b074a7` | certain | Could not update visibility just now. | `modules/hall-ui/public/goals-render.js:1219` |
|
|
@@ -420,7 +420,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
420
420
|
| `04bbccfe7465` | certain | Everything a new builder needs before claiming their first task. About a ten-minute read. | `modules/hall-ui/public/primer.html:42` |
|
|
421
421
|
| `647513e4838a` | certain | Everything this builder has shipped. Seen one craft at a time, with goals and ideas, under | `modules/hall-ui/public/profile.html:108` |
|
|
422
422
|
| `efdb46f76b02` | certain | Everything this instance can run: what the core ships, what this project built, and who keeps each one true as | `modules/hall-ui/public/modules.html:32` |
|
|
423
|
-
| `d629e152f074` | certain | Expires {…} · refreshes on use. | `modules/hall-ui/public/settings.js:
|
|
423
|
+
| `d629e152f074` | certain | Expires {…} · refreshes on use. | `modules/hall-ui/public/settings.js:1007` |
|
|
424
424
|
| `de62f4cc7d2e` | certain | File a bug or idea | `modules/hall-ui/public/ideas.html:59` |
|
|
425
425
|
| `0f166311ff3f` | certain | File it | `modules/hall-ui/public/ideas.html:99` |
|
|
426
426
|
| `0c4632f983db` | certain | File the change | `modules/hall-ui/public/copy-desk.html:173` |
|
|
@@ -444,7 +444,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
444
444
|
| `6149e9ca69f7` | certain | Fleet summary | `modules/hall-ui/public/harbor.html:44` |
|
|
445
445
|
| `617f13fa3fdb` | certain | Flip the switch. | `modules/hall-ui/public/hall-render.js:779` |
|
|
446
446
|
| `42cee5cb3584` | certain | Fold this idea into # | `modules/hall-ui/public/task-detail.js:473` |
|
|
447
|
-
| `647bcfcfdb03` | certain | Fresh CLI token issued. Paste it in your terminal: | `modules/hall-ui/public/settings.js:
|
|
447
|
+
| `647bcfcfdb03` | certain | Fresh CLI token issued. Paste it in your terminal: | `modules/hall-ui/public/settings.js:997` |
|
|
448
448
|
| `55c71d76a94c` | certain | From creation to production — and the exact step where {{currency}} are awarded (at | `modules/hall-ui/public/diagrams.html:52` |
|
|
449
449
|
| `d32c5e058d1e` | certain | From the system | `modules/hall-ui/public/hall-render.js:658` |
|
|
450
450
|
| `fc6fdfa639a7` | certain | Full log | `modules/hall-ui/public/task.js:443` |
|
|
@@ -453,7 +453,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
453
453
|
| `c93912bbad76` | certain | Gathering the reviews and flagged copy that wait for you. | `modules/hall-ui/public/studio.html:46` |
|
|
454
454
|
| `4638e024f0af` | certain | Generated from the code on the last deploy · | `modules/hall-ui/public/atlas.js:431` |
|
|
455
455
|
| `3c1a5d27ef0b` | certain | Generated from the code on the last deploy. | `modules/hall-ui/public/atlas.js:431` |
|
|
456
|
-
| `2ae2114b61db` | certain | Get a free key ↗ | `modules/hall-ui/public/settings.js:
|
|
456
|
+
| `2ae2114b61db` | certain | Get a free key ↗ | `modules/hall-ui/public/settings.js:1041` |
|
|
457
457
|
| `4794a991de3d` | certain | Getting started | `modules/hall-ui/public/hall-widgets.js:59` |
|
|
458
458
|
| `a28b1a567f1a` | certain | GitHub username | `modules/hall-ui/public/hall-render.js:294` |
|
|
459
459
|
| `8e52f0649662` | certain | Give the category a label. | `modules/hall-ui/public/project-settings.js:189` |
|
|
@@ -508,7 +508,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
508
508
|
| `ef224c9de7c8` | certain | Ideas — {{worldName}} | `modules/hall-ui/public/ideas.html:6` |
|
|
509
509
|
| `9e9f8a44276b` | certain | Identity vouched | `modules/hall-ui/public/watch.js:373` |
|
|
510
510
|
| `7d6a7de7a69e` | certain | If the {…} has invited you, sign in with GitHub and you're in. If not, ask them for an invite — this project d | `modules/hall-ui/public/hall-render.js:286` |
|
|
511
|
-
| `b6c47d4ee42c` | certain | Image key removed. | `modules/hall-ui/public/settings.js:
|
|
511
|
+
| `b6c47d4ee42c` | certain | Image key removed. | `modules/hall-ui/public/settings.js:1214` |
|
|
512
512
|
| `783853467d52` | certain | Image-generation key | `modules/hall-ui/public/settings.html:184` |
|
|
513
513
|
| `5c2e2bcbd5fb` | certain | In Progress | `modules/hall-ui/public/work.html:95` |
|
|
514
514
|
| `75cfcdd41661` | certain | In this primer | `modules/hall-ui/public/primer.html:58` |
|
|
@@ -535,16 +535,16 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
535
535
|
| `bc779353aa0c` | certain | Karma — peer recognition and approvals, a separate counter from {…}. | `modules/hall-ui/public/profile.js:94` |
|
|
536
536
|
| `de0e1590667f` | certain | Keep all {…} {…} — they are the values the code drops in, and the change cannot land without them. | `modules/hall-ui/public/copy-desk.js:442` |
|
|
537
537
|
| `32d25ef2182d` | certain | Keep box | `modules/hall-ui/public/box-panel.js:164` |
|
|
538
|
-
| `fbe40b5818a3` | certain | Key removed. | `modules/hall-ui/public/settings.js:
|
|
539
|
-
| `93c17262bacf` | certain | Key storage is being set up by an Archon — check back shortly. {…} | `modules/hall-ui/public/settings.js:
|
|
540
|
-
| `2a3c9e501f8e` | certain | Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the | `modules/hall-ui/public/settings.js:
|
|
538
|
+
| `fbe40b5818a3` | certain | Key removed. | `modules/hall-ui/public/settings.js:1213` |
|
|
539
|
+
| `93c17262bacf` | certain | Key storage is being set up by an Archon — check back shortly. {…} | `modules/hall-ui/public/settings.js:1092` |
|
|
540
|
+
| `2a3c9e501f8e` | certain | Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the | `modules/hall-ui/public/settings.js:1088` |
|
|
541
541
|
| `7d6eaa8d4514` | certain | Kinds of work shipped | `modules/hall-ui/public/hall-render.js:1194` |
|
|
542
542
|
| `81f62e066dbf` | certain | Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed). | `modules/hall-ui/public/builders.js:595` |
|
|
543
543
|
| `35a15eb0a117` | certain | Last 30 days | `modules/hall-ui/public/hall-widgets.js:129` |
|
|
544
544
|
| `9be8b839eff8` | certain | Last 7 days | `modules/hall-ui/public/hall-widgets.js:129` |
|
|
545
545
|
| `59f0bc78a28f` | certain | Last 90 days | `modules/hall-ui/public/hall-widgets.js:130` |
|
|
546
546
|
| `13bae4dfb28e` | certain | Last claimed by | `modules/hall-ui/public/task.js:549` |
|
|
547
|
-
| `1526a7ae8c85` | certain | Latest version: v{…}. | `modules/hall-ui/public/settings.js:
|
|
547
|
+
| `1526a7ae8c85` | certain | Latest version: v{…}. | `modules/hall-ui/public/settings.js:1482` |
|
|
548
548
|
| `19ad2430937d` | certain | Learning capture | `modules/hall-ui/public/ideas.html:78` |
|
|
549
549
|
| `7c9b7a89353b` | certain | Leave goal | `modules/hall-ui/public/goals-render.js:931` |
|
|
550
550
|
| `f192ff6563f9` | certain | Leave your GitHub username and an Archon will let you in. No coding needed to start — once you're approved, si | `modules/hall-ui/public/hall-render.js:294` |
|
|
@@ -616,7 +616,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
616
616
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/builders.js:480` |
|
|
617
617
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/profile.js:144` |
|
|
618
618
|
| `479c1a45f39d` | certain | No backlog tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:1120` |
|
|
619
|
-
| `83f62fc94271` | certain | No builder account found for this sign-in. | `modules/hall-ui/public/settings.js:
|
|
619
|
+
| `83f62fc94271` | certain | No builder account found for this sign-in. | `modules/hall-ui/public/settings.js:1404` |
|
|
620
620
|
| `6d6fd2314248` | certain | No cross-project activity reported yet. | `modules/hall-ui/public/profile.js:323` |
|
|
621
621
|
| `b1ada579483c` | certain | No custom ranks yet | `modules/hall-ui/public/government.js:358` |
|
|
622
622
|
| `6e2d2e11f84a` | certain | No description. | `modules/hall-ui/public/idea.js:122` |
|
|
@@ -702,8 +702,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
702
702
|
| `5ded44da0cc5` | certain | Override requests | `modules/hall-ui/public/watch.html:143` |
|
|
703
703
|
| `15a49bf15007` | certain | Page {…} of {…} | `modules/hall-ui/public/hall-kit.js:112` |
|
|
704
704
|
| `8595b0aa76a0` | certain | Pair Claude Desktop | `modules/hall-ui/public/settings.html:242` |
|
|
705
|
-
| `cf68a394cfa5` | certain | Paste command copied. | `modules/hall-ui/public/settings.js:
|
|
706
|
-
| `a495649d1f82` | certain | Paste your key first. | `modules/hall-ui/public/settings.js:
|
|
705
|
+
| `cf68a394cfa5` | certain | Paste command copied. | `modules/hall-ui/public/settings.js:1016` |
|
|
706
|
+
| `a495649d1f82` | certain | Paste your key first. | `modules/hall-ui/public/settings.js:1137` |
|
|
707
707
|
| `542f801cc77f` | certain | Path-based estimate from declared files. Glob-aware detection with claim collisions — and lead resolution acti | `modules/hall-ui/public/goals-render.js:582` |
|
|
708
708
|
| `54fa47e421a5` | certain | Peer recognition | `modules/hall-ui/public/hall-widgets.js:168` |
|
|
709
709
|
| `47d609ece51c` | certain | Pending invitations | `modules/hall-ui/public/goals-render.js:1290` |
|
|
@@ -748,7 +748,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
748
748
|
| `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
|
|
749
749
|
| `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
|
|
750
750
|
| `e60039795803` | certain | Re-issue CLI token | `modules/hall-ui/public/settings.html:151` |
|
|
751
|
-
| `101a51902f53` | certain | Re-issue failed: {…} | `modules/hall-ui/public/settings.js:
|
|
751
|
+
| `101a51902f53` | certain | Re-issue failed: {…} | `modules/hall-ui/public/settings.js:1021` |
|
|
752
752
|
| `fae2f90927bd` | certain | Read an idea, then decide. An objection needs a reason and the section it faults. | `modules/hall-ui/public/board-room.html:51` |
|
|
753
753
|
| `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/drachmae.js:148` |
|
|
754
754
|
| `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/watch.js:1126` |
|
|
@@ -777,7 +777,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
777
777
|
| `c49f9b9f8864` | certain | Remake or tweak | `modules/hall-ui/public/studio.js:181` |
|
|
778
778
|
| `9c74a2572f4d` | certain | Remote control (recommended) | `modules/hall-ui/public/hall-render.js:779` |
|
|
779
779
|
| `65e3399a8fbf` | certain | Remove filter | `modules/hall-ui/public/hall-kit.js:311` |
|
|
780
|
-
| `dacd113fb3b2` | certain | Remove your image-generation key? Art generation will stop until you add one again. | `modules/hall-ui/public/settings.js:
|
|
780
|
+
| `dacd113fb3b2` | certain | Remove your image-generation key? Art generation will stop until you add one again. | `modules/hall-ui/public/settings.js:1205` |
|
|
781
781
|
| `20882d6ffdd0` | certain | Removed {…} from builder {…}. | `modules/hall-ui/public/government.js:365` |
|
|
782
782
|
| `b06589044b0b` | certain | Render session cards as widgets (prettier, costs tokens) instead of plain text (cheaper, identical info). | `modules/hall-ui/public/settings.js:507` |
|
|
783
783
|
| `9f4e519ea3e2` | certain | Repo Atlas | `modules/hall-ui/public/atlas.html:18` |
|
|
@@ -813,7 +813,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
813
813
|
| `f7ed4ba07178` | certain | Roadmap — {{worldName}} | `modules/hall-ui/public/roadmap.html:6` |
|
|
814
814
|
| `f7ed4ba07178` | certain | Roadmap — {{worldName}} | `modules/hall-ui/public/roadmap.html:6` |
|
|
815
815
|
| `b6596905f845` | certain | Said more than once | `modules/hall-ui/public/copy-desk.html:56` |
|
|
816
|
-
| `0c79b504aebe` | certain | Save key | `modules/hall-ui/public/settings.js:
|
|
816
|
+
| `0c79b504aebe` | certain | Save key | `modules/hall-ui/public/settings.js:1073` |
|
|
817
817
|
| `11486793742e` | certain | Saves the moment you toggle; applies from your next session. | `modules/hall-ui/public/settings.html:284` |
|
|
818
818
|
| `e8e4e49fe8f4` | certain | Saves when you press Save; shows everywhere at once. | `modules/hall-ui/public/settings.html:88` |
|
|
819
819
|
| `42cbc20a6ec8` | certain | Saves when you press Save; your next | `modules/hall-ui/public/settings.html:136` |
|
|
@@ -840,9 +840,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
840
840
|
| `55e0a34bafed` | certain | Session log{…} | `modules/hall-ui/public/task.js:447` |
|
|
841
841
|
| `cccb362bd6da` | certain | Sessions — {{worldName}} | `modules/hall-ui/public/sessions.html:6` |
|
|
842
842
|
| `cccb362bd6da` | certain | Sessions — {{worldName}} | `modules/hall-ui/public/sessions.html:6` |
|
|
843
|
-
| `b823d9a37a35` | certain | Set up key storage | `modules/hall-ui/public/settings.js:
|
|
843
|
+
| `b823d9a37a35` | certain | Set up key storage | `modules/hall-ui/public/settings.js:1089` |
|
|
844
844
|
| `84f31c3c3797` | certain | Set up your machine / get the code | `modules/hall-ui/public/hall-render.js:846` |
|
|
845
|
-
| `f639250de42f` | certain | Setting up key storage… | `modules/hall-ui/public/settings.js:
|
|
845
|
+
| `f639250de42f` | certain | Setting up key storage… | `modules/hall-ui/public/settings.js:1173` |
|
|
846
846
|
| `44bd6c3a2471` | certain | Setting up your box… (about a minute) | `modules/hall-ui/public/box-panel.js:298` |
|
|
847
847
|
| `65509721fe12` | certain | Setting up… | `modules/hall-ui/public/box-panel.js:352` |
|
|
848
848
|
| `62c3ea026095` | certain | Settings sections | `modules/hall-ui/public/settings.html:51` |
|
|
@@ -1090,15 +1090,15 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1090
1090
|
| `4ca77de13df4` | certain | Your dev box is stopped — turn it back on below. | `modules/hall-ui/public/box-panel.js:332` |
|
|
1091
1091
|
| `909b0b7c6ffa` | certain | Your display name | `modules/hall-ui/public/settings.html:84` |
|
|
1092
1092
|
| `51cae49539b5` | certain | Your files are kept | `modules/hall-ui/public/box-panel.js:323` |
|
|
1093
|
-
| `a47f15b6a33c` | certain | Your image-generation key settings could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings.js:
|
|
1094
|
-
| `51fd6f1ecb2f` | certain | Your key | `modules/hall-ui/public/settings.js:
|
|
1093
|
+
| `a47f15b6a33c` | certain | Your image-generation key settings could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings.js:1240` |
|
|
1094
|
+
| `51fd6f1ecb2f` | certain | Your key | `modules/hall-ui/public/settings.js:1069` |
|
|
1095
1095
|
| `20d453b11ae5` | certain | Your name | `modules/hall-ui/public/hall-render.js:294` |
|
|
1096
1096
|
| `6dadadffa36e` | certain | Your name cannot be blank. | `modules/hall-ui/public/settings.js:832` |
|
|
1097
1097
|
| `bd77210a8c90` | certain | Your name must be {…} characters or fewer. | `modules/hall-ui/public/settings.js:837` |
|
|
1098
1098
|
| `c0a01a95e97e` | certain | Your own idea. You may vote, but it can’t be decided by your vote alone, and a vote on your own idea earns no | `modules/hall-ui/public/board-room.js:274` |
|
|
1099
1099
|
| `8fc605026acf` | certain | Your pending join {…}: {…} — awaiting approval. | `modules/hall-ui/public/goal-inbox.js:88` |
|
|
1100
1100
|
| `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:856` |
|
|
1101
|
-
| `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:
|
|
1101
|
+
| `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:1413` |
|
|
1102
1102
|
| `b6dceaace783` | certain | Your profile page setting applies now — private already answers "not found" everywhere your profile is read. R | `modules/hall-ui/public/settings.html:119` |
|
|
1103
1103
|
| `f39746e3d66b` | certain | Your rendering preference could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings.js:554` |
|
|
1104
1104
|
| `b2dfd7120052` | certain | Your request is sent ✓ | `modules/hall-ui/public/hall-render.js:391` |
|
|
@@ -1218,7 +1218,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1218
1218
|
| `7b85e6494596` | certain | opens a new tab | `modules/hall-ui/public/palette.js:190` |
|
|
1219
1219
|
| `c38db02adb61` | certain | or above | `modules/hall-ui/public/government.js:564` |
|
|
1220
1220
|
| `66f7e9c2dde0` | certain | or right-click — plain Ctrl+V will not paste here. Claude takes over the terminal with its own interface once | `modules/hall-ui/public/hall-render.js:779` |
|
|
1221
|
-
| `884948925fcb` | certain | paste command | `modules/hall-ui/public/settings.js:
|
|
1221
|
+
| `884948925fcb` | certain | paste command | `modules/hall-ui/public/settings.js:999` |
|
|
1222
1222
|
| `25d2c940e672` | certain | paste it into your terminal — bypasses Device Flow. | `modules/hall-ui/public/settings.html:152` |
|
|
1223
1223
|
| `2fb1dad96280` | certain | pending, on the People tab | `modules/hall-ui/public/watch.html:46` |
|
|
1224
1224
|
| `3b22c5af029b` | certain | rank or above, or that it is your own. | `modules/hall-ui/public/copy-desk.html:47` |
|
|
@@ -1315,7 +1315,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1315
1315
|
| `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:407` |
|
|
1316
1316
|
| `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:474` |
|
|
1317
1317
|
| `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:249` |
|
|
1318
|
-
| `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:
|
|
1318
|
+
| `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:1075` |
|
|
1319
1319
|
| `94445e6ed5e8` | certain | {…} · code | `modules/hall-ui/public/pair.js:53` |
|
|
1320
1320
|
| `d73256fbc395` | certain | {…} · who votes, and how it {…} | `modules/hall-ui/public/board-room.js:357` |
|
|
1321
1321
|
| `cab2a4296aec` | certain | {…} · {…} · {…}{…} | `modules/hall-ui/public/goal-inbox.js:326` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"modules/hall-ui/public/settings.js:683",
|
|
82
82
|
"modules/hall-ui/public/settings.js:782",
|
|
83
83
|
"modules/hall-ui/public/settings.js:862",
|
|
84
|
-
"modules/hall-ui/public/settings.js:
|
|
84
|
+
"modules/hall-ui/public/settings.js:1161"
|
|
85
85
|
]
|
|
86
86
|
},
|
|
87
87
|
{
|
|
@@ -1468,7 +1468,7 @@
|
|
|
1468
1468
|
"occurrences": 2,
|
|
1469
1469
|
"at": [
|
|
1470
1470
|
"modules/hall-ui/public/settings.js:856",
|
|
1471
|
-
"modules/hall-ui/public/settings.js:
|
|
1471
|
+
"modules/hall-ui/public/settings.js:1413"
|
|
1472
1472
|
]
|
|
1473
1473
|
},
|
|
1474
1474
|
{
|
|
@@ -3055,7 +3055,7 @@
|
|
|
3055
3055
|
"surface": "builders-hall",
|
|
3056
3056
|
"text": "Checking your key…",
|
|
3057
3057
|
"file": "modules/hall-ui/public/settings.js",
|
|
3058
|
-
"line":
|
|
3058
|
+
"line": 1138,
|
|
3059
3059
|
"origin": "js-text-assign",
|
|
3060
3060
|
"confidence": "certain"
|
|
3061
3061
|
},
|
|
@@ -3649,7 +3649,7 @@
|
|
|
3649
3649
|
"surface": "builders-hall",
|
|
3650
3650
|
"text": "Could not copy automatically — select and copy manually. ({…})",
|
|
3651
3651
|
"file": "modules/hall-ui/public/settings.js",
|
|
3652
|
-
"line":
|
|
3652
|
+
"line": 1017,
|
|
3653
3653
|
"origin": "js-notice",
|
|
3654
3654
|
"confidence": "certain"
|
|
3655
3655
|
},
|
|
@@ -3847,7 +3847,7 @@
|
|
|
3847
3847
|
"surface": "builders-hall",
|
|
3848
3848
|
"text": "Could not load your account. Reload the page to try again.",
|
|
3849
3849
|
"file": "modules/hall-ui/public/settings.js",
|
|
3850
|
-
"line":
|
|
3850
|
+
"line": 1396,
|
|
3851
3851
|
"origin": "js-text-assign",
|
|
3852
3852
|
"confidence": "certain"
|
|
3853
3853
|
},
|
|
@@ -3874,7 +3874,7 @@
|
|
|
3874
3874
|
"surface": "builders-hall",
|
|
3875
3875
|
"text": "Could not load your settings.",
|
|
3876
3876
|
"file": "modules/hall-ui/public/settings.js",
|
|
3877
|
-
"line":
|
|
3877
|
+
"line": 1399,
|
|
3878
3878
|
"origin": "js-notice",
|
|
3879
3879
|
"confidence": "certain"
|
|
3880
3880
|
},
|
|
@@ -3919,7 +3919,7 @@
|
|
|
3919
3919
|
"surface": "builders-hall",
|
|
3920
3920
|
"text": "Could not remove your key. Try again.",
|
|
3921
3921
|
"file": "modules/hall-ui/public/settings.js",
|
|
3922
|
-
"line":
|
|
3922
|
+
"line": 1218,
|
|
3923
3923
|
"origin": "js-notice",
|
|
3924
3924
|
"confidence": "certain"
|
|
3925
3925
|
},
|
|
@@ -3928,7 +3928,7 @@
|
|
|
3928
3928
|
"surface": "builders-hall",
|
|
3929
3929
|
"text": "Could not remove. Try again.",
|
|
3930
3930
|
"file": "modules/hall-ui/public/settings.js",
|
|
3931
|
-
"line":
|
|
3931
|
+
"line": 1217,
|
|
3932
3932
|
"origin": "js-text-assign",
|
|
3933
3933
|
"confidence": "certain"
|
|
3934
3934
|
},
|
|
@@ -3982,7 +3982,7 @@
|
|
|
3982
3982
|
"surface": "builders-hall",
|
|
3983
3983
|
"text": "Could not save your key. Try again.",
|
|
3984
3984
|
"file": "modules/hall-ui/public/settings.js",
|
|
3985
|
-
"line":
|
|
3985
|
+
"line": 1162,
|
|
3986
3986
|
"origin": "js-notice",
|
|
3987
3987
|
"confidence": "certain"
|
|
3988
3988
|
},
|
|
@@ -4117,7 +4117,7 @@
|
|
|
4117
4117
|
"surface": "builders-hall",
|
|
4118
4118
|
"text": "Could not save. Try again.",
|
|
4119
4119
|
"file": "modules/hall-ui/public/settings.js",
|
|
4120
|
-
"line":
|
|
4120
|
+
"line": 1161,
|
|
4121
4121
|
"origin": "js-text-assign",
|
|
4122
4122
|
"confidence": "certain"
|
|
4123
4123
|
},
|
|
@@ -4135,7 +4135,7 @@
|
|
|
4135
4135
|
"surface": "builders-hall",
|
|
4136
4136
|
"text": "Could not set up key storage. Try again.",
|
|
4137
4137
|
"file": "modules/hall-ui/public/settings.js",
|
|
4138
|
-
"line":
|
|
4138
|
+
"line": 1198,
|
|
4139
4139
|
"origin": "js-notice",
|
|
4140
4140
|
"confidence": "certain"
|
|
4141
4141
|
},
|
|
@@ -4144,7 +4144,7 @@
|
|
|
4144
4144
|
"surface": "builders-hall",
|
|
4145
4145
|
"text": "Could not set up storage. Try again.",
|
|
4146
4146
|
"file": "modules/hall-ui/public/settings.js",
|
|
4147
|
-
"line":
|
|
4147
|
+
"line": 1197,
|
|
4148
4148
|
"origin": "js-text-assign",
|
|
4149
4149
|
"confidence": "certain"
|
|
4150
4150
|
},
|
|
@@ -4810,8 +4810,8 @@
|
|
|
4810
4810
|
"surface": "builders-hall",
|
|
4811
4811
|
"text": "Expires {…} · refreshes on use.",
|
|
4812
4812
|
"file": "modules/hall-ui/public/settings.js",
|
|
4813
|
-
"line":
|
|
4814
|
-
"origin": "js-
|
|
4813
|
+
"line": 1007,
|
|
4814
|
+
"origin": "js-text-assign",
|
|
4815
4815
|
"confidence": "certain"
|
|
4816
4816
|
},
|
|
4817
4817
|
{
|
|
@@ -5026,8 +5026,8 @@
|
|
|
5026
5026
|
"surface": "builders-hall",
|
|
5027
5027
|
"text": "Fresh CLI token issued. Paste it in your terminal:",
|
|
5028
5028
|
"file": "modules/hall-ui/public/settings.js",
|
|
5029
|
-
"line":
|
|
5030
|
-
"origin": "js-
|
|
5029
|
+
"line": 997,
|
|
5030
|
+
"origin": "js-text-assign",
|
|
5031
5031
|
"confidence": "certain"
|
|
5032
5032
|
},
|
|
5033
5033
|
{
|
|
@@ -5107,7 +5107,7 @@
|
|
|
5107
5107
|
"surface": "builders-hall",
|
|
5108
5108
|
"text": "Get a free key ↗",
|
|
5109
5109
|
"file": "modules/hall-ui/public/settings.js",
|
|
5110
|
-
"line":
|
|
5110
|
+
"line": 1041,
|
|
5111
5111
|
"origin": "js-markup",
|
|
5112
5112
|
"confidence": "certain"
|
|
5113
5113
|
},
|
|
@@ -5602,7 +5602,7 @@
|
|
|
5602
5602
|
"surface": "builders-hall",
|
|
5603
5603
|
"text": "Image key removed.",
|
|
5604
5604
|
"file": "modules/hall-ui/public/settings.js",
|
|
5605
|
-
"line":
|
|
5605
|
+
"line": 1214,
|
|
5606
5606
|
"origin": "js-notice",
|
|
5607
5607
|
"confidence": "certain"
|
|
5608
5608
|
},
|
|
@@ -5845,7 +5845,7 @@
|
|
|
5845
5845
|
"surface": "builders-hall",
|
|
5846
5846
|
"text": "Key removed.",
|
|
5847
5847
|
"file": "modules/hall-ui/public/settings.js",
|
|
5848
|
-
"line":
|
|
5848
|
+
"line": 1213,
|
|
5849
5849
|
"origin": "js-text-assign",
|
|
5850
5850
|
"confidence": "certain"
|
|
5851
5851
|
},
|
|
@@ -5854,7 +5854,7 @@
|
|
|
5854
5854
|
"surface": "builders-hall",
|
|
5855
5855
|
"text": "Key storage is being set up by an Archon — check back shortly. {…}",
|
|
5856
5856
|
"file": "modules/hall-ui/public/settings.js",
|
|
5857
|
-
"line":
|
|
5857
|
+
"line": 1092,
|
|
5858
5858
|
"origin": "js-markup",
|
|
5859
5859
|
"confidence": "certain"
|
|
5860
5860
|
},
|
|
@@ -5863,7 +5863,7 @@
|
|
|
5863
5863
|
"surface": "builders-hall",
|
|
5864
5864
|
"text": "Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the master key (no terminal needed).",
|
|
5865
5865
|
"file": "modules/hall-ui/public/settings.js",
|
|
5866
|
-
"line":
|
|
5866
|
+
"line": 1088,
|
|
5867
5867
|
"origin": "js-markup",
|
|
5868
5868
|
"confidence": "certain"
|
|
5869
5869
|
},
|
|
@@ -5926,7 +5926,7 @@
|
|
|
5926
5926
|
"surface": "builders-hall",
|
|
5927
5927
|
"text": "Latest version: v{…}.",
|
|
5928
5928
|
"file": "modules/hall-ui/public/settings.js",
|
|
5929
|
-
"line":
|
|
5929
|
+
"line": 1482,
|
|
5930
5930
|
"origin": "js-text-assign",
|
|
5931
5931
|
"confidence": "certain"
|
|
5932
5932
|
},
|
|
@@ -6574,7 +6574,7 @@
|
|
|
6574
6574
|
"surface": "builders-hall",
|
|
6575
6575
|
"text": "No builder account found for this sign-in.",
|
|
6576
6576
|
"file": "modules/hall-ui/public/settings.js",
|
|
6577
|
-
"line":
|
|
6577
|
+
"line": 1404,
|
|
6578
6578
|
"origin": "js-text-assign",
|
|
6579
6579
|
"confidence": "certain"
|
|
6580
6580
|
},
|
|
@@ -7348,7 +7348,7 @@
|
|
|
7348
7348
|
"surface": "builders-hall",
|
|
7349
7349
|
"text": "Paste command copied.",
|
|
7350
7350
|
"file": "modules/hall-ui/public/settings.js",
|
|
7351
|
-
"line":
|
|
7351
|
+
"line": 1016,
|
|
7352
7352
|
"origin": "js-notice",
|
|
7353
7353
|
"confidence": "certain"
|
|
7354
7354
|
},
|
|
@@ -7357,7 +7357,7 @@
|
|
|
7357
7357
|
"surface": "builders-hall",
|
|
7358
7358
|
"text": "Paste your key first.",
|
|
7359
7359
|
"file": "modules/hall-ui/public/settings.js",
|
|
7360
|
-
"line":
|
|
7360
|
+
"line": 1137,
|
|
7361
7361
|
"origin": "js-notice",
|
|
7362
7362
|
"confidence": "certain"
|
|
7363
7363
|
},
|
|
@@ -7762,7 +7762,7 @@
|
|
|
7762
7762
|
"surface": "builders-hall",
|
|
7763
7763
|
"text": "Re-issue failed: {…}",
|
|
7764
7764
|
"file": "modules/hall-ui/public/settings.js",
|
|
7765
|
-
"line":
|
|
7765
|
+
"line": 1021,
|
|
7766
7766
|
"origin": "js-notice",
|
|
7767
7767
|
"confidence": "certain"
|
|
7768
7768
|
},
|
|
@@ -8023,7 +8023,7 @@
|
|
|
8023
8023
|
"surface": "builders-hall",
|
|
8024
8024
|
"text": "Remove your image-generation key? Art generation will stop until you add one again.",
|
|
8025
8025
|
"file": "modules/hall-ui/public/settings.js",
|
|
8026
|
-
"line":
|
|
8026
|
+
"line": 1205,
|
|
8027
8027
|
"origin": "js-notice",
|
|
8028
8028
|
"confidence": "certain"
|
|
8029
8029
|
},
|
|
@@ -8347,7 +8347,7 @@
|
|
|
8347
8347
|
"surface": "builders-hall",
|
|
8348
8348
|
"text": "Save key",
|
|
8349
8349
|
"file": "modules/hall-ui/public/settings.js",
|
|
8350
|
-
"line":
|
|
8350
|
+
"line": 1073,
|
|
8351
8351
|
"origin": "js-markup",
|
|
8352
8352
|
"confidence": "certain"
|
|
8353
8353
|
},
|
|
@@ -8590,7 +8590,7 @@
|
|
|
8590
8590
|
"surface": "builders-hall",
|
|
8591
8591
|
"text": "Set up key storage",
|
|
8592
8592
|
"file": "modules/hall-ui/public/settings.js",
|
|
8593
|
-
"line":
|
|
8593
|
+
"line": 1089,
|
|
8594
8594
|
"origin": "js-markup",
|
|
8595
8595
|
"confidence": "certain"
|
|
8596
8596
|
},
|
|
@@ -8608,7 +8608,7 @@
|
|
|
8608
8608
|
"surface": "builders-hall",
|
|
8609
8609
|
"text": "Setting up key storage…",
|
|
8610
8610
|
"file": "modules/hall-ui/public/settings.js",
|
|
8611
|
-
"line":
|
|
8611
|
+
"line": 1173,
|
|
8612
8612
|
"origin": "js-text-assign",
|
|
8613
8613
|
"confidence": "certain"
|
|
8614
8614
|
},
|
|
@@ -10840,7 +10840,7 @@
|
|
|
10840
10840
|
"surface": "builders-hall",
|
|
10841
10841
|
"text": "Your image-generation key settings could not be loaded. Reload the page to try again.",
|
|
10842
10842
|
"file": "modules/hall-ui/public/settings.js",
|
|
10843
|
-
"line":
|
|
10843
|
+
"line": 1240,
|
|
10844
10844
|
"origin": "js-markup",
|
|
10845
10845
|
"confidence": "certain"
|
|
10846
10846
|
},
|
|
@@ -10849,7 +10849,7 @@
|
|
|
10849
10849
|
"surface": "builders-hall",
|
|
10850
10850
|
"text": "Your key",
|
|
10851
10851
|
"file": "modules/hall-ui/public/settings.js",
|
|
10852
|
-
"line":
|
|
10852
|
+
"line": 1069,
|
|
10853
10853
|
"origin": "js-markup",
|
|
10854
10854
|
"confidence": "certain"
|
|
10855
10855
|
},
|
|
@@ -10912,7 +10912,7 @@
|
|
|
10912
10912
|
"surface": "builders-hall",
|
|
10913
10913
|
"text": "Your preferences, {…}.",
|
|
10914
10914
|
"file": "modules/hall-ui/public/settings.js",
|
|
10915
|
-
"line":
|
|
10915
|
+
"line": 1413,
|
|
10916
10916
|
"origin": "js-text-assign",
|
|
10917
10917
|
"confidence": "certain"
|
|
10918
10918
|
},
|
|
@@ -11992,8 +11992,8 @@
|
|
|
11992
11992
|
"surface": "builders-hall",
|
|
11993
11993
|
"text": "paste command",
|
|
11994
11994
|
"file": "modules/hall-ui/public/settings.js",
|
|
11995
|
-
"line":
|
|
11996
|
-
"origin": "js-
|
|
11995
|
+
"line": 999,
|
|
11996
|
+
"origin": "js-text-assign",
|
|
11997
11997
|
"confidence": "certain"
|
|
11998
11998
|
},
|
|
11999
11999
|
{
|
|
@@ -12865,7 +12865,7 @@
|
|
|
12865
12865
|
"surface": "builders-hall",
|
|
12866
12866
|
"text": "{…} · Stored encrypted; never shown again after saving.",
|
|
12867
12867
|
"file": "modules/hall-ui/public/settings.js",
|
|
12868
|
-
"line":
|
|
12868
|
+
"line": 1075,
|
|
12869
12869
|
"origin": "js-markup",
|
|
12870
12870
|
"confidence": "certain"
|
|
12871
12871
|
},
|
|
@@ -1833,5 +1833,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1833
1833
|
landed since 1.19.685 with no explicit bump. run 34721104118. (task 1002620)
|
|
1834
1834
|
1.19.687 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1835
1835
|
landed since 1.19.686 with no explicit bump. run 34724811506. (task 1002620)
|
|
1836
|
+
1.19.688 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1837
|
+
landed since 1.19.687 with no explicit bump. run 34725902871. (task 1002620)
|
|
1838
|
+
1.19.689 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1839
|
+
landed since 1.19.688 with no explicit bump. run 34726470555. (task 1002620)
|
|
1836
1840
|
---------------------------------------------------------------------------
|
|
1837
1841
|
```
|
|
@@ -982,18 +982,38 @@
|
|
|
982
982
|
const body = (res.data || {});
|
|
983
983
|
if (!res.ok) throw new Error(body.message || `HTTP ${res.status}`);
|
|
984
984
|
const expires = body.expires_at ? new Date(body.expires_at).toLocaleString() : 'unknown';
|
|
985
|
+
const pasteCommand = body.paste_command || '';
|
|
985
986
|
// The secret is QUOTED (settings.css `.quote`): a 64-character token cannot
|
|
986
|
-
// be a line of prose, so it sits one tonal step down with its own foot.
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
987
|
+
// be a line of prose, so it sits one tonal step down with its own foot. Same
|
|
988
|
+
// markup as the innerHTML template it replaces (task 1003644) — what changes
|
|
989
|
+
// is that the token arrives via textContent, where it is text by construction
|
|
990
|
+
// rather than by an escape call someone has to remember at every
|
|
991
|
+
// interpolation. Each literal is assigned DIRECTLY, never passed through the
|
|
992
|
+
// helper: `.textContent = '…'` is the render path copy-inventory.js follows,
|
|
993
|
+
// and threading them through `el(tag, cls, text)` reads tidier but drops all
|
|
994
|
+
// three out of the copy registry, blinding the artist's queue to this panel.
|
|
995
|
+
const el = (tag, cls) => Object.assign(document.createElement(tag), { className: cls });
|
|
996
|
+
const say = el('p', 'cli-result__say');
|
|
997
|
+
say.textContent = 'Fresh CLI token issued. Paste it in your terminal:';
|
|
998
|
+
const eyebrow = el('p', 'quote__eyebrow');
|
|
999
|
+
eyebrow.textContent = 'paste command';
|
|
1000
|
+
const pre = el('pre', 'quote__pre');
|
|
1001
|
+
pre.textContent = pasteCommand;
|
|
1002
|
+
const copyBtn = el('button', 'settings-btn settings-btn--quiet');
|
|
1003
|
+
copyBtn.type = 'button';
|
|
1004
|
+
copyBtn.id = 'cli-reissue-copy';
|
|
1005
|
+
copyBtn.textContent = 'Copy';
|
|
1006
|
+
const hint = el('span', 'settings-card__hint');
|
|
1007
|
+
hint.textContent = `Expires ${expires} · refreshes on use.`;
|
|
1008
|
+
const foot = el('div', 'quote__foot');
|
|
1009
|
+
foot.append(copyBtn, hint);
|
|
1010
|
+
const quote = el('div', 'quote');
|
|
1011
|
+
quote.append(eyebrow, pre, foot);
|
|
1012
|
+
result.textContent = ''; // a re-issue replaces the previous token, as innerHTML did
|
|
1013
|
+
result.append(say, quote);
|
|
993
1014
|
result.hidden = false;
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
try { await navigator.clipboard.writeText(body.paste_command); toast('Paste command copied.'); }
|
|
1015
|
+
copyBtn.addEventListener('click', async () => {
|
|
1016
|
+
try { await navigator.clipboard.writeText(pasteCommand); toast('Paste command copied.'); }
|
|
997
1017
|
catch (err) { toast(`Could not copy automatically — select and copy manually. (${err.message})`); }
|
|
998
1018
|
});
|
|
999
1019
|
} catch (err) {
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.689",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.689",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.689",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
// exceeding the per-builder ceiling. A mechanical task drafts on haiku; a
|
|
4
4
|
// bug/refactor/feature drafts on sonnet; escalation to a higher rung happens only
|
|
5
5
|
// when the cheaper run (a) fails its expected schema or (b) self-reports low
|
|
6
|
-
// confidence — capped at
|
|
6
|
+
// confidence — capped at one full climb of the ladder (MAX_ESCALATIONS, derived
|
|
7
|
+
// from LADDER so the cap can never sit below the ceiling a builder is allowed to
|
|
8
|
+
// pick; task 1003664). The cascade operates UNDER the builder's
|
|
7
9
|
// configured model ceiling (skill-prefs.getForBuilder, migration 037) — it can
|
|
8
10
|
// downshift below it, never above.
|
|
9
11
|
//
|
|
@@ -25,14 +27,33 @@
|
|
|
25
27
|
const seams = require('../module-seams');
|
|
26
28
|
|
|
27
29
|
// Cheapest → dearest. Indices are "rungs"; the cascade only ever moves UP.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
// `fable` tops the ladder: it is this instance's top-model default and prices
|
|
31
|
+
// ABOVE opus ($10/$50 vs $5/$25 — llm-pricing.js PRICES), and the allowed-tier
|
|
32
|
+
// list the settings UI writes agrees (modules/builder-settings/model-alloc-prefs.js
|
|
33
|
+
// ALLOWED_TIERS). Without the rung, `claude-fable-5` fell through rungIndex's
|
|
34
|
+
// unknown-model default and a fable CEILING silently clamped the cascade to
|
|
35
|
+
// sonnet — one rung BELOW opus, the opposite of what that ceiling means
|
|
36
|
+
// (task 1003664).
|
|
37
|
+
const LADDER = ['haiku', 'sonnet', 'opus', 'fable'];
|
|
38
|
+
|
|
39
|
+
// Enough escalations to climb from the CHEAPEST rung to the dearest — the
|
|
40
|
+
// invariant the hardcoded `2` quietly satisfied while the ladder was 3 rungs
|
|
41
|
+
// (haiku→opus is 2 steps) and stopped satisfying the moment fable was added: a
|
|
42
|
+
// 'chore' starting on haiku with a fable ceiling would have run out of
|
|
43
|
+
// escalations at opus and stopped one rung short, which is this task's own bug
|
|
44
|
+
// wearing a different start rung. Derived, so a fifth rung cannot reintroduce it.
|
|
45
|
+
// Per-call `maxEscalations` is unchanged and still overrides this.
|
|
46
|
+
const MAX_ESCALATIONS = LADDER.length - 1;
|
|
30
47
|
|
|
31
48
|
function rungIndex(model) {
|
|
32
49
|
const m = String(model || '').toLowerCase();
|
|
33
50
|
if (m.includes('haiku')) return 0;
|
|
34
51
|
if (m.includes('sonnet')) return 1;
|
|
35
52
|
if (m.includes('opus')) return 2;
|
|
53
|
+
// fable and mythos are ONE family at one price — the same pairing llm-pricing's
|
|
54
|
+
// familyFor() and grader-model's MODEL_FAMILY_TOKENS already make, so mythos
|
|
55
|
+
// must not fall through to the unknown default either.
|
|
56
|
+
if (m.includes('fable') || m.includes('mythos')) return 3;
|
|
36
57
|
return 1; // unknown / 'script' / null → middle (sonnet); callers pass a real ceiling
|
|
37
58
|
}
|
|
38
59
|
|
package/src/module-api.js
CHANGED
|
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
71
71
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
72
72
|
// the entry to that file. Look for a version's history there, not here.
|
|
73
73
|
// ---------------------------------------------------------------------------
|
|
74
|
-
const CORE_VERSION = '1.19.
|
|
74
|
+
const CORE_VERSION = '1.19.689'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
75
75
|
|
|
76
76
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
77
77
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -56,7 +56,7 @@ test('ceiling is NEVER exceeded — schema keeps failing but stops at sonnet cei
|
|
|
56
56
|
assert.equal(r.ceiling, 'sonnet');
|
|
57
57
|
});
|
|
58
58
|
|
|
59
|
-
test('
|
|
59
|
+
test('a full climb from the cheapest rung reaches the ceiling (haiku → sonnet → opus)', async () => {
|
|
60
60
|
const neverValid = () => false;
|
|
61
61
|
const runner = mockRunner({});
|
|
62
62
|
const r = await cascade.dispatch({ prompt: 'p', taskKind: 'chore', ceiling: 'opus', expectSchema: neverValid, runner });
|
|
@@ -64,6 +64,19 @@ test('escalation capped at 2 (haiku → sonnet → opus, then stop)', async () =
|
|
|
64
64
|
assert.equal(r.escalations, 2);
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
+
// This one used to be the test above, named for the CAP — but with a 3-rung
|
|
68
|
+
// ladder the cap and the opus ceiling stopped the climb at the same rung, so it
|
|
69
|
+
// could not tell which one had acted. Drive the cap explicitly instead.
|
|
70
|
+
test('the escalation cap stops a climb short of the ceiling when it is set below it', async () => {
|
|
71
|
+
const neverValid = () => false;
|
|
72
|
+
const runner = mockRunner({});
|
|
73
|
+
const r = await cascade.dispatch({
|
|
74
|
+
prompt: 'p', taskKind: 'chore', ceiling: 'fable', expectSchema: neverValid, runner, maxEscalations: 1,
|
|
75
|
+
});
|
|
76
|
+
assert.deepEqual(runner.calls, ['haiku', 'sonnet'], 'one escalation, then stop — well below the fable ceiling');
|
|
77
|
+
assert.equal(r.escalations, 1);
|
|
78
|
+
});
|
|
79
|
+
|
|
67
80
|
test('self-reported low confidence triggers escalation', async () => {
|
|
68
81
|
const runner = mockRunner({ sonnet: LOWCONF, opus: GOOD });
|
|
69
82
|
const r = await cascade.dispatch({ prompt: 'p', taskKind: 'feature', ceiling: 'opus', runner });
|
|
@@ -88,6 +101,70 @@ test('dispatch requires an injected runner', async () => {
|
|
|
88
101
|
await assert.rejects(() => cascade.dispatch({ prompt: 'p', taskKind: 'bug', ceiling: 'opus' }), /requires an injected runner/);
|
|
89
102
|
});
|
|
90
103
|
|
|
104
|
+
// --- the fable rung (task 1003664) ------------------------------------------
|
|
105
|
+
// A ceiling naming a model rungIndex does not recognise falls through to the
|
|
106
|
+
// unknown default (1 = sonnet). For a ceiling that is meant to be the HIGHEST
|
|
107
|
+
// rung that silently clamps the cascade BELOW opus — a downgrade dressed as a
|
|
108
|
+
// ceiling, and invisible because nothing errors.
|
|
109
|
+
|
|
110
|
+
test('a real fable model id resolves to the top rung, not the unknown default', async () => {
|
|
111
|
+
assert.equal(cascade.rungIndex('claude-fable-5'), 3, 'this is the bug: a fable id must not read as sonnet');
|
|
112
|
+
assert.equal(cascade.rungIndex('claude-fable-5-1'), 3);
|
|
113
|
+
assert.equal(cascade.rungIndex('fable'), 3);
|
|
114
|
+
// mythos is the same family at the same price everywhere else in the codebase.
|
|
115
|
+
assert.equal(cascade.rungIndex('claude-mythos-5-1'), 3);
|
|
116
|
+
assert.equal(cascade.rungIndex('mythos'), 3);
|
|
117
|
+
// the rung is above opus, which is the whole point
|
|
118
|
+
assert.ok(cascade.rungIndex('claude-fable-5') > cascade.rungIndex('claude-opus-5'));
|
|
119
|
+
assert.equal(cascade.LADDER[3], 'fable');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('a fable ceiling escalates PAST opus instead of stopping at sonnet', async () => {
|
|
123
|
+
const neverValid = () => false;
|
|
124
|
+
const runner = mockRunner({});
|
|
125
|
+
const r = await cascade.dispatch({
|
|
126
|
+
prompt: 'p', taskKind: 'feature', ceiling: 'claude-fable-5', expectSchema: neverValid, runner,
|
|
127
|
+
});
|
|
128
|
+
assert.deepEqual(runner.calls, ['sonnet', 'opus', 'fable'], 'a fable ceiling must reach fable');
|
|
129
|
+
assert.equal(r.model, 'fable');
|
|
130
|
+
assert.equal(r.ceiling, 'fable');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// The haiku-start case, which the sonnet-start test above cannot see. A 4-rung
|
|
134
|
+
// ladder needs 3 escalations to climb end-to-end; while MAX_ESCALATIONS was the
|
|
135
|
+
// hardcoded 2 that a 3-rung ladder happened to satisfy, this stopped at opus —
|
|
136
|
+
// the same "ceiling that doesn't reach its ceiling" bug, one start rung over.
|
|
137
|
+
test('a chore with a fable ceiling climbs the WHOLE ladder, not just two rungs', async () => {
|
|
138
|
+
const neverValid = () => false;
|
|
139
|
+
const runner = mockRunner({});
|
|
140
|
+
const r = await cascade.dispatch({
|
|
141
|
+
prompt: 'p', taskKind: 'chore', ceiling: 'claude-fable-5', expectSchema: neverValid, runner,
|
|
142
|
+
});
|
|
143
|
+
assert.deepEqual(runner.calls, ['haiku', 'sonnet', 'opus', 'fable'], 'the cap must not sit below the ceiling');
|
|
144
|
+
assert.equal(r.model, 'fable');
|
|
145
|
+
assert.equal(r.escalations, 3);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('the default cap always allows one full climb, whatever the ladder length', async () => {
|
|
149
|
+
assert.equal(cascade.MAX_ESCALATIONS, cascade.LADDER.length - 1, 'derive it — a fifth rung must not reintroduce the bug');
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('an opus ceiling still never reaches fable (the new rung is not a new floor)', async () => {
|
|
153
|
+
const neverValid = () => false;
|
|
154
|
+
const runner = mockRunner({});
|
|
155
|
+
const r = await cascade.dispatch({
|
|
156
|
+
prompt: 'p', taskKind: 'feature', ceiling: 'claude-opus-5', expectSchema: neverValid, runner,
|
|
157
|
+
});
|
|
158
|
+
assert.ok(!runner.calls.includes('fable'), 'fable must never be called above an opus ceiling');
|
|
159
|
+
assert.equal(r.model, 'opus');
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test('an unknown model id still falls back to the safe middle', async () => {
|
|
163
|
+
assert.equal(cascade.rungIndex('script'), 1, 'the documented fallback is unchanged');
|
|
164
|
+
assert.equal(cascade.rungIndex(null), 1);
|
|
165
|
+
assert.equal(cascade.rungIndex(''), 1);
|
|
166
|
+
});
|
|
167
|
+
|
|
91
168
|
// settle async tests then report
|
|
92
169
|
setTimeout(() => {
|
|
93
170
|
console.log(`\ncascade-dispatch: ${passed} passed, ${failed} failed`);
|
|
@@ -229,14 +229,40 @@ test('white on the accent is gone, and the Discord mark is the one named excepti
|
|
|
229
229
|
test('the CLI token is quoted — one tonal step down, wrapping anywhere', () => {
|
|
230
230
|
const fn = settingsJs.match(/async function issueCliToken\([\s\S]*?\n \}\n/);
|
|
231
231
|
assert.ok(fn, 'issueCliToken is a whole function');
|
|
232
|
-
|
|
233
|
-
|
|
232
|
+
// The composition is unchanged by task 1003644 — only how it is built. These
|
|
233
|
+
// used to read `class="quote"` out of a template string; they read the same
|
|
234
|
+
// four class names out of the createElement calls.
|
|
235
|
+
for (const cls of ['quote', 'quote__eyebrow', 'quote__pre', 'quote__foot']) {
|
|
236
|
+
assert.match(fn[0], new RegExp(`'${cls}'`), `the result renders .${cls}`);
|
|
237
|
+
}
|
|
234
238
|
assert.doesNotMatch(fn[0], /style="/, 'no inline style on the foot');
|
|
235
239
|
const pre = ruleOf(settingsCss, '.quote__pre');
|
|
236
240
|
assert.match(pre, /overflow-wrap:\s*anywhere/, 'a 64-character token wraps inside its quote instead of widening the panel');
|
|
237
241
|
assert.match(ruleOf(settingsCss, '.quote') || '', /background:\s*var\(--glass\)/, 'one tonal step down from the panel');
|
|
238
242
|
});
|
|
239
243
|
|
|
244
|
+
// The node that renders a live credential builds it, never writes it (task
|
|
245
|
+
// 1003644). The old form was correct — every interpolation was wrapped in
|
|
246
|
+
// escapeHtml — but correct by memory: the escape was a call someone had to keep
|
|
247
|
+
// making, and the string being interpolated is a bearer token. Built as nodes,
|
|
248
|
+
// the token is text by construction and there is no call to forget.
|
|
249
|
+
test('the CLI token reaches the page as text, not as markup', () => {
|
|
250
|
+
const fn = settingsJs.match(/async function issueCliToken\([\s\S]*?\n \}\n/);
|
|
251
|
+
assert.ok(fn, 'issueCliToken is a whole function');
|
|
252
|
+
// An ASSIGNMENT, not the bare word — the function's own comment names innerHTML
|
|
253
|
+
// to say why it isn't used, and a test that its explanation trips is a test that
|
|
254
|
+
// punishes documenting the decision.
|
|
255
|
+
assert.doesNotMatch(fn[0], /\.innerHTML\s*=/, 'the credential node must not be assembled by writing innerHTML');
|
|
256
|
+
assert.match(fn[0], /createElement/, 'it is built with createElement');
|
|
257
|
+
assert.match(fn[0], /textContent/, 'and filled with textContent');
|
|
258
|
+
// The secret and the clipboard read the SAME resolved value, so the button can
|
|
259
|
+
// never copy a different string than the one on screen — nor the literal
|
|
260
|
+
// "undefined", which writeText(body.paste_command) produced on a body without one.
|
|
261
|
+
assert.match(fn[0], /const pasteCommand = body\.paste_command \|\| ''/, 'one resolved value');
|
|
262
|
+
assert.match(fn[0], /writeText\(pasteCommand\)/, 'the clipboard copies that same value');
|
|
263
|
+
assert.match(fn[0], /result\.textContent = ''/, 're-issuing replaces the previous token rather than stacking a second');
|
|
264
|
+
});
|
|
265
|
+
|
|
240
266
|
// The hall's my-projects page is GONE (owner decision, task 1003308): "my
|
|
241
267
|
// projects" is a user-level page that already lives on the hub, so the hall
|
|
242
268
|
// carries neither the page nor a link nor a redirect to it.
|
package/tests/sound_player.mjs
CHANGED
|
@@ -355,29 +355,62 @@ test('playerFor never throws and returns null or a [cmd, args] pair', () => {
|
|
|
355
355
|
// right for the DEFAULT call; it is wrong the moment a caller names a file.
|
|
356
356
|
// ---------------------------------------------------------------------------
|
|
357
357
|
|
|
358
|
+
// Runs in a CHILD with a sandboxed home, for the reason task 1003760 wrote up at
|
|
359
|
+
// length in tests/cli_sessions.mjs: both prefs paths derive from os.homedir(), so
|
|
360
|
+
// in-process this case reads the BUILDER'S OWN settings.
|
|
361
|
+
//
|
|
362
|
+
// That is what made it red (task 1003628). The old guard skipped only when the
|
|
363
|
+
// LEGACY file existed, and then planted one — but it never checked the CANONICAL
|
|
364
|
+
// file, and readPrefs consults legacy only when the canonical read THROWS. On any
|
|
365
|
+
// machine with saved sound settings the canonical file parses, volume 100 comes
|
|
366
|
+
// back, and the final assertion failed 100 !== 11. On a bare CI runner neither file
|
|
367
|
+
// exists, the plant works, and it passed: green where nobody looks, red where
|
|
368
|
+
// everybody does — the exact phrase this file's own comment above uses for the
|
|
369
|
+
// product bug task 1003293 fixed. The product is correct; the test was reading the
|
|
370
|
+
// developer's machine. Sandboxing is what makes the claim testable at all, rather
|
|
371
|
+
// than skipped on every machine that has the state it cares about.
|
|
372
|
+
//
|
|
373
|
+
// Both layers of the 1003760 contract apply: override every variable a platform
|
|
374
|
+
// might read for the home, and FAIL CLOSED in the child if os.homedir() did not
|
|
375
|
+
// land in the sandbox — a silent escape here would plant a prefs file in the
|
|
376
|
+
// builder's real config dir.
|
|
377
|
+
function sandboxEnv(home) {
|
|
378
|
+
const { root } = path.parse(home);
|
|
379
|
+
return {
|
|
380
|
+
...process.env,
|
|
381
|
+
HOME: home,
|
|
382
|
+
USERPROFILE: home, // Windows: what os.homedir() actually reads
|
|
383
|
+
HOMEDRIVE: root.replace(/[\\/]+$/, ''), // legacy Windows fallback pair
|
|
384
|
+
HOMEPATH: home.slice(root.length - 1) || '\\',
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
|
|
358
388
|
test('an explicit missing path fails open — it never substitutes another file', () => {
|
|
359
|
-
|
|
360
|
-
// and prove an explicit path still ignores it. Skipped if the real file exists,
|
|
361
|
-
// because this test must never clobber a builder's own settings.
|
|
362
|
-
const legacy = player.LEGACY_PREFS_PATH;
|
|
363
|
-
if (!legacy || fs.existsSync(legacy)) {
|
|
364
|
-
// Nothing to plant, but the invariant is still checkable: an absent explicit
|
|
365
|
-
// path must yield the fail-open default, whatever the legacy file holds.
|
|
366
|
-
const p = player.readPrefs(path.join(os.tmpdir(), `otb-absent-${process.pid}.json`));
|
|
367
|
-
assert.equal(p.volume, 100);
|
|
368
|
-
assert.equal(p.enabled('ship'), true);
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
fs.mkdirSync(path.dirname(legacy), { recursive: true });
|
|
372
|
-
fs.writeFileSync(legacy, JSON.stringify({ volume: 11, ship: false }));
|
|
389
|
+
const home = fs.mkdtempSync(path.join(os.tmpdir(), 'otb-sound-home-'));
|
|
373
390
|
try {
|
|
374
|
-
const
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
391
|
+
const code = `const R=${JSON.stringify(ROOT)};
|
|
392
|
+
const SANDBOX=${JSON.stringify(home)};
|
|
393
|
+
const os=require('node:os'), fs=require('node:fs'), path=require('node:path');
|
|
394
|
+
const assert=require('node:assert/strict');
|
|
395
|
+
if (os.homedir() !== SANDBOX) {
|
|
396
|
+
console.error('ERR sandbox-escape: os.homedir()=' + os.homedir() + ' but the sandbox is ' + SANDBOX
|
|
397
|
+
+ ' — this platform does not take the home override, and planting prefs here would write to the real config dir.');
|
|
398
|
+
process.exit(2);
|
|
399
|
+
}
|
|
400
|
+
const player = require(R + '/.claude/sounds/play.js');
|
|
401
|
+
assert.ok(!fs.existsSync(player.PREFS_PATH), 'the sandbox must start with no canonical prefs file');
|
|
402
|
+
fs.mkdirSync(path.dirname(player.LEGACY_PREFS_PATH), { recursive: true });
|
|
403
|
+
fs.writeFileSync(player.LEGACY_PREFS_PATH, JSON.stringify({ volume: 11, ship: false }));
|
|
404
|
+
const p = player.readPrefs(path.join(os.tmpdir(), 'otb-absent-' + process.pid + '.json'));
|
|
405
|
+
assert.equal(p.volume, 100, 'an explicit path must not inherit the legacy file volume');
|
|
406
|
+
assert.equal(p.enabled('ship'), true, 'an explicit path must not inherit legacy mutes');
|
|
407
|
+
// …while the DEFAULT call still honours it — the fallback is not removed.
|
|
408
|
+
const d = player.readPrefs();
|
|
409
|
+
assert.equal(d.volume, 11, 'the default path must still fall back to the legacy file');
|
|
410
|
+
console.log('OK');`;
|
|
411
|
+
const r = execFileSync(process.execPath, ['-e', code], { encoding: 'utf8', env: sandboxEnv(home) });
|
|
412
|
+
assert.match(r, /OK/, 'the sandboxed child must reach its final assertion');
|
|
380
413
|
} finally {
|
|
381
|
-
fs.
|
|
414
|
+
fs.rmSync(home, { recursive: true, force: true });
|
|
382
415
|
}
|
|
383
416
|
});
|