@bastani/atomic 0.9.28-alpha.4 → 0.9.28

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 (128) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +13 -0
  3. package/dist/builtin/intercom/README.md +3 -2
  4. package/dist/builtin/intercom/broker/broker.ts +90 -14
  5. package/dist/builtin/intercom/broker/paths.ts +4 -0
  6. package/dist/builtin/intercom/broker/socket-liveness.ts +32 -0
  7. package/dist/builtin/intercom/broker/socket-replacement-lock.ts +104 -0
  8. package/dist/builtin/intercom/broker/spawn.ts +108 -63
  9. package/dist/builtin/intercom/index.bundle.mjs +114 -61
  10. package/dist/builtin/intercom/package.json +1 -1
  11. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  12. package/dist/builtin/mcp/package.json +1 -1
  13. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  14. package/dist/builtin/subagents/package.json +1 -1
  15. package/dist/builtin/web-access/package.json +1 -1
  16. package/dist/builtin/workflows/CHANGELOG.md +41 -0
  17. package/dist/builtin/workflows/builtin/{chunk-aqv8ny38.js → chunk-9ywkdsa9.js} +1 -1
  18. package/dist/builtin/workflows/builtin/{chunk-p6jagvyf.js → chunk-bnz4knhy.js} +1 -1
  19. package/dist/builtin/workflows/builtin/{chunk-br4ac9a3.js → chunk-dx5sjaxe.js} +1 -1
  20. package/dist/builtin/workflows/builtin/{chunk-p3xmajmj.js → chunk-v4scsq3y.js} +41 -13
  21. package/dist/builtin/workflows/builtin/goal.js +2 -2
  22. package/dist/builtin/workflows/builtin/index.js +3 -3
  23. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  24. package/dist/builtin/workflows/package.json +1 -1
  25. package/dist/builtin/workflows/src/extension/index.bundle.mjs +38 -14
  26. package/dist/builtin/workflows/src/index.js +38 -14
  27. package/dist/cli/startup-ui.d.ts +3 -2
  28. package/dist/cli/startup-ui.d.ts.map +1 -1
  29. package/dist/cli/startup-ui.js +19 -4
  30. package/dist/cli/startup-ui.js.map +1 -1
  31. package/dist/core/agent-session-runtime.d.ts +5 -1
  32. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  33. package/dist/core/agent-session-runtime.js +13 -9
  34. package/dist/core/agent-session-runtime.js.map +1 -1
  35. package/dist/core/extensions/session-events.d.ts +2 -0
  36. package/dist/core/extensions/session-events.d.ts.map +1 -1
  37. package/dist/core/extensions/session-events.js.map +1 -1
  38. package/dist/core/provider-alias.d.ts.map +1 -1
  39. package/dist/core/provider-alias.js +8 -0
  40. package/dist/core/provider-alias.js.map +1 -1
  41. package/dist/core/provider-composer-internal.d.ts.map +1 -1
  42. package/dist/core/provider-composer-internal.js +6 -3
  43. package/dist/core/provider-composer-internal.js.map +1 -1
  44. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  45. package/dist/core/resource-loader-reload.js +1 -0
  46. package/dist/core/resource-loader-reload.js.map +1 -1
  47. package/dist/core/resource-loader-types.d.ts +1 -0
  48. package/dist/core/resource-loader-types.d.ts.map +1 -1
  49. package/dist/core/resource-loader-types.js.map +1 -1
  50. package/dist/extensions/herdr/index.d.ts.map +1 -1
  51. package/dist/extensions/herdr/index.js +20 -2
  52. package/dist/extensions/herdr/index.js.map +1 -1
  53. package/dist/extensions/herdr/pane-owner.d.ts +7 -0
  54. package/dist/extensions/herdr/pane-owner.d.ts.map +1 -1
  55. package/dist/extensions/herdr/pane-owner.js +53 -11
  56. package/dist/extensions/herdr/pane-owner.js.map +1 -1
  57. package/dist/main-deferred-startup.d.ts +8 -0
  58. package/dist/main-deferred-startup.d.ts.map +1 -1
  59. package/dist/main-deferred-startup.js +6 -0
  60. package/dist/main-deferred-startup.js.map +1 -1
  61. package/dist/main.d.ts.map +1 -1
  62. package/dist/main.js +11 -3
  63. package/dist/main.js.map +1 -1
  64. package/dist/modes/interactive/interactive-auth-routing.js +2 -2
  65. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  66. package/dist/modes/interactive/interactive-extension-dialogs.js +8 -0
  67. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  68. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  69. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  70. package/dist/modes/interactive/interactive-mode-base.js +1 -0
  71. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  72. package/dist/modes/interactive/interactive-mode-helpers.js +1 -1
  73. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  74. package/dist/modes/interactive/interactive-mode-types.d.ts +1 -0
  75. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  76. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  77. package/dist/modes/interactive/interactive-process-lifecycle.js +1 -1
  78. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  79. package/dist/modes/interactive/interactive-startup-trust.d.ts +6 -0
  80. package/dist/modes/interactive/interactive-startup-trust.d.ts.map +1 -0
  81. package/dist/modes/interactive/interactive-startup-trust.js +15 -0
  82. package/dist/modes/interactive/interactive-startup-trust.js.map +1 -0
  83. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  84. package/dist/modes/interactive/interactive-startup.js +3 -0
  85. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  86. package/dist/modes/interactive-engine/engine-child-liveness.d.ts +1 -0
  87. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -1
  88. package/dist/modes/interactive-engine/engine-child-liveness.js +15 -1
  89. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -1
  90. package/dist/modes/interactive-engine/engine-monitor.d.ts +4 -0
  91. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -1
  92. package/dist/modes/interactive-engine/engine-monitor.js +17 -0
  93. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  94. package/dist/modes/interactive-engine/engine-quit-intent.d.ts +16 -0
  95. package/dist/modes/interactive-engine/engine-quit-intent.d.ts.map +1 -0
  96. package/dist/modes/interactive-engine/engine-quit-intent.js +27 -0
  97. package/dist/modes/interactive-engine/engine-quit-intent.js.map +1 -0
  98. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +1 -0
  99. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  100. package/dist/modes/interactive-engine/extension-ui-bridge.js +5 -0
  101. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  102. package/dist/modes/interactive-engine/isolated-runtime.d.ts +4 -1
  103. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  104. package/dist/modes/interactive-engine/isolated-runtime.js +19 -2
  105. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  106. package/dist/modes/interactive-engine/protocol.d.ts +18 -1
  107. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  108. package/dist/modes/interactive-engine/protocol.js +6 -0
  109. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  110. package/dist/modes/rpc/rpc-client.d.ts +11 -0
  111. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  112. package/dist/modes/rpc/rpc-client.js +42 -0
  113. package/dist/modes/rpc/rpc-client.js.map +1 -1
  114. package/dist/modes/rpc/rpc-input-scheduler.js +2 -2
  115. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  116. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  117. package/dist/modes/rpc/rpc-mode.js +23 -6
  118. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  119. package/dist/modes/rpc/rpc-provider-auth.js +1 -1
  120. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  121. package/docs/extensions/events.md +3 -0
  122. package/docs/herdr.md +11 -2
  123. package/docs/models.md +1 -1
  124. package/docs/providers.md +2 -0
  125. package/docs/sdk.md +1 -1
  126. package/docs/settings.md +1 -1
  127. package/npm-shrinkwrap.json +32 -32
  128. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getExtensionContextOwner, publishExtensionContextEffect } from \"../../core/extensions/runner-context.ts\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../core/extensions/types.ts\";\nimport type { WorkflowRootActivity } from \"../../core/extensions/workflow-events.js\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { OwnerTaskStore } from \"../../core/tasks/owner-store.js\";\nimport { deriveSessionActivity } from \"./activity.js\";\nimport { captureHerdrEnvironment } from \"./environment.js\";\nimport {\n\tclaimPaneReporting,\n\ttype PaneOwner,\n\ttype PaneReportingOptions,\n\treleasePaneReporting,\n\treportPaneActivity,\n\tretirePaneReporting,\n} from \"./pane-owner.js\";\nimport type { HerdrDiagnostic } from \"./transport.js\";\n\nexport interface HerdrExtensionOptions extends PaneReportingOptions {\n\tenv?: NodeJS.ProcessEnv;\n\tenabled?: (ctx: ExtensionContext) => boolean;\n}\n\nfunction enabled(ctx: ExtensionContext): boolean {\n\tconst settings = SettingsManager.create(ctx.cwd, undefined, { projectTrusted: ctx.isProjectTrusted() });\n\treturn (settings.getProjectSettings().herdr?.enabled ?? settings.getGlobalSettings().herdr?.enabled) !== false;\n}\n\nexport function createHerdrExtension(options: HerdrExtensionOptions = {}): ExtensionFactory {\n\treturn (pi) => {\n\t\tif (!captureHerdrEnvironment(options.env ?? process.env)) return;\n\t\tlet owner: PaneOwner | undefined;\n\t\t// Supplied loaders can share closures across sessions and overlapping reload runners.\n\t\tlet boundSessionManager: ExtensionContext[\"sessionManager\"] | undefined;\n\t\tlet boundRunner: object | undefined;\n\t\tconst retiredRunners = new WeakSet<object>();\n\t\tconst ownsBinding = (ctx: ExtensionContext) =>\n\t\t\tboundSessionManager !== undefined && getExtensionContextOwner(ctx) === boundRunner;\n\t\tlet lease: { dispose(): void } | undefined;\n\t\tlet taskStore: OwnerTaskStore | undefined;\n\t\tlet unsubscribeTasks: (() => void) | undefined;\n\t\tlet agentRunning = false;\n\t\tlet openPromptCount = 0;\n\t\tlet availability: \"ready\" | \"unavailable\" | \"recovering\" = \"unavailable\";\n\t\tconst roots = new Map<string, WorkflowRootActivity>();\n\t\tconst acknowledgedBlocks = new Map<string, WorkflowRootActivity>();\n\t\tconst sameSummary = (left: WorkflowRootActivity, right: WorkflowRootActivity) =>\n\t\t\tleft.state === right.state &&\n\t\t\tleft.reason === right.reason &&\n\t\t\tleft.actionableBlockCount === right.actionableBlockCount &&\n\t\t\tleft.activeExecutionCount === right.activeExecutionCount &&\n\t\t\tleft.needsAttention === right.needsAttention;\n\t\tconst updateRoot = (root: WorkflowRootActivity) => {\n\t\t\tconst acknowledged = acknowledgedBlocks.get(root.rootRunId);\n\t\t\tif (acknowledged && !sameSummary(root, acknowledged)) acknowledgedBlocks.delete(root.rootRunId);\n\t\t\troots.set(root.rootRunId, root);\n\t\t};\n\t\tconst seenDiagnostics = new Set<string>();\n\t\tlet generation = 0;\n\t\tconst diagnostic = (value: HerdrDiagnostic) => {\n\t\t\tconst key = `${value.kind}:${value.owner ?? \"\"}`;\n\t\t\tif (seenDiagnostics.has(key)) return;\n\t\t\tseenDiagnostics.add(key);\n\t\t\tif (options.diagnostic) options.diagnostic(value);\n\t\t\telse console.error(`[Herdr] ${value.kind}${value.owner ? `: deferring to ${value.owner}` : \"\"}`);\n\t\t};\n\t\tconst tasksRunning = () => taskStore?.tasks.some((task) => task.execution.kind !== \"settled\") ?? false;\n\t\tconst report = (skipUnchanged = false) => {\n\t\t\tif (!owner) return;\n\t\t\tconst activity = deriveSessionActivity({\n\t\t\t\tagentRunning,\n\t\t\t\ttasksRunning: tasksRunning(),\n\t\t\t\topenPromptCount,\n\t\t\t\troots: [...roots.values()].filter((root) => !acknowledgedBlocks.has(root.rootRunId)),\n\t\t\t\tavailability,\n\t\t\t});\n\t\t\tif (activity) reportPaneActivity(owner, activity, skipUnchanged);\n\t\t};\n\t\tconst start = async (ctx: ExtensionContext) => {\n\t\t\tconst runner = getExtensionContextOwner(ctx);\n\t\t\tif (retiredRunners.has(runner)) return;\n\t\t\tif (boundSessionManager && ctx.sessionManager !== boundSessionManager) return;\n\t\t\tconst environment = captureHerdrEnvironment(options.env ?? process.env);\n\t\t\tif (!environment || ctx.mode !== \"tui\" || !ctx.hasUI || ctx.subagentPolicy || ctx.orchestrationContext) return;\n\t\t\tif (!(options.enabled ?? enabled)(ctx)) return;\n\t\t\tif (boundRunner && boundRunner !== runner) retiredRunners.add(boundRunner);\n\t\t\tboundRunner = runner;\n\t\t\tboundSessionManager = ctx.sessionManager;\n\t\t\tconst current = ++generation;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\topenPromptCount = 0;\n\t\t\troots.clear();\n\t\t\tacknowledgedBlocks.clear();\n\t\t\tavailability = \"unavailable\";\n\t\t\tconst claimed = await claimPaneReporting(\n\t\t\t\tenvironment,\n\t\t\t\t{ id: ctx.sessionManager.getSessionId(), path: ctx.sessionManager.getSessionFile() },\n\t\t\t\t{ ...options, diagnostic },\n\t\t\t);\n\t\t\tif (current !== generation) {\n\t\t\t\tawait releasePaneReporting(claimed);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\towner = claimed;\n\t\t\tagentRunning = !ctx.isIdle();\n\t\t\tconst taskHost = ctx.getAgentTaskHost?.();\n\t\t\tif (taskHost) {\n\t\t\t\tconst { supervisor, owner: taskOwner } = taskHost.ownerBinding;\n\t\t\t\ttaskStore = new OwnerTaskStore(supervisor, taskOwner);\n\t\t\t\ttaskStore.connect();\n\t\t\t\tlet running = tasksRunning();\n\t\t\t\tunsubscribeTasks = taskStore.subscribe(() => {\n\t\t\t\t\tif (current !== generation) return;\n\t\t\t\t\tconst next = tasksRunning();\n\t\t\t\t\tif (next === running) return;\n\t\t\t\t\trunning = next;\n\t\t\t\t\treport();\n\t\t\t\t});\n\t\t\t}\n\t\t\tlease = ctx.observeWorkflowActivity((frame) => {\n\t\t\t\tif (current !== generation) return;\n\t\t\t\tif (frame.kind === \"snapshot\") {\n\t\t\t\t\tavailability = frame.availability;\n\t\t\t\t\troots.clear();\n\t\t\t\t\tif (frame.availability === \"ready\") {\n\t\t\t\t\t\tfor (const root of frame.roots) updateRoot(root);\n\t\t\t\t\t\tfor (const id of acknowledgedBlocks.keys()) if (!roots.has(id)) acknowledgedBlocks.delete(id);\n\t\t\t\t\t}\n\t\t\t\t} else if (frame.kind === \"changed\") {\n\t\t\t\t\tconst previous = roots.get(frame.root.rootRunId);\n\t\t\t\t\tupdateRoot(frame.root);\n\t\t\t\t\t// Graph-only changes do not alter the pane state; skip the redundant report.\n\t\t\t\t\tif (previous && sameSummary(previous, frame.root)) return;\n\t\t\t\t} else {\n\t\t\t\t\troots.delete(frame.rootRunId);\n\t\t\t\t\tacknowledgedBlocks.delete(frame.rootRunId);\n\t\t\t\t}\n\t\t\t\treport(frame.kind === \"snapshot\");\n\t\t\t});\n\t\t};\n\t\tpi.on(\"session_start\", (_event, ctx) => publishExtensionContextEffect(ctx, () => start(ctx)));\n\t\tpi.on(\"input\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.source !== \"interactive\") return;\n\t\t\tlet changed = false;\n\t\t\tfor (const root of roots.values()) {\n\t\t\t\tif (root.state === \"blocked\" && !acknowledgedBlocks.has(root.rootRunId)) {\n\t\t\t\t\tacknowledgedBlocks.set(root.rootRunId, { ...root });\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changed) report();\n\t\t});\n\t\tpi.on(\"workflow_lifecycle\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.delivery !== \"live\") return;\n\t\t\tconst target = event.target;\n\t\t\tconst newBlock =\n\t\t\t\ttarget.kind === \"prompt\"\n\t\t\t\t\t? target.status === \"opened\"\n\t\t\t\t\t: (target.kind === \"run\" || target.kind === \"stage\") &&\n\t\t\t\t\t\t(target.status === \"blocked\" || target.status === \"awaiting_input\") &&\n\t\t\t\t\t\ttarget.previousStatus !== target.status;\n\t\t\tif (newBlock && acknowledgedBlocks.delete(event.rootRunId)) report();\n\t\t});\n\t\tpi.on(\"agent_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = true;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = false;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount++;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_end\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount = Math.max(0, openPromptCount - 1);\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\t// A non-quit stop may restart this runner, unless a successor supersedes it first.\n\t\t\tif (event.reason === \"quit\") retiredRunners.add(boundRunner!);\n\t\t\tgeneration++;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\tconst previous = owner;\n\t\t\towner = undefined;\n\t\t\t// Clear before awaiting transport: a successor can bind while retirement drains,\n\t\t\t// and this shutdown's completion must never clear that newer binding.\n\t\t\tboundSessionManager = undefined;\n\t\t\tif (previous) {\n\t\t\t\tif (event.reason === \"quit\") await releasePaneReporting(previous);\n\t\t\t\telse await retirePaneReporting(previous);\n\t\t\t}\n\t\t});\n\t};\n}\n\nexport default function herdrExtension(pi: ExtensionAPI): void {\n\tcreateHerdrExtension()(pi);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { APP_NAME } from \"../../config.js\";\nimport { getExtensionContextOwner, publishExtensionContextEffect } from \"../../core/extensions/runner-context.ts\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../core/extensions/types.ts\";\nimport type { WorkflowRootActivity } from \"../../core/extensions/workflow-events.js\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { OwnerTaskStore } from \"../../core/tasks/owner-store.js\";\nimport { deriveSessionActivity } from \"./activity.js\";\nimport { captureHerdrEnvironment } from \"./environment.js\";\nimport {\n\tclaimPaneReporting,\n\ttype PaneOwner,\n\ttype PaneReportingOptions,\n\treleasePaneReporting,\n\treportPaneActivity,\n\tretirePaneReporting,\n} from \"./pane-owner.js\";\nimport type { HerdrDiagnostic } from \"./transport.js\";\n\nexport interface HerdrExtensionOptions extends PaneReportingOptions {\n\tenv?: NodeJS.ProcessEnv;\n\tenabled?: (ctx: ExtensionContext) => boolean;\n}\n\n/** `--session` reads a value with a path separator or a `.jsonl` suffix as a file path, not a session ID. */\nfunction readsAsSessionPath(sessionId: string): boolean {\n\treturn sessionId.includes(\"/\") || sessionId.includes(\"\\\\\") || sessionId.endsWith(\".jsonl\");\n}\n\nfunction resumeArgv(sessionManager: ExtensionContext[\"sessionManager\"]): string[] | undefined {\n\tconst sessionFile = sessionManager.getSessionFile();\n\tif (!sessionFile) return undefined;\n\tconst sessionId = sessionManager.getSessionId();\n\tconst sessionDir = sessionManager.usesDefaultSessionDir() ? [] : [\"--session-dir\", sessionManager.getSessionDir()];\n\treturn [APP_NAME, ...sessionDir, \"--session\", readsAsSessionPath(sessionId) ? sessionFile : sessionId];\n}\n\nfunction enabled(ctx: ExtensionContext): boolean {\n\tconst settings = SettingsManager.create(ctx.cwd, undefined, { projectTrusted: ctx.isProjectTrusted() });\n\treturn (settings.getProjectSettings().herdr?.enabled ?? settings.getGlobalSettings().herdr?.enabled) !== false;\n}\n\nexport function createHerdrExtension(options: HerdrExtensionOptions = {}): ExtensionFactory {\n\treturn (pi) => {\n\t\tif (!captureHerdrEnvironment(options.env ?? process.env)) return;\n\t\tlet owner: PaneOwner | undefined;\n\t\t// Supplied loaders can share closures across sessions and overlapping reload runners.\n\t\tlet boundSessionManager: ExtensionContext[\"sessionManager\"] | undefined;\n\t\tlet boundRunner: object | undefined;\n\t\tconst retiredRunners = new WeakSet<object>();\n\t\tconst ownsBinding = (ctx: ExtensionContext) =>\n\t\t\tboundSessionManager !== undefined && getExtensionContextOwner(ctx) === boundRunner;\n\t\tlet lease: { dispose(): void } | undefined;\n\t\tlet taskStore: OwnerTaskStore | undefined;\n\t\tlet unsubscribeTasks: (() => void) | undefined;\n\t\tlet agentRunning = false;\n\t\tlet openPromptCount = 0;\n\t\tlet availability: \"ready\" | \"unavailable\" | \"recovering\" = \"unavailable\";\n\t\tconst roots = new Map<string, WorkflowRootActivity>();\n\t\tconst acknowledgedBlocks = new Map<string, WorkflowRootActivity>();\n\t\tconst sameSummary = (left: WorkflowRootActivity, right: WorkflowRootActivity) =>\n\t\t\tleft.state === right.state &&\n\t\t\tleft.reason === right.reason &&\n\t\t\tleft.actionableBlockCount === right.actionableBlockCount &&\n\t\t\tleft.activeExecutionCount === right.activeExecutionCount &&\n\t\t\tleft.needsAttention === right.needsAttention;\n\t\tconst updateRoot = (root: WorkflowRootActivity) => {\n\t\t\tconst acknowledged = acknowledgedBlocks.get(root.rootRunId);\n\t\t\tif (acknowledged && !sameSummary(root, acknowledged)) acknowledgedBlocks.delete(root.rootRunId);\n\t\t\troots.set(root.rootRunId, root);\n\t\t};\n\t\tconst seenDiagnostics = new Set<string>();\n\t\tlet generation = 0;\n\t\tconst diagnostic = (value: HerdrDiagnostic) => {\n\t\t\tconst key = `${value.kind}:${value.owner ?? \"\"}`;\n\t\t\tif (seenDiagnostics.has(key)) return;\n\t\t\tseenDiagnostics.add(key);\n\t\t\tif (options.diagnostic) options.diagnostic(value);\n\t\t\telse console.error(`[Herdr] ${value.kind}${value.owner ? `: deferring to ${value.owner}` : \"\"}`);\n\t\t};\n\t\tconst tasksRunning = () => taskStore?.tasks.some((task) => task.execution.kind !== \"settled\") ?? false;\n\t\tconst report = (skipUnchanged = false) => {\n\t\t\tif (!owner) return;\n\t\t\tconst activity = deriveSessionActivity({\n\t\t\t\tagentRunning,\n\t\t\t\ttasksRunning: tasksRunning(),\n\t\t\t\topenPromptCount,\n\t\t\t\troots: [...roots.values()].filter((root) => !acknowledgedBlocks.has(root.rootRunId)),\n\t\t\t\tavailability,\n\t\t\t});\n\t\t\tif (activity) reportPaneActivity(owner, activity, skipUnchanged);\n\t\t};\n\t\tconst start = async (ctx: ExtensionContext) => {\n\t\t\tconst runner = getExtensionContextOwner(ctx);\n\t\t\tif (retiredRunners.has(runner)) return;\n\t\t\tif (boundSessionManager && ctx.sessionManager !== boundSessionManager) return;\n\t\t\tconst environment = captureHerdrEnvironment(options.env ?? process.env);\n\t\t\tif (!environment || ctx.mode !== \"tui\" || !ctx.hasUI || ctx.subagentPolicy || ctx.orchestrationContext) return;\n\t\t\tif (!(options.enabled ?? enabled)(ctx)) return;\n\t\t\tif (boundRunner && boundRunner !== runner) retiredRunners.add(boundRunner);\n\t\t\tboundRunner = runner;\n\t\t\tboundSessionManager = ctx.sessionManager;\n\t\t\tconst current = ++generation;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\topenPromptCount = 0;\n\t\t\troots.clear();\n\t\t\tacknowledgedBlocks.clear();\n\t\t\tavailability = \"unavailable\";\n\t\t\tconst claimed = await claimPaneReporting(\n\t\t\t\tenvironment,\n\t\t\t\t{\n\t\t\t\t\tid: ctx.sessionManager.getSessionId(),\n\t\t\t\t\tpath: ctx.sessionManager.getSessionFile(),\n\t\t\t\t\tresume: resumeArgv(ctx.sessionManager),\n\t\t\t\t},\n\t\t\t\t{ ...options, diagnostic },\n\t\t\t);\n\t\t\tif (current !== generation) {\n\t\t\t\tawait releasePaneReporting(claimed);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\towner = claimed;\n\t\t\tagentRunning = !ctx.isIdle();\n\t\t\tconst taskHost = ctx.getAgentTaskHost?.();\n\t\t\tif (taskHost) {\n\t\t\t\tconst { supervisor, owner: taskOwner } = taskHost.ownerBinding;\n\t\t\t\ttaskStore = new OwnerTaskStore(supervisor, taskOwner);\n\t\t\t\ttaskStore.connect();\n\t\t\t\tlet running = tasksRunning();\n\t\t\t\tunsubscribeTasks = taskStore.subscribe(() => {\n\t\t\t\t\tif (current !== generation) return;\n\t\t\t\t\tconst next = tasksRunning();\n\t\t\t\t\tif (next === running) return;\n\t\t\t\t\trunning = next;\n\t\t\t\t\treport();\n\t\t\t\t});\n\t\t\t}\n\t\t\tlease = ctx.observeWorkflowActivity((frame) => {\n\t\t\t\tif (current !== generation) return;\n\t\t\t\tif (frame.kind === \"snapshot\") {\n\t\t\t\t\tavailability = frame.availability;\n\t\t\t\t\troots.clear();\n\t\t\t\t\tif (frame.availability === \"ready\") {\n\t\t\t\t\t\tfor (const root of frame.roots) updateRoot(root);\n\t\t\t\t\t\tfor (const id of acknowledgedBlocks.keys()) if (!roots.has(id)) acknowledgedBlocks.delete(id);\n\t\t\t\t\t}\n\t\t\t\t} else if (frame.kind === \"changed\") {\n\t\t\t\t\tconst previous = roots.get(frame.root.rootRunId);\n\t\t\t\t\tupdateRoot(frame.root);\n\t\t\t\t\t// Graph-only changes do not alter the pane state; skip the redundant report.\n\t\t\t\t\tif (previous && sameSummary(previous, frame.root)) return;\n\t\t\t\t} else {\n\t\t\t\t\troots.delete(frame.rootRunId);\n\t\t\t\t\tacknowledgedBlocks.delete(frame.rootRunId);\n\t\t\t\t}\n\t\t\t\treport(frame.kind === \"snapshot\");\n\t\t\t});\n\t\t};\n\t\tpi.on(\"session_start\", (_event, ctx) => publishExtensionContextEffect(ctx, () => start(ctx)));\n\t\tpi.on(\"input\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.source !== \"interactive\") return;\n\t\t\tlet changed = false;\n\t\t\tfor (const root of roots.values()) {\n\t\t\t\tif (root.state === \"blocked\" && !acknowledgedBlocks.has(root.rootRunId)) {\n\t\t\t\t\tacknowledgedBlocks.set(root.rootRunId, { ...root });\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changed) report();\n\t\t});\n\t\tpi.on(\"workflow_lifecycle\", (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx) || event.delivery !== \"live\") return;\n\t\t\tconst target = event.target;\n\t\t\tconst newBlock =\n\t\t\t\ttarget.kind === \"prompt\"\n\t\t\t\t\t? target.status === \"opened\"\n\t\t\t\t\t: (target.kind === \"run\" || target.kind === \"stage\") &&\n\t\t\t\t\t\t(target.status === \"blocked\" || target.status === \"awaiting_input\") &&\n\t\t\t\t\t\ttarget.previousStatus !== target.status;\n\t\t\tif (newBlock && acknowledgedBlocks.delete(event.rootRunId)) report();\n\t\t});\n\t\tpi.on(\"agent_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = true;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\tagentRunning = false;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_start\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount++;\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"ui_prompt_end\", (_event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\topenPromptCount = Math.max(0, openPromptCount - 1);\n\t\t\treport();\n\t\t});\n\t\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\t\tif (!ownsBinding(ctx)) return;\n\t\t\t// A non-quit stop may restart this runner, unless a successor supersedes it first.\n\t\t\tif (event.reason === \"quit\") retiredRunners.add(boundRunner!);\n\t\t\tgeneration++;\n\t\t\tlease?.dispose();\n\t\t\tlease = undefined;\n\t\t\tunsubscribeTasks?.();\n\t\t\ttaskStore?.dispose();\n\t\t\tunsubscribeTasks = undefined;\n\t\t\ttaskStore = undefined;\n\t\t\tconst previous = owner;\n\t\t\towner = undefined;\n\t\t\t// Clear before awaiting transport: a successor can bind while retirement drains,\n\t\t\t// and this shutdown's completion must never clear that newer binding.\n\t\t\tboundSessionManager = undefined;\n\t\t\tif (previous) {\n\t\t\t\t// A host signal ends the process, not the conversation: keep the registration Herdr restores from.\n\t\t\t\tif (event.reason === \"quit\" && !event.fromSignal) await releasePaneReporting(previous);\n\t\t\t\telse await retirePaneReporting(previous);\n\t\t\t}\n\t\t});\n\t};\n}\n\nexport default function herdrExtension(pi: ExtensionAPI): void {\n\tcreateHerdrExtension()(pi);\n}\n"]}
