@blackbelt-technology/pi-agent-dashboard 0.5.0 → 0.5.2
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/AGENTS.md +26 -5
- package/README.md +49 -7
- package/docs/architecture.md +129 -1
- package/package.json +15 -15
- package/packages/extension/package.json +11 -3
- package/packages/extension/src/__tests__/ask-user-tool.test.ts +1 -1
- package/packages/extension/src/__tests__/bridge-slash-command-routing.test.ts +362 -0
- package/packages/extension/src/__tests__/command-handler.test.ts +78 -8
- package/packages/extension/src/__tests__/enrich-model-metadata.test.ts +1 -1
- package/packages/extension/src/__tests__/extension-slash-command-detection.test.ts +107 -0
- package/packages/extension/src/__tests__/no-tui-multiselect-arm-regression.test.ts +1 -1
- package/packages/extension/src/__tests__/prompt-expander.test.ts +110 -1
- package/packages/extension/src/__tests__/provider-register-reload.test.ts +74 -0
- package/packages/extension/src/__tests__/retry-tracker.test.ts +147 -0
- package/packages/extension/src/__tests__/server-launcher-launch.test.ts +78 -0
- package/packages/extension/src/__tests__/session-sync.test.ts +72 -0
- package/packages/extension/src/__tests__/usage-limit-orderer.test.ts +105 -0
- package/packages/extension/src/ask-user-tool.ts +1 -1
- package/packages/extension/src/bridge-context.ts +68 -4
- package/packages/extension/src/bridge.ts +79 -11
- package/packages/extension/src/command-handler.ts +95 -15
- package/packages/extension/src/flow-event-wiring.ts +1 -1
- package/packages/extension/src/multiselect-list.ts +1 -1
- package/packages/extension/src/pi-env.d.ts +16 -9
- package/packages/extension/src/prompt-expander.ts +74 -63
- package/packages/extension/src/provider-register.ts +16 -9
- package/packages/extension/src/retry-tracker.ts +123 -0
- package/packages/extension/src/server-launcher.ts +31 -70
- package/packages/extension/src/session-sync.ts +10 -1
- package/packages/extension/src/slash-dispatch.ts +123 -0
- package/packages/extension/src/usage-limit-orderer.ts +76 -0
- package/packages/server/bin/pi-dashboard.mjs +84 -0
- package/packages/server/package.json +8 -7
- package/packages/server/scripts/fix-pty-permissions.cjs +52 -0
- package/packages/server/src/__tests__/changelog-fs.test.ts +171 -0
- package/packages/server/src/__tests__/changelog-parser.test.ts +220 -0
- package/packages/server/src/__tests__/changelog-remote.test.ts +193 -0
- package/packages/server/src/__tests__/cli-parse.test.ts +16 -4
- package/packages/server/src/__tests__/directory-service-openspec-enabled.test.ts +187 -0
- package/packages/server/src/__tests__/directory-service-refresh-force.test.ts +1 -1
- package/packages/server/src/__tests__/directory-service-specs-mtime.test.ts +1 -1
- package/packages/server/src/__tests__/directory-service-toctou.test.ts +1 -1
- package/packages/server/src/__tests__/directory-service.test.ts +2 -2
- package/packages/server/src/__tests__/dispatch-extension-command-router.test.ts +178 -0
- package/packages/server/src/__tests__/e2e/model-proxy-google-flash.test.ts +184 -0
- package/packages/server/src/__tests__/event-wiring-providers-list.test.ts +68 -1
- package/packages/server/src/__tests__/fixtures/pi-changelog-slice.md +180 -0
- package/packages/server/src/__tests__/fork-empty-session-preflight.test.ts +268 -0
- package/packages/server/src/__tests__/headless-pid-registry.test.ts +316 -0
- package/packages/server/src/__tests__/is-pi-process.test.ts +1 -1
- package/packages/server/src/__tests__/keeper-manager.test.ts +298 -0
- package/packages/server/src/__tests__/legacy-pi-cleanup.test.ts +149 -0
- package/packages/server/src/__tests__/model-proxy-api-key-routes.test.ts +277 -0
- package/packages/server/src/__tests__/model-proxy-auth-gate.test.ts +263 -0
- package/packages/server/src/__tests__/model-proxy-multi-user.test.ts +169 -0
- package/packages/server/src/__tests__/model-proxy-routes.test.ts +286 -0
- package/packages/server/src/__tests__/model-proxy-second-port.test.ts +116 -0
- package/packages/server/src/__tests__/openspec-connect-snapshot.test.ts +64 -8
- package/packages/server/src/__tests__/openspec-group-broadcast.test.ts +97 -0
- package/packages/server/src/__tests__/openspec-group-join.test.ts +80 -0
- package/packages/server/src/__tests__/openspec-group-routes.test.ts +370 -0
- package/packages/server/src/__tests__/openspec-group-store.test.ts +496 -0
- package/packages/server/src/__tests__/package-manager-wrapper-resolve.test.ts +4 -4
- package/packages/server/src/__tests__/package-routes.test.ts +1 -1
- package/packages/server/src/__tests__/pending-fork-registry.test.ts +48 -24
- package/packages/server/src/__tests__/pi-ai-shape.test.ts +147 -0
- package/packages/server/src/__tests__/pi-changelog-integration.test.ts +165 -0
- package/packages/server/src/__tests__/pi-changelog-routes.test.ts +409 -0
- package/packages/server/src/__tests__/pi-core-checker.test.ts +155 -13
- package/packages/server/src/__tests__/pi-core-updater-managed-path.test.ts +62 -3
- package/packages/server/src/__tests__/pi-core-updater.test.ts +1 -1
- package/packages/server/src/__tests__/pi-dashboard-bin-wrapper.test.ts +84 -0
- package/packages/server/src/__tests__/pi-dev-version-check.test.ts +184 -0
- package/packages/server/src/__tests__/pi-version-skew.test.ts +4 -4
- package/packages/server/src/__tests__/process-manager-keeper-spawn.test.ts +206 -0
- package/packages/server/src/__tests__/provider-auth-routes.test.ts +12 -4
- package/packages/server/src/__tests__/provider-catalogue-cache.test.ts +13 -23
- package/packages/server/src/__tests__/provider-routes-recursion-guard.test.ts +131 -0
- package/packages/server/src/__tests__/recommended-routes.test.ts +3 -3
- package/packages/server/src/__tests__/spawn-correlation-token-integration.test.ts +91 -0
- package/packages/server/src/__tests__/spawn-register-watchdog.test.ts +84 -0
- package/packages/server/src/__tests__/spawn-token.test.ts +57 -0
- package/packages/server/src/__tests__/tunnel-watchdog.test.ts +139 -0
- package/packages/server/src/auth-plugin.ts +3 -0
- package/packages/server/src/bootstrap-state.ts +10 -0
- package/packages/server/src/browser-gateway.ts +27 -10
- package/packages/server/src/browser-handlers/handler-context.ts +9 -0
- package/packages/server/src/browser-handlers/session-action-handler.ts +128 -19
- package/packages/server/src/changelog-fs.ts +167 -0
- package/packages/server/src/changelog-parser.ts +321 -0
- package/packages/server/src/changelog-remote.ts +134 -0
- package/packages/server/src/cli.ts +62 -82
- package/packages/server/src/config-api.ts +14 -2
- package/packages/server/src/directory-service.ts +106 -4
- package/packages/server/src/event-wiring.ts +90 -6
- package/packages/server/src/headless-pid-registry.ts +344 -37
- package/packages/server/src/legacy-pi-cleanup.ts +151 -0
- package/packages/server/src/model-proxy/__tests__/api-key-store.test.ts +142 -0
- package/packages/server/src/model-proxy/__tests__/auth-json-contention.test.ts +98 -0
- package/packages/server/src/model-proxy/__tests__/concurrency.test.ts +107 -0
- package/packages/server/src/model-proxy/__tests__/failed-auth-backoff.test.ts +46 -0
- package/packages/server/src/model-proxy/__tests__/recursion-guard.test.ts +61 -0
- package/packages/server/src/model-proxy/__tests__/streamer.test.ts +139 -0
- package/packages/server/src/model-proxy/api-key-store.ts +87 -0
- package/packages/server/src/model-proxy/auth-gate.ts +116 -0
- package/packages/server/src/model-proxy/concurrency.ts +76 -0
- package/packages/server/src/model-proxy/convert/UPSTREAM.md +13 -0
- package/packages/server/src/model-proxy/convert/__tests__/anthropic-in.test.ts +137 -0
- package/packages/server/src/model-proxy/convert/__tests__/anthropic-out.test.ts +183 -0
- package/packages/server/src/model-proxy/convert/__tests__/openai-in.test.ts +134 -0
- package/packages/server/src/model-proxy/convert/__tests__/openai-out.test.ts +166 -0
- package/packages/server/src/model-proxy/convert/anthropic-in.ts +129 -0
- package/packages/server/src/model-proxy/convert/anthropic-out.ts +173 -0
- package/packages/server/src/model-proxy/convert/index.ts +8 -0
- package/packages/server/src/model-proxy/convert/openai-in.ts +119 -0
- package/packages/server/src/model-proxy/convert/openai-out.ts +151 -0
- package/packages/server/src/model-proxy/convert/types.ts +70 -0
- package/packages/server/src/model-proxy/failed-auth-backoff.ts +45 -0
- package/packages/server/src/model-proxy/internal-auth-storage.ts +146 -0
- package/packages/server/src/model-proxy/internal-registry.ts +157 -0
- package/packages/server/src/model-proxy/recursion-guard.ts +72 -0
- package/packages/server/src/model-proxy/registry-singleton.ts +109 -0
- package/packages/server/src/model-proxy/request-log.ts +53 -0
- package/packages/server/src/model-proxy/streamer.ts +59 -0
- package/packages/server/src/openspec-group-store.ts +490 -0
- package/packages/server/src/pending-client-correlations.ts +73 -0
- package/packages/server/src/pending-fork-registry.ts +24 -12
- package/packages/server/src/pi-core-checker.ts +77 -17
- package/packages/server/src/pi-core-updater.ts +16 -6
- package/packages/server/src/pi-dev-version-check.ts +145 -0
- package/packages/server/src/pi-gateway.ts +4 -0
- package/packages/server/src/pi-version-skew.ts +12 -4
- package/packages/server/src/process-manager.ts +182 -11
- package/packages/server/src/provider-auth-storage.ts +29 -47
- package/packages/server/src/provider-catalogue-cache.ts +24 -18
- package/packages/server/src/restart-helper.ts +17 -16
- package/packages/server/src/routes/bootstrap-routes.ts +37 -0
- package/packages/server/src/routes/jj-routes.ts +3 -0
- package/packages/server/src/routes/model-proxy-api-key-routes.ts +168 -0
- package/packages/server/src/routes/model-proxy-refresh-routes.ts +24 -0
- package/packages/server/src/routes/model-proxy-routes.ts +330 -0
- package/packages/server/src/routes/openspec-group-routes.ts +231 -0
- package/packages/server/src/routes/pi-changelog-routes.ts +194 -0
- package/packages/server/src/routes/pi-core-routes.ts +1 -1
- package/packages/server/src/routes/provider-auth-routes.ts +8 -1
- package/packages/server/src/routes/provider-routes.ts +28 -5
- package/packages/server/src/routes/system-routes.ts +44 -2
- package/packages/server/src/rpc-keeper/__tests__/fixtures/mock-pi-shim.sh +9 -0
- package/packages/server/src/rpc-keeper/__tests__/fixtures/mock-pi.cjs +50 -0
- package/packages/server/src/rpc-keeper/__tests__/keeper.test.ts +371 -0
- package/packages/server/src/rpc-keeper/dispatch-router.ts +85 -0
- package/packages/server/src/rpc-keeper/keeper-manager.ts +364 -0
- package/packages/server/src/rpc-keeper/keeper.cjs +313 -0
- package/packages/server/src/server.ts +254 -60
- package/packages/server/src/session-api.ts +63 -4
- package/packages/server/src/session-discovery.ts +1 -1
- package/packages/server/src/session-file-reader.ts +1 -1
- package/packages/server/src/spawn-register-watchdog.ts +62 -7
- package/packages/server/src/spawn-token.ts +20 -0
- package/packages/server/src/tunnel-watchdog.ts +230 -0
- package/packages/server/src/tunnel.ts +5 -1
- package/packages/shared/package.json +1 -1
- package/packages/shared/src/__tests__/binary-lookup-resolveJiti.test.ts +228 -0
- package/packages/shared/src/__tests__/bootstrap/__snapshots__/cube.test.ts.snap +24 -17
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/a-electron.test.ts.snap +5 -4
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/b-npm-global.test.ts.snap +6 -5
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/c-dev-monorepo.test.ts.snap +1 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/e-stale-partial.test.ts.snap +5 -4
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/f-cwd-variants.test.ts.snap +2 -1
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/g-windows-specifics.test.ts.snap +5 -3
- package/packages/shared/src/__tests__/bootstrap/fixtures/dev-monorepo.ts +1 -1
- package/packages/shared/src/__tests__/changelog-types.test.ts +78 -0
- package/packages/shared/src/__tests__/config-openspec.test.ts +74 -0
- package/packages/shared/src/__tests__/model-proxy-config.test.ts +146 -0
- package/packages/shared/src/__tests__/no-raw-node-import.test.ts +7 -5
- package/packages/shared/src/__tests__/node-spawn-jiti-contract.test.ts +56 -20
- package/packages/shared/src/__tests__/node-spawn.test.ts +51 -0
- package/packages/shared/src/__tests__/openspec-groups-types.test.ts +135 -0
- package/packages/shared/src/__tests__/publish-workflow-contract.test.ts +96 -0
- package/packages/shared/src/__tests__/recommended-extensions.test.ts +11 -3
- package/packages/shared/src/__tests__/server-launcher.test.ts +227 -0
- package/packages/shared/src/__tests__/tool-registry-definitions.test.ts +1 -1
- package/packages/shared/src/bootstrap-install.ts +1 -1
- package/packages/shared/src/browser-protocol.ts +70 -0
- package/packages/shared/src/changelog-types.ts +111 -0
- package/packages/shared/src/config.ts +172 -2
- package/packages/shared/src/dashboard-plugin/manifest-types.ts +16 -1
- package/packages/shared/src/dashboard-plugin/slot-props.ts +8 -0
- package/packages/shared/src/dashboard-plugin/slot-types.ts +57 -0
- package/packages/shared/src/platform/binary-lookup.ts +204 -0
- package/packages/shared/src/platform/node-spawn.ts +71 -26
- package/packages/shared/src/protocol.ts +27 -1
- package/packages/shared/src/recommended-extensions.ts +18 -0
- package/packages/shared/src/rest-api.ts +219 -1
- package/packages/shared/src/server-launcher.ts +277 -0
- package/packages/shared/src/skill-block-parser.ts +1 -1
- package/packages/shared/src/tool-registry/__tests__/pi-ai-registration.test.ts +124 -0
- package/packages/shared/src/tool-registry/definitions.ts +15 -3
- package/packages/shared/src/types.ts +62 -0
- package/packages/shared/src/__tests__/resolve-jiti.test.ts +0 -53
- package/packages/shared/src/resolve-jiti.ts +0 -102
|
@@ -29,12 +29,12 @@ source: —
|
|
|
29
29
|
path: —
|
|
30
30
|
tried:
|
|
31
31
|
override no override set
|
|
32
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
32
33
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
33
|
-
|
|
34
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
34
35
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
35
|
-
|
|
36
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
36
37
|
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
37
|
-
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
38
38
|
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
39
39
|
where not found on PATH"
|
|
40
40
|
`;
|
|
@@ -66,8 +66,9 @@ source: managed
|
|
|
66
66
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
67
67
|
tried:
|
|
68
68
|
override no override set
|
|
69
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
69
70
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
70
|
-
|
|
71
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
71
72
|
managed ok"
|
|
72
73
|
`;
|
|
73
74
|
|
|
@@ -111,12 +112,12 @@ source: —
|
|
|
111
112
|
path: —
|
|
112
113
|
tried:
|
|
113
114
|
override no override set
|
|
115
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
114
116
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
115
|
-
|
|
117
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
116
118
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
117
|
-
|
|
119
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
118
120
|
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
119
|
-
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
120
121
|
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
121
122
|
where not found on PATH"
|
|
122
123
|
`;
|
|
@@ -150,10 +151,11 @@ source: npm-global
|
|
|
150
151
|
path: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
151
152
|
tried:
|
|
152
153
|
override no override set
|
|
154
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
153
155
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
154
|
-
|
|
156
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
155
157
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
156
|
-
|
|
158
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
157
159
|
npm-global ok
|
|
158
160
|
argv:
|
|
159
161
|
- C:/Program Files/nodejs/node.exe
|
|
@@ -199,6 +201,7 @@ source: bare-import
|
|
|
199
201
|
path: dist/cli.js
|
|
200
202
|
tried:
|
|
201
203
|
override no override set
|
|
204
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
202
205
|
bare-import ok"
|
|
203
206
|
`;
|
|
204
207
|
|
|
@@ -248,8 +251,9 @@ source: managed
|
|
|
248
251
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
249
252
|
tried:
|
|
250
253
|
override no override set
|
|
254
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
251
255
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
252
|
-
|
|
256
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
253
257
|
managed ok"
|
|
254
258
|
`;
|
|
255
259
|
|
|
@@ -271,12 +275,12 @@ source: —
|
|
|
271
275
|
path: —
|
|
272
276
|
tried:
|
|
273
277
|
override no override set
|
|
278
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
274
279
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
275
|
-
|
|
280
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
276
281
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
277
|
-
|
|
282
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
278
283
|
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
279
|
-
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
280
284
|
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
281
285
|
where not found on PATH"
|
|
282
286
|
`;
|
|
@@ -288,8 +292,9 @@ source: managed
|
|
|
288
292
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
289
293
|
tried:
|
|
290
294
|
override no override set
|
|
295
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
291
296
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
292
|
-
|
|
297
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
293
298
|
managed ok"
|
|
294
299
|
`;
|
|
295
300
|
|
|
@@ -320,8 +325,9 @@ source: managed
|
|
|
320
325
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
321
326
|
tried:
|
|
322
327
|
override no override set
|
|
328
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
323
329
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
324
|
-
|
|
330
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
325
331
|
managed ok
|
|
326
332
|
argv:
|
|
327
333
|
- C:/Program Files/nodejs/node.exe
|
|
@@ -335,10 +341,11 @@ source: npm-global
|
|
|
335
341
|
path: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
336
342
|
tried:
|
|
337
343
|
override no override set
|
|
344
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
338
345
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
339
|
-
|
|
346
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
340
347
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
341
|
-
|
|
348
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
342
349
|
npm-global ok
|
|
343
350
|
argv:
|
|
344
351
|
- C:/Program Files/nodejs/node.exe
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/a-electron.test.ts.snap
CHANGED
|
@@ -29,12 +29,12 @@ source: —
|
|
|
29
29
|
path: —
|
|
30
30
|
tried:
|
|
31
31
|
override no override set
|
|
32
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
32
33
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
33
|
-
|
|
34
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
34
35
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
35
|
-
|
|
36
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
36
37
|
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
37
|
-
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
38
38
|
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
39
39
|
where not found on PATH"
|
|
40
40
|
`;
|
|
@@ -66,8 +66,9 @@ source: managed
|
|
|
66
66
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
67
67
|
tried:
|
|
68
68
|
override no override set
|
|
69
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
69
70
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
70
|
-
|
|
71
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
71
72
|
managed ok"
|
|
72
73
|
`;
|
|
73
74
|
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/b-npm-global.test.ts.snap
CHANGED
|
@@ -29,12 +29,12 @@ source: —
|
|
|
29
29
|
path: —
|
|
30
30
|
tried:
|
|
31
31
|
override no override set
|
|
32
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
32
33
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
33
|
-
|
|
34
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
34
35
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
35
|
-
|
|
36
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
36
37
|
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
37
|
-
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
38
38
|
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
39
39
|
where not found on PATH"
|
|
40
40
|
`;
|
|
@@ -68,10 +68,11 @@ source: npm-global
|
|
|
68
68
|
path: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
69
69
|
tried:
|
|
70
70
|
override no override set
|
|
71
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
71
72
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
72
|
-
|
|
73
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
73
74
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
74
|
-
|
|
75
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
75
76
|
npm-global ok
|
|
76
77
|
argv:
|
|
77
78
|
- C:/Program Files/nodejs/node.exe
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/e-stale-partial.test.ts.snap
CHANGED
|
@@ -27,8 +27,9 @@ source: managed
|
|
|
27
27
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
28
28
|
tried:
|
|
29
29
|
override no override set
|
|
30
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
30
31
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
31
|
-
|
|
32
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
32
33
|
managed ok"
|
|
33
34
|
`;
|
|
34
35
|
|
|
@@ -50,12 +51,12 @@ source: —
|
|
|
50
51
|
path: —
|
|
51
52
|
tried:
|
|
52
53
|
override no override set
|
|
54
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
53
55
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
54
|
-
|
|
56
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
55
57
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
56
|
-
|
|
58
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
57
59
|
npm-global missing: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
58
|
-
npm-global missing: <NPM_ROOT>/@oh-my-pi/pi-coding-agent/dist/cli.js
|
|
59
60
|
managed missing: <HOME>/.pi-dashboard/node_modules/.bin/pi.cmd
|
|
60
61
|
where not found on PATH"
|
|
61
62
|
`;
|
package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/f-cwd-variants.test.ts.snap
CHANGED
|
@@ -7,8 +7,9 @@ source: managed
|
|
|
7
7
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
8
8
|
tried:
|
|
9
9
|
override no override set
|
|
10
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
10
11
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
11
|
-
|
|
12
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
12
13
|
managed ok"
|
|
13
14
|
`;
|
|
14
15
|
|
|
@@ -7,8 +7,9 @@ source: managed
|
|
|
7
7
|
path: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
8
8
|
tried:
|
|
9
9
|
override no override set
|
|
10
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
10
11
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
11
|
-
|
|
12
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
12
13
|
managed ok
|
|
13
14
|
argv:
|
|
14
15
|
- C:/Program Files/nodejs/node.exe
|
|
@@ -22,10 +23,11 @@ source: npm-global
|
|
|
22
23
|
path: <NPM_ROOT>/@mariozechner/pi-coding-agent/dist/cli.js
|
|
23
24
|
tried:
|
|
24
25
|
override no override set
|
|
26
|
+
bare-import cannot resolve @earendil-works/pi-coding-agent/package.json
|
|
25
27
|
bare-import cannot resolve @mariozechner/pi-coding-agent/package.json
|
|
26
|
-
|
|
28
|
+
managed missing: <HOME>/.pi-dashboard/node_modules/@earendil-works/pi-coding-agent/dist/cli.js
|
|
27
29
|
managed missing: <HOME>/.pi-dashboard/node_modules/@mariozechner/pi-coding-agent/dist/cli.js
|
|
28
|
-
|
|
30
|
+
npm-global missing: <NPM_ROOT>/@earendil-works/pi-coding-agent/dist/cli.js
|
|
29
31
|
npm-global ok
|
|
30
32
|
argv:
|
|
31
33
|
- C:/Program Files/nodejs/node.exe
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-only assertions for changelog-types. The runtime body is a
|
|
3
|
+
* single `expect(true).toBe(true)` — the real test is that the
|
|
4
|
+
* `const x: T = {...}` literal blocks compile under `tsc --noEmit`
|
|
5
|
+
* during the normal test run.
|
|
6
|
+
*
|
|
7
|
+
* See change: pi-update-whats-new-panel.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from "vitest";
|
|
10
|
+
import type {
|
|
11
|
+
ChangelogBullet,
|
|
12
|
+
ChangelogRelease,
|
|
13
|
+
ChangelogResponse,
|
|
14
|
+
} from "../changelog-types.js";
|
|
15
|
+
|
|
16
|
+
describe("changelog-types", () => {
|
|
17
|
+
it("ChangelogBullet accepts minimal and full shapes", () => {
|
|
18
|
+
const minimal: ChangelogBullet = { text: "fix a bug", issues: [] };
|
|
19
|
+
const full: ChangelogBullet = {
|
|
20
|
+
text: "fix a bug ([#3588](https://github.com/x/y/issues/3588))",
|
|
21
|
+
issues: [{ num: 3588, url: "https://github.com/x/y/issues/3588" }],
|
|
22
|
+
};
|
|
23
|
+
expect(minimal.text).toBe("fix a bug");
|
|
24
|
+
expect(full.issues[0].num).toBe(3588);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("ChangelogRelease accepts a fully populated entry", () => {
|
|
28
|
+
const rel: ChangelogRelease = {
|
|
29
|
+
version: "0.70.0",
|
|
30
|
+
date: "2026-04-23",
|
|
31
|
+
breaking: [{ text: "...", issues: [] }],
|
|
32
|
+
features: [{ text: "...", issues: [] }],
|
|
33
|
+
changed: [],
|
|
34
|
+
fixed: [{ text: "...", issues: [] }],
|
|
35
|
+
raw: "## [0.70.0] - 2026-04-23\n\n…",
|
|
36
|
+
};
|
|
37
|
+
expect(rel.version).toBe("0.70.0");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("ChangelogRelease tolerates null date", () => {
|
|
41
|
+
const rel: ChangelogRelease = {
|
|
42
|
+
version: "0.0.1",
|
|
43
|
+
date: null,
|
|
44
|
+
breaking: [],
|
|
45
|
+
features: [],
|
|
46
|
+
changed: [],
|
|
47
|
+
fixed: [],
|
|
48
|
+
raw: "",
|
|
49
|
+
};
|
|
50
|
+
expect(rel.date).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("ChangelogResponse wraps a release list", () => {
|
|
54
|
+
const resp: ChangelogResponse = {
|
|
55
|
+
pkg: "@mariozechner/pi-coding-agent",
|
|
56
|
+
from: "0.62.0",
|
|
57
|
+
to: "0.70.0",
|
|
58
|
+
releases: [],
|
|
59
|
+
hasBreaking: false,
|
|
60
|
+
changelogUrl: null,
|
|
61
|
+
parsedAt: "2026-05-08T12:00:00.000Z",
|
|
62
|
+
};
|
|
63
|
+
expect(resp.releases).toHaveLength(0);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("ChangelogResponse allows null changelogUrl", () => {
|
|
67
|
+
const resp: ChangelogResponse = {
|
|
68
|
+
pkg: "x",
|
|
69
|
+
from: "1.0.0",
|
|
70
|
+
to: "1.0.1",
|
|
71
|
+
releases: [],
|
|
72
|
+
hasBreaking: false,
|
|
73
|
+
changelogUrl: null,
|
|
74
|
+
parsedAt: new Date().toISOString(),
|
|
75
|
+
};
|
|
76
|
+
expect(resp.changelogUrl).toBeNull();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
@@ -104,3 +104,77 @@ describe("loadConfig — openspec poll block", () => {
|
|
|
104
104
|
expect(second.openspec).toEqual(first.openspec);
|
|
105
105
|
});
|
|
106
106
|
});
|
|
107
|
+
|
|
108
|
+
describe("loadConfig — openspec.enabled (auto-hide-empty-session-subcards)", () => {
|
|
109
|
+
let testDir: string;
|
|
110
|
+
let configFile: string;
|
|
111
|
+
let origHome: string;
|
|
112
|
+
|
|
113
|
+
beforeEach(() => {
|
|
114
|
+
testDir = path.join(
|
|
115
|
+
os.tmpdir(),
|
|
116
|
+
`test-config-openspec-enabled-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
117
|
+
);
|
|
118
|
+
fs.mkdirSync(path.join(testDir, ".pi", "dashboard"), { recursive: true });
|
|
119
|
+
configFile = path.join(testDir, ".pi", "dashboard", "config.json");
|
|
120
|
+
origHome = process.env.HOME!;
|
|
121
|
+
process.env.HOME = testDir;
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
afterEach(() => {
|
|
125
|
+
process.env.HOME = origHome;
|
|
126
|
+
if (fs.existsSync(testDir)) fs.rmSync(testDir, { recursive: true });
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("defaults to true when openspec block is absent", () => {
|
|
130
|
+
fs.writeFileSync(configFile, JSON.stringify({ port: 8000 }));
|
|
131
|
+
expect(loadConfig().openspec.enabled).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("defaults to true when openspec block has other fields but no `enabled`", () => {
|
|
135
|
+
fs.writeFileSync(
|
|
136
|
+
configFile,
|
|
137
|
+
JSON.stringify({ openspec: { pollIntervalSeconds: 60 } }),
|
|
138
|
+
);
|
|
139
|
+
expect(loadConfig().openspec.enabled).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it("preserves explicit `false`", () => {
|
|
143
|
+
fs.writeFileSync(
|
|
144
|
+
configFile,
|
|
145
|
+
JSON.stringify({ openspec: { enabled: false } }),
|
|
146
|
+
);
|
|
147
|
+
const cfg = loadConfig();
|
|
148
|
+
expect(cfg.openspec.enabled).toBe(false);
|
|
149
|
+
// sibling fields keep their defaults
|
|
150
|
+
expect(cfg.openspec.pollIntervalSeconds).toBe(30);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("preserves explicit `true`", () => {
|
|
154
|
+
fs.writeFileSync(
|
|
155
|
+
configFile,
|
|
156
|
+
JSON.stringify({ openspec: { enabled: true } }),
|
|
157
|
+
);
|
|
158
|
+
expect(loadConfig().openspec.enabled).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("falls back to default true on non-boolean", () => {
|
|
162
|
+
fs.writeFileSync(
|
|
163
|
+
configFile,
|
|
164
|
+
JSON.stringify({ openspec: { enabled: "yes" } }),
|
|
165
|
+
);
|
|
166
|
+
expect(loadConfig().openspec.enabled).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it("round-trips through load → stringify → load", () => {
|
|
170
|
+
fs.writeFileSync(
|
|
171
|
+
configFile,
|
|
172
|
+
JSON.stringify({ openspec: { enabled: false, pollIntervalSeconds: 90 } }),
|
|
173
|
+
);
|
|
174
|
+
const first = loadConfig();
|
|
175
|
+
fs.writeFileSync(configFile, JSON.stringify(first));
|
|
176
|
+
const second = loadConfig();
|
|
177
|
+
expect(second.openspec.enabled).toBe(false);
|
|
178
|
+
expect(second.openspec.pollIntervalSeconds).toBe(90);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
parseModelProxyConfig,
|
|
4
|
+
DEFAULT_MODEL_PROXY,
|
|
5
|
+
type ModelProxyConfig,
|
|
6
|
+
} from "../config.js";
|
|
7
|
+
|
|
8
|
+
describe("parseModelProxyConfig", () => {
|
|
9
|
+
it("returns defaults when input is missing", () => {
|
|
10
|
+
expect(parseModelProxyConfig(undefined)).toEqual(DEFAULT_MODEL_PROXY);
|
|
11
|
+
expect(parseModelProxyConfig(null)).toEqual(DEFAULT_MODEL_PROXY);
|
|
12
|
+
expect(parseModelProxyConfig("string")).toEqual(DEFAULT_MODEL_PROXY);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("returns defaults when input is empty object", () => {
|
|
16
|
+
const result = parseModelProxyConfig({});
|
|
17
|
+
expect(result.enabled).toBe(true);
|
|
18
|
+
expect(result.maxConcurrentStreams).toBe(16);
|
|
19
|
+
expect(result.perKeyConcurrentStreams).toBe(4);
|
|
20
|
+
expect(result.logRequests).toBe(false);
|
|
21
|
+
expect(result.apiKeys).toEqual([]);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("preserves valid enabled flag", () => {
|
|
25
|
+
expect(parseModelProxyConfig({ enabled: false }).enabled).toBe(false);
|
|
26
|
+
expect(parseModelProxyConfig({ enabled: true }).enabled).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("clamps maxConcurrentStreams to [1, 256]", () => {
|
|
30
|
+
expect(parseModelProxyConfig({ maxConcurrentStreams: 0 }).maxConcurrentStreams).toBe(1);
|
|
31
|
+
expect(parseModelProxyConfig({ maxConcurrentStreams: -5 }).maxConcurrentStreams).toBe(1);
|
|
32
|
+
expect(parseModelProxyConfig({ maxConcurrentStreams: 500 }).maxConcurrentStreams).toBe(256);
|
|
33
|
+
expect(parseModelProxyConfig({ maxConcurrentStreams: 32 }).maxConcurrentStreams).toBe(32);
|
|
34
|
+
// Non-number falls back to default
|
|
35
|
+
expect(parseModelProxyConfig({ maxConcurrentStreams: "ten" }).maxConcurrentStreams).toBe(16);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("clamps perKeyConcurrentStreams to [1, 64]", () => {
|
|
39
|
+
expect(parseModelProxyConfig({ perKeyConcurrentStreams: 0 }).perKeyConcurrentStreams).toBe(1);
|
|
40
|
+
expect(parseModelProxyConfig({ perKeyConcurrentStreams: 100 }).perKeyConcurrentStreams).toBe(64);
|
|
41
|
+
expect(parseModelProxyConfig({ perKeyConcurrentStreams: 8 }).perKeyConcurrentStreams).toBe(8);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("accepts arbitrary string keys in perProviderCaps", () => {
|
|
45
|
+
const result = parseModelProxyConfig({
|
|
46
|
+
perProviderCaps: { anthropic: 5, google: 10, "custom-provider": 2 },
|
|
47
|
+
});
|
|
48
|
+
expect(result.perProviderCaps).toEqual({ anthropic: 5, google: 10, "custom-provider": 2 });
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("filters invalid perProviderCaps entries", () => {
|
|
52
|
+
const result = parseModelProxyConfig({
|
|
53
|
+
perProviderCaps: { valid: 5, bad: "nope", zero: 0, negative: -1 },
|
|
54
|
+
});
|
|
55
|
+
expect(result.perProviderCaps).toEqual({ valid: 5 });
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("clamps perProviderCaps values to max 256", () => {
|
|
59
|
+
const result = parseModelProxyConfig({
|
|
60
|
+
perProviderCaps: { huge: 999 },
|
|
61
|
+
});
|
|
62
|
+
expect(result.perProviderCaps).toEqual({ huge: 256 });
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("omits perProviderCaps when not an object", () => {
|
|
66
|
+
expect(parseModelProxyConfig({ perProviderCaps: "bad" }).perProviderCaps).toBeUndefined();
|
|
67
|
+
expect(parseModelProxyConfig({ perProviderCaps: [1] }).perProviderCaps).toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("validates apiKeys entries — rejects missing hash", () => {
|
|
71
|
+
const result = parseModelProxyConfig({
|
|
72
|
+
apiKeys: [
|
|
73
|
+
{ id: "a", label: "test", createdAt: 1000 }, // missing hash
|
|
74
|
+
{ id: "b", label: "ok", hash: "abc123", createdAt: 2000 },
|
|
75
|
+
],
|
|
76
|
+
});
|
|
77
|
+
expect(result.apiKeys).toHaveLength(1);
|
|
78
|
+
expect(result.apiKeys[0].id).toBe("b");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("validates apiKeys entries — rejects missing id/label/createdAt", () => {
|
|
82
|
+
const result = parseModelProxyConfig({
|
|
83
|
+
apiKeys: [
|
|
84
|
+
{ label: "no-id", hash: "h", createdAt: 1 },
|
|
85
|
+
{ id: "no-label", hash: "h", createdAt: 1 },
|
|
86
|
+
{ id: "no-time", label: "x", hash: "h" },
|
|
87
|
+
],
|
|
88
|
+
});
|
|
89
|
+
expect(result.apiKeys).toHaveLength(0);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("preserves optional apiKey fields", () => {
|
|
93
|
+
const result = parseModelProxyConfig({
|
|
94
|
+
apiKeys: [
|
|
95
|
+
{
|
|
96
|
+
id: "k1",
|
|
97
|
+
label: "full",
|
|
98
|
+
hash: "sha",
|
|
99
|
+
createdAt: 1000,
|
|
100
|
+
createdBy: "alice@x",
|
|
101
|
+
scopes: ["all"],
|
|
102
|
+
lastUsedAt: 2000,
|
|
103
|
+
expiresAt: 9999,
|
|
104
|
+
revokedAt: 3000,
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
});
|
|
108
|
+
expect(result.apiKeys[0]).toEqual({
|
|
109
|
+
id: "k1",
|
|
110
|
+
label: "full",
|
|
111
|
+
hash: "sha",
|
|
112
|
+
createdAt: 1000,
|
|
113
|
+
createdBy: "alice@x",
|
|
114
|
+
scopes: ["all"],
|
|
115
|
+
lastUsedAt: 2000,
|
|
116
|
+
expiresAt: 9999,
|
|
117
|
+
revokedAt: 3000,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("filters non-string scopes in apiKeys", () => {
|
|
122
|
+
const result = parseModelProxyConfig({
|
|
123
|
+
apiKeys: [
|
|
124
|
+
{ id: "k1", label: "t", hash: "h", createdAt: 1, scopes: ["chat", 42, null, "messages"] },
|
|
125
|
+
],
|
|
126
|
+
});
|
|
127
|
+
expect(result.apiKeys[0].scopes).toEqual(["chat", "messages"]);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("validates secondPort range [1024, 65535]", () => {
|
|
131
|
+
expect(parseModelProxyConfig({ secondPort: 9876 }).secondPort).toBe(9876);
|
|
132
|
+
expect(parseModelProxyConfig({ secondPort: 80 }).secondPort).toBeUndefined();
|
|
133
|
+
expect(parseModelProxyConfig({ secondPort: 70000 }).secondPort).toBeUndefined();
|
|
134
|
+
expect(parseModelProxyConfig({ secondPort: "bad" }).secondPort).toBeUndefined();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("preserves defaultModel string", () => {
|
|
138
|
+
expect(parseModelProxyConfig({ defaultModel: "gpt-4" }).defaultModel).toBe("gpt-4");
|
|
139
|
+
expect(parseModelProxyConfig({ defaultModel: 42 }).defaultModel).toBeUndefined();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it("preserves logRequests boolean", () => {
|
|
143
|
+
expect(parseModelProxyConfig({ logRequests: true }).logRequests).toBe(true);
|
|
144
|
+
expect(parseModelProxyConfig({ logRequests: "yes" }).logRequests).toBe(false); // falls back
|
|
145
|
+
});
|
|
146
|
+
});
|
|
@@ -20,10 +20,12 @@ import url from "node:url";
|
|
|
20
20
|
/** Files allowed to reference --import / --loader with raw identifiers. */
|
|
21
21
|
const ALLOWLIST: readonly string[] = [
|
|
22
22
|
"packages/shared/src/platform/node-spawn.ts",
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
|
|
23
|
+
// server-launcher.ts is the single shared spawn primitive for the
|
|
24
|
+
// dashboard server (Bridge / Standalone CLI / Electron). It mentions
|
|
25
|
+
// "--import" in commentary; argv construction itself is delegated to
|
|
26
|
+
// node-spawn.ts via `spawnNodeScript` / `buildNodeImportArgvParts`.
|
|
27
|
+
// See change: unify-server-launch-ts-loader.
|
|
28
|
+
"packages/shared/src/server-launcher.ts",
|
|
27
29
|
];
|
|
28
30
|
|
|
29
31
|
/** Per-line opt-out for intentional usages (e.g. comment examples). */
|
|
@@ -49,7 +51,7 @@ const IMPORT_ARGV_RE =
|
|
|
49
51
|
/["']--(?:import|loader)["']\s*,\s*([^,\]]+?)\s*,\s*([^,\]]+?)(?:\s*,|\s*\])/g;
|
|
50
52
|
|
|
51
53
|
const URL_LOOKING_RE =
|
|
52
|
-
/^(?:["']file:|toFileUrl\s*\(|pathToFileURL\s*\([^)]*\)\s*\.href
|
|
54
|
+
/^(?:["']file:|toFileUrl\s*\(|pathToFileURL\s*\([^)]*\)\s*\.href)/;
|
|
53
55
|
|
|
54
56
|
/** Recursively walk a directory, yielding .ts / .tsx files. */
|
|
55
57
|
async function* walk(dir: string): AsyncGenerator<string> {
|