@opengsd/gsd-pi 1.1.1-dev.154fd443 → 1.1.1-dev.1854a79a

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.
Files changed (169) hide show
  1. package/dist/project-sessions.js +4 -2
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/browser-tools/index.js +39 -22
  4. package/dist/resources/extensions/browser-tools/state.js +12 -0
  5. package/dist/resources/extensions/browser-tools/tools/session.js +3 -2
  6. package/dist/resources/extensions/browser-tools/utils.js +3 -3
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -9
  8. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  9. package/dist/resources/extensions/gsd/auto/orchestrator.js +659 -57
  10. package/dist/resources/extensions/gsd/auto-prompts.js +14 -1
  11. package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
  12. package/dist/resources/extensions/gsd/auto-tool-tracking.js +5 -0
  13. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +29 -0
  14. package/dist/resources/extensions/gsd/auto.js +62 -464
  15. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +2 -1
  16. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  17. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  18. package/dist/resources/extensions/gsd/markdown-renderer.js +31 -32
  19. package/dist/resources/extensions/gsd/mcp-filter.js +6 -0
  20. package/dist/resources/extensions/gsd/native-git-bridge.js +9 -0
  21. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  22. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  23. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  24. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  25. package/dist/web/standalone/.next/BUILD_ID +1 -1
  26. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  27. package/dist/web/standalone/.next/build-manifest.json +2 -2
  28. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  29. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  46. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  47. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  48. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  49. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  50. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  51. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  52. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  53. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  54. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  55. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  57. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  58. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  59. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  60. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  61. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  62. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  63. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  64. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  65. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  66. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  67. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  68. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  69. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  70. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  71. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  72. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  73. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  74. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  75. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  76. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  77. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  78. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  79. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  80. package/dist/web/standalone/.next/server/app/index.html +1 -1
  81. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  88. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  89. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  90. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  91. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  93. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  94. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  95. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  96. package/package.json +6 -4
  97. package/packages/cloud-mcp-gateway/package.json +2 -2
  98. package/packages/contracts/package.json +1 -1
  99. package/packages/daemon/package.json +4 -4
  100. package/packages/gsd-agent-core/package.json +5 -5
  101. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  102. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +21 -23
  103. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  104. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  105. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  106. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  107. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +18 -11
  108. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  109. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  110. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +16 -0
  111. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  112. package/packages/gsd-agent-modes/package.json +7 -7
  113. package/packages/mcp-server/package.json +3 -3
  114. package/packages/native/package.json +1 -1
  115. package/packages/pi-agent-core/package.json +1 -1
  116. package/packages/pi-ai/dist/models.generated.d.ts +0 -34
  117. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  118. package/packages/pi-ai/dist/models.generated.js +0 -34
  119. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  120. package/packages/pi-ai/package.json +1 -1
  121. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  122. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  123. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  124. package/packages/pi-coding-agent/dist/core/settings-manager.js +1 -1
  125. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  126. package/packages/pi-coding-agent/package.json +7 -7
  127. package/packages/pi-tui/package.json +2 -2
  128. package/packages/rpc-client/package.json +2 -2
  129. package/pkg/package.json +1 -1
  130. package/src/resources/extensions/browser-tools/index.ts +39 -22
  131. package/src/resources/extensions/browser-tools/state.ts +13 -0
  132. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +57 -0
  133. package/src/resources/extensions/browser-tools/tools/session.ts +4 -2
  134. package/src/resources/extensions/browser-tools/utils.ts +3 -3
  135. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -8
  136. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +2 -2
  137. package/src/resources/extensions/gsd/auto/contracts.ts +8 -119
  138. package/src/resources/extensions/gsd/auto/orchestrator.ts +794 -58
  139. package/src/resources/extensions/gsd/auto-prompts.ts +21 -1
  140. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
  141. package/src/resources/extensions/gsd/auto-tool-tracking.ts +5 -0
  142. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +33 -0
  143. package/src/resources/extensions/gsd/auto.ts +81 -500
  144. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +2 -0
  145. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  146. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  147. package/src/resources/extensions/gsd/markdown-renderer.ts +38 -19
  148. package/src/resources/extensions/gsd/mcp-filter.ts +7 -0
  149. package/src/resources/extensions/gsd/native-git-bridge.ts +9 -0
  150. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  151. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  152. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  153. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  154. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  155. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +590 -855
  156. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  157. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  158. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  159. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  160. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  161. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  162. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +4 -2
  163. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +19 -5
  164. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  165. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  166. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  167. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  168. /package/dist/web/standalone/.next/static/{vAecbJ3K9eO213bAxU8Mi → h38jfi0dnRY0y3hbyBszg}/_buildManifest.js +0 -0
  169. /package/dist/web/standalone/.next/static/{vAecbJ3K9eO213bAxU8Mi → h38jfi0dnRY0y3hbyBszg}/_ssgManifest.js +0 -0
