gsd-pi 2.64.0-dev.9c14bd0 → 2.64.0-dev.b3ee078
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/dist/headless.js +3 -1
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +22 -7
- package/dist/resources/extensions/bg-shell/process-manager.js +6 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +24 -13
- package/dist/resources/extensions/gsd/bootstrap/notify-interceptor.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +8 -0
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +16 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +20 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +104 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/notification-overlay.js +223 -0
- package/dist/resources/extensions/gsd/notification-store.js +273 -0
- package/dist/resources/extensions/gsd/notification-widget.js +56 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +8 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -19
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +3 -0
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -0
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +20 -19
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/notifications/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/l7tiSF0KtXOwxxYn0ZAyF/_buildManifest.js +1 -0
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +26 -9
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +100 -4
- package/packages/pi-agent-core/src/agent-loop.ts +43 -12
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +11 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +4 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +36 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +64 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +10 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +42 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +5 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +9 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +33 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +66 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -0
- package/packages/pi-tui/dist/components/loader.d.ts +4 -2
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +27 -9
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/text.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/text.js +2 -0
- package/packages/pi-tui/dist/components/text.js.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.js +12 -1
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +4 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +35 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +82 -0
- package/packages/pi-tui/src/components/loader.ts +27 -10
- package/packages/pi-tui/src/components/text.ts +1 -0
- package/packages/pi-tui/src/overlay-layout.ts +14 -1
- package/packages/pi-tui/src/tui.ts +34 -0
- package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +19 -7
- package/src/resources/extensions/bg-shell/process-manager.ts +8 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +25 -13
- package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +8 -0
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +20 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +28 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +140 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/notification-overlay.ts +266 -0
- package/src/resources/extensions/gsd/notification-store.ts +293 -0
- package/src/resources/extensions/gsd/notification-widget.ts +68 -0
- package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +282 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +163 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -0
- package/dist/web/standalone/.next/static/SoxM61WC_ia7R2gk4VMpJ/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
- /package/dist/web/standalone/.next/static/{SoxM61WC_ia7R2gk4VMpJ → l7tiSF0KtXOwxxYn0ZAyF}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// GSD-2 — Regression test for #3616: discuss tool scoping must not leak into subsequent sessions
|
|
2
|
+
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Bug #3616: After a discuss session narrows the active tool set via
|
|
6
|
+
* setActiveTools(), the narrowed list persisted into the next auto-mode
|
|
7
|
+
* session because newSession() did not restore extension tools when cwd
|
|
8
|
+
* was unchanged. This caused gsd_plan_slice and other DB tools to be
|
|
9
|
+
* missing from plan-slice subagent sessions.
|
|
10
|
+
*
|
|
11
|
+
* This test verifies the structural properties that prevent the leak:
|
|
12
|
+
* 1. guided-flow.ts narrows tools ONLY for discuss-* unit types
|
|
13
|
+
* 2. The narrowed set explicitly excludes gsd_plan_slice (a HEAVY_TOOL)
|
|
14
|
+
* 3. agent-session.ts:newSession() has an else-branch that restores
|
|
15
|
+
* all extension tools even when cwd hasn't changed
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { describe, test } from "node:test";
|
|
19
|
+
import assert from "node:assert/strict";
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { join, dirname } from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
|
|
24
|
+
import { DISCUSS_TOOLS_ALLOWLIST } from "../constants.ts";
|
|
25
|
+
|
|
26
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
27
|
+
const guidedFlowSource = readFileSync(join(__dirname, "..", "guided-flow.ts"), "utf-8");
|
|
28
|
+
|
|
29
|
+
describe("#3616 — discuss tool scoping must not leak across sessions", () => {
|
|
30
|
+
test("gsd_plan_slice is NOT in DISCUSS_TOOLS_ALLOWLIST", () => {
|
|
31
|
+
assert.ok(
|
|
32
|
+
!DISCUSS_TOOLS_ALLOWLIST.includes("gsd_plan_slice"),
|
|
33
|
+
"gsd_plan_slice should be excluded from discuss scope (it's a heavy planning tool)",
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("tool scoping only activates for discuss-* unit types", () => {
|
|
38
|
+
// The guard must be: if (unitType?.startsWith("discuss-"))
|
|
39
|
+
assert.ok(
|
|
40
|
+
guidedFlowSource.includes('unitType?.startsWith("discuss-")'),
|
|
41
|
+
"tool scoping should only trigger for discuss-* unit types",
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("discuss tool scoping uses setActiveTools (not setTools) for reversibility", () => {
|
|
46
|
+
// setActiveTools changes the active subset but doesn't remove tools from
|
|
47
|
+
// the registry. newSession()'s _refreshToolRegistry can restore them.
|
|
48
|
+
assert.ok(
|
|
49
|
+
guidedFlowSource.includes("pi.setActiveTools(scopedTools)"),
|
|
50
|
+
"should use pi.setActiveTools to narrow tools (preserving registry)",
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("newSession() in agent-session.ts has defense against tool narrowing persistence", () => {
|
|
55
|
+
const agentSessionSource = readFileSync(
|
|
56
|
+
join(process.cwd(), "packages/pi-coding-agent/src/core/agent-session.ts"),
|
|
57
|
+
"utf-8",
|
|
58
|
+
);
|
|
59
|
+
const newSessionStart = agentSessionSource.indexOf("async newSession(options?:");
|
|
60
|
+
assert.ok(newSessionStart >= 0, "should find newSession");
|
|
61
|
+
const body = agentSessionSource.slice(newSessionStart, newSessionStart + 3000);
|
|
62
|
+
|
|
63
|
+
// Both branches (cwd-changed and cwd-unchanged) must include extension tools
|
|
64
|
+
assert.ok(
|
|
65
|
+
body.includes("includeAllExtensionTools: true"),
|
|
66
|
+
"newSession() must include all extension tools in both branches",
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
// Count occurrences — should be at least 2 (one per branch)
|
|
70
|
+
const matches = body.match(/includeAllExtensionTools:\s*true/g);
|
|
71
|
+
assert.ok(
|
|
72
|
+
matches && matches.length >= 2,
|
|
73
|
+
`expected >=2 includeAllExtensionTools:true in newSession(), got ${matches?.length ?? 0}`,
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// GSD Extension — Notification Store Tests
|
|
2
|
+
|
|
3
|
+
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
initNotificationStore,
|
|
11
|
+
appendNotification,
|
|
12
|
+
readNotifications,
|
|
13
|
+
markAllRead,
|
|
14
|
+
clearNotifications,
|
|
15
|
+
getUnreadCount,
|
|
16
|
+
getLineCount,
|
|
17
|
+
suppressPersistence,
|
|
18
|
+
unsuppressPersistence,
|
|
19
|
+
_resetNotificationStore,
|
|
20
|
+
} from "../notification-store.js";
|
|
21
|
+
|
|
22
|
+
describe("notification-store", () => {
|
|
23
|
+
let tmp: string;
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
tmp = mkdtempSync(join(tmpdir(), "gsd-notif-test-"));
|
|
27
|
+
mkdirSync(join(tmp, ".gsd"), { recursive: true });
|
|
28
|
+
_resetNotificationStore();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
_resetNotificationStore();
|
|
33
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("appendNotification creates file and writes entry", () => {
|
|
37
|
+
initNotificationStore(tmp);
|
|
38
|
+
appendNotification("test message", "info");
|
|
39
|
+
|
|
40
|
+
const filePath = join(tmp, ".gsd", "notifications.jsonl");
|
|
41
|
+
assert.ok(existsSync(filePath));
|
|
42
|
+
|
|
43
|
+
const content = readFileSync(filePath, "utf-8").trim();
|
|
44
|
+
const entry = JSON.parse(content);
|
|
45
|
+
assert.equal(entry.message, "test message");
|
|
46
|
+
assert.equal(entry.severity, "info");
|
|
47
|
+
assert.equal(entry.source, "notify");
|
|
48
|
+
assert.equal(entry.read, false);
|
|
49
|
+
assert.ok(entry.id);
|
|
50
|
+
assert.ok(entry.ts);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("readNotifications returns newest-first", () => {
|
|
54
|
+
initNotificationStore(tmp);
|
|
55
|
+
appendNotification("first", "info");
|
|
56
|
+
appendNotification("second", "warning");
|
|
57
|
+
appendNotification("third", "error");
|
|
58
|
+
|
|
59
|
+
const entries = readNotifications();
|
|
60
|
+
assert.equal(entries.length, 3);
|
|
61
|
+
assert.equal(entries[0].message, "third");
|
|
62
|
+
assert.equal(entries[1].message, "second");
|
|
63
|
+
assert.equal(entries[2].message, "first");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("getUnreadCount tracks appends", () => {
|
|
67
|
+
initNotificationStore(tmp);
|
|
68
|
+
assert.equal(getUnreadCount(), 0);
|
|
69
|
+
|
|
70
|
+
appendNotification("msg1", "info");
|
|
71
|
+
assert.equal(getUnreadCount(), 1);
|
|
72
|
+
|
|
73
|
+
appendNotification("msg2", "warning");
|
|
74
|
+
assert.equal(getUnreadCount(), 2);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("markAllRead sets all entries to read", () => {
|
|
78
|
+
initNotificationStore(tmp);
|
|
79
|
+
appendNotification("msg1", "info");
|
|
80
|
+
appendNotification("msg2", "warning");
|
|
81
|
+
|
|
82
|
+
assert.equal(getUnreadCount(), 2);
|
|
83
|
+
|
|
84
|
+
markAllRead();
|
|
85
|
+
|
|
86
|
+
assert.equal(getUnreadCount(), 0);
|
|
87
|
+
|
|
88
|
+
const entries = readNotifications();
|
|
89
|
+
assert.ok(entries.every((e) => e.read === true));
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("clearNotifications empties the file", () => {
|
|
93
|
+
initNotificationStore(tmp);
|
|
94
|
+
appendNotification("msg1", "info");
|
|
95
|
+
appendNotification("msg2", "error");
|
|
96
|
+
|
|
97
|
+
assert.equal(getLineCount(), 2);
|
|
98
|
+
|
|
99
|
+
clearNotifications();
|
|
100
|
+
|
|
101
|
+
assert.equal(getLineCount(), 0);
|
|
102
|
+
assert.equal(getUnreadCount(), 0);
|
|
103
|
+
assert.equal(readNotifications().length, 0);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("rotation keeps only 500 entries", () => {
|
|
107
|
+
initNotificationStore(tmp);
|
|
108
|
+
|
|
109
|
+
for (let i = 0; i < 510; i++) {
|
|
110
|
+
appendNotification(`msg-${i}`, "info");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const entries = readNotifications();
|
|
114
|
+
assert.ok(entries.length <= 500, `Expected <= 500 entries, got ${entries.length}`);
|
|
115
|
+
// Most recent should be msg-509
|
|
116
|
+
assert.equal(entries[0].message, "msg-509");
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("source field is preserved", () => {
|
|
120
|
+
initNotificationStore(tmp);
|
|
121
|
+
appendNotification("from notify", "info", "notify");
|
|
122
|
+
appendNotification("from logger", "warning", "workflow-logger");
|
|
123
|
+
|
|
124
|
+
const entries = readNotifications();
|
|
125
|
+
assert.equal(entries[0].source, "workflow-logger");
|
|
126
|
+
assert.equal(entries[1].source, "notify");
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test("messages are truncated at 500 chars", () => {
|
|
130
|
+
initNotificationStore(tmp);
|
|
131
|
+
const longMsg = "x".repeat(600);
|
|
132
|
+
appendNotification(longMsg, "info");
|
|
133
|
+
|
|
134
|
+
const entries = readNotifications();
|
|
135
|
+
assert.ok(entries[0].message.length <= 501); // 500 + "…"
|
|
136
|
+
assert.ok(entries[0].message.endsWith("…"));
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("readNotifications with explicit basePath works", () => {
|
|
140
|
+
initNotificationStore(tmp);
|
|
141
|
+
appendNotification("msg1", "info");
|
|
142
|
+
|
|
143
|
+
// Read with explicit basePath
|
|
144
|
+
_resetNotificationStore();
|
|
145
|
+
const entries = readNotifications(tmp);
|
|
146
|
+
assert.equal(entries.length, 1);
|
|
147
|
+
assert.equal(entries[0].message, "msg1");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
test("init seeds counters from existing file", () => {
|
|
151
|
+
initNotificationStore(tmp);
|
|
152
|
+
appendNotification("msg1", "info");
|
|
153
|
+
appendNotification("msg2", "warning");
|
|
154
|
+
|
|
155
|
+
// Reset and re-init — should seed from disk
|
|
156
|
+
_resetNotificationStore();
|
|
157
|
+
initNotificationStore(tmp);
|
|
158
|
+
|
|
159
|
+
assert.equal(getLineCount(), 2);
|
|
160
|
+
assert.equal(getUnreadCount(), 2);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test("no-op when store not initialized", () => {
|
|
164
|
+
// Should not throw
|
|
165
|
+
appendNotification("msg", "info");
|
|
166
|
+
assert.equal(readNotifications().length, 0);
|
|
167
|
+
assert.equal(getUnreadCount(), 0);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test("suppressPersistence prevents writes", () => {
|
|
171
|
+
initNotificationStore(tmp);
|
|
172
|
+
appendNotification("before", "info");
|
|
173
|
+
assert.equal(getLineCount(), 1);
|
|
174
|
+
|
|
175
|
+
suppressPersistence();
|
|
176
|
+
appendNotification("suppressed", "info");
|
|
177
|
+
assert.equal(getLineCount(), 1); // still 1
|
|
178
|
+
|
|
179
|
+
unsuppressPersistence();
|
|
180
|
+
appendNotification("after", "info");
|
|
181
|
+
assert.equal(getLineCount(), 2); // now 2
|
|
182
|
+
|
|
183
|
+
const entries = readNotifications();
|
|
184
|
+
assert.equal(entries[0].message, "after");
|
|
185
|
+
assert.equal(entries[1].message, "before");
|
|
186
|
+
// "suppressed" should not appear
|
|
187
|
+
assert.ok(!entries.some((e) => e.message === "suppressed"));
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("suppressPersistence is ref-counted", () => {
|
|
191
|
+
initNotificationStore(tmp);
|
|
192
|
+
suppressPersistence();
|
|
193
|
+
suppressPersistence();
|
|
194
|
+
unsuppressPersistence();
|
|
195
|
+
// Still suppressed (one suppress remaining)
|
|
196
|
+
appendNotification("still suppressed", "info");
|
|
197
|
+
assert.equal(getLineCount(), 0);
|
|
198
|
+
|
|
199
|
+
unsuppressPersistence();
|
|
200
|
+
appendNotification("now works", "info");
|
|
201
|
+
assert.equal(getLineCount(), 1);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("reinit switches to new project path", () => {
|
|
205
|
+
const tmp2 = mkdtempSync(join(tmpdir(), "gsd-notif-test2-"));
|
|
206
|
+
mkdirSync(join(tmp2, ".gsd"), { recursive: true });
|
|
207
|
+
|
|
208
|
+
initNotificationStore(tmp);
|
|
209
|
+
appendNotification("project1", "info");
|
|
210
|
+
|
|
211
|
+
// Switch to new project
|
|
212
|
+
initNotificationStore(tmp2);
|
|
213
|
+
appendNotification("project2", "info");
|
|
214
|
+
|
|
215
|
+
// project2 should only have its own entry
|
|
216
|
+
const entries = readNotifications();
|
|
217
|
+
assert.equal(entries.length, 1);
|
|
218
|
+
assert.equal(entries[0].message, "project2");
|
|
219
|
+
|
|
220
|
+
// project1 should still have its entry
|
|
221
|
+
const p1Entries = readNotifications(tmp);
|
|
222
|
+
assert.equal(p1Entries.length, 1);
|
|
223
|
+
assert.equal(p1Entries[0].message, "project1");
|
|
224
|
+
|
|
225
|
+
rmSync(tmp2, { recursive: true, force: true });
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test("counters resync from disk after markAllRead", () => {
|
|
229
|
+
initNotificationStore(tmp);
|
|
230
|
+
appendNotification("msg1", "info");
|
|
231
|
+
appendNotification("msg2", "info");
|
|
232
|
+
assert.equal(getUnreadCount(), 2);
|
|
233
|
+
assert.equal(getLineCount(), 2);
|
|
234
|
+
|
|
235
|
+
markAllRead();
|
|
236
|
+
assert.equal(getUnreadCount(), 0);
|
|
237
|
+
assert.equal(getLineCount(), 2); // entries still exist, just marked read
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test("counters resync from disk after clearNotifications", () => {
|
|
241
|
+
initNotificationStore(tmp);
|
|
242
|
+
appendNotification("msg1", "info");
|
|
243
|
+
appendNotification("msg2", "info");
|
|
244
|
+
|
|
245
|
+
clearNotifications();
|
|
246
|
+
assert.equal(getUnreadCount(), 0);
|
|
247
|
+
assert.equal(getLineCount(), 0);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test("markAllRead does not delete a foreign lock file", () => {
|
|
251
|
+
initNotificationStore(tmp);
|
|
252
|
+
appendNotification("msg1", "info");
|
|
253
|
+
|
|
254
|
+
// Simulate another process holding the lock
|
|
255
|
+
const lockPath = join(tmp, ".gsd", "notifications.lock");
|
|
256
|
+
writeFileSync(lockPath, String(Date.now()), "utf-8");
|
|
257
|
+
|
|
258
|
+
// markAllRead should still work (best-effort) but not delete the foreign lock
|
|
259
|
+
markAllRead();
|
|
260
|
+
|
|
261
|
+
assert.ok(existsSync(lockPath), "foreign lock file should not be deleted");
|
|
262
|
+
|
|
263
|
+
// Clean up the lock so afterEach doesn't leave artifacts
|
|
264
|
+
rmSync(lockPath, { force: true });
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
test("clearNotifications does not delete a foreign lock file", () => {
|
|
268
|
+
initNotificationStore(tmp);
|
|
269
|
+
appendNotification("msg1", "info");
|
|
270
|
+
|
|
271
|
+
// Simulate another process holding the lock
|
|
272
|
+
const lockPath = join(tmp, ".gsd", "notifications.lock");
|
|
273
|
+
writeFileSync(lockPath, String(Date.now()), "utf-8");
|
|
274
|
+
|
|
275
|
+
// clearNotifications should still work but not delete the foreign lock
|
|
276
|
+
clearNotifications();
|
|
277
|
+
|
|
278
|
+
assert.ok(existsSync(lockPath), "foreign lock file should not be deleted");
|
|
279
|
+
|
|
280
|
+
rmSync(lockPath, { force: true });
|
|
281
|
+
});
|
|
282
|
+
});
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// GSD-2 — Regression test for #3615: unstructured "continue" must inject task context
|
|
2
|
+
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Bug #3615: When a user types "continue" (or any bare text) to resume
|
|
6
|
+
* an in-progress session, buildGuidedExecuteContextInjection() only
|
|
7
|
+
* matched two hardcoded regex patterns (auto-dispatch and guided-resume).
|
|
8
|
+
* The function returned null for any other input, so no task context was
|
|
9
|
+
* injected — causing the agent to rebuild everything from scratch and
|
|
10
|
+
* burn ~86k tokens.
|
|
11
|
+
*
|
|
12
|
+
* This test verifies:
|
|
13
|
+
* 1. Structural: the fallback exists with phase + intent guards
|
|
14
|
+
* 2. Behavioral: RESUME_INTENT_PATTERNS matches expected prompts and
|
|
15
|
+
* rejects non-resume prompts (control, help, diagnostic, etc.)
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { describe, test } from "node:test";
|
|
19
|
+
import assert from "node:assert/strict";
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { join, dirname } from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
|
|
24
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
25
|
+
const systemContextSource = readFileSync(
|
|
26
|
+
join(__dirname, "..", "bootstrap", "system-context.ts"),
|
|
27
|
+
"utf-8",
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// ── Structural tests ────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
describe("#3615 — structural: fallback exists with correct guards", () => {
|
|
33
|
+
const fnStart = systemContextSource.indexOf("async function buildGuidedExecuteContextInjection(");
|
|
34
|
+
assert.ok(fnStart >= 0, "should find buildGuidedExecuteContextInjection");
|
|
35
|
+
const fnEnd = systemContextSource.indexOf("\nasync function ", fnStart + 1);
|
|
36
|
+
const fnBody = fnEnd >= 0
|
|
37
|
+
? systemContextSource.slice(fnStart, fnEnd)
|
|
38
|
+
: systemContextSource.slice(fnStart);
|
|
39
|
+
|
|
40
|
+
test("has a deriveState fallback after the two regex branches", () => {
|
|
41
|
+
const deriveStateCalls = fnBody.match(/deriveState\(basePath\)/g);
|
|
42
|
+
assert.ok(
|
|
43
|
+
deriveStateCalls && deriveStateCalls.length >= 2,
|
|
44
|
+
`expected >=2 deriveState(basePath) calls, got ${deriveStateCalls?.length ?? 0}`,
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("fallback is phase-gated to executing only", () => {
|
|
49
|
+
const afterFallback = fnBody.indexOf("// Fallback:");
|
|
50
|
+
assert.ok(afterFallback >= 0, "should have a fallback comment");
|
|
51
|
+
const fallbackSection = fnBody.slice(afterFallback);
|
|
52
|
+
assert.ok(
|
|
53
|
+
fallbackSection.includes('state.phase === "executing"'),
|
|
54
|
+
'fallback must be gated on state.phase === "executing"',
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("fallback is intent-gated via RESUME_INTENT_PATTERNS", () => {
|
|
59
|
+
const afterFallback = fnBody.indexOf("// Fallback:");
|
|
60
|
+
const fallbackSection = fnBody.slice(afterFallback);
|
|
61
|
+
assert.ok(
|
|
62
|
+
fallbackSection.includes("RESUME_INTENT_PATTERNS"),
|
|
63
|
+
"fallback must check RESUME_INTENT_PATTERNS before deriveState",
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("fallback calls buildTaskExecutionContextInjection with derived state", () => {
|
|
68
|
+
const afterFallback = fnBody.indexOf("// Fallback:");
|
|
69
|
+
const fallbackSection = fnBody.slice(afterFallback);
|
|
70
|
+
assert.ok(
|
|
71
|
+
fallbackSection.includes("buildTaskExecutionContextInjection") &&
|
|
72
|
+
fallbackSection.includes("state.activeMilestone.id") &&
|
|
73
|
+
fallbackSection.includes("state.activeSlice.id") &&
|
|
74
|
+
fallbackSection.includes("state.activeTask.id"),
|
|
75
|
+
"fallback must call buildTaskExecutionContextInjection with state-derived IDs",
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("only one return null at the end", () => {
|
|
80
|
+
const returnNulls = fnBody.match(/return null;/g);
|
|
81
|
+
assert.ok(
|
|
82
|
+
returnNulls && returnNulls.length === 1,
|
|
83
|
+
`expected exactly 1 'return null' (at end after fallback), got ${returnNulls?.length ?? 0}`,
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// ── Behavioral tests: RESUME_INTENT_PATTERNS ────────────────────────
|
|
89
|
+
|
|
90
|
+
describe("#3615 — behavioral: RESUME_INTENT_PATTERNS matches resume prompts", () => {
|
|
91
|
+
// Extract the regex from source so the test stays in sync
|
|
92
|
+
const patternMatch = systemContextSource.match(/const RESUME_INTENT_PATTERNS\s*=\s*\/(.+)\/;/);
|
|
93
|
+
assert.ok(patternMatch, "should find RESUME_INTENT_PATTERNS definition");
|
|
94
|
+
const pattern = new RegExp(patternMatch[1]);
|
|
95
|
+
|
|
96
|
+
// Helper: normalize prompt the same way the production code does
|
|
97
|
+
const normalize = (s: string) => s.trim().toLowerCase().replace(/[.!?,]+$/g, "");
|
|
98
|
+
|
|
99
|
+
const shouldMatch = [
|
|
100
|
+
"continue",
|
|
101
|
+
"Continue",
|
|
102
|
+
"CONTINUE",
|
|
103
|
+
"continue.",
|
|
104
|
+
"continue!",
|
|
105
|
+
"resume",
|
|
106
|
+
"ok",
|
|
107
|
+
"OK",
|
|
108
|
+
"Ok!",
|
|
109
|
+
"go",
|
|
110
|
+
"go ahead",
|
|
111
|
+
"Go ahead.",
|
|
112
|
+
"proceed",
|
|
113
|
+
"keep going",
|
|
114
|
+
"carry on",
|
|
115
|
+
"next",
|
|
116
|
+
"yes",
|
|
117
|
+
"yeah",
|
|
118
|
+
"yep",
|
|
119
|
+
"sure",
|
|
120
|
+
"do it",
|
|
121
|
+
"let's go",
|
|
122
|
+
"pick up where you left off",
|
|
123
|
+
" continue ", // whitespace padded
|
|
124
|
+
];
|
|
125
|
+
|
|
126
|
+
const shouldNotMatch = [
|
|
127
|
+
"help",
|
|
128
|
+
"status",
|
|
129
|
+
"/gsd auto",
|
|
130
|
+
"/gsd stats",
|
|
131
|
+
"what's the plan?",
|
|
132
|
+
"show me the logs",
|
|
133
|
+
"abort",
|
|
134
|
+
"stop",
|
|
135
|
+
"cancel",
|
|
136
|
+
"replan this slice",
|
|
137
|
+
"I think we should change the approach",
|
|
138
|
+
"can you explain what you just did?",
|
|
139
|
+
"run the tests",
|
|
140
|
+
"check the build",
|
|
141
|
+
"Execute the next task: T01",
|
|
142
|
+
"what files were changed",
|
|
143
|
+
"",
|
|
144
|
+
];
|
|
145
|
+
|
|
146
|
+
for (const prompt of shouldMatch) {
|
|
147
|
+
test(`matches resume prompt: "${prompt}"`, () => {
|
|
148
|
+
assert.ok(
|
|
149
|
+
pattern.test(normalize(prompt)),
|
|
150
|
+
`expected RESUME_INTENT_PATTERNS to match "${prompt}" (normalized: "${normalize(prompt)}")`,
|
|
151
|
+
);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
for (const prompt of shouldNotMatch) {
|
|
156
|
+
test(`rejects non-resume prompt: "${prompt}"`, () => {
|
|
157
|
+
assert.ok(
|
|
158
|
+
!pattern.test(normalize(prompt)),
|
|
159
|
+
`expected RESUME_INTENT_PATTERNS to NOT match "${prompt}" (normalized: "${normalize(prompt)}")`,
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
});
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
20
20
|
import { join } from "node:path";
|
|
21
21
|
|
|
22
|
+
import { appendNotification } from "./notification-store.js";
|
|
23
|
+
|
|
22
24
|
// ─── Types ──────────────────────────────────────────────────────────────
|
|
23
25
|
|
|
24
26
|
export type LogSeverity = "warn" | "error";
|
|
@@ -245,6 +247,17 @@ function _push(
|
|
|
245
247
|
const ctxStr = context ? ` ${JSON.stringify(context)}` : "";
|
|
246
248
|
process.stderr.write(`[gsd:${component}] ${prefix}: ${message}${ctxStr}\n`);
|
|
247
249
|
|
|
250
|
+
// Persist to notification store (both warnings and errors)
|
|
251
|
+
try {
|
|
252
|
+
appendNotification(
|
|
253
|
+
`[${component}] ${message}`,
|
|
254
|
+
severity === "error" ? "error" : "warning",
|
|
255
|
+
"workflow-logger",
|
|
256
|
+
);
|
|
257
|
+
} catch (notifErr) {
|
|
258
|
+
process.stderr.write(`[gsd:workflow-logger] notification-store append failed: ${(notifErr as Error).message}\n`);
|
|
259
|
+
}
|
|
260
|
+
|
|
248
261
|
// Buffer for auto-loop to drain
|
|
249
262
|
_buffer.push(entry);
|
|
250
263
|
if (_buffer.length > MAX_BUFFER) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var a,b,c;self.__BUILD_MANIFEST=(a=0,b=0,c=0,{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:44,errorRate:1e-4,numBits:844,numHashes:14,bitArray:[1,0,1,0,0,0,1,1,0,0,0,1,0,1,0,0,1,1,0,0,0,0,1,0,0,1,0,1,1,1,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,0,1,0,1,1,0,0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,1,1,1,1,1,0,1,0,0,1,1,1,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,0,1,0,0,1,0,0,0,1,1,1,0,0,1,1,0,1,0,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,1,1,1,1,0,0,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,0,0,1,0,0,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,1,0,0,1,0,1,1,1,0,1,0,1,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,0,1,0,0,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,1,0,0,1,0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,0,1,1,1,1,0,1,1,0,0,1,1,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,1,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,1,1,1,0,1,0,0,1,0,0,1,0,1,0,1,1,1,0,1,1,0,0,1,1,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1]},__routerFilterDynamic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:NaN,bitArray:[]},sortedPages:["/_app"]}),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|
package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,191,635,802,861,975,992,1226,1965,2437,3788,4117,4233,4367,4468,4794,4868,4896,5318,5338,5517,5673,5676,6143,6231,6366,6498,6748,6819,6851,6954,6988,7331,7410,7584,7670,7822,7851,8167,8361,8570,8898,8966,9452,9560,9788],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
|