@@ -4,6 +4,7 @@ import { type HerdrDiagnostic } from "./transport.js";
4
4
  export interface PaneIdentity {
5
5
  id: string;
6
6
  path?: string;
7
+ resume?: string[];
7
8
  }
8
9
  export interface PaneReportingOptions {
9
10
  clock?: () => number;
@@ -17,6 +18,7 @@ export interface PaneOwner {
17
18
  status: "active" | "releasing" | "retired";
18
19
  seq: number;
19
20
  identitySent: boolean;
21
+ resumeUnsupported: boolean;
20
22
  lastDeliveredActivity?: SessionActivity;
21
23
  pending?: {
22
24
  activity: SessionActivity;
@@ -31,4 +33,9 @@ export declare function reportPaneActivity(owner: PaneOwner, activity: SessionAc
31
33
  /** Fence and drain a local reporter without unregistering the still-running agent. */
32
34
  export declare function retirePaneReporting(owner: PaneOwner): Promise<void>;
33
35
  export declare function releasePaneReporting(owner: PaneOwner): Promise<void>;
36
+ /**
37
+ * Clears Atomic's registration in this pane when no reporter can: an explicit quit the engine child never recorded,
38
+ * because it was stopped mid-recovery or did not answer, would otherwise leave the conversation eligible for restore.
39
+ */
40
+ export declare function releaseUnownedPaneRegistration(environment: HerdrEnvironment, options?: PaneReportingOptions): Promise<void>;
34
41
  //# sourceMappingURL=pane-owner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pane-owner.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,oBAAoB;IACpC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;CACnD;AACD,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAmCD,wBAAsB,kBAAkB,CACvC,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,SAAS,CAAC,CAoBpB;AAUD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,UAAQ,GAAG,IAAI,CAiC3G;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE"}
1
+ {"version":3,"file":"pane-owner.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AACD,MAAM,WAAW,oBAAoB;IACpC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;CACnD;AACD,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,CAAC,EAAE,eAAe,CAAC;IACxC,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AA6DD,wBAAsB,kBAAkB,CACvC,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAUD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,UAAQ,GAAG,IAAI,CAoC3G;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAwBD;;;GAGG;AACH,wBAAsB,8BAA8B,CACnD,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -3,6 +3,8 @@ import { executeHerdr } from "./transport.js";
3
3
  // Host module lifetime outlives inline extension factories and runner generations.
4
4
  const owners = new Map();
5
5
  let highWater = 0;
6
+ const MAX_RESUME_ARGS = 64;
7
+ const MAX_RESUME_BYTES = 8 * 1024;
6
8
  function diagnostic(owner, value) {
7
9
  owner.options.diagnostic?.(value);
8
10
  }
@@ -23,6 +25,31 @@ function argv(owner, command) {
23
25
  String(owner.seq),
24
26
  ];
25
27
  }
28
+ /** Herdr drops the whole report for a resume argv it cannot accept, so only offer one it will. */
29
+ function acceptedResume(resume) {
30
+ if (!resume?.[0] || resume.length > MAX_RESUME_ARGS || /[\\/]/.test(resume[0]))
31
+ return undefined;
32
+ let bytes = 0;
33
+ for (const word of resume) {
34
+ if (/['\u0000-\u001f\u007f-\u009f]/.test(word))
35
+ return undefined;
36
+ bytes += Buffer.byteLength(word) + 1;
37
+ }
38
+ return bytes > MAX_RESUME_BYTES ? undefined : resume;
39
+ }
40
+ function reportArgv(owner, activity, resume) {
41
+ const args = [...argv(owner, "report-agent"), "--state", activity.state];
42
+ if (activity.message)
43
+ args.push("--message", activity.message);
44
+ if (!owner.identitySent) {
45
+ args.push("--agent-session-id", owner.identity.id);
46
+ if (owner.identity.path && isAbsolute(owner.identity.path))
47
+ args.push("--agent-session-path", owner.identity.path);
48
+ }
49
+ if (resume)
50
+ args.push("--", ...resume);
51
+ return args;
52
+ }
26
53
  async function send(owner, args) {
27
54
  const result = await executeHerdr(owner.environment, args, owner.options.timeoutMs);
28
55
  if (result)
@@ -44,6 +71,8 @@ export async function claimPaneReporting(environment, identity, options = {}) {
44
71
  // Inherit the registration even if recovery produces no successor report before quit.
45
72
  seq: previous?.seq ?? 0,
46
73
  identitySent: false,
74
+ // The same Herdr serves every session in a pane, so a rejection stays true for the successor.
75
+ resumeUnsupported: previous?.resumeUnsupported ?? false,
47
76
  async flush() {
48
77
  await this.flight;
49
78
  },
@@ -74,20 +103,22 @@ export function reportPaneActivity(owner, activity, skipUnchanged = false) {
74
103
  if (skipUnchanged && matchesActivity(owner.lastDeliveredActivity, next))
75
104
  continue;
76
105
  allocateSequence(owner);
77
- const args = [...argv(owner, "report-agent"), "--state", next.state];
78
- if (next.message)
79
- args.push("--message", next.message);
80
- if (!owner.identitySent) {
81
- args.push("--agent-session-id", owner.identity.id);
82
- if (owner.identity.path && isAbsolute(owner.identity.path))
83
- args.push("--agent-session-path", owner.identity.path);
106
+ const resume = owner.identitySent || owner.resumeUnsupported ? undefined : acceptedResume(owner.identity.resume);
107
+ let failure = await executeHerdr(owner.environment, reportArgv(owner, next, resume), owner.options.timeoutMs);
108
+ if (resume && failure?.kind === "protocol_rejected") {
109
+ // Herdr older than 0.9.2 may refuse the trailing argv; keep the status and identity it would accept.
110
+ allocateSequence(owner);
111
+ failure = await executeHerdr(owner.environment, reportArgv(owner, next), owner.options.timeoutMs);
112
+ if (!failure)
113
+ owner.resumeUnsupported = true;
84
114
  }
85
- if (await send(owner, args)) {
86
- owner.identitySent = true;
87
- owner.lastDeliveredActivity = next;
115
+ if (failure) {
116
+ diagnostic(owner, failure);
117
+ owner.lastDeliveredActivity = undefined;
88
118
  }
89
119
  else {
90
- owner.lastDeliveredActivity = undefined;
120
+ owner.identitySent = true;
121
+ owner.lastDeliveredActivity = next;
91
122
  }
92
123
  }
93
124
  })().finally(() => {
@@ -123,4 +154,15 @@ function stopPaneReporting(owner, releaseRegistration) {
123
154
  })();
124
155
  return owner.release;
125
156
  }
157
+ /**
158
+ * Clears Atomic's registration in this pane when no reporter can: an explicit quit the engine child never recorded,
159
+ * because it was stopped mid-recovery or did not answer, would otherwise leave the conversation eligible for restore.
160
+ */
161
+ export async function releaseUnownedPaneRegistration(environment, options = {}) {
162
+ const owner = { environment, options, seq: 0 };
163
+ allocateSequence(owner);
164
+ const result = await executeHerdr(environment, argv(owner, "release-agent"), options.timeoutMs);
165
+ if (result)
166
+ options.diagnostic?.(result);
167
+ }
126
168
  //# sourceMappingURL=pane-owner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pane-owner.js","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute } from \"node:path\";\nimport type { SessionActivity } from \"./activity.js\";\nimport type { HerdrEnvironment } from \"./environment.js\";\nimport { executeHerdr, type HerdrDiagnostic } from \"./transport.js\";\n\nexport interface PaneIdentity {\n\tid: string;\n\tpath?: string;\n}\nexport interface PaneReportingOptions {\n\tclock?: () => number;\n\ttimeoutMs?: number;\n\tdiagnostic?: (diagnostic: HerdrDiagnostic) => void;\n}\nexport interface PaneOwner {\n\tenvironment: HerdrEnvironment;\n\tidentity: PaneIdentity;\n\toptions: PaneReportingOptions;\n\tstatus: \"active\" | \"releasing\" | \"retired\";\n\tseq: number;\n\tidentitySent: boolean;\n\tlastDeliveredActivity?: SessionActivity;\n\tpending?: { activity: SessionActivity; skipUnchanged: boolean };\n\tflight?: Promise<void>;\n\trelease?: Promise<void>;\n\tflush(): Promise<void>;\n}\n\n// Host module lifetime outlives inline extension factories and runner generations.\nconst owners = new Map<string, PaneOwner>();\nlet highWater = 0;\n\nfunction diagnostic(owner: PaneOwner, value: HerdrDiagnostic): void {\n\towner.options.diagnostic?.(value);\n}\n\n/** Every admitted command, including release, takes a fresh strictly increasing sequence: Herdr ignores equal or older `--seq`. */\nfunction allocateSequence(owner: PaneOwner): void {\n\towner.seq = highWater = Math.max((owner.options.clock ?? Date.now)(), highWater + 1);\n}\n\nfunction argv(owner: PaneOwner, command: string): string[] {\n\treturn [\n\t\t\"pane\",\n\t\tcommand,\n\t\towner.environment.paneId,\n\t\t\"--source\",\n\t\t\"custom:atomic\",\n\t\t\"--agent\",\n\t\t\"atomic\",\n\t\t\"--seq\",\n\t\tString(owner.seq),\n\t];\n}\n\nasync function send(owner: PaneOwner, args: string[]): Promise<boolean> {\n\tconst result = await executeHerdr(owner.environment, args, owner.options.timeoutMs);\n\tif (result) diagnostic(owner, result);\n\treturn result === undefined;\n}\n\nexport async function claimPaneReporting(\n\tenvironment: HerdrEnvironment,\n\tidentity: PaneIdentity,\n\toptions: PaneReportingOptions = {},\n): Promise<PaneOwner> {\n\tlet previous: PaneOwner | undefined;\n\tdo {\n\t\tprevious = owners.get(environment.paneId);\n\t\tif (previous) await retirePaneReporting(previous);\n\t} while (owners.get(environment.paneId) !== previous);\n\tconst owner: PaneOwner = {\n\t\tenvironment,\n\t\tidentity,\n\t\toptions,\n\t\tstatus: \"active\",\n\t\t// Inherit the registration even if recovery produces no successor report before quit.\n\t\tseq: previous?.seq ?? 0,\n\t\tidentitySent: false,\n\t\tasync flush() {\n\t\t\tawait this.flight;\n\t\t},\n\t};\n\towners.set(environment.paneId, owner);\n\treturn owner;\n}\n\nfunction matchesActivity(previous: SessionActivity | undefined, activity: SessionActivity): boolean {\n\treturn (\n\t\tactivity.state === previous?.state &&\n\t\tactivity.reason === previous?.reason &&\n\t\tactivity.message === previous?.message\n\t);\n}\n\nexport function reportPaneActivity(owner: PaneOwner, activity: SessionActivity, skipUnchanged = false): void {\n\tif (owner.status !== \"active\" || owners.get(owner.environment.paneId) !== owner) {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn;\n\t}\n\tif (!owner.flight && skipUnchanged && matchesActivity(owner.lastDeliveredActivity, activity)) return;\n\tconst pendingExplicitRefresh =\n\t\towner.pending?.skipUnchanged === false && matchesActivity(owner.pending.activity, activity);\n\towner.pending = { activity, skipUnchanged: skipUnchanged && !pendingExplicitRefresh };\n\tif (owner.flight) return;\n\towner.flight = (async () => {\n\t\twhile (owner.pending && owner.status === \"active\") {\n\t\t\tconst { activity: next, skipUnchanged } = owner.pending;\n\t\t\towner.pending = undefined;\n\t\t\tif (skipUnchanged && matchesActivity(owner.lastDeliveredActivity, next)) continue;\n\t\t\tallocateSequence(owner);\n\t\t\tconst args = [...argv(owner, \"report-agent\"), \"--state\", next.state];\n\t\t\tif (next.message) args.push(\"--message\", next.message);\n\t\t\tif (!owner.identitySent) {\n\t\t\t\targs.push(\"--agent-session-id\", owner.identity.id);\n\t\t\t\tif (owner.identity.path && isAbsolute(owner.identity.path))\n\t\t\t\t\targs.push(\"--agent-session-path\", owner.identity.path);\n\t\t\t}\n\t\t\tif (await send(owner, args)) {\n\t\t\t\towner.identitySent = true;\n\t\t\t\towner.lastDeliveredActivity = next;\n\t\t\t} else {\n\t\t\t\towner.lastDeliveredActivity = undefined;\n\t\t\t}\n\t\t}\n\t})().finally(() => {\n\t\towner.flight = undefined;\n\t});\n}\n\n/** Fence and drain a local reporter without unregistering the still-running agent. */\nexport function retirePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, false);\n}\n\nexport function releasePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, true);\n}\n\nfunction stopPaneReporting(owner: PaneOwner, releaseRegistration: boolean): Promise<void> {\n\tif (owner.release) return owner.release;\n\tif (owners.get(owner.environment.paneId) !== owner || owner.status !== \"active\") {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn Promise.resolve();\n\t}\n\towner.status = \"releasing\";\n\towner.pending = undefined;\n\towner.release = (async () => {\n\t\tawait owner.flight;\n\t\t// A failed command may still have claimed authority before its response was lost.\n\t\tif (releaseRegistration && owner.seq > 0) {\n\t\t\tallocateSequence(owner);\n\t\t\tawait send(owner, argv(owner, \"release-agent\"));\n\t\t}\n\t\towner.status = \"retired\";\n\t\tif (releaseRegistration && owners.get(owner.environment.paneId) === owner)\n\t\t\towners.delete(owner.environment.paneId);\n\t})();\n\treturn owner.release;\n}\n"]}
1
+ {"version":3,"file":"pane-owner.js","sourceRoot":"","sources":["../../../src/extensions/herdr/pane-owner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute } from \"node:path\";\nimport type { SessionActivity } from \"./activity.js\";\nimport type { HerdrEnvironment } from \"./environment.js\";\nimport { executeHerdr, type HerdrDiagnostic } from \"./transport.js\";\n\nexport interface PaneIdentity {\n\tid: string;\n\tpath?: string;\n\tresume?: string[];\n}\nexport interface PaneReportingOptions {\n\tclock?: () => number;\n\ttimeoutMs?: number;\n\tdiagnostic?: (diagnostic: HerdrDiagnostic) => void;\n}\nexport interface PaneOwner {\n\tenvironment: HerdrEnvironment;\n\tidentity: PaneIdentity;\n\toptions: PaneReportingOptions;\n\tstatus: \"active\" | \"releasing\" | \"retired\";\n\tseq: number;\n\tidentitySent: boolean;\n\tresumeUnsupported: boolean;\n\tlastDeliveredActivity?: SessionActivity;\n\tpending?: { activity: SessionActivity; skipUnchanged: boolean };\n\tflight?: Promise<void>;\n\trelease?: Promise<void>;\n\tflush(): Promise<void>;\n}\n\n// Host module lifetime outlives inline extension factories and runner generations.\nconst owners = new Map<string, PaneOwner>();\nlet highWater = 0;\n\nconst MAX_RESUME_ARGS = 64;\nconst MAX_RESUME_BYTES = 8 * 1024;\n\nfunction diagnostic(owner: PaneOwner, value: HerdrDiagnostic): void {\n\towner.options.diagnostic?.(value);\n}\n\n/** Every admitted command, including release, takes a fresh strictly increasing sequence: Herdr ignores equal or older `--seq`. */\nfunction allocateSequence(owner: Pick<PaneOwner, \"options\" | \"seq\">): void {\n\towner.seq = highWater = Math.max((owner.options.clock ?? Date.now)(), highWater + 1);\n}\n\nfunction argv(owner: Pick<PaneOwner, \"environment\" | \"seq\">, command: string): string[] {\n\treturn [\n\t\t\"pane\",\n\t\tcommand,\n\t\towner.environment.paneId,\n\t\t\"--source\",\n\t\t\"custom:atomic\",\n\t\t\"--agent\",\n\t\t\"atomic\",\n\t\t\"--seq\",\n\t\tString(owner.seq),\n\t];\n}\n\n/** Herdr drops the whole report for a resume argv it cannot accept, so only offer one it will. */\nfunction acceptedResume(resume: string[] | undefined): string[] | undefined {\n\tif (!resume?.[0] || resume.length > MAX_RESUME_ARGS || /[\\\\/]/.test(resume[0])) return undefined;\n\tlet bytes = 0;\n\tfor (const word of resume) {\n\t\tif (/['\\u0000-\\u001f\\u007f-\\u009f]/.test(word)) return undefined;\n\t\tbytes += Buffer.byteLength(word) + 1;\n\t}\n\treturn bytes > MAX_RESUME_BYTES ? undefined : resume;\n}\n\nfunction reportArgv(owner: PaneOwner, activity: SessionActivity, resume?: string[]): string[] {\n\tconst args = [...argv(owner, \"report-agent\"), \"--state\", activity.state];\n\tif (activity.message) args.push(\"--message\", activity.message);\n\tif (!owner.identitySent) {\n\t\targs.push(\"--agent-session-id\", owner.identity.id);\n\t\tif (owner.identity.path && isAbsolute(owner.identity.path))\n\t\t\targs.push(\"--agent-session-path\", owner.identity.path);\n\t}\n\tif (resume) args.push(\"--\", ...resume);\n\treturn args;\n}\n\nasync function send(owner: PaneOwner, args: string[]): Promise<boolean> {\n\tconst result = await executeHerdr(owner.environment, args, owner.options.timeoutMs);\n\tif (result) diagnostic(owner, result);\n\treturn result === undefined;\n}\n\nexport async function claimPaneReporting(\n\tenvironment: HerdrEnvironment,\n\tidentity: PaneIdentity,\n\toptions: PaneReportingOptions = {},\n): Promise<PaneOwner> {\n\tlet previous: PaneOwner | undefined;\n\tdo {\n\t\tprevious = owners.get(environment.paneId);\n\t\tif (previous) await retirePaneReporting(previous);\n\t} while (owners.get(environment.paneId) !== previous);\n\tconst owner: PaneOwner = {\n\t\tenvironment,\n\t\tidentity,\n\t\toptions,\n\t\tstatus: \"active\",\n\t\t// Inherit the registration even if recovery produces no successor report before quit.\n\t\tseq: previous?.seq ?? 0,\n\t\tidentitySent: false,\n\t\t// The same Herdr serves every session in a pane, so a rejection stays true for the successor.\n\t\tresumeUnsupported: previous?.resumeUnsupported ?? false,\n\t\tasync flush() {\n\t\t\tawait this.flight;\n\t\t},\n\t};\n\towners.set(environment.paneId, owner);\n\treturn owner;\n}\n\nfunction matchesActivity(previous: SessionActivity | undefined, activity: SessionActivity): boolean {\n\treturn (\n\t\tactivity.state === previous?.state &&\n\t\tactivity.reason === previous?.reason &&\n\t\tactivity.message === previous?.message\n\t);\n}\n\nexport function reportPaneActivity(owner: PaneOwner, activity: SessionActivity, skipUnchanged = false): void {\n\tif (owner.status !== \"active\" || owners.get(owner.environment.paneId) !== owner) {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn;\n\t}\n\tif (!owner.flight && skipUnchanged && matchesActivity(owner.lastDeliveredActivity, activity)) return;\n\tconst pendingExplicitRefresh =\n\t\towner.pending?.skipUnchanged === false && matchesActivity(owner.pending.activity, activity);\n\towner.pending = { activity, skipUnchanged: skipUnchanged && !pendingExplicitRefresh };\n\tif (owner.flight) return;\n\towner.flight = (async () => {\n\t\twhile (owner.pending && owner.status === \"active\") {\n\t\t\tconst { activity: next, skipUnchanged } = owner.pending;\n\t\t\towner.pending = undefined;\n\t\t\tif (skipUnchanged && matchesActivity(owner.lastDeliveredActivity, next)) continue;\n\t\t\tallocateSequence(owner);\n\t\t\tconst resume =\n\t\t\t\towner.identitySent || owner.resumeUnsupported ? undefined : acceptedResume(owner.identity.resume);\n\t\t\tlet failure = await executeHerdr(owner.environment, reportArgv(owner, next, resume), owner.options.timeoutMs);\n\t\t\tif (resume && failure?.kind === \"protocol_rejected\") {\n\t\t\t\t// Herdr older than 0.9.2 may refuse the trailing argv; keep the status and identity it would accept.\n\t\t\t\tallocateSequence(owner);\n\t\t\t\tfailure = await executeHerdr(owner.environment, reportArgv(owner, next), owner.options.timeoutMs);\n\t\t\t\tif (!failure) owner.resumeUnsupported = true;\n\t\t\t}\n\t\t\tif (failure) {\n\t\t\t\tdiagnostic(owner, failure);\n\t\t\t\towner.lastDeliveredActivity = undefined;\n\t\t\t} else {\n\t\t\t\towner.identitySent = true;\n\t\t\t\towner.lastDeliveredActivity = next;\n\t\t\t}\n\t\t}\n\t})().finally(() => {\n\t\towner.flight = undefined;\n\t});\n}\n\n/** Fence and drain a local reporter without unregistering the still-running agent. */\nexport function retirePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, false);\n}\n\nexport function releasePaneReporting(owner: PaneOwner): Promise<void> {\n\treturn stopPaneReporting(owner, true);\n}\n\nfunction stopPaneReporting(owner: PaneOwner, releaseRegistration: boolean): Promise<void> {\n\tif (owner.release) return owner.release;\n\tif (owners.get(owner.environment.paneId) !== owner || owner.status !== \"active\") {\n\t\tdiagnostic(owner, { kind: \"stale_owner\" });\n\t\treturn Promise.resolve();\n\t}\n\towner.status = \"releasing\";\n\towner.pending = undefined;\n\towner.release = (async () => {\n\t\tawait owner.flight;\n\t\t// A failed command may still have claimed authority before its response was lost.\n\t\tif (releaseRegistration && owner.seq > 0) {\n\t\t\tallocateSequence(owner);\n\t\t\tawait send(owner, argv(owner, \"release-agent\"));\n\t\t}\n\t\towner.status = \"retired\";\n\t\tif (releaseRegistration && owners.get(owner.environment.paneId) === owner)\n\t\t\towners.delete(owner.environment.paneId);\n\t})();\n\treturn owner.release;\n}\n\n/**\n * Clears Atomic's registration in this pane when no reporter can: an explicit quit the engine child never recorded,\n * because it was stopped mid-recovery or did not answer, would otherwise leave the conversation eligible for restore.\n */\nexport async function releaseUnownedPaneRegistration(\n\tenvironment: HerdrEnvironment,\n\toptions: PaneReportingOptions = {},\n): Promise<void> {\n\tconst owner: Pick<PaneOwner, \"environment\" | \"options\" | \"seq\"> = { environment, options, seq: 0 };\n\tallocateSequence(owner);\n\tconst result = await executeHerdr(environment, argv(owner, \"release-agent\"), options.timeoutMs);\n\tif (result) options.diagnostic?.(result);\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { Args } from "./cli/args.ts";
2
2
  import type { ScopedModel } from "./core/model-resolver-types.ts";
3
+ import type { DefaultProjectTrust } from "./core/settings-manager.ts";
3
4
  import type { ProjectTrustStore } from "./core/trust-manager.ts";
4
5
  import type { AppMode } from "./main-app-mode.ts";
5
6
  export interface ComputeDeferExtensionsInput {
@@ -39,6 +40,13 @@ export interface ComputeStartupInputCaptureInput {
39
40
  sessionSelectionComplete?: boolean;
40
41
  }
41
42
  export declare function computeStartupInputCaptureEnabled(input: ComputeStartupInputCaptureInput): boolean;
43
+ export interface ComputeStartupTrustPromptPossibleInput {
44
+ projectTrustOverride: boolean | undefined;
45
+ hasTrustInputs: boolean;
46
+ storedProjectTrust: boolean | null;
47
+ defaultProjectTrust: DefaultProjectTrust;
48
+ }
49
+ export declare function computeStartupTrustPromptPossible(input: ComputeStartupTrustPromptPossibleInput): boolean;
42
50
  export declare function computeDeferExtensions(input: ComputeDeferExtensionsInput): boolean;
43
51
  /**
44
52
  * The isolated engine may bind its minimal RPC session before loading optional
@@ -1 +1 @@
1
- {"version":3,"file":"main-deferred-startup.d.ts","sourceRoot":"","sources":["../src/main-deferred-startup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,yBAAyB,EAAE,OAAO,CAAC;IACnC,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6CAA6C;IAC7D,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,yBAAyB,EAAE,OAAO,CAAC;IACnC,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,+BAA+B;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,IAAI,CACX,IAAI,EACF,MAAM,GACN,YAAY,GACZ,sBAAsB,GACtB,cAAc,GACd,oBAAoB,GACpB,cAAc,GACd,UAAU,GACV,OAAO,GACP,QAAQ,GACR,SAAS,CACX,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAClD,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAajG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAelF;AAED;;;;GAIG;AACH,wBAAgB,wCAAwC,CACvD,KAAK,EAAE,6CAA6C,GAClD,OAAO,CAUT;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CAOzE"}
1
+ {"version":3,"file":"main-deferred-startup.d.ts","sourceRoot":"","sources":["../src/main-deferred-startup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,yBAAyB,EAAE,OAAO,CAAC;IACnC,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6CAA6C;IAC7D,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,yBAAyB,EAAE,OAAO,CAAC;IACnC,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,+BAA+B;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,IAAI,CACX,IAAI,EACF,MAAM,GACN,YAAY,GACZ,sBAAsB,GACtB,cAAc,GACd,oBAAoB,GACpB,cAAc,GACd,UAAU,GACV,OAAO,GACP,QAAQ,GACR,SAAS,CACX,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAClD,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAajG;AAED,MAAM,WAAW,sCAAsC;IACtD,oBAAoB,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,mBAAmB,EAAE,mBAAmB,CAAC;CACzC;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,sCAAsC,GAAG,OAAO,CAOxG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAelF;AAED;;;;GAIG;AACH,wBAAgB,wCAAwC,CACvD,KAAK,EAAE,6CAA6C,GAClD,OAAO,CAUT;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CAOzE"}
@@ -12,6 +12,12 @@ export function computeStartupInputCaptureEnabled(input) {
12
12
  !hasTrustInputs ||
13
13
  input.projectTrustStore.get(input.sessionCwd) !== null));
14
14
  }
15
+ export function computeStartupTrustPromptPossible(input) {
16
+ return (input.projectTrustOverride === undefined &&
17
+ input.hasTrustInputs &&
18
+ input.storedProjectTrust === null &&
19
+ input.defaultProjectTrust === "ask");
20
+ }
15
21
  export function computeDeferExtensions(input) {
16
22
  return (input.appMode === "interactive" &&
17
23
  input.stdinIsTTY &&
@@ -1 +1 @@
1
- {"version":3,"file":"main-deferred-startup.js","sourceRoot":"","sources":["../src/main-deferred-startup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAsDhE,MAAM,UAAU,iCAAiC,CAAC,KAAsC;IACvF,IAAI,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACjH,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/D,OAAO,CACN,KAAK,CAAC,OAAO,KAAK,aAAa;QAC/B,KAAK,CAAC,UAAU;QAChB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;QAClB,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;QACrC,KAAK,CAAC,uBAAuB,KAAK,CAAC;QACnC,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,KAAK,SAAS;YAC/C,CAAC,cAAc;YACf,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CACxD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACxE,OAAO,CACN,KAAK,CAAC,OAAO,KAAK,aAAa;QAC/B,KAAK,CAAC,UAAU;QAChB,CAAC,KAAK,CAAC,oBAAoB;QAC3B,CAAC,KAAK,CAAC,IAAI;QACX,KAAK,CAAC,UAAU,KAAK,SAAS;QAC9B,CAAC,CAAC,KAAK,CAAC,yBAAyB,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;QACvE,KAAK,CAAC,0BAA0B,KAAK,CAAC;QACtC,KAAK,CAAC,yBAAyB,KAAK,CAAC;QACrC,CAAC,KAAK,CAAC,oBAAoB;QAC3B,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAC5B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wCAAwC,CACvD,KAAoD;IAEpD,OAAO,CACN,KAAK,CAAC,sBAAsB;QAC5B,CAAC,KAAK,CAAC,oBAAoB;QAC3B,CAAC,CAAC,KAAK,CAAC,yBAAyB,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;QACvE,KAAK,CAAC,0BAA0B,KAAK,CAAC;QACtC,KAAK,CAAC,yBAAyB,KAAK,CAAC;QACrC,CAAC,KAAK,CAAC,oBAAoB;QAC3B,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAA2B;IAChE,OAAO,YAAY;SACjB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC9C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC","sourcesContent":["import type { Args } from \"./cli/args.ts\";\nimport type { ScopedModel } from \"./core/model-resolver-types.ts\";\nimport type { ProjectTrustStore } from \"./core/trust-manager.ts\";\nimport { hasProjectTrustInputs } from \"./core/trust-manager.ts\";\nimport type { AppMode } from \"./main-app-mode.ts\";\n\nexport interface ComputeDeferExtensionsInput {\n\tappMode: AppMode;\n\tstdinIsTTY: boolean;\n\thasSessionStartEvent: boolean;\n\thelp?: boolean;\n\tlistModels?: Args[\"listModels\"];\n\tshouldResolveProjectTrust: boolean;\n\tstoredProjectTrust: boolean | null;\n\tresolvedExtensionPathCount: number;\n\tresolvedResourcePathCount: number;\n\thasSystemPromptInput: boolean;\n\tunknownFlagCount: number;\n\tprovider?: string;\n\tmodel?: string;\n}\n\nexport interface ComputeInteractiveEngineResourceDeferralInput {\n\tinteractiveEngineChild: boolean;\n\thasSessionStartEvent: boolean;\n\tshouldResolveProjectTrust: boolean;\n\tstoredProjectTrust: boolean | null;\n\tresolvedExtensionPathCount: number;\n\tresolvedResourcePathCount: number;\n\thasSystemPromptInput: boolean;\n\tunknownFlagCount: number;\n}\n\nexport interface ComputeStartupInputCaptureInput {\n\tappMode: AppMode;\n\tstdinIsTTY: boolean;\n\tparsed: Pick<\n\t\tArgs,\n\t\t| \"help\"\n\t\t| \"listModels\"\n\t\t| \"projectTrustOverride\"\n\t\t| \"systemPrompt\"\n\t\t| \"appendSystemPrompt\"\n\t\t| \"unknownFlags\"\n\t\t| \"provider\"\n\t\t| \"model\"\n\t\t| \"resume\"\n\t\t| \"session\"\n\t>;\n\tsessionCwd: string;\n\tprojectTrustStore: Pick<ProjectTrustStore, \"get\">;\n\tresolvedExtensionPathCount: number;\n\tresolvedResourcePathCount: number;\n\tdeprecationWarningCount: number;\n\tsessionSelectionComplete?: boolean;\n}\n\nexport function computeStartupInputCaptureEnabled(input: ComputeStartupInputCaptureInput): boolean {\n\tif (!input.sessionSelectionComplete && (input.parsed.resume || input.parsed.session !== undefined)) return false;\n\tconst hasTrustInputs = hasProjectTrustInputs(input.sessionCwd);\n\treturn (\n\t\tinput.appMode === \"interactive\" &&\n\t\tinput.stdinIsTTY &&\n\t\t!input.parsed.help &&\n\t\tinput.parsed.listModels === undefined &&\n\t\tinput.deprecationWarningCount === 0 &&\n\t\t(input.parsed.projectTrustOverride !== undefined ||\n\t\t\t!hasTrustInputs ||\n\t\t\tinput.projectTrustStore.get(input.sessionCwd) !== null)\n\t);\n}\n\nexport function computeDeferExtensions(input: ComputeDeferExtensionsInput): boolean {\n\treturn (\n\t\tinput.appMode === \"interactive\" &&\n\t\tinput.stdinIsTTY &&\n\t\t!input.hasSessionStartEvent &&\n\t\t!input.help &&\n\t\tinput.listModels === undefined &&\n\t\t(!input.shouldResolveProjectTrust || input.storedProjectTrust !== null) &&\n\t\tinput.resolvedExtensionPathCount === 0 &&\n\t\tinput.resolvedResourcePathCount === 0 &&\n\t\t!input.hasSystemPromptInput &&\n\t\tinput.provider === undefined &&\n\t\tinput.model === undefined &&\n\t\tinput.unknownFlagCount === 0\n\t);\n}\n\n/**\n * The isolated engine may bind its minimal RPC session before loading optional\n * bundled resources. User-selected paths and trust-sensitive startup stay\n * synchronous because they can affect the first visible or interactive state.\n */\nexport function computeInteractiveEngineResourceDeferral(\n\tinput: ComputeInteractiveEngineResourceDeferralInput,\n): boolean {\n\treturn (\n\t\tinput.interactiveEngineChild &&\n\t\t!input.hasSessionStartEvent &&\n\t\t(!input.shouldResolveProjectTrust || input.storedProjectTrust !== null) &&\n\t\tinput.resolvedExtensionPathCount === 0 &&\n\t\tinput.resolvedResourcePathCount === 0 &&\n\t\t!input.hasSystemPromptInput &&\n\t\tinput.unknownFlagCount === 0\n\t);\n}\n\nexport function formatScopedModelList(scopedModels: ScopedModel[]): string {\n\treturn scopedModels\n\t\t.map((scoped) => {\n\t\t\tconst thinkingSuffix = scoped.thinkingLevel ? `:${scoped.thinkingLevel}` : \"\";\n\t\t\treturn `${scoped.model.id}${thinkingSuffix}`;\n\t\t})\n\t\t.join(\", \");\n}\n"]}
1
+ {"version":3,"file":"main-deferred-startup.js","sourceRoot":"","sources":["../src/main-deferred-startup.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAsDhE,MAAM,UAAU,iCAAiC,CAAC,KAAsC;IACvF,IAAI,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACjH,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/D,OAAO,CACN,KAAK,CAAC,OAAO,KAAK,aAAa;QAC/B,KAAK,CAAC,UAAU;QAChB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;QAClB,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;QACrC,KAAK,CAAC,uBAAuB,KAAK,CAAC;QACnC,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,KAAK,SAAS;YAC/C,CAAC,cAAc;YACf,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CACxD,CAAC;AACH,CAAC;AASD,MAAM,UAAU,iCAAiC,CAAC,KAA6C;IAC9F,OAAO,CACN,KAAK,CAAC,oBAAoB,KAAK,SAAS;QACxC,KAAK,CAAC,cAAc;QACpB,KAAK,CAAC,kBAAkB,KAAK,IAAI;QACjC,KAAK,CAAC,mBAAmB,KAAK,KAAK,CACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACxE,OAAO,CACN,KAAK,CAAC,OAAO,KAAK,aAAa;QAC/B,KAAK,CAAC,UAAU;QAChB,CAAC,KAAK,CAAC,oBAAoB;QAC3B,CAAC,KAAK,CAAC,IAAI;QACX,KAAK,CAAC,UAAU,KAAK,SAAS;QAC9B,CAAC,CAAC,KAAK,CAAC,yBAAyB,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;QACvE,KAAK,CAAC,0BAA0B,KAAK,CAAC;QACtC,KAAK,CAAC,yBAAyB,KAAK,CAAC;QACrC,CAAC,KAAK,CAAC,oBAAoB;QAC3B,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAC5B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wCAAwC,CACvD,KAAoD;IAEpD,OAAO,CACN,KAAK,CAAC,sBAAsB;QAC5B,CAAC,KAAK,CAAC,oBAAoB;QAC3B,CAAC,CAAC,KAAK,CAAC,yBAAyB,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;QACvE,KAAK,CAAC,0BAA0B,KAAK,CAAC;QACtC,KAAK,CAAC,yBAAyB,KAAK,CAAC;QACrC,CAAC,KAAK,CAAC,oBAAoB;QAC3B,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAA2B;IAChE,OAAO,YAAY;SACjB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC9C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC","sourcesContent":["import type { Args } from \"./cli/args.ts\";\nimport type { ScopedModel } from \"./core/model-resolver-types.ts\";\nimport type { DefaultProjectTrust } from \"./core/settings-manager.ts\";\nimport type { ProjectTrustStore } from \"./core/trust-manager.ts\";\nimport { hasProjectTrustInputs } from \"./core/trust-manager.ts\";\nimport type { AppMode } from \"./main-app-mode.ts\";\n\nexport interface ComputeDeferExtensionsInput {\n\tappMode: AppMode;\n\tstdinIsTTY: boolean;\n\thasSessionStartEvent: boolean;\n\thelp?: boolean;\n\tlistModels?: Args[\"listModels\"];\n\tshouldResolveProjectTrust: boolean;\n\tstoredProjectTrust: boolean | null;\n\tresolvedExtensionPathCount: number;\n\tresolvedResourcePathCount: number;\n\thasSystemPromptInput: boolean;\n\tunknownFlagCount: number;\n\tprovider?: string;\n\tmodel?: string;\n}\n\nexport interface ComputeInteractiveEngineResourceDeferralInput {\n\tinteractiveEngineChild: boolean;\n\thasSessionStartEvent: boolean;\n\tshouldResolveProjectTrust: boolean;\n\tstoredProjectTrust: boolean | null;\n\tresolvedExtensionPathCount: number;\n\tresolvedResourcePathCount: number;\n\thasSystemPromptInput: boolean;\n\tunknownFlagCount: number;\n}\n\nexport interface ComputeStartupInputCaptureInput {\n\tappMode: AppMode;\n\tstdinIsTTY: boolean;\n\tparsed: Pick<\n\t\tArgs,\n\t\t| \"help\"\n\t\t| \"listModels\"\n\t\t| \"projectTrustOverride\"\n\t\t| \"systemPrompt\"\n\t\t| \"appendSystemPrompt\"\n\t\t| \"unknownFlags\"\n\t\t| \"provider\"\n\t\t| \"model\"\n\t\t| \"resume\"\n\t\t| \"session\"\n\t>;\n\tsessionCwd: string;\n\tprojectTrustStore: Pick<ProjectTrustStore, \"get\">;\n\tresolvedExtensionPathCount: number;\n\tresolvedResourcePathCount: number;\n\tdeprecationWarningCount: number;\n\tsessionSelectionComplete?: boolean;\n}\n\nexport function computeStartupInputCaptureEnabled(input: ComputeStartupInputCaptureInput): boolean {\n\tif (!input.sessionSelectionComplete && (input.parsed.resume || input.parsed.session !== undefined)) return false;\n\tconst hasTrustInputs = hasProjectTrustInputs(input.sessionCwd);\n\treturn (\n\t\tinput.appMode === \"interactive\" &&\n\t\tinput.stdinIsTTY &&\n\t\t!input.parsed.help &&\n\t\tinput.parsed.listModels === undefined &&\n\t\tinput.deprecationWarningCount === 0 &&\n\t\t(input.parsed.projectTrustOverride !== undefined ||\n\t\t\t!hasTrustInputs ||\n\t\t\tinput.projectTrustStore.get(input.sessionCwd) !== null)\n\t);\n}\n\nexport interface ComputeStartupTrustPromptPossibleInput {\n\tprojectTrustOverride: boolean | undefined;\n\thasTrustInputs: boolean;\n\tstoredProjectTrust: boolean | null;\n\tdefaultProjectTrust: DefaultProjectTrust;\n}\n\nexport function computeStartupTrustPromptPossible(input: ComputeStartupTrustPromptPossibleInput): boolean {\n\treturn (\n\t\tinput.projectTrustOverride === undefined &&\n\t\tinput.hasTrustInputs &&\n\t\tinput.storedProjectTrust === null &&\n\t\tinput.defaultProjectTrust === \"ask\"\n\t);\n}\n\nexport function computeDeferExtensions(input: ComputeDeferExtensionsInput): boolean {\n\treturn (\n\t\tinput.appMode === \"interactive\" &&\n\t\tinput.stdinIsTTY &&\n\t\t!input.hasSessionStartEvent &&\n\t\t!input.help &&\n\t\tinput.listModels === undefined &&\n\t\t(!input.shouldResolveProjectTrust || input.storedProjectTrust !== null) &&\n\t\tinput.resolvedExtensionPathCount === 0 &&\n\t\tinput.resolvedResourcePathCount === 0 &&\n\t\t!input.hasSystemPromptInput &&\n\t\tinput.provider === undefined &&\n\t\tinput.model === undefined &&\n\t\tinput.unknownFlagCount === 0\n\t);\n}\n\n/**\n * The isolated engine may bind its minimal RPC session before loading optional\n * bundled resources. User-selected paths and trust-sensitive startup stay\n * synchronous because they can affect the first visible or interactive state.\n */\nexport function computeInteractiveEngineResourceDeferral(\n\tinput: ComputeInteractiveEngineResourceDeferralInput,\n): boolean {\n\treturn (\n\t\tinput.interactiveEngineChild &&\n\t\t!input.hasSessionStartEvent &&\n\t\t(!input.shouldResolveProjectTrust || input.storedProjectTrust !== null) &&\n\t\tinput.resolvedExtensionPathCount === 0 &&\n\t\tinput.resolvedResourcePathCount === 0 &&\n\t\t!input.hasSystemPromptInput &&\n\t\tinput.unknownFlagCount === 0\n\t);\n}\n\nexport function formatScopedModelList(scopedModels: ScopedModel[]): string {\n\treturn scopedModels\n\t\t.map((scoped) => {\n\t\t\tconst thinkingSuffix = scoped.thinkingLevel ? `:${scoped.thinkingLevel}` : \"\";\n\t\t\treturn `${scoped.model.id}${thinkingSuffix}`;\n\t\t})\n\t\t.join(\", \");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAsGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAenD,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA6JnD,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBAwpB/D"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAuGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAenD,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA6JnD,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBAkqB/D"}
package/dist/main.js CHANGED
@@ -25,7 +25,7 @@ import { endTimingSpan, printTimings, resetTimings, startTimingSpan, time } from
25
25
  import { hasProjectTrustInputs, ProjectTrustStore } from "./core/trust-manager.js";
26
26
  import { builtInExtensions } from "./extensions/index.js";
27
27
  import { isPlainRuntimeMetadataCommand, prepareInitialMessage, resolveAppMode, resolveCliPaths, resolveExcludedToolsForAppMode, shouldStartRpcCatalogRefresh, toPrintOutputMode, } from "./main-app-mode.js";
28
- import { computeDeferExtensions, computeInteractiveEngineResourceDeferral, computeStartupInputCaptureEnabled, formatScopedModelList, } from "./main-deferred-startup.js";
28
+ import { computeDeferExtensions, computeInteractiveEngineResourceDeferral, computeStartupInputCaptureEnabled, computeStartupTrustPromptPossible, formatScopedModelList, } from "./main-deferred-startup.js";
29
29
  import { startEarlyInputCapture } from "./main-early-input.js";
30
30
  import { runFirstTimeSetup } from "./main-first-time-setup.js";
31
31
  import { applyCliRuntimeApiKey } from "./main-runtime-api-key.js";
@@ -288,8 +288,8 @@ export async function main(argv, options) {
288
288
  if (shouldTakeOverStdout) {
289
289
  takeOverStdout();
290
290
  }
291
- if (engineEnv.child === "1")
292
- startInteractiveEngineLiveness(writeRawStdout).ready();
291
+ const engineLiveness = engineEnv.child === "1" ? startInteractiveEngineLiveness(writeRawStdout) : undefined;
292
+ engineLiveness?.ready();
293
293
  if (parsed.mode === "rpc" && parsed.fileArgs.length > 0) {
294
294
  console.error(chalk.red("Error: @file arguments are not supported in RPC mode"));
295
295
  process.exit(1);
@@ -464,6 +464,7 @@ export async function main(argv, options) {
464
464
  completeStartupReload = complete;
465
465
  }
466
466
  : undefined,
467
+ onProjectTrustResolved: engineLiveness ? () => engineLiveness.projectTrustResolved() : undefined,
467
468
  resolveProjectTrust: shouldResolveProjectTrust
468
469
  ? async ({ extensionsResult }) => {
469
470
  const trusted = await resolveProjectTrusted({
@@ -742,6 +743,13 @@ export async function main(argv, options) {
742
743
  startupDiagnostics,
743
744
  modelFallbackMessage,
744
745
  autoTrustOnReloadCwd,
746
+ holdTuiForStartupTrust: isolateInteractiveHost &&
747
+ computeStartupTrustPromptPossible({
748
+ projectTrustOverride: parsed.projectTrustOverride,
749
+ hasTrustInputs: hasProjectTrustInputs(sessionCwd),
750
+ storedProjectTrust: projectTrustStore.get(sessionCwd),
751
+ defaultProjectTrust: startupDefaultProjectTrust,
752
+ }),
745
753
  initialMessage,
746
754
  initialImages,
747
755
  initialMessages: parsed.messages,