@bongos/core 1.21.178 → 1.21.179
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 +22 -17
- package/docs/copy-inventory.md +25 -25
- package/docs/copy-registry.json +36 -36
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +2 -2
- package/modules/hall-ui/public/work.js +67 -14
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/module-api.js +1 -1
- package/tests/goal_sort_staleness.mjs +1 -1
- package/tests/work_board_live_refresh.mjs +236 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/bongos/package-core.js",
|
|
5
|
-
"core_version": "1.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.179",
|
|
6
|
+
"core_contract": "1.21.179",
|
|
7
|
+
"source_commit": "178a6fa539e3718e93bab31e4ced14262d1457a6",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-26T00:
|
|
9
|
+
"built_at": "2026-10-26T00:44:53.003Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 616,
|
|
13
13
|
"agent_docs_stubbed": 29,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 3537,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 4183,
|
|
20
|
+
"tree_sha256": "026997dfda1f061de2986ae1e869fbe88be80237fa31d02b7f1d2480dd9d51e4",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2422,12 +2422,12 @@
|
|
|
2422
2422
|
{
|
|
2423
2423
|
"path": "docs/copy-inventory.md",
|
|
2424
2424
|
"mode": "0000644",
|
|
2425
|
-
"sha256": "
|
|
2425
|
+
"sha256": "7eda6b4420e558f09a5d237130f60cf8443ce8ff5f5a0696632805446da37af4"
|
|
2426
2426
|
},
|
|
2427
2427
|
{
|
|
2428
2428
|
"path": "docs/copy-registry.json",
|
|
2429
2429
|
"mode": "0000644",
|
|
2430
|
-
"sha256": "
|
|
2430
|
+
"sha256": "badee953ce40105230c6aa643a0dd4fedd8ff6fe024fc0d8de4bc6deee50f9a5"
|
|
2431
2431
|
},
|
|
2432
2432
|
{
|
|
2433
2433
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2937,7 +2937,7 @@
|
|
|
2937
2937
|
{
|
|
2938
2938
|
"path": "docs/module-api-changelog.md",
|
|
2939
2939
|
"mode": "0000644",
|
|
2940
|
-
"sha256": "
|
|
2940
|
+
"sha256": "5d9dd0fe4686c1dde4914b7b17f35d182ef0e931f4e4e3a682008df73364cc94"
|
|
2941
2941
|
},
|
|
2942
2942
|
{
|
|
2943
2943
|
"path": "docs/modules-contract.md",
|
|
@@ -3027,7 +3027,7 @@
|
|
|
3027
3027
|
{
|
|
3028
3028
|
"path": "docs/page-readings.json",
|
|
3029
3029
|
"mode": "0000644",
|
|
3030
|
-
"sha256": "
|
|
3030
|
+
"sha256": "396e53e8d1a4fce1d46726261ea9e0328d4f97c2c883c4964471875556be9b69"
|
|
3031
3031
|
},
|
|
3032
3032
|
{
|
|
3033
3033
|
"path": "docs/project-context.template.md",
|
|
@@ -6862,7 +6862,7 @@
|
|
|
6862
6862
|
{
|
|
6863
6863
|
"path": "modules/hall-ui/public/work.js",
|
|
6864
6864
|
"mode": "0000644",
|
|
6865
|
-
"sha256": "
|
|
6865
|
+
"sha256": "7dad67bff97ad03682ad6e9a44d71f19b25a00ed6e9732d80e50fd48ac9381d3"
|
|
6866
6866
|
},
|
|
6867
6867
|
{
|
|
6868
6868
|
"path": "modules/hall-ui/public/work.states.json",
|
|
@@ -10827,12 +10827,12 @@
|
|
|
10827
10827
|
{
|
|
10828
10828
|
"path": "package-lock.json",
|
|
10829
10829
|
"mode": "0000644",
|
|
10830
|
-
"sha256": "
|
|
10830
|
+
"sha256": "a310406cb88d9fa7053aa0002367fc0d02e00f0fa3a566353e7ec4d93700ee0f"
|
|
10831
10831
|
},
|
|
10832
10832
|
{
|
|
10833
10833
|
"path": "package.json",
|
|
10834
10834
|
"mode": "0000644",
|
|
10835
|
-
"sha256": "
|
|
10835
|
+
"sha256": "78692b77c9c7abc874c9237014f3953b714f1b4d90b7102b323a48cff93c41ed"
|
|
10836
10836
|
},
|
|
10837
10837
|
{
|
|
10838
10838
|
"path": "public-docs/index.html",
|
|
@@ -10852,7 +10852,7 @@
|
|
|
10852
10852
|
{
|
|
10853
10853
|
"path": "release-notes.json",
|
|
10854
10854
|
"mode": "0000644",
|
|
10855
|
-
"sha256": "
|
|
10855
|
+
"sha256": "9c2abac99e107bc56a08f65863cf2367ceeceb9c7a4823e41db7e9805c829e4c"
|
|
10856
10856
|
},
|
|
10857
10857
|
{
|
|
10858
10858
|
"path": "scripts/bongos/CLAUDE.md",
|
|
@@ -14677,7 +14677,7 @@
|
|
|
14677
14677
|
{
|
|
14678
14678
|
"path": "src/module-api.js",
|
|
14679
14679
|
"mode": "0000644",
|
|
14680
|
-
"sha256": "
|
|
14680
|
+
"sha256": "622387442066f1d43a8f2514f706770b6c3fb6972e7bb60642da1a7b31117c4d"
|
|
14681
14681
|
},
|
|
14682
14682
|
{
|
|
14683
14683
|
"path": "src/module-loader/catalog.js",
|
|
@@ -16637,7 +16637,7 @@
|
|
|
16637
16637
|
{
|
|
16638
16638
|
"path": "tests/goal_sort_staleness.mjs",
|
|
16639
16639
|
"mode": "0000644",
|
|
16640
|
-
"sha256": "
|
|
16640
|
+
"sha256": "3432418888224a9ad2ed6cd3c30dbb8ed2ffc76318ff47537115dd3a36972d32"
|
|
16641
16641
|
},
|
|
16642
16642
|
{
|
|
16643
16643
|
"path": "tests/goal_spec_task.mjs",
|
|
@@ -20889,6 +20889,11 @@
|
|
|
20889
20889
|
"mode": "0000644",
|
|
20890
20890
|
"sha256": "486bb5b4af30db3ab3a6a0f047edf60a9d4ec5a70cb1c19cebbd1fcd89578799"
|
|
20891
20891
|
},
|
|
20892
|
+
{
|
|
20893
|
+
"path": "tests/work_board_live_refresh.mjs",
|
|
20894
|
+
"mode": "0000644",
|
|
20895
|
+
"sha256": "a5d8cb543f153345c7f4361ccd59d520b003d9e5ba8d3f3ff315d795c3ee849b"
|
|
20896
|
+
},
|
|
20892
20897
|
{
|
|
20893
20898
|
"path": "tests/work_title_wrap.mjs",
|
|
20894
20899
|
"mode": "0000644",
|
package/docs/copy-inventory.md
CHANGED
|
@@ -68,9 +68,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
68
68
|
| `08afb1257b71` | 3x | Back to home | modules/hall-ui/public/drachmae.html:83, modules/hall-ui/public/primer.html:85, modules/hall-ui/public/primer.js:282 |
|
|
69
69
|
| `118026595c16` | 3x | Board Room | modules/hall-ui/public/board-room.html:20, modules/hall-ui/public/board-room.html:20, modules/hall-ui/public/board-room.html:31 |
|
|
70
70
|
| `a78477a24a48` | 3x | Builders' Hall | modules/hall-ui/public/index.html:12, modules/hall-ui/public/index.html:12, modules/hall-ui/public/index.html:51 |
|
|
71
|
-
| `c10806b50c61` | 3x | Claim task {…} | modules/hall-ui/public/builders.js:911, modules/hall-ui/public/goals-render.js:369, modules/hall-ui/public/work.js:
|
|
71
|
+
| `c10806b50c61` | 3x | Claim task {…} | modules/hall-ui/public/builders.js:911, modules/hall-ui/public/goals-render.js:369, modules/hall-ui/public/work.js:493 |
|
|
72
72
|
| `12ee050d0180` | 3x | Copy desk | modules/hall-ui/public/copy-desk.html:15, modules/hall-ui/public/copy-desk.html:15, modules/hall-ui/public/copy-desk.html:27 |
|
|
73
|
-
| `a873e7c29d80` | 3x | Copy prompt | modules/hall-ui/public/task.js:820, modules/hall-ui/public/task.js:843, modules/hall-ui/public/work.js:
|
|
73
|
+
| `a873e7c29d80` | 3x | Copy prompt | modules/hall-ui/public/task.js:820, modules/hall-ui/public/task.js:843, modules/hall-ui/public/work.js:645 |
|
|
74
74
|
| `9c728558d6e7` | 3x | Drachmae & karma | modules/hall-ui/public/drachmae.html:22, modules/hall-ui/public/drachmae.html:22, modules/hall-ui/public/drachmae.html:34 |
|
|
75
75
|
| `e0e2606e1104` | 3x | Fleet costs | modules/hall-ui/public/fleet.html:15, modules/hall-ui/public/fleet.html:15, modules/hall-ui/public/fleet.html:26 |
|
|
76
76
|
| `f2671b0f02da` | 3x | My agents | modules/hall-ui/public/my-agents.html:18, modules/hall-ui/public/my-agents.html:18, modules/hall-ui/public/my-agents.html:31 |
|
|
@@ -292,7 +292,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
292
292
|
| `b7d5648b66db` | certain | Claim it | `modules/hall-ui/public/task.js:859` |
|
|
293
293
|
| `c10806b50c61` | certain | Claim task {…} | `modules/hall-ui/public/builders.js:911` |
|
|
294
294
|
| `c10806b50c61` | certain | Claim task {…} | `modules/hall-ui/public/goals-render.js:369` |
|
|
295
|
-
| `c10806b50c61` | certain | Claim task {…} | `modules/hall-ui/public/work.js:
|
|
295
|
+
| `c10806b50c61` | certain | Claim task {…} | `modules/hall-ui/public/work.js:493` |
|
|
296
296
|
| `84664050c372` | certain | Claimed by another builder | `modules/hall-ui/public/goals-render.js:375` |
|
|
297
297
|
| `18a03475e536` | certain | Claude Code | `modules/hall-ui/public/hall-render.js:841` |
|
|
298
298
|
| `ccb94814e3c2` | certain | Claude can start it when you ask in plain words. | `modules/hall-ui/public/commands.html:33` |
|
|
@@ -334,14 +334,14 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
334
334
|
| `ebc8a6c16a22` | certain | Copy parallel prompt | `modules/hall-ui/public/work.html:166` |
|
|
335
335
|
| `a873e7c29d80` | certain | Copy prompt | `modules/hall-ui/public/task.js:820` |
|
|
336
336
|
| `a873e7c29d80` | certain | Copy prompt | `modules/hall-ui/public/task.js:843` |
|
|
337
|
-
| `a873e7c29d80` | certain | Copy prompt | `modules/hall-ui/public/work.js:
|
|
337
|
+
| `a873e7c29d80` | certain | Copy prompt | `modules/hall-ui/public/work.js:645` |
|
|
338
338
|
| `8e2046777710` | certain | Copy prompt for task {…} | `modules/hall-ui/public/goals-render.js:370` |
|
|
339
|
-
| `8e2046777710` | certain | Copy prompt for task {…} | `modules/hall-ui/public/work.js:
|
|
339
|
+
| `8e2046777710` | certain | Copy prompt for task {…} | `modules/hall-ui/public/work.js:493` |
|
|
340
340
|
| `8618c85d014f` | certain | Copy sequential prompt | `modules/hall-ui/public/goals.html:181` |
|
|
341
341
|
| `8618c85d014f` | certain | Copy sequential prompt | `modules/hall-ui/public/work.html:167` |
|
|
342
342
|
| `7306a1448097` | certain | Copy someone has judged as needing attention, with their reason. Anyone can file one; closing it needs the | `modules/hall-ui/public/copy-desk.html:47` |
|
|
343
343
|
| `3837f6d586a3` | certain | Copy the task prompt to your clipboard | `modules/hall-ui/public/goals-render.js:370` |
|
|
344
|
-
| `3837f6d586a3` | certain | Copy the task prompt to your clipboard | `modules/hall-ui/public/work.js:
|
|
344
|
+
| `3837f6d586a3` | certain | Copy the task prompt to your clipboard | `modules/hall-ui/public/work.js:493` |
|
|
345
345
|
| `f770588750ef` | certain | Copy-write Approval queue | `modules/hall-ui/public/studio.html:127` |
|
|
346
346
|
| `301afa9a94b9` | certain | Costs us / month | `modules/hall-ui/public/fleet-costs.js:70` |
|
|
347
347
|
| `395ba7a5af09` | certain | Could not add a card: {…} | `modules/hall-ui/public/settings-passkeys.js:96` |
|
|
@@ -355,7 +355,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
355
355
|
| `9ab613a308d6` | certain | Could not check for updates: {…}. | `modules/hall-ui/public/settings-software-update.js:288` |
|
|
356
356
|
| `c3f99e7c6e6b` | certain | Could not copy automatically — select and copy manually. ({…}) | `modules/hall-ui/public/settings.js:820` |
|
|
357
357
|
| `e3fd1febf63d` | certain | Could not copy to the clipboard. Try again. | `modules/hall-ui/public/goals-page.js:435` |
|
|
358
|
-
| `e3fd1febf63d` | certain | Could not copy to the clipboard. Try again. | `modules/hall-ui/public/work.js:
|
|
358
|
+
| `e3fd1febf63d` | certain | Could not copy to the clipboard. Try again. | `modules/hall-ui/public/work.js:660` |
|
|
359
359
|
| `04824d351824` | certain | Could not copy — select the text and copy it manually. | `modules/hall-ui/public/copy-on-click.js:110` |
|
|
360
360
|
| `fa309d1d0104` | certain | Could not create rank: {…} | `modules/hall-ui/public/government.js:486` |
|
|
361
361
|
| `7054cd87b5ec` | certain | Could not end that session: {…} | `modules/hall-ui/public/settings-sessions.js:85` |
|
|
@@ -788,7 +788,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
788
788
|
| `41ec1cf65d6f` | certain | No GitHub account yet? Make a free one at | `modules/hall-ui/public/hall-render.js:300` |
|
|
789
789
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/builders.js:474` |
|
|
790
790
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/profile.js:194` |
|
|
791
|
-
| `479c1a45f39d` | certain | No backlog tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:
|
|
791
|
+
| `479c1a45f39d` | certain | No backlog tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:843` |
|
|
792
792
|
| `83f62fc94271` | certain | No builder account found for this sign-in. | `modules/hall-ui/public/settings.js:1213` |
|
|
793
793
|
| `acab89358bdd` | certain | No cards registered yet. | `modules/hall-ui/public/settings-passkeys.js:35` |
|
|
794
794
|
| `449db2ead464` | certain | No changes are listed for this version. | `modules/hall-ui/public/settings-software-update.js:148` |
|
|
@@ -796,7 +796,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
796
796
|
| `b1ada579483c` | certain | No custom ranks yet | `modules/hall-ui/public/government.js:396` |
|
|
797
797
|
| `6e2d2e11f84a` | certain | No description. | `modules/hall-ui/public/idea.js:122` |
|
|
798
798
|
| `881d06b5e79f` | certain | No done-when criteria yet | `modules/hall-ui/public/goals-render.js:159` |
|
|
799
|
-
| `93c00cb1423a` | certain | No goal | `modules/hall-ui/public/work.js:
|
|
799
|
+
| `93c00cb1423a` | certain | No goal | `modules/hall-ui/public/work.js:620` |
|
|
800
800
|
| `d10dca462260` | certain | No goal (homeless) | `modules/hall-ui/public/ideas.js:581` |
|
|
801
801
|
| `70adb03c606b` | certain | No goal has started yet. | `modules/hall-ui/public/roadmap.js:128` |
|
|
802
802
|
| `abc64639b134` | certain | No goals seeded yet. | `modules/hall-ui/public/roadmap.js:228` |
|
|
@@ -825,7 +825,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
825
825
|
| `4485497d87bb` | certain | No specialities yet. Create one below — it takes a name and a craft, and you can train it afterwards. | `modules/hall-ui/public/settings-specialities.js:416` |
|
|
826
826
|
| `545dc44ad427` | certain | No task in this goal depends on another task in this goal. | `modules/hall-ui/public/goal-forest-render.js:164` |
|
|
827
827
|
| `da838f6056b1` | certain | No tasks for this stage yet. | `modules/hall-ui/public/genesis-home.js:192` |
|
|
828
|
-
| `712b64d8273f` | certain | No tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:
|
|
828
|
+
| `712b64d8273f` | certain | No tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:438` |
|
|
829
829
|
| `2302ee46744e` | certain | No terminal commands found. | `modules/hall-ui/public/commands.js:46` |
|
|
830
830
|
| `78f78d1d1e1f` | certain | No version is in flight right now. | `modules/hall-ui/public/roadmap.js:433` |
|
|
831
831
|
| `c9800f8b6bc8` | certain | No versions declared yet. | `modules/hall-ui/public/roadmap.js:451` |
|
|
@@ -877,7 +877,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
877
877
|
| `cd652d04d616` | certain | Nothing changes yet. This files a task carrying your wording; whoever claims it lands the diff, and it ships g | `modules/hall-ui/public/copy-desk.html:168` |
|
|
878
878
|
| `65434cfeb080` | certain | Nothing claimable right now | `modules/hall-ui/public/goals.js:71` |
|
|
879
879
|
| `b4b8ed14e704` | certain | Nothing explored yet. Pick a starting point in the sky. | `modules/hall-ui/public/sky-panel.js:134` |
|
|
880
|
-
| `fec5d78497e8` | certain | Nothing in the backlog right now. | `modules/hall-ui/public/work.js:
|
|
880
|
+
| `fec5d78497e8` | certain | Nothing in the backlog right now. | `modules/hall-ui/public/work.js:829` |
|
|
881
881
|
| `905e99f158c2` | certain | Nothing is discarded by omission: every task needs a decision before this can be submitted. Abandoning stamps | `modules/hall-ui/public/goals-render.js:1032` |
|
|
882
882
|
| `8edb2116af0d` | certain | Nothing is on your desk yet. The Tweak/CopyWrite Flow has a page ready for you. | `modules/hall-ui/public/studio.html:102` |
|
|
883
883
|
| `2ec0fbb20a42` | certain | Nothing is waiting. A spark appears here when its author offers a quick idea up for development. | `modules/hall-ui/public/ideas.js:863` |
|
|
@@ -921,7 +921,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
921
921
|
| `03197f066323` | certain | Open it in the tweak editor | `modules/hall-ui/public/paintbrush.js:444` |
|
|
922
922
|
| `3366b115217b` | certain | Open navigation | `modules/hall-ui/public/shell.js:532` |
|
|
923
923
|
| `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/goals-render.js:435` |
|
|
924
|
-
| `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/work.js:
|
|
924
|
+
| `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/work.js:866` |
|
|
925
925
|
| `99c630009152` | certain | Open tasks whose declared files overlap — sequence these before two builders collide. | `modules/hall-ui/public/goals.html:201` |
|
|
926
926
|
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:212` |
|
|
927
927
|
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:217` |
|
|
@@ -990,9 +990,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
990
990
|
| `1fe749ae5677` | certain | Project settings — {{worldName}} | `modules/hall-ui/public/project-settings.html:6` |
|
|
991
991
|
| `16521a997ade` | certain | Project type | `modules/hall-ui/public/government.js:894` |
|
|
992
992
|
| `dd4bc23c7759` | certain | Prompt for #{…} copied to your clipboard. | `modules/hall-ui/public/goals-page.js:428` |
|
|
993
|
-
| `dd4bc23c7759` | certain | Prompt for #{…} copied to your clipboard. | `modules/hall-ui/public/work.js:
|
|
993
|
+
| `dd4bc23c7759` | certain | Prompt for #{…} copied to your clipboard. | `modules/hall-ui/public/work.js:647` |
|
|
994
994
|
| `cd7dc83871b6` | certain | Prompt for #{…} copied. | `modules/hall-ui/public/goals-page.js:434` |
|
|
995
|
-
| `cd7dc83871b6` | certain | Prompt for #{…} copied. | `modules/hall-ui/public/work.js:
|
|
995
|
+
| `cd7dc83871b6` | certain | Prompt for #{…} copied. | `modules/hall-ui/public/work.js:658` |
|
|
996
996
|
| `fe7f3488fda8` | certain | Propose new wording | `modules/hall-ui/public/copy-desk.html:152` |
|
|
997
997
|
| `abee9a18325d` | certain | Propose wording… | `modules/hall-ui/public/copy-desk.js:179` |
|
|
998
998
|
| `995dd1ee728d` | certain | Proposed to | `modules/hall-ui/public/my-agents.js:558` |
|
|
@@ -1022,7 +1022,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1022
1022
|
| `9ea556e7b78b` | certain | Reason (optional) | `modules/hall-ui/public/task-detail.js:626` |
|
|
1023
1023
|
| `4f619c19a8e7` | certain | Rebase owed | `modules/hall-ui/public/hall-render.js:683` |
|
|
1024
1024
|
| `d65a380a71c4` | certain | Recent filings | `modules/hall-ui/public/ideas.html:109` |
|
|
1025
|
-
| `58fb6fe4b47e` | certain | Recent history could not be loaded right now. | `modules/hall-ui/public/work.js:
|
|
1025
|
+
| `58fb6fe4b47e` | certain | Recent history could not be loaded right now. | `modules/hall-ui/public/work.js:1004` |
|
|
1026
1026
|
| `21a0b09bf10f` | certain | Recent updates | `modules/hall-ui/public/settings-software-update.js:195` |
|
|
1027
1027
|
| `0b2d1327608f` | certain | Recently shipped | `modules/hall-ui/public/hall-widgets.js:115` |
|
|
1028
1028
|
| `5419ad9503ef` | certain | Recommended for your project | `modules/hall-ui/public/government.js:931` |
|
|
@@ -1033,7 +1033,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1033
1033
|
| `6d8347c3575a` | certain | Release a thought | `modules/hall-ui/public/thinking.html:98` |
|
|
1034
1034
|
| `58af483d7a84` | certain | Release task {…} | `modules/hall-ui/public/goals-render.js:372` |
|
|
1035
1035
|
| `6f86e17007c6` | certain | Release your claim on #{…}? It returns to the queue and no {…} are earned. | `modules/hall-ui/public/goals-page.js:543` |
|
|
1036
|
-
| `6f86e17007c6` | certain | Release your claim on #{…}? It returns to the queue and no {…} are earned. | `modules/hall-ui/public/work.js:
|
|
1036
|
+
| `6f86e17007c6` | certain | Release your claim on #{…}? It returns to the queue and no {…} are earned. | `modules/hall-ui/public/work.js:752` |
|
|
1037
1037
|
| `975ffb256651` | certain | Release {…}? {…} to the queue and no {…} are earned. | `modules/hall-ui/public/bulk-toolbar.js:249` |
|
|
1038
1038
|
| `c49f9b9f8864` | certain | Remake or tweak | `modules/hall-ui/public/studio.js:214` |
|
|
1039
1039
|
| `65e3399a8fbf` | certain | Remove filter | `modules/hall-ui/public/hall-kit.js:313` |
|
|
@@ -1121,10 +1121,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1121
1121
|
| `55cde0774831` | certain | See what would change | `modules/hall-ui/public/deploy.js:430` |
|
|
1122
1122
|
| `75dc5463facc` | certain | Select at least 2 waiting tasks to copy a parallel-session prompt. | `modules/hall-ui/public/bulk-toolbar.js:181` |
|
|
1123
1123
|
| `a98882faa482` | certain | Select at least 2 waiting tasks to copy a sequential prompt. | `modules/hall-ui/public/bulk-toolbar.js:206` |
|
|
1124
|
-
| `582bdd9435eb` | certain | Select task {…} for bulk actions | `modules/hall-ui/public/work.js:
|
|
1124
|
+
| `582bdd9435eb` | certain | Select task {…} for bulk actions | `modules/hall-ui/public/work.js:479` |
|
|
1125
1125
|
| `d91c8e9be76c` | certain | Select task {…} for bulk claim | `modules/hall-ui/public/goals-render.js:361` |
|
|
1126
1126
|
| `7e1d54119e08` | certain | Select task {…} for bulk release | `modules/hall-ui/public/goals-render.js:363` |
|
|
1127
|
-
| `7e1d54119e08` | certain | Select task {…} for bulk release | `modules/hall-ui/public/work.js:
|
|
1127
|
+
| `7e1d54119e08` | certain | Select task {…} for bulk release | `modules/hall-ui/public/work.js:269` |
|
|
1128
1128
|
| `ae43a132699b` | certain | Selectable today | `modules/hall-ui/public/government.js:847` |
|
|
1129
1129
|
| `3a4e95274918` | certain | Send for approval | `modules/hall-ui/public/paintbrush.js:173` |
|
|
1130
1130
|
| `53cc6d8dd23c` | certain | Send invitation | `modules/hall-ui/public/goals-render.js:1234` |
|
|
@@ -1357,11 +1357,11 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1357
1357
|
| `d00666a91ac4` | certain | The studio page is yours, but its words could not be read just now. Open it in the editor. | `modules/hall-ui/public/studio.js:938` |
|
|
1358
1358
|
| `599fd0e82d1c` | certain | The task board — all work | `modules/hall-ui/public/studio.html:178` |
|
|
1359
1359
|
| `198ba9353bf6` | certain | The task feed did not answer. Nothing on the record has changed, only the read failed. Try again in a moment, | `modules/hall-ui/public/task.js:1031` |
|
|
1360
|
-
| `34555793f33e` | certain | The task list could not be loaded right now. | `modules/hall-ui/public/work.js:
|
|
1360
|
+
| `34555793f33e` | certain | The task list could not be loaded right now. | `modules/hall-ui/public/work.js:1080` |
|
|
1361
1361
|
| `8c991355687d` | certain | The upgrade checked {…} and refused:{…} | `modules/hall-ui/public/deploy.js:473` |
|
|
1362
1362
|
| `a42a37c43bfb` | certain | The words this project shows people — what has been flagged, and what nobody has looked at. | `modules/hall-ui/public/copy-desk.js:328` |
|
|
1363
1363
|
| `d51b954e0aa9` | certain | The words you changed | `modules/hall-ui/public/approval-queue.js:215` |
|
|
1364
|
-
| `bcdbded93d4e` | certain | The work board failed to load. Reload to try again. | `modules/hall-ui/public/work.js:
|
|
1364
|
+
| `bcdbded93d4e` | certain | The work board failed to load. Reload to try again. | `modules/hall-ui/public/work.js:1268` |
|
|
1365
1365
|
| `eb4e0e565f6f` | certain | Their rank on that project, as that project reports it. | `modules/hall-ui/public/profile.js:388` |
|
|
1366
1366
|
| `996d2aa0e2f0` | certain | Then copy the project onto your machine, install its dependencies, and sign in: | `modules/hall-ui/public/hall-render.js:841` |
|
|
1367
1367
|
| `383018c7df70` | certain | There is no transcript you can read for this session. | `modules/hall-ui/public/sessions.js:234` |
|
|
@@ -1466,7 +1466,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1466
1466
|
| `c1fcfa9b48c2` | certain | Watch — {{worldName}} | `modules/hall-ui/public/watch.html:6` |
|
|
1467
1467
|
| `c1fcfa9b48c2` | certain | Watch — {{worldName}} | `modules/hall-ui/public/watch.html:6` |
|
|
1468
1468
|
| `0658f0358ffd` | certain | Welcome back, {…}. | `modules/hall-ui/public/hall-render.js:596` |
|
|
1469
|
-
| `72e85d35e6be` | certain | Welcome, {…}. Pick up work, or follow what is moving. | `modules/hall-ui/public/work.js:
|
|
1469
|
+
| `72e85d35e6be` | certain | Welcome, {…}. Pick up work, or follow what is moving. | `modules/hall-ui/public/work.js:995` |
|
|
1470
1470
|
| `60853319f290` | certain | What are you doing now? | `modules/hall-ui/public/craft-mode.js:675` |
|
|
1471
1471
|
| `d6bae87dc29b` | certain | What builders will see | `modules/hall-ui/public/government.html:84` |
|
|
1472
1472
|
| `c077272746d4` | certain | What could this page become? | `modules/hall-ui/public/lightbulb.js:74` |
|
|
@@ -1799,7 +1799,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1799
1799
|
| `43e6f1592ae3` | certain | submit it in the editor | `modules/hall-ui/public/studio.js:868` |
|
|
1800
1800
|
| `9ec19e32f86f` | certain | submit page | `modules/hall-ui/public/tweak-editor.html:68` |
|
|
1801
1801
|
| `da30b952a60b` | certain | system / unattributed | `modules/hall-ui/public/goals-page.js:284` |
|
|
1802
|
-
| `da30b952a60b` | certain | system / unattributed | `modules/hall-ui/public/work.js:
|
|
1802
|
+
| `da30b952a60b` | certain | system / unattributed | `modules/hall-ui/public/work.js:592` |
|
|
1803
1803
|
| `70bbd20d223f` | certain | take it | `modules/hall-ui/public/studio.js:699` |
|
|
1804
1804
|
| `d4f99c118825` | certain | take next | `modules/hall-ui/public/tweak-editor.html:106` |
|
|
1805
1805
|
| `357cc737dd98` | certain | take the studio page | `modules/hall-ui/public/studio.html:109` |
|
|
@@ -1928,10 +1928,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1928
1928
|
| `8e28c14b106d` | certain | {…} total | `modules/hall-ui/public/roadmap.js:120` |
|
|
1929
1929
|
| `1a8a6267e490` | certain | {…} unfinished task{…} — say what happens to each | `modules/hall-ui/public/goals-render.js:1032` |
|
|
1930
1930
|
| `2f75f69cdb2f` | certain | {…} {…} changed | `modules/hall-ui/public/profile-crafts.js:218` |
|
|
1931
|
-
| `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:
|
|
1931
|
+
| `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:431` |
|
|
1932
1932
|
| `a9216af9b05e` | certain | {…} {…} — how-to | `modules/hall-ui/public/modules.js:646` |
|
|
1933
1933
|
| `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:514` |
|
|
1934
|
-
| `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:
|
|
1934
|
+
| `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:276` |
|
|
1935
1935
|
| `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:878` |
|
|
1936
1936
|
| `a6e4ed98fbea` | certain | {…} · revoke it any time under Active sessions. | `modules/hall-ui/public/settings.js:810` |
|
|
1937
1937
|
| `d73256fbc395` | certain | {…} · who votes, and how it {…} | `modules/hall-ui/public/board-room.js:480` |
|
|
@@ -1993,7 +1993,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1993
1993
|
| `5d6f38a02386` | certain | ⚖ admitted | `modules/hall-ui/public/goals-render.js:194` |
|
|
1994
1994
|
| `9a4bcd727224` | certain | ⚠ overlaps {…} | `modules/hall-ui/public/task-lib.js:74` |
|
|
1995
1995
|
| `fe81a8973cc2` | certain | ✎ {…} file{…} | `modules/hall-ui/public/goals-render.js:343` |
|
|
1996
|
-
| `fe81a8973cc2` | certain | ✎ {…} file{…} | `modules/hall-ui/public/work.js:
|
|
1996
|
+
| `fe81a8973cc2` | certain | ✎ {…} file{…} | `modules/hall-ui/public/work.js:467` |
|
|
1997
1997
|
| `5938da97d113` | certain | ⤍ PLANNED | `modules/hall-ui/public/diagrams.html:40` |
|
|
1998
1998
|
| `65790f65c6f4` | certain | 🔒 Private | `modules/hall-ui/public/goals-render.js:867` |
|
|
1999
1999
|
| `7e1bb38d4777` | certain | 🔒 Request to join | `modules/hall-ui/public/goals-render.js:967` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -519,7 +519,7 @@
|
|
|
519
519
|
"at": [
|
|
520
520
|
"modules/hall-ui/public/builders.js:911",
|
|
521
521
|
"modules/hall-ui/public/goals-render.js:369",
|
|
522
|
-
"modules/hall-ui/public/work.js:
|
|
522
|
+
"modules/hall-ui/public/work.js:493"
|
|
523
523
|
]
|
|
524
524
|
},
|
|
525
525
|
{
|
|
@@ -541,7 +541,7 @@
|
|
|
541
541
|
"at": [
|
|
542
542
|
"modules/hall-ui/public/task.js:820",
|
|
543
543
|
"modules/hall-ui/public/task.js:843",
|
|
544
|
-
"modules/hall-ui/public/work.js:
|
|
544
|
+
"modules/hall-ui/public/work.js:645"
|
|
545
545
|
]
|
|
546
546
|
},
|
|
547
547
|
{
|
|
@@ -1038,7 +1038,7 @@
|
|
|
1038
1038
|
"occurrences": 2,
|
|
1039
1039
|
"at": [
|
|
1040
1040
|
"modules/hall-ui/public/goals-render.js:370",
|
|
1041
|
-
"modules/hall-ui/public/work.js:
|
|
1041
|
+
"modules/hall-ui/public/work.js:493"
|
|
1042
1042
|
]
|
|
1043
1043
|
},
|
|
1044
1044
|
{
|
|
@@ -1058,7 +1058,7 @@
|
|
|
1058
1058
|
"occurrences": 2,
|
|
1059
1059
|
"at": [
|
|
1060
1060
|
"modules/hall-ui/public/goals-render.js:370",
|
|
1061
|
-
"modules/hall-ui/public/work.js:
|
|
1061
|
+
"modules/hall-ui/public/work.js:493"
|
|
1062
1062
|
]
|
|
1063
1063
|
},
|
|
1064
1064
|
{
|
|
@@ -1068,7 +1068,7 @@
|
|
|
1068
1068
|
"occurrences": 2,
|
|
1069
1069
|
"at": [
|
|
1070
1070
|
"modules/hall-ui/public/goals-page.js:435",
|
|
1071
|
-
"modules/hall-ui/public/work.js:
|
|
1071
|
+
"modules/hall-ui/public/work.js:660"
|
|
1072
1072
|
]
|
|
1073
1073
|
},
|
|
1074
1074
|
{
|
|
@@ -1598,7 +1598,7 @@
|
|
|
1598
1598
|
"occurrences": 2,
|
|
1599
1599
|
"at": [
|
|
1600
1600
|
"modules/hall-ui/public/goals-render.js:435",
|
|
1601
|
-
"modules/hall-ui/public/work.js:
|
|
1601
|
+
"modules/hall-ui/public/work.js:866"
|
|
1602
1602
|
]
|
|
1603
1603
|
},
|
|
1604
1604
|
{
|
|
@@ -1678,7 +1678,7 @@
|
|
|
1678
1678
|
"occurrences": 2,
|
|
1679
1679
|
"at": [
|
|
1680
1680
|
"modules/hall-ui/public/goals-page.js:428",
|
|
1681
|
-
"modules/hall-ui/public/work.js:
|
|
1681
|
+
"modules/hall-ui/public/work.js:647"
|
|
1682
1682
|
]
|
|
1683
1683
|
},
|
|
1684
1684
|
{
|
|
@@ -1688,7 +1688,7 @@
|
|
|
1688
1688
|
"occurrences": 2,
|
|
1689
1689
|
"at": [
|
|
1690
1690
|
"modules/hall-ui/public/goals-page.js:434",
|
|
1691
|
-
"modules/hall-ui/public/work.js:
|
|
1691
|
+
"modules/hall-ui/public/work.js:658"
|
|
1692
1692
|
]
|
|
1693
1693
|
},
|
|
1694
1694
|
{
|
|
@@ -1738,7 +1738,7 @@
|
|
|
1738
1738
|
"occurrences": 2,
|
|
1739
1739
|
"at": [
|
|
1740
1740
|
"modules/hall-ui/public/goals-page.js:543",
|
|
1741
|
-
"modules/hall-ui/public/work.js:
|
|
1741
|
+
"modules/hall-ui/public/work.js:752"
|
|
1742
1742
|
]
|
|
1743
1743
|
},
|
|
1744
1744
|
{
|
|
@@ -1838,7 +1838,7 @@
|
|
|
1838
1838
|
"occurrences": 2,
|
|
1839
1839
|
"at": [
|
|
1840
1840
|
"modules/hall-ui/public/goals-render.js:363",
|
|
1841
|
-
"modules/hall-ui/public/work.js:
|
|
1841
|
+
"modules/hall-ui/public/work.js:269"
|
|
1842
1842
|
]
|
|
1843
1843
|
},
|
|
1844
1844
|
{
|
|
@@ -2328,7 +2328,7 @@
|
|
|
2328
2328
|
"occurrences": 2,
|
|
2329
2329
|
"at": [
|
|
2330
2330
|
"modules/hall-ui/public/goals-page.js:284",
|
|
2331
|
-
"modules/hall-ui/public/work.js:
|
|
2331
|
+
"modules/hall-ui/public/work.js:592"
|
|
2332
2332
|
]
|
|
2333
2333
|
},
|
|
2334
2334
|
{
|
|
@@ -2568,7 +2568,7 @@
|
|
|
2568
2568
|
"occurrences": 2,
|
|
2569
2569
|
"at": [
|
|
2570
2570
|
"modules/hall-ui/public/watch.js:514",
|
|
2571
|
-
"modules/hall-ui/public/work.js:
|
|
2571
|
+
"modules/hall-ui/public/work.js:276"
|
|
2572
2572
|
]
|
|
2573
2573
|
},
|
|
2574
2574
|
{
|
|
@@ -2598,7 +2598,7 @@
|
|
|
2598
2598
|
"occurrences": 2,
|
|
2599
2599
|
"at": [
|
|
2600
2600
|
"modules/hall-ui/public/goals-render.js:343",
|
|
2601
|
-
"modules/hall-ui/public/work.js:
|
|
2601
|
+
"modules/hall-ui/public/work.js:467"
|
|
2602
2602
|
]
|
|
2603
2603
|
}
|
|
2604
2604
|
],
|
|
@@ -4498,7 +4498,7 @@
|
|
|
4498
4498
|
"surface": "builders-hall",
|
|
4499
4499
|
"text": "Claim task {…}",
|
|
4500
4500
|
"file": "modules/hall-ui/public/work.js",
|
|
4501
|
-
"line":
|
|
4501
|
+
"line": 493,
|
|
4502
4502
|
"origin": "js-markup",
|
|
4503
4503
|
"confidence": "certain"
|
|
4504
4504
|
},
|
|
@@ -4876,7 +4876,7 @@
|
|
|
4876
4876
|
"surface": "builders-hall",
|
|
4877
4877
|
"text": "Copy prompt",
|
|
4878
4878
|
"file": "modules/hall-ui/public/work.js",
|
|
4879
|
-
"line":
|
|
4879
|
+
"line": 645,
|
|
4880
4880
|
"origin": "js-text-assign",
|
|
4881
4881
|
"confidence": "certain"
|
|
4882
4882
|
},
|
|
@@ -4894,7 +4894,7 @@
|
|
|
4894
4894
|
"surface": "builders-hall",
|
|
4895
4895
|
"text": "Copy prompt for task {…}",
|
|
4896
4896
|
"file": "modules/hall-ui/public/work.js",
|
|
4897
|
-
"line":
|
|
4897
|
+
"line": 493,
|
|
4898
4898
|
"origin": "js-markup",
|
|
4899
4899
|
"confidence": "certain"
|
|
4900
4900
|
},
|
|
@@ -4939,7 +4939,7 @@
|
|
|
4939
4939
|
"surface": "builders-hall",
|
|
4940
4940
|
"text": "Copy the task prompt to your clipboard",
|
|
4941
4941
|
"file": "modules/hall-ui/public/work.js",
|
|
4942
|
-
"line":
|
|
4942
|
+
"line": 493,
|
|
4943
4943
|
"origin": "js-markup",
|
|
4944
4944
|
"confidence": "certain"
|
|
4945
4945
|
},
|
|
@@ -5065,7 +5065,7 @@
|
|
|
5065
5065
|
"surface": "builders-hall",
|
|
5066
5066
|
"text": "Could not copy to the clipboard. Try again.",
|
|
5067
5067
|
"file": "modules/hall-ui/public/work.js",
|
|
5068
|
-
"line":
|
|
5068
|
+
"line": 660,
|
|
5069
5069
|
"origin": "js-notice",
|
|
5070
5070
|
"confidence": "certain"
|
|
5071
5071
|
},
|
|
@@ -8962,7 +8962,7 @@
|
|
|
8962
8962
|
"surface": "builders-hall",
|
|
8963
8963
|
"text": "No backlog tasks match these filters. Try widening them.",
|
|
8964
8964
|
"file": "modules/hall-ui/public/work.js",
|
|
8965
|
-
"line":
|
|
8965
|
+
"line": 843,
|
|
8966
8966
|
"origin": "js-markup",
|
|
8967
8967
|
"confidence": "certain"
|
|
8968
8968
|
},
|
|
@@ -9034,7 +9034,7 @@
|
|
|
9034
9034
|
"surface": "builders-hall",
|
|
9035
9035
|
"text": "No goal",
|
|
9036
9036
|
"file": "modules/hall-ui/public/work.js",
|
|
9037
|
-
"line":
|
|
9037
|
+
"line": 620,
|
|
9038
9038
|
"origin": "js-text-assign",
|
|
9039
9039
|
"confidence": "certain"
|
|
9040
9040
|
},
|
|
@@ -9295,7 +9295,7 @@
|
|
|
9295
9295
|
"surface": "builders-hall",
|
|
9296
9296
|
"text": "No tasks match these filters. Try widening them.",
|
|
9297
9297
|
"file": "modules/hall-ui/public/work.js",
|
|
9298
|
-
"line":
|
|
9298
|
+
"line": 438,
|
|
9299
9299
|
"origin": "js-markup",
|
|
9300
9300
|
"confidence": "certain"
|
|
9301
9301
|
},
|
|
@@ -9763,7 +9763,7 @@
|
|
|
9763
9763
|
"surface": "builders-hall",
|
|
9764
9764
|
"text": "Nothing in the backlog right now.",
|
|
9765
9765
|
"file": "modules/hall-ui/public/work.js",
|
|
9766
|
-
"line":
|
|
9766
|
+
"line": 829,
|
|
9767
9767
|
"origin": "js-markup",
|
|
9768
9768
|
"confidence": "certain"
|
|
9769
9769
|
},
|
|
@@ -10159,7 +10159,7 @@
|
|
|
10159
10159
|
"surface": "builders-hall",
|
|
10160
10160
|
"text": "Open task #{…}",
|
|
10161
10161
|
"file": "modules/hall-ui/public/work.js",
|
|
10162
|
-
"line":
|
|
10162
|
+
"line": 866,
|
|
10163
10163
|
"origin": "js-markup",
|
|
10164
10164
|
"confidence": "certain"
|
|
10165
10165
|
},
|
|
@@ -10780,7 +10780,7 @@
|
|
|
10780
10780
|
"surface": "builders-hall",
|
|
10781
10781
|
"text": "Prompt for #{…} copied to your clipboard.",
|
|
10782
10782
|
"file": "modules/hall-ui/public/work.js",
|
|
10783
|
-
"line":
|
|
10783
|
+
"line": 647,
|
|
10784
10784
|
"origin": "js-notice",
|
|
10785
10785
|
"confidence": "certain"
|
|
10786
10786
|
},
|
|
@@ -10798,7 +10798,7 @@
|
|
|
10798
10798
|
"surface": "builders-hall",
|
|
10799
10799
|
"text": "Prompt for #{…} copied.",
|
|
10800
10800
|
"file": "modules/hall-ui/public/work.js",
|
|
10801
|
-
"line":
|
|
10801
|
+
"line": 658,
|
|
10802
10802
|
"origin": "js-notice",
|
|
10803
10803
|
"confidence": "certain"
|
|
10804
10804
|
},
|
|
@@ -11068,7 +11068,7 @@
|
|
|
11068
11068
|
"surface": "builders-hall",
|
|
11069
11069
|
"text": "Recent history could not be loaded right now.",
|
|
11070
11070
|
"file": "modules/hall-ui/public/work.js",
|
|
11071
|
-
"line":
|
|
11071
|
+
"line": 1004,
|
|
11072
11072
|
"origin": "js-markup",
|
|
11073
11073
|
"confidence": "certain"
|
|
11074
11074
|
},
|
|
@@ -11167,7 +11167,7 @@
|
|
|
11167
11167
|
"surface": "builders-hall",
|
|
11168
11168
|
"text": "Release your claim on #{…}? It returns to the queue and no {…} are earned.",
|
|
11169
11169
|
"file": "modules/hall-ui/public/work.js",
|
|
11170
|
-
"line":
|
|
11170
|
+
"line": 752,
|
|
11171
11171
|
"origin": "js-notice",
|
|
11172
11172
|
"confidence": "certain"
|
|
11173
11173
|
},
|
|
@@ -11959,7 +11959,7 @@
|
|
|
11959
11959
|
"surface": "builders-hall",
|
|
11960
11960
|
"text": "Select task {…} for bulk actions",
|
|
11961
11961
|
"file": "modules/hall-ui/public/work.js",
|
|
11962
|
-
"line":
|
|
11962
|
+
"line": 479,
|
|
11963
11963
|
"origin": "js-markup",
|
|
11964
11964
|
"confidence": "certain"
|
|
11965
11965
|
},
|
|
@@ -11986,7 +11986,7 @@
|
|
|
11986
11986
|
"surface": "builders-hall",
|
|
11987
11987
|
"text": "Select task {…} for bulk release",
|
|
11988
11988
|
"file": "modules/hall-ui/public/work.js",
|
|
11989
|
-
"line":
|
|
11989
|
+
"line": 269,
|
|
11990
11990
|
"origin": "js-markup",
|
|
11991
11991
|
"confidence": "certain"
|
|
11992
11992
|
},
|
|
@@ -14083,7 +14083,7 @@
|
|
|
14083
14083
|
"surface": "builders-hall",
|
|
14084
14084
|
"text": "The task list could not be loaded right now.",
|
|
14085
14085
|
"file": "modules/hall-ui/public/work.js",
|
|
14086
|
-
"line":
|
|
14086
|
+
"line": 1080,
|
|
14087
14087
|
"origin": "js-markup",
|
|
14088
14088
|
"confidence": "certain"
|
|
14089
14089
|
},
|
|
@@ -14119,7 +14119,7 @@
|
|
|
14119
14119
|
"surface": "builders-hall",
|
|
14120
14120
|
"text": "The work board failed to load. Reload to try again.",
|
|
14121
14121
|
"file": "modules/hall-ui/public/work.js",
|
|
14122
|
-
"line":
|
|
14122
|
+
"line": 1268,
|
|
14123
14123
|
"origin": "js-notice",
|
|
14124
14124
|
"confidence": "certain"
|
|
14125
14125
|
},
|
|
@@ -15064,7 +15064,7 @@
|
|
|
15064
15064
|
"surface": "builders-hall",
|
|
15065
15065
|
"text": "Welcome, {…}. Pick up work, or follow what is moving.",
|
|
15066
15066
|
"file": "modules/hall-ui/public/work.js",
|
|
15067
|
-
"line":
|
|
15067
|
+
"line": 995,
|
|
15068
15068
|
"origin": "js-text-assign",
|
|
15069
15069
|
"confidence": "certain"
|
|
15070
15070
|
},
|
|
@@ -18061,7 +18061,7 @@
|
|
|
18061
18061
|
"surface": "builders-hall",
|
|
18062
18062
|
"text": "system / unattributed",
|
|
18063
18063
|
"file": "modules/hall-ui/public/work.js",
|
|
18064
|
-
"line":
|
|
18064
|
+
"line": 592,
|
|
18065
18065
|
"origin": "js-text-assign",
|
|
18066
18066
|
"confidence": "certain"
|
|
18067
18067
|
},
|
|
@@ -19222,7 +19222,7 @@
|
|
|
19222
19222
|
"surface": "builders-hall",
|
|
19223
19223
|
"text": "{…} {…} waiting",
|
|
19224
19224
|
"file": "modules/hall-ui/public/work.js",
|
|
19225
|
-
"line":
|
|
19225
|
+
"line": 431,
|
|
19226
19226
|
"origin": "js-text-assign",
|
|
19227
19227
|
"confidence": "certain"
|
|
19228
19228
|
},
|
|
@@ -19249,7 +19249,7 @@
|
|
|
19249
19249
|
"surface": "builders-hall",
|
|
19250
19250
|
"text": "{…} {…}{…}",
|
|
19251
19251
|
"file": "modules/hall-ui/public/work.js",
|
|
19252
|
-
"line":
|
|
19252
|
+
"line": 276,
|
|
19253
19253
|
"origin": "js-markup",
|
|
19254
19254
|
"confidence": "certain"
|
|
19255
19255
|
},
|
|
@@ -19807,7 +19807,7 @@
|
|
|
19807
19807
|
"surface": "builders-hall",
|
|
19808
19808
|
"text": "✎ {…} file{…}",
|
|
19809
19809
|
"file": "modules/hall-ui/public/work.js",
|
|
19810
|
-
"line":
|
|
19810
|
+
"line": 467,
|
|
19811
19811
|
"origin": "js-markup",
|
|
19812
19812
|
"confidence": "certain"
|
|
19813
19813
|
},
|
|
@@ -3193,5 +3193,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3193
3193
|
landed since 1.21.176 with no explicit bump. run 40241825861. (task 1002620)
|
|
3194
3194
|
1.21.178 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3195
3195
|
landed since 1.21.177 with no explicit bump. run 40249608959. (task 1002620)
|
|
3196
|
+
1.21.179 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3197
|
+
landed since 1.21.178 with no explicit bump. run 40250732318. (task 1002620)
|
|
3196
3198
|
---------------------------------------------------------------------------
|
|
3197
3199
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -4251,7 +4251,7 @@
|
|
|
4251
4251
|
"surface": "builders",
|
|
4252
4252
|
"title": "Tasks",
|
|
4253
4253
|
"states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
|
|
4254
|
-
"files_hash": "
|
|
4254
|
+
"files_hash": "7e2e0fcb30d10915",
|
|
4255
4255
|
"reading_hash": "e5b6e930db9ca1ad",
|
|
4256
4256
|
"counts": {"lines":121,"placed":48,"shared":8,"unplaced":65},
|
|
4257
4257
|
"omitted": {"data":321},
|
|
@@ -4346,7 +4346,7 @@
|
|
|
4346
4346
|
{"key":"L0087","section":"Ready — tasks to do150","text":"Claim","placement":"unplaced","occurrences":26},
|
|
4347
4347
|
{"key":"L0088","section":"Ready — tasks to do150","text":"to take a task right here — no terminal needed. Then click","placement":"placed","file":"modules/hall-ui/public/work.html","line":103,"string_id":"23488ca48320"},
|
|
4348
4348
|
{"key":"L0089","section":"Ready — tasks to do150","text":"to copy the task prompt and paste it into a fresh Claude Code session to begin.","placement":"placed","file":"modules/hall-ui/public/work.html","line":103,"string_id":"5520469f2834"},
|
|
4349
|
-
{"key":"L0090","section":"Ready — tasks to do150","text":"{…} {…} waiting","placement":"placed","file":"modules/hall-ui/public/work.js","line":
|
|
4349
|
+
{"key":"L0090","section":"Ready — tasks to do150","text":"{…} {…} waiting","placement":"placed","file":"modules/hall-ui/public/work.js","line":431,"string_id":"8186b562553a"},
|
|
4350
4350
|
{"key":"L0091","section":"Ready — tasks to do150","text":"Archon","placement":"unplaced"},
|
|
4351
4351
|
{"key":"L0092","section":"Ready — tasks to do150","text":"30m","placement":"unplaced","occurrences":5},
|
|
4352
4352
|
{"key":"L0093","section":"Ready — tasks to do150","text":"1.00 d/min","placement":"unplaced","occurrences":21},
|
|
@@ -93,6 +93,17 @@
|
|
|
93
93
|
return parts.length ? `?${parts.join('&')}` : '';
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
+
// task 1004877 — the claimable read, with a ceiling. Sort, filters, search and
|
|
97
|
+
// paging all run here over the loaded feed, so it cannot be cut to one page;
|
|
98
|
+
// 1000 is the route's own maximum, far above today's queue, and the tab count
|
|
99
|
+
// reads claimable_total so it stays honest if the ceiling is ever reached.
|
|
100
|
+
const CLAIMABLE_LIMIT = 1000;
|
|
101
|
+
const claimableUrl = () => `${API}/tasks/claimable?limit=${CLAIMABLE_LIMIT}${serverFilterQuery().replace(/^\?/, '&')}`;
|
|
102
|
+
function takeClaimable(resp) {
|
|
103
|
+
taskState.all = resp.claimable || [];
|
|
104
|
+
taskState.claimableTotal = Number.isFinite(resp.claimable_total) ? resp.claimable_total : taskState.all.length;
|
|
105
|
+
}
|
|
106
|
+
|
|
96
107
|
// task 1003828 — the BACKLOG's server query, deliberately NOT shared with the
|
|
97
108
|
// claimable feed's. The routes differ (GET /tasks answers version/kind/
|
|
98
109
|
// discipline/goal_id; /tasks/claimable answers only version+discipline), and the
|
|
@@ -421,7 +432,7 @@
|
|
|
421
432
|
// task 1899: header count pill reflects the filtered-list length; the tab
|
|
422
433
|
// pill (task 2170) carries the FULL ready count, filters notwithstanding.
|
|
423
434
|
setCountPill('#ready-count', list.length);
|
|
424
|
-
setTabCount('ready', taskState.all.length);
|
|
435
|
+
setTabCount('ready', taskState.claimableTotal ?? taskState.all.length);
|
|
425
436
|
|
|
426
437
|
if (!list.length) {
|
|
427
438
|
root.innerHTML = `<div class="profile__placeholder">No tasks match these filters. Try widening them.</div>`;
|
|
@@ -868,9 +879,9 @@
|
|
|
868
879
|
// the same way loadAll does so a transient failure doesn't blank the board.
|
|
869
880
|
async function refreshLive() {
|
|
870
881
|
try {
|
|
871
|
-
const claimResp = await getJSON(
|
|
882
|
+
const claimResp = await getJSON(claimableUrl());
|
|
872
883
|
renderInFlight(claimResp.active_claims || []);
|
|
873
|
-
|
|
884
|
+
takeClaimable(claimResp);
|
|
874
885
|
renderClaimable();
|
|
875
886
|
pruneSelection();
|
|
876
887
|
renderBulkToolbar();
|
|
@@ -880,22 +891,64 @@
|
|
|
880
891
|
}
|
|
881
892
|
}
|
|
882
893
|
|
|
894
|
+
// task 1004877 — refresh on the hall's live signal (GET /api/bongos/live, the
|
|
895
|
+
// SSE stream builders.js uses: a bare "something changed" nudge on any task,
|
|
896
|
+
// claim or credit write), not a fixed 20 s timer that re-read the whole feed
|
|
897
|
+
// 30 times per idle 10 minutes. A nudge refreshes after LIVE_DEBOUNCE_MS, and
|
|
898
|
+
// never sooner than LIVE_MIN_GAP_MS after the last one, so a burst of writes
|
|
899
|
+
// costs one read and a busy project never costs more than the old timer did.
|
|
900
|
+
// The slow timer is the backstop for a dropped stream, and stands down while
|
|
901
|
+
// live refreshes are arriving.
|
|
902
|
+
const FALLBACK_POLL_MS = 120000;
|
|
903
|
+
const LIVE_DEBOUNCE_MS = 1000;
|
|
904
|
+
const LIVE_MIN_GAP_MS = 20000;
|
|
905
|
+
let liveTimer = null;
|
|
906
|
+
let lastRefreshAt = 0;
|
|
907
|
+
let liveSource = null;
|
|
908
|
+
|
|
909
|
+
function refreshNow() {
|
|
910
|
+
lastRefreshAt = Date.now();
|
|
911
|
+
refreshLive();
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
function scheduleLiveRefresh() {
|
|
915
|
+
if (liveTimer || document.hidden) return; // coalescing already; a hidden tab catches up on return
|
|
916
|
+
const wait = Math.max(LIVE_DEBOUNCE_MS, lastRefreshAt + LIVE_MIN_GAP_MS - Date.now());
|
|
917
|
+
liveTimer = setTimeout(() => {
|
|
918
|
+
liveTimer = null;
|
|
919
|
+
if (!document.hidden) refreshNow();
|
|
920
|
+
}, wait);
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
function connectLive() {
|
|
924
|
+
if (liveSource || typeof EventSource === 'undefined') return;
|
|
925
|
+
try {
|
|
926
|
+
const es = new EventSource(`${API}/live`);
|
|
927
|
+
liveSource = es;
|
|
928
|
+
let opened = false;
|
|
929
|
+
es.addEventListener('nudge', scheduleLiveRefresh);
|
|
930
|
+
// A reconnect may have missed a nudge while the stream was down.
|
|
931
|
+
es.onopen = () => { if (opened) scheduleLiveRefresh(); opened = true; };
|
|
932
|
+
// CLOSED (e.g. a 401) never reconnects on its own; drop it so the
|
|
933
|
+
// visibility handler can open a fresh one.
|
|
934
|
+
es.onerror = () => { if (es.readyState === EventSource.CLOSED) liveSource = null; };
|
|
935
|
+
} catch (_) { /* no live stream: the fallback timer still refreshes */ }
|
|
936
|
+
}
|
|
937
|
+
|
|
883
938
|
function startPolling() {
|
|
884
|
-
|
|
885
|
-
// fresh truth from the server. Paused while the tab is hidden to avoid
|
|
886
|
-
// pointless background traffic.
|
|
887
|
-
const POLL_MS = 20000;
|
|
939
|
+
connectLive();
|
|
888
940
|
setInterval(() => {
|
|
889
|
-
if (document.hidden)
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
// Cheap local re-render of claim ages between polls.
|
|
941
|
+
if (!document.hidden && Date.now() - lastRefreshAt >= FALLBACK_POLL_MS / 2) refreshNow();
|
|
942
|
+
}, FALLBACK_POLL_MS);
|
|
943
|
+
// Cheap local re-render of claim ages between refreshes.
|
|
893
944
|
setInterval(() => {
|
|
894
945
|
if (!document.hidden && liveState.active.length) renderInFlight();
|
|
895
946
|
}, 60000);
|
|
896
947
|
// Snap to fresh data the moment the tab regains focus.
|
|
897
948
|
document.addEventListener('visibilitychange', () => {
|
|
898
|
-
if (
|
|
949
|
+
if (document.hidden) return;
|
|
950
|
+
connectLive();
|
|
951
|
+
refreshNow();
|
|
899
952
|
});
|
|
900
953
|
}
|
|
901
954
|
|
|
@@ -993,7 +1046,7 @@
|
|
|
993
1046
|
// empty-but-honest (the gate also blocks active_claims, so say so).
|
|
994
1047
|
try {
|
|
995
1048
|
const [claimResp, versionsResp, focusResp] = await Promise.all([
|
|
996
|
-
getJSON(
|
|
1049
|
+
getJSON(claimableUrl()),
|
|
997
1050
|
getJSON(`${API}/versions`).catch(() => ({ versions: [] })),
|
|
998
1051
|
getJSON(`${API}/versions/focus`).catch(() => null),
|
|
999
1052
|
]);
|
|
@@ -1001,7 +1054,7 @@
|
|
|
1001
1054
|
populateVersionFilter(taskState.versions);
|
|
1002
1055
|
restoreUrlFilter('f-version');
|
|
1003
1056
|
renderInFlight(claimResp.active_claims || []);
|
|
1004
|
-
|
|
1057
|
+
takeClaimable(claimResp);
|
|
1005
1058
|
renderClaimable();
|
|
1006
1059
|
populateGoalFilter(); // task 1755
|
|
1007
1060
|
populateCreatorFilter().catch(() => {}); // task 1003278 — fire-and-forget, the owner-filter posture
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.179",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.21.
|
|
9
|
+
"version": "1.21.179",
|
|
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.21.
|
|
3
|
+
"version": "1.21.179",
|
|
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",
|
package/release-notes.json
CHANGED
|
@@ -10344,5 +10344,11 @@
|
|
|
10344
10344
|
"id": "1004863",
|
|
10345
10345
|
"text": "Eight database tests that had quietly stopped working are repaired and now run on every change, including the one that proves an idea's author is never paid twice and the one that proves search never shows someone a page above"
|
|
10346
10346
|
}
|
|
10347
|
+
],
|
|
10348
|
+
"1.21.179": [
|
|
10349
|
+
{
|
|
10350
|
+
"id": "1004877",
|
|
10351
|
+
"text": "The Work page no longer re-downloads the whole task list every 20 seconds: it updates within about a second when something actually changes, and an idle tab now asks 5 times in 10 minutes instead of 30."
|
|
10352
|
+
}
|
|
10347
10353
|
]
|
|
10348
10354
|
}
|
package/src/module-api.js
CHANGED
|
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
75
75
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
76
76
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
77
77
|
|
|
78
|
-
const CORE_VERSION = '1.21.
|
|
78
|
+
const CORE_VERSION = '1.21.179'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
79
79
|
|
|
80
80
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
81
81
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
|
@@ -195,7 +195,7 @@ await test('the rollup activity clock is the SAME max(updated_at, shipped_at)',
|
|
|
195
195
|
|
|
196
196
|
await test('Creator and Age are sent to the server, on BOTH board feeds', () => {
|
|
197
197
|
assert.match(WORK_SRC, /function serverFilterQuery\(\)/);
|
|
198
|
-
assert.match(WORK_SRC, /tasks\/claimable\$\{serverFilterQuery\(\)
|
|
198
|
+
assert.match(WORK_SRC, /tasks\/claimable\?limit=\$\{CLAIMABLE_LIMIT\}\$\{serverFilterQuery\(\)/,
|
|
199
199
|
'the claimable feed narrows at the source, not in the browser');
|
|
200
200
|
assert.match(WORK_SRC, /tasks\?status=backlog&limit=\$\{BACKLOG_LIMIT\}\$\{q\}/,
|
|
201
201
|
'and so does the backlog read');
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// tests/work_board_live_refresh.mjs — the Work board refreshes on the hall's live
|
|
2
|
+
// signal, not a 20-second timer, and asks for a bounded claimable list (task 1004877).
|
|
3
|
+
//
|
|
4
|
+
// Before: an idle, visible Work tab re-fetched the WHOLE claimable feed every 20 s
|
|
5
|
+
// (30 requests per 10 minutes) whether or not anything had changed. Now it listens
|
|
6
|
+
// on the same live channel the hall home uses (GET /api/bongos/live, an
|
|
7
|
+
// EventSource that says "something changed" and nothing else), re-fetches a
|
|
8
|
+
// second after a change (at most one read per 20 s while changes keep coming), and
|
|
9
|
+
// keeps a slow 2-minute timer as a backstop in case the live connection is down. Every claimable read carries ?limit= so the list it
|
|
10
|
+
// returns has a ceiling.
|
|
11
|
+
//
|
|
12
|
+
// work.js is BOOTED in a vm here (the harness shape tests/hall_mine_lens.mjs uses)
|
|
13
|
+
// against a fake clock and a fake EventSource, so the counts below are the real
|
|
14
|
+
// page's timers, not a reading of its source.
|
|
15
|
+
|
|
16
|
+
import { test } from 'node:test';
|
|
17
|
+
import assert from 'node:assert/strict';
|
|
18
|
+
import fs from 'node:fs';
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
import vm from 'node:vm';
|
|
21
|
+
import { fileURLToPath } from 'node:url';
|
|
22
|
+
import { settle } from './helpers.mjs';
|
|
23
|
+
|
|
24
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
25
|
+
const HALL = path.join(ROOT, 'modules', 'hall-ui', 'public');
|
|
26
|
+
const read = (f) => fs.readFileSync(path.join(HALL, f), 'utf8');
|
|
27
|
+
|
|
28
|
+
const MIN = 60 * 1000;
|
|
29
|
+
|
|
30
|
+
// A virtual clock: setTimeout/setInterval queue here and only fire on advance(),
|
|
31
|
+
// so ten minutes of page life run in milliseconds.
|
|
32
|
+
function makeClock() {
|
|
33
|
+
let now = 1_000_000;
|
|
34
|
+
let seq = 0;
|
|
35
|
+
const timers = new Map();
|
|
36
|
+
const add = (fn, ms, every) => { seq += 1; timers.set(seq, { at: now + Math.max(0, Number(ms) || 0), fn, every }); return seq; };
|
|
37
|
+
return {
|
|
38
|
+
now: () => now,
|
|
39
|
+
setTimeout: (fn, ms) => add(fn, ms, 0),
|
|
40
|
+
setInterval: (fn, ms) => add(fn, ms, Math.max(1, Number(ms) || 1)),
|
|
41
|
+
clear: (id) => { timers.delete(id); },
|
|
42
|
+
async advance(ms) {
|
|
43
|
+
const end = now + ms;
|
|
44
|
+
for (;;) {
|
|
45
|
+
let next = null;
|
|
46
|
+
for (const [id, t] of timers) if (t.at <= end && (!next || t.at < next[1].at)) next = [id, t];
|
|
47
|
+
if (!next) break;
|
|
48
|
+
const [id, t] = next;
|
|
49
|
+
now = t.at;
|
|
50
|
+
if (t.every) t.at += t.every; else timers.delete(id);
|
|
51
|
+
t.fn();
|
|
52
|
+
await settle(); await settle();
|
|
53
|
+
}
|
|
54
|
+
now = end;
|
|
55
|
+
await settle();
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function bootWorkBoard() {
|
|
61
|
+
const clock = makeClock();
|
|
62
|
+
const els = new Map();
|
|
63
|
+
const makeEl = (id = '') => ({
|
|
64
|
+
id, dataset: {}, style: {}, textContent: '', hidden: false, disabled: false,
|
|
65
|
+
checked: false, value: '', title: '', _html: '',
|
|
66
|
+
classList: { add() {}, remove() {}, toggle() { return false; }, contains() { return false; } },
|
|
67
|
+
setAttribute() {}, getAttribute() { return null; },
|
|
68
|
+
listeners: {},
|
|
69
|
+
addEventListener(type, fn) { (this.listeners[type] ||= []).push(fn); },
|
|
70
|
+
querySelector() { return null; }, querySelectorAll() { return []; },
|
|
71
|
+
appendChild() {}, remove() {}, closest() { return null; },
|
|
72
|
+
set innerHTML(v) { this._html = String(v); }, get innerHTML() { return this._html; },
|
|
73
|
+
});
|
|
74
|
+
const el = (key) => { if (!els.has(key)) els.set(key, makeEl(key)); return els.get(key); };
|
|
75
|
+
const documentObj = {
|
|
76
|
+
getElementById: (id) => el(id),
|
|
77
|
+
querySelector: (sel) => el(String(sel).replace(/^#/, '')),
|
|
78
|
+
querySelectorAll: () => [],
|
|
79
|
+
createElement: () => makeEl(),
|
|
80
|
+
addEventListener(type, fn) { (this.listeners[type] ||= []).push(fn); },
|
|
81
|
+
listeners: {},
|
|
82
|
+
body: { dataset: {} }, documentElement: { dataset: {} },
|
|
83
|
+
hidden: false,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const requests = [];
|
|
87
|
+
const client = {
|
|
88
|
+
request: async (method, url) => {
|
|
89
|
+
requests.push(url);
|
|
90
|
+
const ok = (data) => ({ status: 200, ok: true, data });
|
|
91
|
+
if (url.endsWith('/me')) return ok({ builder: { id: 7, github_login: 'percy', rank: 'metic' } });
|
|
92
|
+
if (url.endsWith('/goals')) return ok({ goals: [] });
|
|
93
|
+
if (url.includes('/tasks/claimable')) {
|
|
94
|
+
return ok({ claimable: [{ id: 501, title: 'a ready task', status: 'ready', version_id: 'V1' }], claimable_total: 1234, active_claims: [] });
|
|
95
|
+
}
|
|
96
|
+
return ok({});
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// The fake live stream: one instance per `new EventSource(url)`.
|
|
101
|
+
const streams = [];
|
|
102
|
+
class FakeEventSource {
|
|
103
|
+
constructor(url) { this.url = url; this.readyState = 1; this.listeners = {}; streams.push(this); }
|
|
104
|
+
addEventListener(type, fn) { (this.listeners[type] ||= []).push(fn); }
|
|
105
|
+
emit(type) { (this.listeners[type] || []).forEach((fn) => fn({ data: '{}' })); }
|
|
106
|
+
close() { this.readyState = 2; }
|
|
107
|
+
}
|
|
108
|
+
FakeEventSource.CLOSED = 2;
|
|
109
|
+
|
|
110
|
+
const tabCounts = {};
|
|
111
|
+
const kit = {
|
|
112
|
+
makePager: (prefix) => ({ prefix, page: 1, perPage: 100 }),
|
|
113
|
+
paginate: (rows) => rows,
|
|
114
|
+
wirePager() {},
|
|
115
|
+
pagerBarHtml: () => '',
|
|
116
|
+
makeTabs: ({ tabs }) => ({ active: () => tabs[0].id, setCount(id, n) { tabCounts[id] = n; }, activate() {} }),
|
|
117
|
+
makeFilterBar: ({ search, primary = [], overflow = [] }) => {
|
|
118
|
+
[search, ...primary, ...overflow].filter(Boolean).forEach((c) => { el(c.id).value = c.value ?? c.default ?? ''; });
|
|
119
|
+
return { values: () => ({}), get: () => '', set() {} };
|
|
120
|
+
},
|
|
121
|
+
ageChipHtml: () => '',
|
|
122
|
+
};
|
|
123
|
+
const windowObj = {
|
|
124
|
+
__BRANDING__: { currency: { label: 'credits' } },
|
|
125
|
+
BongosClient: { createClient: () => client },
|
|
126
|
+
OTBKit: kit,
|
|
127
|
+
OTBTaskDetail: { href: (id) => `/task/${id}`, open() {} },
|
|
128
|
+
OTBTaskLib: {
|
|
129
|
+
priorityRank: () => 0, touchesConflict: () => false, conflictPeers: () => [], conflictChipHtml: () => '', rankTagHtml: () => '',
|
|
130
|
+
creditsPerMinute: () => 0, buildPromptForTask: () => '', friendlyBatchReason: () => '',
|
|
131
|
+
taskActivityMs: () => 0, STALE_CHOICES: [{ value: '', label: '— any —' }], isStale: () => false,
|
|
132
|
+
focusVersionDefault: () => null,
|
|
133
|
+
},
|
|
134
|
+
OTB: {
|
|
135
|
+
escapeHtml: (s) => String(s ?? ''), $: (sel) => documentObj.querySelector(sel),
|
|
136
|
+
fmtNum: (n) => String(n ?? 0), fmtDate: (d) => String(d ?? ''),
|
|
137
|
+
errCode: () => null, errDetails: () => ({}), toast() {}, categoryChip: () => '', fillKindFilter() {},
|
|
138
|
+
kindIsUnset: () => true, KIND_UNSET: 'unclassified', roleAxisLabel: () => 'Role',
|
|
139
|
+
roleOptions: () => [{ value: '', label: '— any —' }], roleIsUnset: () => true, roleLabel: () => '', ROLE_UNSET: 'unclassified',
|
|
140
|
+
},
|
|
141
|
+
location: { hostname: 'builders.example.com', pathname: '/work', search: '', hash: '', href: 'https://builders.example.com/work' },
|
|
142
|
+
localStorage: { getItem: () => null, setItem() {}, removeItem() {} },
|
|
143
|
+
confirm: () => true,
|
|
144
|
+
addEventListener() {},
|
|
145
|
+
};
|
|
146
|
+
class FakeDate extends Date {}
|
|
147
|
+
FakeDate.now = () => clock.now();
|
|
148
|
+
const sandbox = {
|
|
149
|
+
window: windowObj, document: documentObj, location: windowObj.location,
|
|
150
|
+
localStorage: windowObj.localStorage, console,
|
|
151
|
+
setTimeout: clock.setTimeout, clearTimeout: clock.clear, setInterval: clock.setInterval, clearInterval: clock.clear,
|
|
152
|
+
Date: FakeDate, URL, URLSearchParams, navigator: {}, history: { replaceState() {} },
|
|
153
|
+
EventSource: FakeEventSource,
|
|
154
|
+
};
|
|
155
|
+
sandbox.globalThis = sandbox;
|
|
156
|
+
vm.createContext(sandbox);
|
|
157
|
+
for (const f of ['mine-lens.js', 'work-summary.js', 'claim-action.js', 'bulk-toolbar.js']) vm.runInContext(read(f), sandbox, { filename: f });
|
|
158
|
+
windowObj.OTBMineLens = sandbox.OTBMineLens;
|
|
159
|
+
windowObj.OTBWorkSummary = sandbox.OTBWorkSummary;
|
|
160
|
+
vm.runInContext(read('work.js'), sandbox, { filename: 'work.js' });
|
|
161
|
+
(documentObj.listeners.DOMContentLoaded || []).forEach((fn) => fn());
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
clock, requests, streams, tabCounts,
|
|
165
|
+
claimableReads: () => requests.filter((u) => u.includes('/tasks/claimable')),
|
|
166
|
+
setHidden(h) { documentObj.hidden = h; (documentObj.listeners.visibilitychange || []).forEach((fn) => fn()); },
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const boot = async () => {
|
|
171
|
+
const b = bootWorkBoard();
|
|
172
|
+
for (let i = 0; i < 8; i += 1) await settle();
|
|
173
|
+
await b.clock.advance(0);
|
|
174
|
+
return b;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
test('every claimable read asks for a bounded list', async () => {
|
|
178
|
+
const b = await boot();
|
|
179
|
+
await b.clock.advance(10 * MIN);
|
|
180
|
+
const reads = b.claimableReads();
|
|
181
|
+
assert.ok(reads.length >= 1);
|
|
182
|
+
for (const u of reads) assert.match(u, /[?&]limit=\d+/, `unbounded claimable read: ${u}`);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test('the Ready tab count is the server total, not the length of the bounded list', async () => {
|
|
186
|
+
const b = await boot();
|
|
187
|
+
assert.equal(b.tabCounts.ready, 1234);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test('an idle visible tab makes at most 5 claimable reads in 10 minutes (was 30)', async () => {
|
|
191
|
+
const b = await boot();
|
|
192
|
+
const atLoad = b.claimableReads().length;
|
|
193
|
+
await b.clock.advance(10 * MIN);
|
|
194
|
+
const idle = b.claimableReads().length - atLoad;
|
|
195
|
+
assert.ok(idle <= 5, `expected ≤ 5 background reads per 10 min, got ${idle}`);
|
|
196
|
+
assert.ok(idle >= 4, `the slow fallback timer must still run (got ${idle})`);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test('the page subscribes to the live channel', async () => {
|
|
200
|
+
const b = await boot();
|
|
201
|
+
assert.equal(b.streams.length, 1);
|
|
202
|
+
assert.equal(b.streams[0].url, '/api/bongos/live');
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test('a live nudge refreshes the claimable list within seconds', async () => {
|
|
206
|
+
const b = await boot();
|
|
207
|
+
const before = b.claimableReads().length;
|
|
208
|
+
b.streams[0].emit('nudge');
|
|
209
|
+
await b.clock.advance(3000);
|
|
210
|
+
assert.equal(b.claimableReads().length, before + 1);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('a burst of nudges is coalesced: a busy minute costs at most 3 reads', async () => {
|
|
214
|
+
const b = await boot();
|
|
215
|
+
const before = b.claimableReads().length;
|
|
216
|
+
for (let s = 0; s < 60; s += 1) { b.streams[0].emit('nudge'); await b.clock.advance(1000); }
|
|
217
|
+
const n = b.claimableReads().length - before;
|
|
218
|
+
assert.ok(n >= 1 && n <= 3, `expected 1–3 reads for 60 nudges in a minute, got ${n}`);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('a project changing every second never costs more than the old 20 s timer (30 per 10 min)', async () => {
|
|
222
|
+
const b = await boot();
|
|
223
|
+
const before = b.claimableReads().length;
|
|
224
|
+
for (let s = 0; s < 600; s += 1) { b.streams[0].emit('nudge'); await b.clock.advance(1000); }
|
|
225
|
+
const n = b.claimableReads().length - before;
|
|
226
|
+
assert.ok(n <= 30, `expected ≤ 30 reads in a busy 10 minutes, got ${n}`);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test('a hidden tab fetches nothing, on the timer or on a nudge', async () => {
|
|
230
|
+
const b = await boot();
|
|
231
|
+
b.setHidden(true);
|
|
232
|
+
const before = b.claimableReads().length;
|
|
233
|
+
b.streams[0].emit('nudge');
|
|
234
|
+
await b.clock.advance(10 * MIN);
|
|
235
|
+
assert.equal(b.claimableReads().length, before);
|
|
236
|
+
});
|