@bongos/core 1.20.34 → 1.20.35
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 +44 -34
- package/.claude/skills/ask-for-help/SKILL.md +5 -3
- package/.claude/skills/collab-review/SKILL.md +8 -5
- package/clients/bongos-client/index.d.ts +1 -1
- package/docs/api/openapi.json +3 -2
- package/docs/copy-inventory.md +18 -17
- package/docs/copy-registry.json +70 -51
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +14 -14
- package/modules/hall-ui/public/approval-queue.js +1 -1
- package/modules/hall-ui/public/collab-lib.js +10 -1
- package/modules/hall-ui/public/collab.js +47 -10
- package/modules/hall-ui/public/studio.js +7 -7
- package/modules/lifecycle/help-requests.js +35 -2
- package/modules/lifecycle/migrations/lifecycle_016_help_request_reopen.sql +23 -0
- package/modules/lifecycle/routes/help-requests.js +15 -1
- package/modules/provisioning/render-standup.js +4 -1
- package/modules/public-landing/public/projects.html +16 -7
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +13 -0
- package/src/module-api.js +1 -1
- package/tests/collab_page.mjs +27 -1
- package/tests/hall_approval_queue.mjs +5 -1
- package/tests/hall_client_request_shape.mjs +103 -0
- package/tests/hall_studio_home.mjs +7 -1
- package/tests/hall_studio_world.mjs +5 -1
- package/tests/help_requests.mjs +54 -1
- package/tests/projects_hub_app_step.mjs +42 -0
- package/tests/provisioning_render_route.mjs +7 -0
package/docs/copy-registry.json
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
6
|
+
"strings": 2190,
|
|
7
7
|
"unique_ids": 1889,
|
|
8
|
-
"certain":
|
|
8
|
+
"certain": 2190,
|
|
9
9
|
"heuristic": 0,
|
|
10
|
-
"duplicate_ids":
|
|
10
|
+
"duplicate_ids": 208
|
|
11
11
|
},
|
|
12
12
|
"surfaces": {
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 109,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1619
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -1161,6 +1161,16 @@
|
|
|
1161
1161
|
"modules/hall-ui/public/roadmap.html:33"
|
|
1162
1162
|
]
|
|
1163
1163
|
},
|
|
1164
|
+
{
|
|
1165
|
+
"id": "4924438fb299",
|
|
1166
|
+
"surface": "builders-hall",
|
|
1167
|
+
"text": "Mark resolved",
|
|
1168
|
+
"occurrences": 2,
|
|
1169
|
+
"at": [
|
|
1170
|
+
"modules/hall-ui/public/collab.js:278",
|
|
1171
|
+
"modules/hall-ui/public/collab.js:304"
|
|
1172
|
+
]
|
|
1173
|
+
},
|
|
1164
1174
|
{
|
|
1165
1175
|
"id": "df335a1224ae",
|
|
1166
1176
|
"surface": "builders-hall",
|
|
@@ -1287,8 +1297,8 @@
|
|
|
1287
1297
|
"text": "Post reply",
|
|
1288
1298
|
"occurrences": 2,
|
|
1289
1299
|
"at": [
|
|
1290
|
-
"modules/hall-ui/public/collab.js:
|
|
1291
|
-
"modules/hall-ui/public/collab.js:
|
|
1300
|
+
"modules/hall-ui/public/collab.js:175",
|
|
1301
|
+
"modules/hall-ui/public/collab.js:768"
|
|
1292
1302
|
]
|
|
1293
1303
|
},
|
|
1294
1304
|
{
|
|
@@ -3922,15 +3932,6 @@
|
|
|
3922
3932
|
"origin": "html-text",
|
|
3923
3933
|
"confidence": "certain"
|
|
3924
3934
|
},
|
|
3925
|
-
{
|
|
3926
|
-
"id": "b16bd3e36632",
|
|
3927
|
-
"surface": "builders-hall",
|
|
3928
|
-
"text": "Close this ask",
|
|
3929
|
-
"file": "modules/hall-ui/public/collab.js",
|
|
3930
|
-
"line": 270,
|
|
3931
|
-
"origin": "js-markup",
|
|
3932
|
-
"confidence": "certain"
|
|
3933
|
-
},
|
|
3934
3935
|
{
|
|
3935
3936
|
"id": "d12a2fb5730d",
|
|
3936
3937
|
"surface": "builders-hall",
|
|
@@ -4062,7 +4063,7 @@
|
|
|
4062
4063
|
"surface": "builders-hall",
|
|
4063
4064
|
"text": "Copy all {…} for Session Start",
|
|
4064
4065
|
"file": "modules/hall-ui/public/collab.js",
|
|
4065
|
-
"line":
|
|
4066
|
+
"line": 478,
|
|
4066
4067
|
"origin": "js-text-assign",
|
|
4067
4068
|
"confidence": "certain"
|
|
4068
4069
|
},
|
|
@@ -4395,7 +4396,7 @@
|
|
|
4395
4396
|
"surface": "builders-hall",
|
|
4396
4397
|
"text": "Could not load requests — reload to try again.",
|
|
4397
4398
|
"file": "modules/hall-ui/public/collab.js",
|
|
4398
|
-
"line":
|
|
4399
|
+
"line": 845,
|
|
4399
4400
|
"origin": "js-text-assign",
|
|
4400
4401
|
"confidence": "certain"
|
|
4401
4402
|
},
|
|
@@ -7297,6 +7298,24 @@
|
|
|
7297
7298
|
"origin": "html-attr:aria-label",
|
|
7298
7299
|
"confidence": "certain"
|
|
7299
7300
|
},
|
|
7301
|
+
{
|
|
7302
|
+
"id": "4924438fb299",
|
|
7303
|
+
"surface": "builders-hall",
|
|
7304
|
+
"text": "Mark resolved",
|
|
7305
|
+
"file": "modules/hall-ui/public/collab.js",
|
|
7306
|
+
"line": 278,
|
|
7307
|
+
"origin": "js-markup",
|
|
7308
|
+
"confidence": "certain"
|
|
7309
|
+
},
|
|
7310
|
+
{
|
|
7311
|
+
"id": "4924438fb299",
|
|
7312
|
+
"surface": "builders-hall",
|
|
7313
|
+
"text": "Mark resolved",
|
|
7314
|
+
"file": "modules/hall-ui/public/collab.js",
|
|
7315
|
+
"line": 304,
|
|
7316
|
+
"origin": "js-markup",
|
|
7317
|
+
"confidence": "certain"
|
|
7318
|
+
},
|
|
7300
7319
|
{
|
|
7301
7320
|
"id": "8bdec961e84a",
|
|
7302
7321
|
"surface": "builders-hall",
|
|
@@ -8085,7 +8104,7 @@
|
|
|
8085
8104
|
"surface": "builders-hall",
|
|
8086
8105
|
"text": "Not now",
|
|
8087
8106
|
"file": "modules/hall-ui/public/collab.js",
|
|
8088
|
-
"line":
|
|
8107
|
+
"line": 668,
|
|
8089
8108
|
"origin": "js-markup",
|
|
8090
8109
|
"confidence": "certain"
|
|
8091
8110
|
},
|
|
@@ -8845,12 +8864,21 @@
|
|
|
8845
8864
|
"origin": "html-text",
|
|
8846
8865
|
"confidence": "certain"
|
|
8847
8866
|
},
|
|
8867
|
+
{
|
|
8868
|
+
"id": "07d7e62640d6",
|
|
8869
|
+
"surface": "builders-hall",
|
|
8870
|
+
"text": "Post & resolve",
|
|
8871
|
+
"file": "modules/hall-ui/public/collab.js",
|
|
8872
|
+
"line": 170,
|
|
8873
|
+
"origin": "js-markup",
|
|
8874
|
+
"confidence": "certain"
|
|
8875
|
+
},
|
|
8848
8876
|
{
|
|
8849
8877
|
"id": "5b08da0632c7",
|
|
8850
8878
|
"surface": "builders-hall",
|
|
8851
8879
|
"text": "Post reply",
|
|
8852
8880
|
"file": "modules/hall-ui/public/collab.js",
|
|
8853
|
-
"line":
|
|
8881
|
+
"line": 175,
|
|
8854
8882
|
"origin": "js-markup",
|
|
8855
8883
|
"confidence": "certain"
|
|
8856
8884
|
},
|
|
@@ -8859,7 +8887,7 @@
|
|
|
8859
8887
|
"surface": "builders-hall",
|
|
8860
8888
|
"text": "Post reply",
|
|
8861
8889
|
"file": "modules/hall-ui/public/collab.js",
|
|
8862
|
-
"line":
|
|
8890
|
+
"line": 768,
|
|
8863
8891
|
"origin": "js-text-assign",
|
|
8864
8892
|
"confidence": "certain"
|
|
8865
8893
|
},
|
|
@@ -9489,7 +9517,7 @@
|
|
|
9489
9517
|
"surface": "builders-hall",
|
|
9490
9518
|
"text": "Replied.",
|
|
9491
9519
|
"file": "modules/hall-ui/public/collab.js",
|
|
9492
|
-
"line":
|
|
9520
|
+
"line": 763,
|
|
9493
9521
|
"origin": "js-notice",
|
|
9494
9522
|
"confidence": "certain"
|
|
9495
9523
|
},
|
|
@@ -9930,7 +9958,7 @@
|
|
|
9930
9958
|
"surface": "builders-hall",
|
|
9931
9959
|
"text": "Say yes",
|
|
9932
9960
|
"file": "modules/hall-ui/public/collab.js",
|
|
9933
|
-
"line":
|
|
9961
|
+
"line": 668,
|
|
9934
9962
|
"origin": "js-markup",
|
|
9935
9963
|
"confidence": "certain"
|
|
9936
9964
|
},
|
|
@@ -10254,7 +10282,7 @@
|
|
|
10254
10282
|
"surface": "builders-hall",
|
|
10255
10283
|
"text": "Show all {…}",
|
|
10256
10284
|
"file": "modules/hall-ui/public/collab.js",
|
|
10257
|
-
"line":
|
|
10285
|
+
"line": 432,
|
|
10258
10286
|
"origin": "js-text-assign",
|
|
10259
10287
|
"confidence": "certain"
|
|
10260
10288
|
},
|
|
@@ -10510,15 +10538,6 @@
|
|
|
10510
10538
|
"origin": "html-text",
|
|
10511
10539
|
"confidence": "certain"
|
|
10512
10540
|
},
|
|
10513
|
-
{
|
|
10514
|
-
"id": "7da6a848cd26",
|
|
10515
|
-
"surface": "builders-hall",
|
|
10516
|
-
"text": "Someone helped",
|
|
10517
|
-
"file": "modules/hall-ui/public/collab.js",
|
|
10518
|
-
"line": 296,
|
|
10519
|
-
"origin": "js-markup",
|
|
10520
|
-
"confidence": "certain"
|
|
10521
|
-
},
|
|
10522
10541
|
{
|
|
10523
10542
|
"id": "e7b592185803",
|
|
10524
10543
|
"surface": "builders-hall",
|
|
@@ -13008,7 +13027,7 @@
|
|
|
13008
13027
|
"surface": "builders-hall",
|
|
13009
13028
|
"text": "Write a reply…",
|
|
13010
13029
|
"file": "modules/hall-ui/public/collab.js",
|
|
13011
|
-
"line":
|
|
13030
|
+
"line": 175,
|
|
13012
13031
|
"origin": "js-markup",
|
|
13013
13032
|
"confidence": "certain"
|
|
13014
13033
|
},
|
|
@@ -20311,6 +20330,24 @@
|
|
|
20311
20330
|
"origin": "html-text",
|
|
20312
20331
|
"confidence": "certain"
|
|
20313
20332
|
},
|
|
20333
|
+
{
|
|
20334
|
+
"id": "26170630cdbf",
|
|
20335
|
+
"surface": "landing",
|
|
20336
|
+
"text": "for example: npm ci",
|
|
20337
|
+
"file": "modules/public-landing/public/projects.html",
|
|
20338
|
+
"line": 1437,
|
|
20339
|
+
"origin": "html-attr:placeholder",
|
|
20340
|
+
"confidence": "certain"
|
|
20341
|
+
},
|
|
20342
|
+
{
|
|
20343
|
+
"id": "491e8125389e",
|
|
20344
|
+
"surface": "landing",
|
|
20345
|
+
"text": "for example: npm start",
|
|
20346
|
+
"file": "modules/public-landing/public/projects.html",
|
|
20347
|
+
"line": 1440,
|
|
20348
|
+
"origin": "html-attr:placeholder",
|
|
20349
|
+
"confidence": "certain"
|
|
20350
|
+
},
|
|
20314
20351
|
{
|
|
20315
20352
|
"id": "93252b0b4f86",
|
|
20316
20353
|
"surface": "landing",
|
|
@@ -20365,24 +20402,6 @@
|
|
|
20365
20402
|
"origin": "html-text",
|
|
20366
20403
|
"confidence": "certain"
|
|
20367
20404
|
},
|
|
20368
|
-
{
|
|
20369
|
-
"id": "bcb99ff96077",
|
|
20370
|
-
"surface": "landing",
|
|
20371
|
-
"text": "npm ci",
|
|
20372
|
-
"file": "modules/public-landing/public/projects.html",
|
|
20373
|
-
"line": 1437,
|
|
20374
|
-
"origin": "html-attr:placeholder",
|
|
20375
|
-
"confidence": "certain"
|
|
20376
|
-
},
|
|
20377
|
-
{
|
|
20378
|
-
"id": "93948c482b9c",
|
|
20379
|
-
"surface": "landing",
|
|
20380
|
-
"text": "npm start",
|
|
20381
|
-
"file": "modules/public-landing/public/projects.html",
|
|
20382
|
-
"line": 1440,
|
|
20383
|
-
"origin": "html-attr:placeholder",
|
|
20384
|
-
"confidence": "certain"
|
|
20385
|
-
},
|
|
20386
20405
|
{
|
|
20387
20406
|
"id": "6fd790bc901e",
|
|
20388
20407
|
"surface": "landing",
|
|
@@ -2725,5 +2725,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2725
2725
|
landed since 1.20.32 with no explicit bump. run 36783765458. (task 1002620)
|
|
2726
2726
|
1.20.34 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2727
2727
|
landed since 1.20.33 with no explicit bump. run 36784565937. (task 1002620)
|
|
2728
|
+
1.20.35 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2729
|
+
landed since 1.20.34 with no explicit bump. run 36787635391. (task 1002620)
|
|
2728
2730
|
---------------------------------------------------------------------------
|
|
2729
2731
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -136,8 +136,8 @@
|
|
|
136
136
|
"surface": "builders",
|
|
137
137
|
"title": "Collab",
|
|
138
138
|
"states_read": ["board","out"],
|
|
139
|
-
"files_hash": "
|
|
140
|
-
"reading_hash": "
|
|
139
|
+
"files_hash": "793b7af1446ab69e",
|
|
140
|
+
"reading_hash": "cedb8171693a308e",
|
|
141
141
|
"counts": {"lines":68,"placed":23,"shared":4,"unplaced":41},
|
|
142
142
|
"omitted": {"data":12},
|
|
143
143
|
"notes": [],
|
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
{"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":767,"string_id":"87cee78ca134"},
|
|
146
146
|
{"key":"L0002","section":"top bar","text":"Collab","placement":"shared"},
|
|
147
147
|
{"key":"L0003","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":487,"string_id":"eba610d25523"},
|
|
148
|
-
{"key":"L0004","section":"top bar","text":"
|
|
148
|
+
{"key":"L0004","section":"top bar","text":"⌘K","placement":"shared"},
|
|
149
149
|
{"key":"L0005","section":"Collab","text":"Collab","placement":"unplaced"},
|
|
150
150
|
{"key":"L0006","section":"Collab","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232"},
|
|
151
151
|
{"key":"L0007","section":"Collab","text":"Waiting on you","placement":"unplaced"},
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
{"key":"L0018","section":"Asked {…}","text":"task #{…}","placement":"placed","file":"modules/hall-ui/public/copy-desk.js","line":105,"string_id":"a6e803a31a4d"},
|
|
163
163
|
{"key":"L0019","section":"Asked {…}","text":"Reply","placement":"unplaced","occurrences":2},
|
|
164
164
|
{"key":"L0020","section":"Asked {…}","text":"just asked","placement":"unplaced","occurrences":2},
|
|
165
|
-
{"key":"L0021","section":"Asked {…}","text":"
|
|
165
|
+
{"key":"L0021","section":"Asked {…}","text":"Mark resolved","placement":"placed","file":"modules/hall-ui/public/collab.js","line":278,"string_id":"4924438fb299","occurrences":3},
|
|
166
166
|
{"key":"L0022","section":"Asked {…}","text":"The worktree junction keeps dragging the shared node_modules with it when I remove a stale worktree.","placement":"unplaced"},
|
|
167
167
|
{"key":"L0023","section":"Asked {…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","occurrences":2},
|
|
168
168
|
{"key":"L0024","section":"Asked {…}","text":"Could you look at the oversight contact sheet before I ship?","placement":"unplaced"},
|
|
@@ -171,9 +171,9 @@
|
|
|
171
171
|
{"key":"L0027","section":"Asked {…}","text":"6 days ago","placement":"unplaced"},
|
|
172
172
|
{"key":"L0028","section":"Asked {…}","text":"5 days ago","placement":"unplaced"},
|
|
173
173
|
{"key":"L0029","section":"Asked {…}","text":"Add a reply","placement":"unplaced"},
|
|
174
|
-
{"key":"L0030","section":"Asked {…}","text":"waiting
|
|
175
|
-
{"key":"L0031","section":"Asked {…}","text":"Show all {…}","placement":"placed","file":"modules/hall-ui/public/collab.js","line":
|
|
176
|
-
{"key":"L0032","section":"Asked {…}","text":"Copy all {…} for Session Start","placement":"placed","file":"modules/hall-ui/public/collab.js","line":
|
|
174
|
+
{"key":"L0030","section":"Asked {…}","text":"waiting 2 days","placement":"unplaced"},
|
|
175
|
+
{"key":"L0031","section":"Asked {…}","text":"Show all {…}","placement":"placed","file":"modules/hall-ui/public/collab.js","line":432,"string_id":"6dde12eb0c78"},
|
|
176
|
+
{"key":"L0032","section":"Asked {…}","text":"Copy all {…} for Session Start","placement":"placed","file":"modules/hall-ui/public/collab.js","line":478,"string_id":"4fb972405d3d"},
|
|
177
177
|
{"key":"L0033","section":"Your asks 2","text":"Your asks","placement":"placed","file":"modules/hall-ui/public/collab.html","line":68,"string_id":"7d26333b5fb0"},
|
|
178
178
|
{"key":"L0034","section":"Your asks 2","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":2},
|
|
179
179
|
{"key":"L0035","section":"Your asks 2","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9"},
|
|
@@ -181,15 +181,15 @@
|
|
|
181
181
|
{"key":"L0037","section":"Your asks 2","text":"You asked","placement":"unplaced"},
|
|
182
182
|
{"key":"L0038","section":"Your asks 2","text":"by name","placement":"unplaced"},
|
|
183
183
|
{"key":"L0039","section":"Your asks 2","text":"task #{…}","placement":"placed","file":"modules/hall-ui/public/copy-desk.js","line":105,"string_id":"a6e803a31a4d"},
|
|
184
|
-
{"key":"L0040","section":"Your asks 2","text":"
|
|
184
|
+
{"key":"L0040","section":"Your asks 2","text":"just asked","placement":"unplaced"},
|
|
185
185
|
{"key":"L0041","section":"Your asks 2","text":"Reply","placement":"unplaced"},
|
|
186
|
-
{"key":"L0042","section":"Your asks 2","text":"
|
|
186
|
+
{"key":"L0042","section":"Your asks 2","text":"Mark resolved","placement":"placed","file":"modules/hall-ui/public/collab.js","line":278,"string_id":"4924438fb299","occurrences":2},
|
|
187
187
|
{"key":"L0043","section":"Your asks 2","text":"Withdraw","placement":"unplaced","occurrences":2},
|
|
188
188
|
{"key":"L0044","section":"Your asks 2","text":"A","placement":"unplaced"},
|
|
189
189
|
{"key":"L0045","section":"Your asks 2","text":"I need an {…}'s read on whether a forest plate under the glass rail is worth shooting, or whether the void stands.","placement":"unplaced"},
|
|
190
190
|
{"key":"L0046","section":"Your asks 2","text":"You asked artists","placement":"unplaced"},
|
|
191
191
|
{"key":"L0047","section":"Your asks 2","text":"goal #1000081","placement":"unplaced"},
|
|
192
|
-
{"key":"L0048","section":"Your asks 2","text":"waiting
|
|
192
|
+
{"key":"L0048","section":"Your asks 2","text":"waiting 5 days","placement":"unplaced"},
|
|
193
193
|
{"key":"L0049","section":"Your asks 2","text":"5 days ago","placement":"unplaced"},
|
|
194
194
|
{"key":"L0050","section":"Your asks 2","text":"Add a reply","placement":"unplaced"},
|
|
195
195
|
{"key":"L0051","section":"All {…} asks 8","text":"All open asks","placement":"placed","file":"modules/hall-ui/public/collab.html","line":79,"string_id":"9c34bccb06ef"},
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
{"key":"L0063","section":"All {…} asks 8","text":"by name","placement":"unplaced"},
|
|
208
208
|
{"key":"L0064","section":"All {…} asks 8","text":"task #{…}","placement":"placed","file":"modules/hall-ui/public/copy-desk.js","line":105,"string_id":"a6e803a31a4d","occurrences":2},
|
|
209
209
|
{"key":"L0065","section":"All {…} asks 8","text":"asked builders","placement":"unplaced"},
|
|
210
|
-
{"key":"L0066","section":"All {…} asks 8","text":"Show all {…}","placement":"placed","file":"modules/hall-ui/public/collab.js","line":
|
|
210
|
+
{"key":"L0066","section":"All {…} asks 8","text":"Show all {…}","placement":"placed","file":"modules/hall-ui/public/collab.js","line":432,"string_id":"6dde12eb0c78"},
|
|
211
211
|
{"key":"L0067","section":"All {…} asks 8","text":"Archive","placement":"unplaced"},
|
|
212
212
|
{"key":"L0068","section":"All {…} asks 8","text":"Answering is optional and declining costs nothing. Nobody is assigned by being asked.","placement":"placed","file":"modules/hall-ui/public/collab.html","line":143,"string_id":"05761b08ec8f"}
|
|
213
213
|
]
|
|
@@ -2637,7 +2637,7 @@
|
|
|
2637
2637
|
"surface": "builders",
|
|
2638
2638
|
"title": "Studio",
|
|
2639
2639
|
"states_read": ["home","out","flow","flow-pick","status","words-offer","words-edit","reviews","full","full-back","approvals","approvals-before","approvals-phone","approvals-note","approved","sent-back"],
|
|
2640
|
-
"files_hash": "
|
|
2640
|
+
"files_hash": "85650f845556e185",
|
|
2641
2641
|
"reading_hash": "7ad6eaf33f933983",
|
|
2642
2642
|
"counts": {"lines":70,"placed":42,"shared":3,"unplaced":25},
|
|
2643
2643
|
"omitted": {"data":18},
|
|
@@ -2645,7 +2645,7 @@
|
|
|
2645
2645
|
"lines": [
|
|
2646
2646
|
{"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":767,"string_id":"87cee78ca134"},
|
|
2647
2647
|
{"key":"L0002","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":487,"string_id":"eba610d25523"},
|
|
2648
|
-
{"key":"L0003","section":"top bar","text":"
|
|
2648
|
+
{"key":"L0003","section":"top bar","text":"⌘K","placement":"shared"},
|
|
2649
2649
|
{"key":"L0004","section":"page top","text":"{{worldName}} · studio","placement":"placed","file":"modules/hall-ui/public/studio.html","line":79,"string_id":"3d8611c2e79d"},
|
|
2650
2650
|
{"key":"L0005","section":"page top","text":"pages tweaked","placement":"placed","file":"modules/hall-ui/public/studio.html","line":83,"string_id":"271de72308a4"},
|
|
2651
2651
|
{"key":"L0006","section":"page top","text":"this week","placement":"placed","file":"modules/hall-ui/public/studio.html","line":85,"string_id":"130c3731ad83"},
|
|
@@ -3608,7 +3608,7 @@
|
|
|
3608
3608
|
"surface": "landing",
|
|
3609
3609
|
"title": "{{productName}} — projects",
|
|
3610
3610
|
"states_read": ["out-map","in-map","in-map-projects","in-map-profile","in-map-kbd","in-map-search","in-map-mine-on","in-table","in-table-by-builders","in-mine","in-manage","in-manage-address","in-manage-planet","in-manage-card","in-manage-kind","in-manage-invite","in-manage-invite-handoff","in-manage-app-live","in-manage-app-building","in-manage-app-failed","in-manage-app-retry","in-manage-app-offer","in-manage-app-connect","in-manage-snag","in-manage-gone","in-manage-missing","out-manage","in-new","out-new","in-new-type","in-new-about","in-new-modules","in-new-modules-search","in-new-home","in-new-address","in-new-app","in-new-app-render","in-new-review","in-new-done","in-new-resume-offer","out-map-projects","card","card-noart","card-self","in-mine-empty","card-floor","card-backdrop"],
|
|
3611
|
-
"files_hash": "
|
|
3611
|
+
"files_hash": "f6bf47d00fcd6fee",
|
|
3612
3612
|
"reading_hash": "1b2c6ce40c79925e",
|
|
3613
3613
|
"counts": {"lines":517,"placed":182,"shared":20,"unplaced":315},
|
|
3614
3614
|
"omitted": {"data":107},
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
paint();
|
|
234
234
|
try {
|
|
235
235
|
const url = kind === 'approved' ? writes.approve(item.page_id) : writes.sendBack(item.page_id);
|
|
236
|
-
const res = await api.request('POST', url, body);
|
|
236
|
+
const res = await api.request('POST', url, { body });
|
|
237
237
|
if (!res.ok) {
|
|
238
238
|
state.error = errWords(res.data, 'That could not be recorded. Nothing changed.');
|
|
239
239
|
return;
|
|
@@ -560,6 +560,15 @@
|
|
|
560
560
|
return !!req.needs_craft && crafts.indexOf(req.needs_craft) !== -1;
|
|
561
561
|
}
|
|
562
562
|
|
|
563
|
+
// Whether the reader may REOPEN a settled ask (task 1004458): only the person
|
|
564
|
+
// who asked, ticket style. Mirrors reopenHelpRequest's WHERE; the server stays
|
|
565
|
+
// the authority, this only decides whether to draw the button.
|
|
566
|
+
function canReopen(req, meId) {
|
|
567
|
+
if (!req || meId == null) return false;
|
|
568
|
+
if (String(req.status || '') === 'open') return false;
|
|
569
|
+
return String(req.requested_by) === String(meId);
|
|
570
|
+
}
|
|
571
|
+
|
|
563
572
|
// ---- the archive (task 1004224) -------------------------------------------
|
|
564
573
|
//
|
|
565
574
|
// HOW AN ASK ENDED, in one sentence. This is the only thing an archived row has
|
|
@@ -613,7 +622,7 @@
|
|
|
613
622
|
SKILL_COMMAND: SKILL_COMMAND, sessionStartPrompt: sessionStartPrompt,
|
|
614
623
|
queueStartPrompt: queueStartPrompt, contextSentence: contextSentence,
|
|
615
624
|
saidLabel: saidLabel, replyAuthor: replyAuthor, threadOf: threadOf,
|
|
616
|
-
canClose: canClose, validateReplyBody: validateReplyBody, MAX_REPLY: MAX_REPLY,
|
|
625
|
+
canClose: canClose, canReopen: canReopen, validateReplyBody: validateReplyBody, MAX_REPLY: MAX_REPLY,
|
|
617
626
|
outcomeLine: outcomeLine,
|
|
618
627
|
};
|
|
619
628
|
})();
|
|
@@ -158,10 +158,17 @@
|
|
|
158
158
|
// The composer is CLOSED until asked for. A textarea open on every row would
|
|
159
159
|
// turn a page you read into a page you are being asked to type on, and the
|
|
160
160
|
// blocks are condensed to three rows precisely so the page stays readable.
|
|
161
|
+
//
|
|
162
|
+
// "Post & resolve" (task 1004458) is the answer and the close in one press,
|
|
163
|
+
// drawn only for someone L.canClose says may close the ask. The asker can
|
|
164
|
+
// reopen it from their archive if the answer did not do it.
|
|
161
165
|
function threadHtml(req, key, nowMs) {
|
|
162
166
|
const thread = L.threadOf(req);
|
|
163
167
|
const id = escapeHtml(String(req.id));
|
|
164
168
|
const fid = `cb-reply-${escapeHtml(key)}-${id}`;
|
|
169
|
+
const resolve = L.canClose(req, meId, myCrafts)
|
|
170
|
+
? `<button class="btn-ghost" type="submit" data-reply-send="${id}" data-reply-resolve>Post & resolve</button>`
|
|
171
|
+
: '';
|
|
165
172
|
const list = thread.length
|
|
166
173
|
? `<ul class="cb-thread">${thread.map((r) => replyHtml(r, nowMs)).join('')}</ul>`
|
|
167
174
|
: '';
|
|
@@ -172,6 +179,7 @@
|
|
|
172
179
|
<textarea class="cb-reply-input" name="body" rows="3" maxlength="${L.MAX_REPLY}" placeholder="Write a reply…"></textarea>
|
|
173
180
|
<div class="cb-reply-actions">
|
|
174
181
|
<button class="btn-accent" type="submit" data-reply-send="${id}">Post reply</button>
|
|
182
|
+
${resolve}
|
|
175
183
|
<button class="btn-ghost" type="button" data-reply-cancel="${fid}">Cancel</button>
|
|
176
184
|
</div>
|
|
177
185
|
</form>`;
|
|
@@ -267,7 +275,7 @@
|
|
|
267
275
|
// draw it and the server's own WHERE decides whether it works — so the worst
|
|
268
276
|
// a wrong answer here can do is offer a button that refuses.
|
|
269
277
|
const close = L.canClose(req, meId, myCrafts)
|
|
270
|
-
? `<div class="ov-row__actions"><button class="btn-ghost" data-settle="answered" data-id="${escapeHtml(String(req.id))}">
|
|
278
|
+
? `<div class="ov-row__actions"><button class="btn-ghost" data-settle="answered" data-id="${escapeHtml(String(req.id))}">Mark resolved</button></div>`
|
|
271
279
|
: '';
|
|
272
280
|
return `<li class="ov-row ov-row--lead cb-row${live}" data-id="${escapeHtml(String(req.id))}"${extra ? ' data-extra hidden' : ''}>
|
|
273
281
|
${faceHtml(L.faceOf(req, 'in'))}
|
|
@@ -301,7 +309,7 @@
|
|
|
301
309
|
</div>
|
|
302
310
|
<div class="ov-row__right">
|
|
303
311
|
<div class="ov-row__actions">
|
|
304
|
-
<button class="btn-accent" data-settle="answered" data-id="${id}">
|
|
312
|
+
<button class="btn-accent" data-settle="answered" data-id="${id}">Mark resolved</button>
|
|
305
313
|
<button class="btn-ghost" data-settle="withdrawn" data-id="${id}">Withdraw</button>
|
|
306
314
|
</div>
|
|
307
315
|
</div>
|
|
@@ -338,6 +346,11 @@
|
|
|
338
346
|
// and the sentence: 'in' on the asks made OF them (the asker's face), 'out' on
|
|
339
347
|
// the asks they made (the addressee's). Exactly the pairing forMeRow and
|
|
340
348
|
// mineRow use, which is why an archived row reads like the open row it was.
|
|
349
|
+
//
|
|
350
|
+
// ONE ACTION, ON ONE SIDE (task 1004458): the asker's own archived asks carry
|
|
351
|
+
// "Reopen", ticket style — whoever closed it, the person who needed the answer
|
|
352
|
+
// has the last word. The server's WHERE holds the rule (asker only); the button
|
|
353
|
+
// is only drawn where it can work.
|
|
341
354
|
function archiveRow(dir) {
|
|
342
355
|
return (req, nowMs, extra, key) => {
|
|
343
356
|
const outcome = L.outcomeLine(req);
|
|
@@ -350,11 +363,15 @@
|
|
|
350
363
|
// holds the other facts, and the row keeps no right column at all: there
|
|
351
364
|
// is nothing on an archived row to act on.
|
|
352
365
|
const fact = outcome ? `<span class="ov-fact cb-outcome">${escapeHtml(outcome)}</span>` : '';
|
|
353
|
-
|
|
366
|
+
const id = escapeHtml(String(req.id));
|
|
367
|
+
const reopen = L.canReopen(req, meId)
|
|
368
|
+
? `<div class="ov-row__right"><div class="ov-row__actions"><button class="btn-ghost" data-reopen data-id="${id}">Reopen</button></div></div>`
|
|
369
|
+
: '';
|
|
370
|
+
return `<li class="ov-row ov-row--lead cb-row cb-row--archived" data-id="${id}"${extra ? ' data-extra hidden' : ''}>
|
|
354
371
|
${faceHtml(L.faceOf(req, dir))}
|
|
355
372
|
<div class="ov-row__main">${askHtml(req, key, true)}
|
|
356
373
|
<div class="ov-row__facts">${directionFact(req, dir)}${contextChip(req)}${fact}</div>
|
|
357
|
-
</div
|
|
374
|
+
</div>${reopen}
|
|
358
375
|
</li>`;
|
|
359
376
|
};
|
|
360
377
|
}
|
|
@@ -691,7 +708,7 @@
|
|
|
691
708
|
if (settling) return;
|
|
692
709
|
settling = true;
|
|
693
710
|
try {
|
|
694
|
-
const r = await api.request('POST', `/mingle/pairs/${id}/decide`, { decision });
|
|
711
|
+
const r = await api.request('POST', `/mingle/pairs/${id}/decide`, { body: { decision } });
|
|
695
712
|
if (!r.ok) {
|
|
696
713
|
toast(window.OTB.errMessage ? window.OTB.errMessage(r.data) : 'Could not answer that introduction.');
|
|
697
714
|
return;
|
|
@@ -709,7 +726,11 @@
|
|
|
709
726
|
// Post a reply. One in flight at a time (the `replying` latch), the same guard
|
|
710
727
|
// `settling` gives the settle actions: a double-submit on an APPEND-ONLY table
|
|
711
728
|
// writes the answer twice and there is no edit or delete to take it back with.
|
|
712
|
-
|
|
729
|
+
//
|
|
730
|
+
// `resolve` (task 1004458) closes the ask as 'answered' once the reply has
|
|
731
|
+
// landed — never before, so a refused reply cannot leave an ask closed on words
|
|
732
|
+
// nobody can read.
|
|
733
|
+
async function postReply(form, resolve) {
|
|
713
734
|
if (replying) return;
|
|
714
735
|
const id = form.getAttribute('data-reply-form');
|
|
715
736
|
const input = form.querySelector('.cb-reply-input');
|
|
@@ -725,13 +746,22 @@
|
|
|
725
746
|
const send = form.querySelector('[data-reply-send]');
|
|
726
747
|
if (send) { send.disabled = true; send.textContent = 'Posting…'; }
|
|
727
748
|
try {
|
|
728
|
-
|
|
749
|
+
// The reply's field is ALSO called `body`, so it is nested: the client's
|
|
750
|
+
// `body` option is the whole JSON payload. Passing the bare string sent a
|
|
751
|
+
// top-level JSON string, which the server's strict parser refuses as
|
|
752
|
+
// bad_json (task 1004458).
|
|
753
|
+
const r = await api.request('POST', `/help-requests/${id}/replies`, { body: { body: v.body } });
|
|
729
754
|
if (!r.ok) {
|
|
730
755
|
toast(window.OTB.errMessage ? window.OTB.errMessage(r.data) : 'Could not post that reply.');
|
|
731
756
|
return;
|
|
732
757
|
}
|
|
733
758
|
if (input) input.value = '';
|
|
734
|
-
|
|
759
|
+
if (resolve) {
|
|
760
|
+
const c = await api.helpRequests.patchHelpRequestsId({ id: Number(id), body: { status: 'answered' } });
|
|
761
|
+
toast(c.ok ? 'Replied and resolved.' : 'Replied, but could not resolve it.');
|
|
762
|
+
} else {
|
|
763
|
+
toast('Replied.');
|
|
764
|
+
}
|
|
735
765
|
await load();
|
|
736
766
|
} finally {
|
|
737
767
|
replying = false;
|
|
@@ -758,7 +788,7 @@
|
|
|
758
788
|
toast(window.OTB.errMessage ? window.OTB.errMessage(r.data) : 'Could not update that request.');
|
|
759
789
|
return;
|
|
760
790
|
}
|
|
761
|
-
toast(status === 'answered' ? '
|
|
791
|
+
toast(status === 'answered' ? 'Resolved.' : status === 'open' ? 'Reopened.' : 'Withdrawn.');
|
|
762
792
|
await load();
|
|
763
793
|
} finally {
|
|
764
794
|
settling = false;
|
|
@@ -785,6 +815,12 @@
|
|
|
785
815
|
decideMingle(Number(mingleBtn.getAttribute('data-id')), mingleBtn.getAttribute('data-mingle'));
|
|
786
816
|
return;
|
|
787
817
|
}
|
|
818
|
+
const reopenBtn = closest('[data-reopen]');
|
|
819
|
+
if (reopenBtn) {
|
|
820
|
+
ev.preventDefault();
|
|
821
|
+
settle(Number(reopenBtn.getAttribute('data-id')), 'open');
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
788
824
|
const btn = closest('[data-settle]');
|
|
789
825
|
if (!btn) return;
|
|
790
826
|
ev.preventDefault();
|
|
@@ -799,7 +835,8 @@
|
|
|
799
835
|
const form = ev.target && ev.target.closest ? ev.target.closest('[data-reply-form]') : null;
|
|
800
836
|
if (!form) return;
|
|
801
837
|
ev.preventDefault();
|
|
802
|
-
|
|
838
|
+
const resolve = !!(ev.submitter && ev.submitter.hasAttribute('data-reply-resolve'));
|
|
839
|
+
postReply(form, resolve);
|
|
803
840
|
});
|
|
804
841
|
|
|
805
842
|
load().catch(() => {
|
|
@@ -386,7 +386,7 @@
|
|
|
386
386
|
const said = words();
|
|
387
387
|
const who = (viewer && (viewer.display_name || viewer.github_login)) || 'an artist';
|
|
388
388
|
const reason = `Reviewed in the studio by ${who} — the copy and visuals are good as shipped.${said ? ` ${said}` : ''}`;
|
|
389
|
-
const res = await api.request('POST', WRITE_ROUTES.abandon(p.taskId), { reason });
|
|
389
|
+
const res = await api.request('POST', WRITE_ROUTES.abandon(p.taskId), { body: { reason } });
|
|
390
390
|
if (!res.ok) return verdictError(errMessage(res.data) || 'That could not be recorded. Nothing changed.');
|
|
391
391
|
toast('Dismissed — the copy and visuals are good as shipped.');
|
|
392
392
|
retire(p);
|
|
@@ -417,7 +417,7 @@
|
|
|
417
417
|
const who = (viewer && (viewer.display_name || viewer.github_login)) || 'an artist';
|
|
418
418
|
const stamp = new Date().toISOString().slice(0, 10);
|
|
419
419
|
const block = `\n\n---\n\nARTIST NOTE (${stamp}, ${who}, from the studio):\n\n${said}`;
|
|
420
|
-
const res = await api.request('PATCH', WRITE_ROUTES.patch(p.taskId), { description: `${base}${block}` });
|
|
420
|
+
const res = await api.request('PATCH', WRITE_ROUTES.patch(p.taskId), { body: { description: `${base}${block}` } });
|
|
421
421
|
if (!res.ok) return verdictError(errMessage(res.data) || 'That could not be recorded. Nothing changed.');
|
|
422
422
|
p.description = `${base}${block}`;
|
|
423
423
|
toast('Noted on the review — it stays open.');
|
|
@@ -447,7 +447,7 @@
|
|
|
447
447
|
if (!said) return verdictError('Write what needs work first — a follow-up with no brief cannot be claimed.');
|
|
448
448
|
const who = (viewer && (viewer.display_name || viewer.github_login)) || 'an artist';
|
|
449
449
|
const about = p.shippedId ? `task ${p.shippedId}` : `review ${p.taskId}`;
|
|
450
|
-
const created = await api.request('POST', WRITE_ROUTES.create(), {
|
|
450
|
+
const created = await api.request('POST', WRITE_ROUTES.create(), { body: {
|
|
451
451
|
version_id: p.versionId,
|
|
452
452
|
goal_id: p.goalId ? Number(p.goalId) : undefined,
|
|
453
453
|
title: `Artist verdict: the copy or visuals shipped in ${about} need work`,
|
|
@@ -463,17 +463,17 @@
|
|
|
463
463
|
discipline: 'artist',
|
|
464
464
|
source: 'studio-verdict',
|
|
465
465
|
source_ref: `studio-needs-work-on-review-${p.taskId}`,
|
|
466
|
-
});
|
|
466
|
+
} });
|
|
467
467
|
if (!created.ok) return verdictError(errMessage(created.data) || 'The follow-up could not be filed. Nothing changed.');
|
|
468
468
|
const newId = created.data && created.data.task && created.data.task.id;
|
|
469
469
|
if (!newId) return verdictError('The follow-up came back without an id, so the review was left open.');
|
|
470
470
|
// Close the review against the follow-up. If this half fails the follow-up
|
|
471
471
|
// still exists and is reported as such — a stranded-but-visible task beats
|
|
472
472
|
// a silent success, and re-running the same verdict is safe.
|
|
473
|
-
const closed = await api.request('POST', WRITE_ROUTES.merge(p.taskId), {
|
|
473
|
+
const closed = await api.request('POST', WRITE_ROUTES.merge(p.taskId), { body: {
|
|
474
474
|
into_task_id: Number(newId),
|
|
475
475
|
reason: `Artist verdict from the studio: the review's answer is task ${newId}, which carries the work.`,
|
|
476
|
-
});
|
|
476
|
+
} });
|
|
477
477
|
if (!closed.ok) {
|
|
478
478
|
return verdictError(`Task ${newId} was filed, but this review could not be closed against it — close it from the review itself.`);
|
|
479
479
|
}
|
|
@@ -882,7 +882,7 @@
|
|
|
882
882
|
wedit.save = 'saving';
|
|
883
883
|
wedit.error = '';
|
|
884
884
|
paintEditing();
|
|
885
|
-
wedit.inflight = api.request('PUT', WRITE_ROUTES.draft(STUDIO), body);
|
|
885
|
+
wedit.inflight = api.request('PUT', WRITE_ROUTES.draft(STUDIO), { body });
|
|
886
886
|
const res = await wedit.inflight;
|
|
887
887
|
wedit.inflight = null;
|
|
888
888
|
if (res.ok) {
|