@@ -1,6 +1,8 @@
1
- import { join } from "node:path";
1
+ import { join, normalize } from "node:path";
2
2
  import { sessionsDir as defaultSessionsDir } from "./app-paths.js";
3
3
  export function getProjectSessionsDir(cwd, baseSessionsDir = defaultSessionsDir) {
4
- const safePath = `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
4
+ // Normalize the cwd path to prevent directory traversal
5
+ const normalizedCwd = normalize(cwd).replace(/^[/\\]/, "").replace(/[/\\:]/g, "-");
6
+ const safePath = `--${normalizedCwd}--`;
5
7
  return join(baseSessionsDir, safePath);
6
8
  }
@@ -1 +1 @@
1
- 1fd656139336d72d
1
+ 848de9262becc128
@@ -2,6 +2,7 @@
2
2
  import { importExtensionModule } from "@gsd/pi-coding-agent";
3
3
  import { closeManagedGsdBrowser, registerManagedGsdBrowserTools, warmUpManagedGsdBrowser } from "./engine/managed-gsd-browser.js";
4
4
  import { resolveBrowserEngineMode } from "./engine/selection.js";
5
+ import { setArtifactRootForCwd } from "./state.js";
5
6
  import { detectWebApp } from "./web-app-detect.js";
6
7
  let legacyRegistrationPromise = null;
7
8
  let managedRegistrationPromise = null;
@@ -84,28 +85,29 @@ async function registerLegacyBrowserTools(pi) {
84
85
  sanitizeArtifactName: utils.sanitizeArtifactName,
85
86
  formatArtifactTimestamp: utils.formatArtifactTimestamp,
86
87
  };
87
- navigation.registerNavigationTools(pi, deps);
88
- screenshot.registerScreenshotTools(pi, deps);
89
- interaction.registerInteractionTools(pi, deps);
90
- inspection.registerInspectionTools(pi, deps);
91
- session.registerSessionTools(pi, deps);
92
- assertions.registerAssertionTools(pi, deps);
93
- refTools.registerRefTools(pi, deps);
94
- wait.registerWaitTools(pi, deps);
95
- pages.registerPageTools(pi, deps);
96
- forms.registerFormTools(pi, deps);
97
- intent.registerIntentTools(pi, deps);
98
- pdf.registerPdfTools(pi, deps);
99
- statePersistence.registerStatePersistenceTools(pi, deps);
100
- networkMock.registerNetworkMockTools(pi, deps);
101
- device.registerDeviceTools(pi, deps);
102
- extract.registerExtractTools(pi, deps);
103
- visualDiff.registerVisualDiffTools(pi, deps);
104
- zoom.registerZoomTools(pi, deps);
105
- codegen.registerCodegenTools(pi, deps);
106
- actionCache.registerActionCacheTools(pi, deps);
107
- injectionDetection.registerInjectionDetectionTools(pi, deps);
108
- verify.registerVerifyTools(pi, deps);
88
+ const cwdScopedPi = withBrowserArtifactCwdScope(pi);
89
+ navigation.registerNavigationTools(cwdScopedPi, deps);
90
+ screenshot.registerScreenshotTools(cwdScopedPi, deps);
91
+ interaction.registerInteractionTools(cwdScopedPi, deps);
92
+ inspection.registerInspectionTools(cwdScopedPi, deps);
93
+ session.registerSessionTools(cwdScopedPi, deps);
94
+ assertions.registerAssertionTools(cwdScopedPi, deps);
95
+ refTools.registerRefTools(cwdScopedPi, deps);
96
+ wait.registerWaitTools(cwdScopedPi, deps);
97
+ pages.registerPageTools(cwdScopedPi, deps);
98
+ forms.registerFormTools(cwdScopedPi, deps);
99
+ intent.registerIntentTools(cwdScopedPi, deps);
100
+ pdf.registerPdfTools(cwdScopedPi, deps);
101
+ statePersistence.registerStatePersistenceTools(cwdScopedPi, deps);
102
+ networkMock.registerNetworkMockTools(cwdScopedPi, deps);
103
+ device.registerDeviceTools(cwdScopedPi, deps);
104
+ extract.registerExtractTools(cwdScopedPi, deps);
105
+ visualDiff.registerVisualDiffTools(cwdScopedPi, deps);
106
+ zoom.registerZoomTools(cwdScopedPi, deps);
107
+ codegen.registerCodegenTools(cwdScopedPi, deps);
108
+ actionCache.registerActionCacheTools(cwdScopedPi, deps);
109
+ injectionDetection.registerInjectionDetectionTools(cwdScopedPi, deps);
110
+ verify.registerVerifyTools(cwdScopedPi, deps);
109
111
  })().catch((error) => {
110
112
  legacyRegistrationPromise = null;
111
113
  throw error;
@@ -113,6 +115,21 @@ async function registerLegacyBrowserTools(pi) {
113
115
  }
114
116
  return legacyRegistrationPromise;
115
117
  }
118
+ function withBrowserArtifactCwdScope(pi) {
119
+ return {
120
+ ...pi,
121
+ registerTool(definition) {
122
+ pi.registerTool({
123
+ ...definition,
124
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
125
+ if (ctx?.cwd)
126
+ setArtifactRootForCwd(ctx.cwd);
127
+ return definition.execute(toolCallId, params, signal, onUpdate, ctx);
128
+ },
129
+ });
130
+ },
131
+ };
132
+ }
116
133
  async function registerBrowserTools(pi) {
117
134
  const engine = resolveBrowserEngineMode();
118
135
  if (engine === "off")
@@ -18,6 +18,17 @@ export const HAR_FILENAME = "session.har";
18
18
  // ---------------------------------------------------------------------------
19
19
  // Mutable state variables — accessed only via get/set functions
20
20
  // ---------------------------------------------------------------------------
21
+ // 0. artifactRoot
22
+ let _artifactRoot = ARTIFACT_ROOT;
23
+ export function getArtifactRoot() { return _artifactRoot; }
24
+ export function setArtifactRootForCwd(cwd) {
25
+ const newRoot = path.resolve(cwd, ".artifacts", "browser");
26
+ if (newRoot !== _artifactRoot) {
27
+ _artifactRoot = newRoot;
28
+ _sessionArtifactDir = null;
29
+ }
30
+ return _artifactRoot;
31
+ }
21
32
  // 1. browser
22
33
  let _browser = null;
23
34
  export function getBrowser() { return _browser; }
@@ -102,6 +113,7 @@ export function setHarState(h) { _harState = h; }
102
113
  // resetAllState — mirrors closeBrowser()'s reset logic
103
114
  // ---------------------------------------------------------------------------
104
115
  export function resetAllState() {
116
+ _artifactRoot = ARTIFACT_ROOT;
105
117
  _browser = null;
106
118
  _context = null;
107
119
  pageRegistry.pages = [];
@@ -2,7 +2,7 @@ import { Type } from "@sinclair/typebox";
2
2
  import { stat } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { formatTimelineEntries, buildFailureHypothesis, summarizeBrowserSession, } from "../core.js";
5
- import { ARTIFACT_ROOT, HAR_FILENAME, getPageRegistry, getConsoleLogs, getNetworkLogs, getDialogLogs, getActionTimeline, getActiveTraceSession, setActiveTraceSession, getHarState, setHarState, getSessionStartedAt, getSessionArtifactDir, } from "../state.js";
5
+ import { HAR_FILENAME, getArtifactRoot, getPageRegistry, getConsoleLogs, getNetworkLogs, getDialogLogs, getActionTimeline, getActiveTraceSession, setActiveTraceSession, getHarState, setHarState, getSessionStartedAt, getSessionArtifactDir, } from "../state.js";
6
6
  import { getActiveFrameMetadata, ensureDir, } from "../utils.js";
7
7
  export function registerSessionTools(pi, deps) {
8
8
  // -------------------------------------------------------------------------
@@ -289,7 +289,8 @@ export function registerSessionTools(pi, deps) {
289
289
  const { page: p } = await deps.ensureBrowser();
290
290
  const startedAt = Date.now();
291
291
  const sessionDir = await deps.ensureSessionArtifactDir();
292
- const bundleDir = path.join(ARTIFACT_ROOT, `${deps.formatArtifactTimestamp(startedAt)}-${deps.sanitizeArtifactName(params.name ?? "debug-bundle", "debug-bundle")}`);
292
+ const bundleName = `${deps.formatArtifactTimestamp(startedAt)}-${deps.sanitizeArtifactName(params.name ?? "debug-bundle", "debug-bundle")}`;
293
+ const bundleDir = path.join(getArtifactRoot(), bundleName);
293
294
  await ensureDir(bundleDir);
294
295
  const pages = await deps.getLivePagesSnapshot();
295
296
  const actionTimeline = getActionTimeline();
@@ -8,7 +8,7 @@ import { mkdir, stat, writeFile, copyFile } from "node:fs/promises";
8
8
  import path from "node:path";
9
9
  import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, truncateHead, } from "@gsd/pi-coding-agent";
10
10
  import { beginAction, finishAction, findAction, toActionParamsSummary, registryListPages, } from "./core.js";
11
- import { ARTIFACT_ROOT, getActiveFrame, getActiveTraceSession, getConsoleLogs, getDialogLogs, getHarState, getNetworkLogs, getSessionArtifactDir, getSessionStartedAt, setSessionArtifactDir, setSessionStartedAt, pageRegistry, actionTimeline, getPendingCriticalRequestsByPage, } from "./state.js";
11
+ import { getActiveFrame, getArtifactRoot, getActiveTraceSession, getConsoleLogs, getDialogLogs, getHarState, getNetworkLogs, getSessionArtifactDir, getSessionStartedAt, setSessionArtifactDir, setSessionStartedAt, pageRegistry, actionTimeline, getPendingCriticalRequestsByPage, } from "./state.js";
12
12
  // ---------------------------------------------------------------------------
13
13
  // Text truncation
14
14
  // ---------------------------------------------------------------------------
@@ -60,7 +60,7 @@ export async function ensureSessionArtifactDir() {
60
60
  return existing;
61
61
  }
62
62
  const startedAt = ensureSessionStartedAt();
63
- const dir = path.join(ARTIFACT_ROOT, `${formatArtifactTimestamp(startedAt)}-session`);
63
+ const dir = path.join(getArtifactRoot(), `${formatArtifactTimestamp(startedAt)}-session`);
64
64
  setSessionArtifactDir(dir);
65
65
  await ensureDir(dir);
66
66
  return dir;
@@ -95,7 +95,7 @@ export function getActiveFrameMetadata() {
95
95
  }
96
96
  export function getSessionArtifactMetadata() {
97
97
  return {
98
- artifactRoot: ARTIFACT_ROOT,
98
+ artifactRoot: getArtifactRoot(),
99
99
  sessionStartedAt: getSessionStartedAt(),
100
100
  sessionArtifactDir: getSessionArtifactDir(),
101
101
  activeTraceSession: getActiveTraceSession(),
@@ -18,7 +18,7 @@ import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.j
18
18
  import { buildWorkflowMcpServers, getRequiredWorkflowToolsForAutoUnit, resolveWorkflowMcpProjectRoot, } from "../gsd/workflow-mcp.js";
19
19
  import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
20
20
  import { loadProjectGSDPreferences } from "../gsd/preferences.js";
21
- import { discoverBrowserMcpServerName, discoverMcpServers, discoverMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools, } from "../gsd/mcp-filter.js";
21
+ import { discoverBrowserMcpServerName, discoverMcpServers, discoverMcpServerNames, discoverUserMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools, } from "../gsd/mcp-filter.js";
22
22
  import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
23
23
  import { showInterviewRound } from "../shared/tui.js";
24
24
  export function serverToolUseToToolCallLike(block) {
@@ -1341,14 +1341,22 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1341
1341
  const projectBrowserServerName = discoverBrowserMcpServerName(projectRoot);
1342
1342
  const workflowServerName = projectWorkflowServerName ?? injectedWorkflowServerName;
1343
1343
  const browserServerName = projectBrowserServerName ?? injectedBrowserServerName;
1344
- // If a default GSD MCP server is already declared in the project's .mcp.json
1345
- // or .claude/settings.json, do not inject it again via mcpServers. Passing the
1346
- // same server name from two sources causes a duplicate registration conflict
1347
- // that prevents the MCP server from loading (tools become unavailable).
1344
+ // Non-strict (non-phase) sessions load ~/.claude/settings.json via settingSources
1345
+ // including "user". If the user declared the same server names there, injecting them
1346
+ // again via mcpServers causes duplicate registration and leaves MCP tools unavailable.
1347
+ // Strict (gsdPhase) sessions set settingSources=[] so user settings are not loaded.
1348
+ const userDiscovered = !gsdPhase ? discoverUserMcpServerNames() : [];
1349
+ const allDiscovered = discovered.length > 0 || userDiscovered.length > 0
1350
+ ? [...discovered, ...userDiscovered]
1351
+ : discovered;
1352
+ // If a default GSD MCP server is already declared in project config or in the user's
1353
+ // ~/.claude/settings.json (when that file will be loaded), do not inject it again via
1354
+ // mcpServers. Passing the same server name from two sources causes a duplicate
1355
+ // registration conflict that prevents the MCP server from loading (tools become unavailable).
1348
1356
  const workflowAlreadyInProject = projectWorkflowServerName !== undefined
1349
- || (injectedWorkflowServerName !== undefined && discovered.includes(injectedWorkflowServerName));
1357
+ || (injectedWorkflowServerName !== undefined && allDiscovered.includes(injectedWorkflowServerName));
1350
1358
  const browserAlreadyInProject = projectBrowserServerName !== undefined
1351
- || (injectedBrowserServerName !== undefined && discovered.includes(injectedBrowserServerName));
1359
+ || (injectedBrowserServerName !== undefined && allDiscovered.includes(injectedBrowserServerName));
1352
1360
  const mcpServersToInject = { ...defaultMcpServers.servers };
1353
1361
  if (workflowAlreadyInProject && injectedWorkflowServerName)
1354
1362
  delete mcpServersToInject[injectedWorkflowServerName];
@@ -1405,9 +1413,9 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1405
1413
  const sdkMcpServers = inlinePhaseMcpServers ?? filteredMcpServers;
1406
1414
  const strictMcpConfig = !!inlinePhaseMcpServers;
1407
1415
  // Strict phase configs inline the exact MCP servers GSD needs. Loading
1408
- // project/local settings at the same time can duplicate those servers and
1416
+ // Claude Code settings at the same time can duplicate those servers and
1409
1417
  // leave allowed mcp__... tools with no registered backing tool.
1410
- const settingSources = strictMcpConfig ? [] : ["project", "local"];
1418
+ const settingSources = strictMcpConfig ? [] : ["user", "project", "local"];
1411
1419
  const exactWorkflowMcpTools = resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked);
1412
1420
  const runUatDisallowedTools = gsdPhase === "run-uat" && workflowServerName
1413
1421
  ? [
@@ -1,3 +1,10 @@
1
1
  // Project/App: gsd-pi
2
- // File Purpose: Auto Orchestration module interfaces and ADR-015 invariant adapter contracts.
2
+ // File Purpose: Auto Orchestration module public contract types.
3
+ //
4
+ // Phase 2 of #442 collapsed the nine single-implementation adapter interfaces
5
+ // (DispatchAdapter, RecoveryAdapter, StateReconciliationAdapter,
6
+ // ToolContractAdapter, WorktreeAdapter, HealthAdapter, UokGateAdapter,
7
+ // RuntimePersistenceAdapter, NotificationAdapter) and AutoOrchestratorDeps
8
+ // into AutoOrchestrator itself (auto/orchestrator.ts). Only the public result
9
+ // and lifecycle-interface types remain here.
3
10
  export {};