@bastani/atomic 0.9.3 → 0.9.4-alpha.1

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 (37) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  3. package/dist/builtin/cursor/package.json +2 -2
  4. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  5. package/dist/builtin/intercom/package.json +1 -1
  6. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  7. package/dist/builtin/mcp/package.json +1 -1
  8. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  9. package/dist/builtin/subagents/package.json +1 -1
  10. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  11. package/dist/builtin/web-access/package.json +1 -1
  12. package/dist/builtin/workflows/CHANGELOG.md +6 -0
  13. package/dist/builtin/workflows/README.md +4 -4
  14. package/dist/builtin/workflows/package.json +1 -1
  15. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +4 -2
  16. package/dist/builtin/workflows/src/engine/run-returned-status.ts +41 -0
  17. package/dist/builtin/workflows/src/engine/run.ts +6 -4
  18. package/dist/builtin/workflows/src/extension/config-file-loader.ts +1 -1
  19. package/dist/builtin/workflows/src/extension/config-loader.ts +1 -1
  20. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +37 -12
  21. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +1 -1
  22. package/dist/builtin/workflows/src/shared/store-public-types.ts +3 -2
  23. package/dist/builtin/workflows/src/shared/store-run-methods.ts +6 -1
  24. package/dist/core/http-dispatcher.d.ts +3 -3
  25. package/dist/core/http-dispatcher.d.ts.map +1 -1
  26. package/dist/core/http-dispatcher.js +19 -6
  27. package/dist/core/http-dispatcher.js.map +1 -1
  28. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  29. package/dist/core/settings-manager-basic-accessors.js +1 -1
  30. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  31. package/dist/modes/print-mode.d.ts.map +1 -1
  32. package/dist/modes/print-mode.js +15 -13
  33. package/dist/modes/print-mode.js.map +1 -1
  34. package/docs/settings.md +4 -4
  35. package/docs/workflows.md +5 -3
  36. package/npm-shrinkwrap.json +4299 -0
  37. package/package.json +7 -4
@@ -1 +1 @@
1
- {"version":3,"file":"settings-manager-basic-accessors.d.ts","sourceRoot":"","sources":["../../src/core/settings-manager-basic-accessors.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizePath } from \"../utils/paths.ts\";\nimport { parseContextWindowValue, validateContextWindowValue } from \"./context-window.ts\";\nimport { DEFAULT_HTTP_IDLE_TIMEOUT_MS, parseHttpIdleTimeoutMs } from \"./http-dispatcher.ts\";\nimport { SettingsManager } from \"./settings-manager-core.ts\";\nimport { settingsInternals } from \"./settings-manager-internals.ts\";\nimport type { ContextWindowSetting, TransportSetting } from \"./settings-types.ts\";\n\ninterface SettingsManagerBasicAccessors {\n\tgetLastChangelogVersion(): string | undefined;\n\tsetLastChangelogVersion(version: string): void;\n\tgetFirstRunOnboardingStartedVersion(): string | undefined;\n\tsetFirstRunOnboardingStartedVersion(version: string): void;\n\tgetOnboardedVersion(): string | undefined;\n\tsetOnboardedVersion(version: string): void;\n\tgetSessionDir(): string | undefined;\n\tgetDefaultProvider(): string | undefined;\n\tgetDefaultModel(): string | undefined;\n\tsetDefaultProvider(provider: string): void;\n\tsetDefaultModel(modelId: string): void;\n\tsetDefaultModelAndProvider(provider: string, modelId: string): void;\n\tgetSteeringMode(): \"all\" | \"one-at-a-time\";\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetFollowUpMode(): \"all\" | \"one-at-a-time\";\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetThemeSetting(): string | undefined;\n\tgetTheme(): string | undefined;\n\tsetTheme(theme: string): void;\n\tgetDefaultThinkingLevel(): \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | undefined;\n\tsetDefaultThinkingLevel(level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"): void;\n\tgetDefaultContextWindow(): number | undefined;\n\tgetDefaultContextWindowForModel(provider: string, modelId: string): number | undefined;\n\tsetDefaultContextWindow(contextWindow: number | undefined): void;\n\tsetDefaultContextWindowForModel(provider: string, modelId: string, contextWindow: number | undefined): void;\n\tgetTransport(): TransportSetting;\n\tsetTransport(transport: TransportSetting): void;\n\tgetCompactionEnabled(): boolean;\n\tsetCompactionEnabled(enabled: boolean): void;\n\tgetCompactionReserveTokens(): number;\n\tgetCompactionCompressionRatio(): number;\n\tgetCompactionPreserveRecent(): number;\n\tgetCompactionQuery(): string | undefined;\n\tgetCompactionSettings(): {\n\t\tenabled: boolean;\n\t\treserveTokens: number;\n\t\tcompression_ratio: number;\n\t\tpreserve_recent: number;\n\t\tquery?: string;\n\t};\n\tgetBranchSummarySettings(): { reserveTokens: number; skipPrompt: boolean };\n\tgetBranchSummarySkipPrompt(): boolean;\n\tgetRetryEnabled(): boolean;\n\tsetRetryEnabled(enabled: boolean): void;\n\tgetRetrySettings(): { enabled: boolean; maxRetries: number; baseDelayMs: number };\n\tgetHttpIdleTimeoutMs(): number;\n\tsetHttpIdleTimeoutMs(timeoutMs: number): void;\n\tgetWebSocketConnectTimeoutMs(): number | undefined;\n\tgetProviderRetrySettings(): { timeoutMs?: number; maxRetries?: number; maxRetryDelayMs: number };\n}\n\ndeclare module \"./settings-manager-core.ts\" {\n\tinterface SettingsManager extends SettingsManagerBasicAccessors {}\n}\n\nfunction defaultContextWindowModelKey(provider: string, modelId: string): string {\n\treturn `${provider}/${modelId}`;\n}\n\nfunction parseContextWindowSetting(configured: ContextWindowSetting | undefined): number | undefined {\n\tif (typeof configured === \"number\") {\n\t\treturn validateContextWindowValue(configured) ? undefined : configured;\n\t}\n\tif (typeof configured === \"string\") {\n\t\treturn parseContextWindowValue(configured).value;\n\t}\n\treturn undefined;\n}\n\nconst basicAccessors: SettingsManagerBasicAccessors = {\n\tgetLastChangelogVersion() {\n\t\treturn settingsInternals(this).settings.lastChangelogVersion;\n\t},\n\n\tsetLastChangelogVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.lastChangelogVersion = version;\n\t\tstate.markModified(\"lastChangelogVersion\");\n\t\tstate.save();\n\t},\n\n\tgetFirstRunOnboardingStartedVersion() {\n\t\treturn settingsInternals(this).settings.firstRunOnboardingStartedVersion;\n\t},\n\n\tsetFirstRunOnboardingStartedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.firstRunOnboardingStartedVersion = version;\n\t\tstate.markModified(\"firstRunOnboardingStartedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetOnboardedVersion() {\n\t\treturn settingsInternals(this).settings.onboardedVersion;\n\t},\n\n\tsetOnboardedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.onboardedVersion = version;\n\t\tstate.markModified(\"onboardedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetSessionDir() {\n\t\tconst sessionDir = settingsInternals(this).settings.sessionDir;\n\t\treturn sessionDir ? normalizePath(sessionDir) : sessionDir;\n\t},\n\n\tgetDefaultProvider() {\n\t\treturn settingsInternals(this).settings.defaultProvider;\n\t},\n\n\tgetDefaultModel() {\n\t\treturn settingsInternals(this).settings.defaultModel;\n\t},\n\n\tsetDefaultProvider(provider) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModel(modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModelAndProvider(provider, modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tgetSteeringMode() {\n\t\treturn settingsInternals(this).settings.steeringMode || \"one-at-a-time\";\n\t},\n\n\tsetSteeringMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.steeringMode = mode;\n\t\tstate.markModified(\"steeringMode\");\n\t\tstate.save();\n\t},\n\n\tgetFollowUpMode() {\n\t\treturn settingsInternals(this).settings.followUpMode || \"one-at-a-time\";\n\t},\n\n\tsetFollowUpMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.followUpMode = mode;\n\t\tstate.markModified(\"followUpMode\");\n\t\tstate.save();\n\t},\n\n\tgetThemeSetting() {\n\t\tconst value = settingsInternals(this).settings.theme;\n\t\tif (typeof value === \"string\") return value;\n\t\treturn undefined;\n\t},\n\n\tgetTheme() {\n\t\tconst theme = this.getThemeSetting();\n\t\treturn theme?.includes(\"/\") ? undefined : theme;\n\t},\n\n\tsetTheme(theme) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.theme = theme;\n\t\tstate.markModified(\"theme\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultThinkingLevel() {\n\t\treturn settingsInternals(this).settings.defaultThinkingLevel;\n\t},\n\n\tsetDefaultThinkingLevel(level) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultThinkingLevel = level;\n\t\tstate.markModified(\"defaultThinkingLevel\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultContextWindow() {\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindow);\n\t},\n\n\tgetDefaultContextWindowForModel(provider, modelId) {\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindows?.[key]);\n\t},\n\n\tsetDefaultContextWindow(contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete state.globalSettings.defaultContextWindow;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindow = contextWindow;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindow\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultContextWindowForModel(provider, modelId, contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\tconst next = { ...(state.globalSettings.defaultContextWindows ?? {}) };\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete next[key];\n\t\t} else {\n\t\t\tnext[key] = contextWindow;\n\t\t}\n\t\tif (Object.keys(next).length === 0) {\n\t\t\tdelete state.globalSettings.defaultContextWindows;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindows = next;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindows\");\n\t\tstate.save();\n\t},\n\n\tgetTransport() {\n\t\treturn settingsInternals(this).settings.transport ?? \"auto\";\n\t},\n\n\tsetTransport(transport) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.transport = transport;\n\t\tstate.markModified(\"transport\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionEnabled() {\n\t\treturn settingsInternals(this).settings.compaction?.enabled ?? true;\n\t},\n\n\tsetCompactionEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.compaction) {\n\t\t\tstate.globalSettings.compaction = {};\n\t\t}\n\t\tstate.globalSettings.compaction.enabled = enabled;\n\t\tstate.markModified(\"compaction\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionReserveTokens() {\n\t\treturn settingsInternals(this).settings.compaction?.reserveTokens ?? 16384;\n\t},\n\n\tgetCompactionCompressionRatio() {\n\t\tconst value = settingsInternals(this).settings.compaction?.compression_ratio;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 && value < 1 ? value : 0.5;\n\t},\n\n\tgetCompactionPreserveRecent() {\n\t\tconst value = settingsInternals(this).settings.compaction?.preserve_recent;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 2;\n\t},\n\n\tgetCompactionQuery() {\n\t\tconst query = settingsInternals(this).settings.compaction?.query?.trim();\n\t\treturn query && query.length > 0 ? query : undefined;\n\t},\n\n\tgetCompactionSettings() {\n\t\tconst query = this.getCompactionQuery();\n\t\treturn {\n\t\t\tenabled: this.getCompactionEnabled(),\n\t\t\treserveTokens: this.getCompactionReserveTokens(),\n\t\t\tcompression_ratio: this.getCompactionCompressionRatio(),\n\t\t\tpreserve_recent: this.getCompactionPreserveRecent(),\n\t\t\t...(query === undefined ? {} : { query }),\n\t\t};\n\t},\n\n\tgetBranchSummarySettings() {\n\t\treturn {\n\t\t\treserveTokens: settingsInternals(this).settings.branchSummary?.reserveTokens ?? 16384,\n\t\t\tskipPrompt: settingsInternals(this).settings.branchSummary?.skipPrompt ?? false,\n\t\t};\n\t},\n\n\tgetBranchSummarySkipPrompt() {\n\t\treturn settingsInternals(this).settings.branchSummary?.skipPrompt ?? false;\n\t},\n\n\tgetRetryEnabled() {\n\t\treturn settingsInternals(this).settings.retry?.enabled ?? true;\n\t},\n\n\tsetRetryEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.retry) {\n\t\t\tstate.globalSettings.retry = {};\n\t\t}\n\t\tstate.globalSettings.retry.enabled = enabled;\n\t\tstate.markModified(\"retry\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetRetrySettings() {\n\t\treturn {\n\t\t\tenabled: this.getRetryEnabled(),\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.maxRetries ?? 3,\n\t\t\tbaseDelayMs: settingsInternals(this).settings.retry?.baseDelayMs ?? 2000,\n\t\t};\n\t},\n\n\tgetHttpIdleTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.httpIdleTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn DEFAULT_HTTP_IDLE_TIMEOUT_MS;\n\t},\n\n\tsetHttpIdleTimeoutMs(timeoutMs) {\n\t\tconst normalizedTimeoutMs = parseHttpIdleTimeoutMs(timeoutMs);\n\t\tif (normalizedTimeoutMs === undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(timeoutMs)}`);\n\t\t}\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.httpIdleTimeoutMs = normalizedTimeoutMs;\n\t\tstate.markModified(\"httpIdleTimeoutMs\");\n\t\tstate.save();\n\t},\n\n\tgetWebSocketConnectTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.websocketConnectTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid websocketConnectTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tgetProviderRetrySettings() {\n\t\treturn {\n\t\t\ttimeoutMs: settingsInternals(this).settings.retry?.provider?.timeoutMs,\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.provider?.maxRetries ?? 5,\n\t\t\tmaxRetryDelayMs: settingsInternals(this).settings.retry?.provider?.maxRetryDelayMs ?? 60000,\n\t\t};\n\t},\n};\n\nObject.assign(SettingsManager.prototype, basicAccessors);\n"]}
1
+ {"version":3,"file":"settings-manager-basic-accessors.d.ts","sourceRoot":"","sources":["../../src/core/settings-manager-basic-accessors.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizePath } from \"../utils/paths.ts\";\nimport { parseContextWindowValue, validateContextWindowValue } from \"./context-window.ts\";\nimport { DEFAULT_HTTP_IDLE_TIMEOUT_MS, parseHttpIdleTimeoutMs } from \"./http-dispatcher.ts\";\nimport { SettingsManager } from \"./settings-manager-core.ts\";\nimport { settingsInternals } from \"./settings-manager-internals.ts\";\nimport type { ContextWindowSetting, TransportSetting } from \"./settings-types.ts\";\n\ninterface SettingsManagerBasicAccessors {\n\tgetLastChangelogVersion(): string | undefined;\n\tsetLastChangelogVersion(version: string): void;\n\tgetFirstRunOnboardingStartedVersion(): string | undefined;\n\tsetFirstRunOnboardingStartedVersion(version: string): void;\n\tgetOnboardedVersion(): string | undefined;\n\tsetOnboardedVersion(version: string): void;\n\tgetSessionDir(): string | undefined;\n\tgetDefaultProvider(): string | undefined;\n\tgetDefaultModel(): string | undefined;\n\tsetDefaultProvider(provider: string): void;\n\tsetDefaultModel(modelId: string): void;\n\tsetDefaultModelAndProvider(provider: string, modelId: string): void;\n\tgetSteeringMode(): \"all\" | \"one-at-a-time\";\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetFollowUpMode(): \"all\" | \"one-at-a-time\";\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetThemeSetting(): string | undefined;\n\tgetTheme(): string | undefined;\n\tsetTheme(theme: string): void;\n\tgetDefaultThinkingLevel(): \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | undefined;\n\tsetDefaultThinkingLevel(level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"): void;\n\tgetDefaultContextWindow(): number | undefined;\n\tgetDefaultContextWindowForModel(provider: string, modelId: string): number | undefined;\n\tsetDefaultContextWindow(contextWindow: number | undefined): void;\n\tsetDefaultContextWindowForModel(provider: string, modelId: string, contextWindow: number | undefined): void;\n\tgetTransport(): TransportSetting;\n\tsetTransport(transport: TransportSetting): void;\n\tgetCompactionEnabled(): boolean;\n\tsetCompactionEnabled(enabled: boolean): void;\n\tgetCompactionReserveTokens(): number;\n\tgetCompactionCompressionRatio(): number;\n\tgetCompactionPreserveRecent(): number;\n\tgetCompactionQuery(): string | undefined;\n\tgetCompactionSettings(): {\n\t\tenabled: boolean;\n\t\treserveTokens: number;\n\t\tcompression_ratio: number;\n\t\tpreserve_recent: number;\n\t\tquery?: string;\n\t};\n\tgetBranchSummarySettings(): { reserveTokens: number; skipPrompt: boolean };\n\tgetBranchSummarySkipPrompt(): boolean;\n\tgetRetryEnabled(): boolean;\n\tsetRetryEnabled(enabled: boolean): void;\n\tgetRetrySettings(): { enabled: boolean; maxRetries: number; baseDelayMs: number };\n\tgetHttpIdleTimeoutMs(): number;\n\tsetHttpIdleTimeoutMs(timeoutMs: number): void;\n\tgetWebSocketConnectTimeoutMs(): number | undefined;\n\tgetProviderRetrySettings(): { timeoutMs?: number; maxRetries?: number; maxRetryDelayMs: number };\n}\n\ndeclare module \"./settings-manager-core.ts\" {\n\tinterface SettingsManager extends SettingsManagerBasicAccessors {}\n}\n\nfunction defaultContextWindowModelKey(provider: string, modelId: string): string {\n\treturn `${provider}/${modelId}`;\n}\n\nfunction parseContextWindowSetting(configured: ContextWindowSetting | undefined): number | undefined {\n\tif (typeof configured === \"number\") {\n\t\treturn validateContextWindowValue(configured) ? undefined : configured;\n\t}\n\tif (typeof configured === \"string\") {\n\t\treturn parseContextWindowValue(configured).value;\n\t}\n\treturn undefined;\n}\n\nconst basicAccessors: SettingsManagerBasicAccessors = {\n\tgetLastChangelogVersion() {\n\t\treturn settingsInternals(this).settings.lastChangelogVersion;\n\t},\n\n\tsetLastChangelogVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.lastChangelogVersion = version;\n\t\tstate.markModified(\"lastChangelogVersion\");\n\t\tstate.save();\n\t},\n\n\tgetFirstRunOnboardingStartedVersion() {\n\t\treturn settingsInternals(this).settings.firstRunOnboardingStartedVersion;\n\t},\n\n\tsetFirstRunOnboardingStartedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.firstRunOnboardingStartedVersion = version;\n\t\tstate.markModified(\"firstRunOnboardingStartedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetOnboardedVersion() {\n\t\treturn settingsInternals(this).settings.onboardedVersion;\n\t},\n\n\tsetOnboardedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.onboardedVersion = version;\n\t\tstate.markModified(\"onboardedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetSessionDir() {\n\t\tconst sessionDir = settingsInternals(this).settings.sessionDir;\n\t\treturn sessionDir ? normalizePath(sessionDir) : sessionDir;\n\t},\n\n\tgetDefaultProvider() {\n\t\treturn settingsInternals(this).settings.defaultProvider;\n\t},\n\n\tgetDefaultModel() {\n\t\treturn settingsInternals(this).settings.defaultModel;\n\t},\n\n\tsetDefaultProvider(provider) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModel(modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModelAndProvider(provider, modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tgetSteeringMode() {\n\t\treturn settingsInternals(this).settings.steeringMode || \"one-at-a-time\";\n\t},\n\n\tsetSteeringMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.steeringMode = mode;\n\t\tstate.markModified(\"steeringMode\");\n\t\tstate.save();\n\t},\n\n\tgetFollowUpMode() {\n\t\treturn settingsInternals(this).settings.followUpMode || \"one-at-a-time\";\n\t},\n\n\tsetFollowUpMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.followUpMode = mode;\n\t\tstate.markModified(\"followUpMode\");\n\t\tstate.save();\n\t},\n\n\tgetThemeSetting() {\n\t\tconst value = settingsInternals(this).settings.theme;\n\t\tif (typeof value === \"string\") return value;\n\t\treturn undefined;\n\t},\n\n\tgetTheme() {\n\t\tconst theme = this.getThemeSetting();\n\t\treturn theme?.includes(\"/\") ? undefined : theme;\n\t},\n\n\tsetTheme(theme) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.theme = theme;\n\t\tstate.markModified(\"theme\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultThinkingLevel() {\n\t\treturn settingsInternals(this).settings.defaultThinkingLevel;\n\t},\n\n\tsetDefaultThinkingLevel(level) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultThinkingLevel = level;\n\t\tstate.markModified(\"defaultThinkingLevel\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultContextWindow() {\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindow);\n\t},\n\n\tgetDefaultContextWindowForModel(provider, modelId) {\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindows?.[key]);\n\t},\n\n\tsetDefaultContextWindow(contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete state.globalSettings.defaultContextWindow;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindow = contextWindow;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindow\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultContextWindowForModel(provider, modelId, contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\tconst next = { ...(state.globalSettings.defaultContextWindows ?? {}) };\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete next[key];\n\t\t} else {\n\t\t\tnext[key] = contextWindow;\n\t\t}\n\t\tif (Object.keys(next).length === 0) {\n\t\t\tdelete state.globalSettings.defaultContextWindows;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindows = next;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindows\");\n\t\tstate.save();\n\t},\n\n\tgetTransport() {\n\t\treturn settingsInternals(this).settings.transport ?? \"auto\";\n\t},\n\n\tsetTransport(transport) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.transport = transport;\n\t\tstate.markModified(\"transport\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionEnabled() {\n\t\treturn settingsInternals(this).settings.compaction?.enabled ?? true;\n\t},\n\n\tsetCompactionEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.compaction) {\n\t\t\tstate.globalSettings.compaction = {};\n\t\t}\n\t\tstate.globalSettings.compaction.enabled = enabled;\n\t\tstate.markModified(\"compaction\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionReserveTokens() {\n\t\treturn settingsInternals(this).settings.compaction?.reserveTokens ?? 16384;\n\t},\n\n\tgetCompactionCompressionRatio() {\n\t\tconst value = settingsInternals(this).settings.compaction?.compression_ratio;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 && value < 1 ? value : 0.5;\n\t},\n\n\tgetCompactionPreserveRecent() {\n\t\tconst value = settingsInternals(this).settings.compaction?.preserve_recent;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 2;\n\t},\n\n\tgetCompactionQuery() {\n\t\tconst query = settingsInternals(this).settings.compaction?.query?.trim();\n\t\treturn query && query.length > 0 ? query : undefined;\n\t},\n\n\tgetCompactionSettings() {\n\t\tconst query = this.getCompactionQuery();\n\t\treturn {\n\t\t\tenabled: this.getCompactionEnabled(),\n\t\t\treserveTokens: this.getCompactionReserveTokens(),\n\t\t\tcompression_ratio: this.getCompactionCompressionRatio(),\n\t\t\tpreserve_recent: this.getCompactionPreserveRecent(),\n\t\t\t...(query === undefined ? {} : { query }),\n\t\t};\n\t},\n\n\tgetBranchSummarySettings() {\n\t\treturn {\n\t\t\treserveTokens: settingsInternals(this).settings.branchSummary?.reserveTokens ?? 16384,\n\t\t\tskipPrompt: settingsInternals(this).settings.branchSummary?.skipPrompt ?? false,\n\t\t};\n\t},\n\n\tgetBranchSummarySkipPrompt() {\n\t\treturn settingsInternals(this).settings.branchSummary?.skipPrompt ?? false;\n\t},\n\n\tgetRetryEnabled() {\n\t\treturn settingsInternals(this).settings.retry?.enabled ?? true;\n\t},\n\n\tsetRetryEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.retry) {\n\t\t\tstate.globalSettings.retry = {};\n\t\t}\n\t\tstate.globalSettings.retry.enabled = enabled;\n\t\tstate.markModified(\"retry\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetRetrySettings() {\n\t\treturn {\n\t\t\tenabled: this.getRetryEnabled(),\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.maxRetries ?? 3,\n\t\t\tbaseDelayMs: settingsInternals(this).settings.retry?.baseDelayMs ?? 2000,\n\t\t};\n\t},\n\n\tgetHttpIdleTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.httpIdleTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn DEFAULT_HTTP_IDLE_TIMEOUT_MS;\n\t},\n\n\tsetHttpIdleTimeoutMs(timeoutMs) {\n\t\tconst normalizedTimeoutMs = parseHttpIdleTimeoutMs(timeoutMs);\n\t\tif (normalizedTimeoutMs === undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(timeoutMs)}`);\n\t\t}\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.httpIdleTimeoutMs = normalizedTimeoutMs;\n\t\tstate.markModified(\"httpIdleTimeoutMs\");\n\t\tstate.save();\n\t},\n\n\tgetWebSocketConnectTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.websocketConnectTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid websocketConnectTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tgetProviderRetrySettings() {\n\t\treturn {\n\t\t\ttimeoutMs: settingsInternals(this).settings.retry?.provider?.timeoutMs,\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.provider?.maxRetries,\n\t\t\tmaxRetryDelayMs: settingsInternals(this).settings.retry?.provider?.maxRetryDelayMs ?? 60000,\n\t\t};\n\t},\n};\n\nObject.assign(SettingsManager.prototype, basicAccessors);\n"]}
@@ -262,7 +262,7 @@ const basicAccessors = {
262
262
  getProviderRetrySettings() {
263
263
  return {
264
264
  timeoutMs: settingsInternals(this).settings.retry?.provider?.timeoutMs,
265
- maxRetries: settingsInternals(this).settings.retry?.provider?.maxRetries ?? 5,
265
+ maxRetries: settingsInternals(this).settings.retry?.provider?.maxRetries,
266
266
  maxRetryDelayMs: settingsInternals(this).settings.retry?.provider?.maxRetryDelayMs ?? 60000,
267
267
  };
268
268
  },
@@ -1 +1 @@
1
- {"version":3,"file":"settings-manager-basic-accessors.js","sourceRoot":"","sources":["../../src/core/settings-manager-basic-accessors.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizePath } from \"../utils/paths.ts\";\nimport { parseContextWindowValue, validateContextWindowValue } from \"./context-window.ts\";\nimport { DEFAULT_HTTP_IDLE_TIMEOUT_MS, parseHttpIdleTimeoutMs } from \"./http-dispatcher.ts\";\nimport { SettingsManager } from \"./settings-manager-core.ts\";\nimport { settingsInternals } from \"./settings-manager-internals.ts\";\nimport type { ContextWindowSetting, TransportSetting } from \"./settings-types.ts\";\n\ninterface SettingsManagerBasicAccessors {\n\tgetLastChangelogVersion(): string | undefined;\n\tsetLastChangelogVersion(version: string): void;\n\tgetFirstRunOnboardingStartedVersion(): string | undefined;\n\tsetFirstRunOnboardingStartedVersion(version: string): void;\n\tgetOnboardedVersion(): string | undefined;\n\tsetOnboardedVersion(version: string): void;\n\tgetSessionDir(): string | undefined;\n\tgetDefaultProvider(): string | undefined;\n\tgetDefaultModel(): string | undefined;\n\tsetDefaultProvider(provider: string): void;\n\tsetDefaultModel(modelId: string): void;\n\tsetDefaultModelAndProvider(provider: string, modelId: string): void;\n\tgetSteeringMode(): \"all\" | \"one-at-a-time\";\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetFollowUpMode(): \"all\" | \"one-at-a-time\";\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetThemeSetting(): string | undefined;\n\tgetTheme(): string | undefined;\n\tsetTheme(theme: string): void;\n\tgetDefaultThinkingLevel(): \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | undefined;\n\tsetDefaultThinkingLevel(level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"): void;\n\tgetDefaultContextWindow(): number | undefined;\n\tgetDefaultContextWindowForModel(provider: string, modelId: string): number | undefined;\n\tsetDefaultContextWindow(contextWindow: number | undefined): void;\n\tsetDefaultContextWindowForModel(provider: string, modelId: string, contextWindow: number | undefined): void;\n\tgetTransport(): TransportSetting;\n\tsetTransport(transport: TransportSetting): void;\n\tgetCompactionEnabled(): boolean;\n\tsetCompactionEnabled(enabled: boolean): void;\n\tgetCompactionReserveTokens(): number;\n\tgetCompactionCompressionRatio(): number;\n\tgetCompactionPreserveRecent(): number;\n\tgetCompactionQuery(): string | undefined;\n\tgetCompactionSettings(): {\n\t\tenabled: boolean;\n\t\treserveTokens: number;\n\t\tcompression_ratio: number;\n\t\tpreserve_recent: number;\n\t\tquery?: string;\n\t};\n\tgetBranchSummarySettings(): { reserveTokens: number; skipPrompt: boolean };\n\tgetBranchSummarySkipPrompt(): boolean;\n\tgetRetryEnabled(): boolean;\n\tsetRetryEnabled(enabled: boolean): void;\n\tgetRetrySettings(): { enabled: boolean; maxRetries: number; baseDelayMs: number };\n\tgetHttpIdleTimeoutMs(): number;\n\tsetHttpIdleTimeoutMs(timeoutMs: number): void;\n\tgetWebSocketConnectTimeoutMs(): number | undefined;\n\tgetProviderRetrySettings(): { timeoutMs?: number; maxRetries?: number; maxRetryDelayMs: number };\n}\n\ndeclare module \"./settings-manager-core.ts\" {\n\tinterface SettingsManager extends SettingsManagerBasicAccessors {}\n}\n\nfunction defaultContextWindowModelKey(provider: string, modelId: string): string {\n\treturn `${provider}/${modelId}`;\n}\n\nfunction parseContextWindowSetting(configured: ContextWindowSetting | undefined): number | undefined {\n\tif (typeof configured === \"number\") {\n\t\treturn validateContextWindowValue(configured) ? undefined : configured;\n\t}\n\tif (typeof configured === \"string\") {\n\t\treturn parseContextWindowValue(configured).value;\n\t}\n\treturn undefined;\n}\n\nconst basicAccessors: SettingsManagerBasicAccessors = {\n\tgetLastChangelogVersion() {\n\t\treturn settingsInternals(this).settings.lastChangelogVersion;\n\t},\n\n\tsetLastChangelogVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.lastChangelogVersion = version;\n\t\tstate.markModified(\"lastChangelogVersion\");\n\t\tstate.save();\n\t},\n\n\tgetFirstRunOnboardingStartedVersion() {\n\t\treturn settingsInternals(this).settings.firstRunOnboardingStartedVersion;\n\t},\n\n\tsetFirstRunOnboardingStartedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.firstRunOnboardingStartedVersion = version;\n\t\tstate.markModified(\"firstRunOnboardingStartedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetOnboardedVersion() {\n\t\treturn settingsInternals(this).settings.onboardedVersion;\n\t},\n\n\tsetOnboardedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.onboardedVersion = version;\n\t\tstate.markModified(\"onboardedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetSessionDir() {\n\t\tconst sessionDir = settingsInternals(this).settings.sessionDir;\n\t\treturn sessionDir ? normalizePath(sessionDir) : sessionDir;\n\t},\n\n\tgetDefaultProvider() {\n\t\treturn settingsInternals(this).settings.defaultProvider;\n\t},\n\n\tgetDefaultModel() {\n\t\treturn settingsInternals(this).settings.defaultModel;\n\t},\n\n\tsetDefaultProvider(provider) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModel(modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModelAndProvider(provider, modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tgetSteeringMode() {\n\t\treturn settingsInternals(this).settings.steeringMode || \"one-at-a-time\";\n\t},\n\n\tsetSteeringMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.steeringMode = mode;\n\t\tstate.markModified(\"steeringMode\");\n\t\tstate.save();\n\t},\n\n\tgetFollowUpMode() {\n\t\treturn settingsInternals(this).settings.followUpMode || \"one-at-a-time\";\n\t},\n\n\tsetFollowUpMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.followUpMode = mode;\n\t\tstate.markModified(\"followUpMode\");\n\t\tstate.save();\n\t},\n\n\tgetThemeSetting() {\n\t\tconst value = settingsInternals(this).settings.theme;\n\t\tif (typeof value === \"string\") return value;\n\t\treturn undefined;\n\t},\n\n\tgetTheme() {\n\t\tconst theme = this.getThemeSetting();\n\t\treturn theme?.includes(\"/\") ? undefined : theme;\n\t},\n\n\tsetTheme(theme) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.theme = theme;\n\t\tstate.markModified(\"theme\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultThinkingLevel() {\n\t\treturn settingsInternals(this).settings.defaultThinkingLevel;\n\t},\n\n\tsetDefaultThinkingLevel(level) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultThinkingLevel = level;\n\t\tstate.markModified(\"defaultThinkingLevel\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultContextWindow() {\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindow);\n\t},\n\n\tgetDefaultContextWindowForModel(provider, modelId) {\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindows?.[key]);\n\t},\n\n\tsetDefaultContextWindow(contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete state.globalSettings.defaultContextWindow;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindow = contextWindow;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindow\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultContextWindowForModel(provider, modelId, contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\tconst next = { ...(state.globalSettings.defaultContextWindows ?? {}) };\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete next[key];\n\t\t} else {\n\t\t\tnext[key] = contextWindow;\n\t\t}\n\t\tif (Object.keys(next).length === 0) {\n\t\t\tdelete state.globalSettings.defaultContextWindows;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindows = next;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindows\");\n\t\tstate.save();\n\t},\n\n\tgetTransport() {\n\t\treturn settingsInternals(this).settings.transport ?? \"auto\";\n\t},\n\n\tsetTransport(transport) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.transport = transport;\n\t\tstate.markModified(\"transport\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionEnabled() {\n\t\treturn settingsInternals(this).settings.compaction?.enabled ?? true;\n\t},\n\n\tsetCompactionEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.compaction) {\n\t\t\tstate.globalSettings.compaction = {};\n\t\t}\n\t\tstate.globalSettings.compaction.enabled = enabled;\n\t\tstate.markModified(\"compaction\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionReserveTokens() {\n\t\treturn settingsInternals(this).settings.compaction?.reserveTokens ?? 16384;\n\t},\n\n\tgetCompactionCompressionRatio() {\n\t\tconst value = settingsInternals(this).settings.compaction?.compression_ratio;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 && value < 1 ? value : 0.5;\n\t},\n\n\tgetCompactionPreserveRecent() {\n\t\tconst value = settingsInternals(this).settings.compaction?.preserve_recent;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 2;\n\t},\n\n\tgetCompactionQuery() {\n\t\tconst query = settingsInternals(this).settings.compaction?.query?.trim();\n\t\treturn query && query.length > 0 ? query : undefined;\n\t},\n\n\tgetCompactionSettings() {\n\t\tconst query = this.getCompactionQuery();\n\t\treturn {\n\t\t\tenabled: this.getCompactionEnabled(),\n\t\t\treserveTokens: this.getCompactionReserveTokens(),\n\t\t\tcompression_ratio: this.getCompactionCompressionRatio(),\n\t\t\tpreserve_recent: this.getCompactionPreserveRecent(),\n\t\t\t...(query === undefined ? {} : { query }),\n\t\t};\n\t},\n\n\tgetBranchSummarySettings() {\n\t\treturn {\n\t\t\treserveTokens: settingsInternals(this).settings.branchSummary?.reserveTokens ?? 16384,\n\t\t\tskipPrompt: settingsInternals(this).settings.branchSummary?.skipPrompt ?? false,\n\t\t};\n\t},\n\n\tgetBranchSummarySkipPrompt() {\n\t\treturn settingsInternals(this).settings.branchSummary?.skipPrompt ?? false;\n\t},\n\n\tgetRetryEnabled() {\n\t\treturn settingsInternals(this).settings.retry?.enabled ?? true;\n\t},\n\n\tsetRetryEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.retry) {\n\t\t\tstate.globalSettings.retry = {};\n\t\t}\n\t\tstate.globalSettings.retry.enabled = enabled;\n\t\tstate.markModified(\"retry\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetRetrySettings() {\n\t\treturn {\n\t\t\tenabled: this.getRetryEnabled(),\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.maxRetries ?? 3,\n\t\t\tbaseDelayMs: settingsInternals(this).settings.retry?.baseDelayMs ?? 2000,\n\t\t};\n\t},\n\n\tgetHttpIdleTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.httpIdleTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn DEFAULT_HTTP_IDLE_TIMEOUT_MS;\n\t},\n\n\tsetHttpIdleTimeoutMs(timeoutMs) {\n\t\tconst normalizedTimeoutMs = parseHttpIdleTimeoutMs(timeoutMs);\n\t\tif (normalizedTimeoutMs === undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(timeoutMs)}`);\n\t\t}\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.httpIdleTimeoutMs = normalizedTimeoutMs;\n\t\tstate.markModified(\"httpIdleTimeoutMs\");\n\t\tstate.save();\n\t},\n\n\tgetWebSocketConnectTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.websocketConnectTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid websocketConnectTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tgetProviderRetrySettings() {\n\t\treturn {\n\t\t\ttimeoutMs: settingsInternals(this).settings.retry?.provider?.timeoutMs,\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.provider?.maxRetries ?? 5,\n\t\t\tmaxRetryDelayMs: settingsInternals(this).settings.retry?.provider?.maxRetryDelayMs ?? 60000,\n\t\t};\n\t},\n};\n\nObject.assign(SettingsManager.prototype, basicAccessors);\n"]}
1
+ {"version":3,"file":"settings-manager-basic-accessors.js","sourceRoot":"","sources":["../../src/core/settings-manager-basic-accessors.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizePath } from \"../utils/paths.ts\";\nimport { parseContextWindowValue, validateContextWindowValue } from \"./context-window.ts\";\nimport { DEFAULT_HTTP_IDLE_TIMEOUT_MS, parseHttpIdleTimeoutMs } from \"./http-dispatcher.ts\";\nimport { SettingsManager } from \"./settings-manager-core.ts\";\nimport { settingsInternals } from \"./settings-manager-internals.ts\";\nimport type { ContextWindowSetting, TransportSetting } from \"./settings-types.ts\";\n\ninterface SettingsManagerBasicAccessors {\n\tgetLastChangelogVersion(): string | undefined;\n\tsetLastChangelogVersion(version: string): void;\n\tgetFirstRunOnboardingStartedVersion(): string | undefined;\n\tsetFirstRunOnboardingStartedVersion(version: string): void;\n\tgetOnboardedVersion(): string | undefined;\n\tsetOnboardedVersion(version: string): void;\n\tgetSessionDir(): string | undefined;\n\tgetDefaultProvider(): string | undefined;\n\tgetDefaultModel(): string | undefined;\n\tsetDefaultProvider(provider: string): void;\n\tsetDefaultModel(modelId: string): void;\n\tsetDefaultModelAndProvider(provider: string, modelId: string): void;\n\tgetSteeringMode(): \"all\" | \"one-at-a-time\";\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetFollowUpMode(): \"all\" | \"one-at-a-time\";\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void;\n\tgetThemeSetting(): string | undefined;\n\tgetTheme(): string | undefined;\n\tsetTheme(theme: string): void;\n\tgetDefaultThinkingLevel(): \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | undefined;\n\tsetDefaultThinkingLevel(level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"): void;\n\tgetDefaultContextWindow(): number | undefined;\n\tgetDefaultContextWindowForModel(provider: string, modelId: string): number | undefined;\n\tsetDefaultContextWindow(contextWindow: number | undefined): void;\n\tsetDefaultContextWindowForModel(provider: string, modelId: string, contextWindow: number | undefined): void;\n\tgetTransport(): TransportSetting;\n\tsetTransport(transport: TransportSetting): void;\n\tgetCompactionEnabled(): boolean;\n\tsetCompactionEnabled(enabled: boolean): void;\n\tgetCompactionReserveTokens(): number;\n\tgetCompactionCompressionRatio(): number;\n\tgetCompactionPreserveRecent(): number;\n\tgetCompactionQuery(): string | undefined;\n\tgetCompactionSettings(): {\n\t\tenabled: boolean;\n\t\treserveTokens: number;\n\t\tcompression_ratio: number;\n\t\tpreserve_recent: number;\n\t\tquery?: string;\n\t};\n\tgetBranchSummarySettings(): { reserveTokens: number; skipPrompt: boolean };\n\tgetBranchSummarySkipPrompt(): boolean;\n\tgetRetryEnabled(): boolean;\n\tsetRetryEnabled(enabled: boolean): void;\n\tgetRetrySettings(): { enabled: boolean; maxRetries: number; baseDelayMs: number };\n\tgetHttpIdleTimeoutMs(): number;\n\tsetHttpIdleTimeoutMs(timeoutMs: number): void;\n\tgetWebSocketConnectTimeoutMs(): number | undefined;\n\tgetProviderRetrySettings(): { timeoutMs?: number; maxRetries?: number; maxRetryDelayMs: number };\n}\n\ndeclare module \"./settings-manager-core.ts\" {\n\tinterface SettingsManager extends SettingsManagerBasicAccessors {}\n}\n\nfunction defaultContextWindowModelKey(provider: string, modelId: string): string {\n\treturn `${provider}/${modelId}`;\n}\n\nfunction parseContextWindowSetting(configured: ContextWindowSetting | undefined): number | undefined {\n\tif (typeof configured === \"number\") {\n\t\treturn validateContextWindowValue(configured) ? undefined : configured;\n\t}\n\tif (typeof configured === \"string\") {\n\t\treturn parseContextWindowValue(configured).value;\n\t}\n\treturn undefined;\n}\n\nconst basicAccessors: SettingsManagerBasicAccessors = {\n\tgetLastChangelogVersion() {\n\t\treturn settingsInternals(this).settings.lastChangelogVersion;\n\t},\n\n\tsetLastChangelogVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.lastChangelogVersion = version;\n\t\tstate.markModified(\"lastChangelogVersion\");\n\t\tstate.save();\n\t},\n\n\tgetFirstRunOnboardingStartedVersion() {\n\t\treturn settingsInternals(this).settings.firstRunOnboardingStartedVersion;\n\t},\n\n\tsetFirstRunOnboardingStartedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.firstRunOnboardingStartedVersion = version;\n\t\tstate.markModified(\"firstRunOnboardingStartedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetOnboardedVersion() {\n\t\treturn settingsInternals(this).settings.onboardedVersion;\n\t},\n\n\tsetOnboardedVersion(version) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.onboardedVersion = version;\n\t\tstate.markModified(\"onboardedVersion\");\n\t\tstate.save();\n\t},\n\n\tgetSessionDir() {\n\t\tconst sessionDir = settingsInternals(this).settings.sessionDir;\n\t\treturn sessionDir ? normalizePath(sessionDir) : sessionDir;\n\t},\n\n\tgetDefaultProvider() {\n\t\treturn settingsInternals(this).settings.defaultProvider;\n\t},\n\n\tgetDefaultModel() {\n\t\treturn settingsInternals(this).settings.defaultModel;\n\t},\n\n\tsetDefaultProvider(provider) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModel(modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultModelAndProvider(provider, modelId) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultProvider = provider;\n\t\tstate.globalSettings.defaultModel = modelId;\n\t\tstate.markModified(\"defaultProvider\");\n\t\tstate.markModified(\"defaultModel\");\n\t\tstate.save();\n\t},\n\n\tgetSteeringMode() {\n\t\treturn settingsInternals(this).settings.steeringMode || \"one-at-a-time\";\n\t},\n\n\tsetSteeringMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.steeringMode = mode;\n\t\tstate.markModified(\"steeringMode\");\n\t\tstate.save();\n\t},\n\n\tgetFollowUpMode() {\n\t\treturn settingsInternals(this).settings.followUpMode || \"one-at-a-time\";\n\t},\n\n\tsetFollowUpMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.followUpMode = mode;\n\t\tstate.markModified(\"followUpMode\");\n\t\tstate.save();\n\t},\n\n\tgetThemeSetting() {\n\t\tconst value = settingsInternals(this).settings.theme;\n\t\tif (typeof value === \"string\") return value;\n\t\treturn undefined;\n\t},\n\n\tgetTheme() {\n\t\tconst theme = this.getThemeSetting();\n\t\treturn theme?.includes(\"/\") ? undefined : theme;\n\t},\n\n\tsetTheme(theme) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.theme = theme;\n\t\tstate.markModified(\"theme\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultThinkingLevel() {\n\t\treturn settingsInternals(this).settings.defaultThinkingLevel;\n\t},\n\n\tsetDefaultThinkingLevel(level) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.defaultThinkingLevel = level;\n\t\tstate.markModified(\"defaultThinkingLevel\");\n\t\tstate.save();\n\t},\n\n\tgetDefaultContextWindow() {\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindow);\n\t},\n\n\tgetDefaultContextWindowForModel(provider, modelId) {\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\treturn parseContextWindowSetting(settingsInternals(this).settings.defaultContextWindows?.[key]);\n\t},\n\n\tsetDefaultContextWindow(contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete state.globalSettings.defaultContextWindow;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindow = contextWindow;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindow\");\n\t\tstate.save();\n\t},\n\n\tsetDefaultContextWindowForModel(provider, modelId, contextWindow) {\n\t\tconst state = settingsInternals(this);\n\t\tconst key = defaultContextWindowModelKey(provider, modelId);\n\t\tconst next = { ...(state.globalSettings.defaultContextWindows ?? {}) };\n\t\tif (contextWindow === undefined) {\n\t\t\tdelete next[key];\n\t\t} else {\n\t\t\tnext[key] = contextWindow;\n\t\t}\n\t\tif (Object.keys(next).length === 0) {\n\t\t\tdelete state.globalSettings.defaultContextWindows;\n\t\t} else {\n\t\t\tstate.globalSettings.defaultContextWindows = next;\n\t\t}\n\t\tstate.markModified(\"defaultContextWindows\");\n\t\tstate.save();\n\t},\n\n\tgetTransport() {\n\t\treturn settingsInternals(this).settings.transport ?? \"auto\";\n\t},\n\n\tsetTransport(transport) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.transport = transport;\n\t\tstate.markModified(\"transport\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionEnabled() {\n\t\treturn settingsInternals(this).settings.compaction?.enabled ?? true;\n\t},\n\n\tsetCompactionEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.compaction) {\n\t\t\tstate.globalSettings.compaction = {};\n\t\t}\n\t\tstate.globalSettings.compaction.enabled = enabled;\n\t\tstate.markModified(\"compaction\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetCompactionReserveTokens() {\n\t\treturn settingsInternals(this).settings.compaction?.reserveTokens ?? 16384;\n\t},\n\n\tgetCompactionCompressionRatio() {\n\t\tconst value = settingsInternals(this).settings.compaction?.compression_ratio;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 && value < 1 ? value : 0.5;\n\t},\n\n\tgetCompactionPreserveRecent() {\n\t\tconst value = settingsInternals(this).settings.compaction?.preserve_recent;\n\t\treturn typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 2;\n\t},\n\n\tgetCompactionQuery() {\n\t\tconst query = settingsInternals(this).settings.compaction?.query?.trim();\n\t\treturn query && query.length > 0 ? query : undefined;\n\t},\n\n\tgetCompactionSettings() {\n\t\tconst query = this.getCompactionQuery();\n\t\treturn {\n\t\t\tenabled: this.getCompactionEnabled(),\n\t\t\treserveTokens: this.getCompactionReserveTokens(),\n\t\t\tcompression_ratio: this.getCompactionCompressionRatio(),\n\t\t\tpreserve_recent: this.getCompactionPreserveRecent(),\n\t\t\t...(query === undefined ? {} : { query }),\n\t\t};\n\t},\n\n\tgetBranchSummarySettings() {\n\t\treturn {\n\t\t\treserveTokens: settingsInternals(this).settings.branchSummary?.reserveTokens ?? 16384,\n\t\t\tskipPrompt: settingsInternals(this).settings.branchSummary?.skipPrompt ?? false,\n\t\t};\n\t},\n\n\tgetBranchSummarySkipPrompt() {\n\t\treturn settingsInternals(this).settings.branchSummary?.skipPrompt ?? false;\n\t},\n\n\tgetRetryEnabled() {\n\t\treturn settingsInternals(this).settings.retry?.enabled ?? true;\n\t},\n\n\tsetRetryEnabled(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.retry) {\n\t\t\tstate.globalSettings.retry = {};\n\t\t}\n\t\tstate.globalSettings.retry.enabled = enabled;\n\t\tstate.markModified(\"retry\", \"enabled\");\n\t\tstate.save();\n\t},\n\n\tgetRetrySettings() {\n\t\treturn {\n\t\t\tenabled: this.getRetryEnabled(),\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.maxRetries ?? 3,\n\t\t\tbaseDelayMs: settingsInternals(this).settings.retry?.baseDelayMs ?? 2000,\n\t\t};\n\t},\n\n\tgetHttpIdleTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.httpIdleTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn DEFAULT_HTTP_IDLE_TIMEOUT_MS;\n\t},\n\n\tsetHttpIdleTimeoutMs(timeoutMs) {\n\t\tconst normalizedTimeoutMs = parseHttpIdleTimeoutMs(timeoutMs);\n\t\tif (normalizedTimeoutMs === undefined) {\n\t\t\tthrow new Error(`Invalid httpIdleTimeoutMs setting: ${String(timeoutMs)}`);\n\t\t}\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.httpIdleTimeoutMs = normalizedTimeoutMs;\n\t\tstate.markModified(\"httpIdleTimeoutMs\");\n\t\tstate.save();\n\t},\n\n\tgetWebSocketConnectTimeoutMs() {\n\t\tconst value = settingsInternals(this).settings.websocketConnectTimeoutMs;\n\t\tconst timeoutMs = parseHttpIdleTimeoutMs(value);\n\t\tif (timeoutMs !== undefined) {\n\t\t\treturn timeoutMs;\n\t\t}\n\t\tif (value !== undefined) {\n\t\t\tthrow new Error(`Invalid websocketConnectTimeoutMs setting: ${String(value)}`);\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tgetProviderRetrySettings() {\n\t\treturn {\n\t\t\ttimeoutMs: settingsInternals(this).settings.retry?.provider?.timeoutMs,\n\t\t\tmaxRetries: settingsInternals(this).settings.retry?.provider?.maxRetries,\n\t\t\tmaxRetryDelayMs: settingsInternals(this).settings.retry?.provider?.maxRetryDelayMs ?? 60000,\n\t\t};\n\t},\n};\n\nObject.assign(SettingsManager.prototype, basicAccessors);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAoB,YAAY,EAAqB,MAAM,8BAA8B,CAAC;AAEtG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAO5E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAiED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqK/G","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `pi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { AssistantMessage, ImageContent, ToolResultMessage } from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionEvent } from \"../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport type { ExtensionError } from \"../core/extensions/index.ts\";\nimport type { ToolDefinition } from \"../core/extensions/types.ts\";\nimport type { CustomMessage } from \"../core/messages.ts\";\nimport { flushRawStdout, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\nfunction isCommandExtensionError(error: ExtensionError): boolean {\n\treturn error.event === \"command\" || error.extensionPath.startsWith(\"command:\");\n}\n\nfunction displayableCustomText(message: CustomMessage): string | undefined {\n\tif (message.display !== true) return undefined;\n\tif (typeof message.content === \"string\") return message.content;\n\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\n\treturn hasTextPart ? text : undefined;\n}\n\ntype MaybeTerminatingToolResult = {\n\tterminate?: boolean;\n};\n\ntype ToolExecutionEndSessionEvent = Extract<AgentSessionEvent, { type: \"tool_execution_end\" }>;\n\ntype GetToolDefinition = (name: string) => ToolDefinition | undefined;\n\nfunction isStructuredOutputTool(getToolDefinition: GetToolDefinition, name: string): boolean {\n\treturn getToolDefinition(name)?.structuredOutput === true;\n}\n\nfunction isTerminatingStructuredOutputEvent(\n\tevent: AgentSessionEvent,\n\tgetToolDefinition: GetToolDefinition,\n): event is ToolExecutionEndSessionEvent {\n\tif (event.type !== \"tool_execution_end\") return false;\n\tif (!isStructuredOutputTool(getToolDefinition, event.toolName)) return false;\n\tif (event.isError) return false;\n\tconst result = event.result as MaybeTerminatingToolResult | undefined;\n\treturn result?.terminate === true;\n}\n\nfunction textFromToolResult(message: ToolResultMessage): string | undefined {\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\treturn hasTextPart ? text : undefined;\n}\n\nfunction terminatingStructuredOutputText(\n\tmessage: ToolResultMessage,\n\tterminatingStructuredOutputCallIds: ReadonlySet<string>,\n): string | undefined {\n\tif (!terminatingStructuredOutputCallIds.has(message.toolCallId)) return undefined;\n\treturn textFromToolResult(message);\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet suppressFinalOutput = false;\n\tlet activePromptHadCommandError = false;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tconst terminatingStructuredOutputCallIds = new Set<string>();\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\tconst promptWithScopedCommandSuppression = async (\n\t\ttext: string,\n\t\tpromptOptions?: { images?: ImageContent[] },\n\t): Promise<void> => {\n\t\tactivePromptHadCommandError = false;\n\t\ttry {\n\t\t\tif (promptOptions === undefined) {\n\t\t\t\tawait session.prompt(text);\n\t\t\t} else {\n\t\t\t\tawait session.prompt(text, promptOptions);\n\t\t\t}\n\t\t} finally {\n\t\t\t// Final-output suppression is scoped to the most recent prompt so a\n\t\t\t// later successful prompt in the same invocation can still print its\n\t\t\t// result. The non-zero exit code remains sticky across prompts.\n\t\t\tsuppressFinalOutput = activePromptHadCommandError;\n\t\t}\n\t};\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconst isCommandError = isCommandExtensionError(err);\n\t\t\t\tif (isCommandError) exitCode = 1;\n\t\t\t\tactivePromptHadCommandError = activePromptHadCommandError || isCommandError;\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (isTerminatingStructuredOutputEvent(event, (name) => session.getToolDefinition(name))) {\n\t\t\t\tterminatingStructuredOutputCallIds.add(event.toolCallId);\n\t\t\t}\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(event)}\\n`);\n\t\t\t}\n\t\t});\n\t};\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait promptWithScopedCommandSuppression(initialMessage, { images: initialImages });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait promptWithScopedCommandSuppression(message);\n\t\t}\n\n\t\tif (mode === \"text\" && !suppressFinalOutput) {\n\t\t\tconst state = session.state;\n\t\t\tconst lastMessage = state.messages[state.messages.length - 1];\n\n\t\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = lastMessage as AssistantMessage;\n\t\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t\texitCode = 1;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (lastMessage?.role === \"custom\") {\n\t\t\t\tconst text = displayableCustomText(lastMessage as CustomMessage);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t} else if (lastMessage?.role === \"toolResult\") {\n\t\t\t\tconst text = terminatingStructuredOutputText(lastMessage as ToolResultMessage, terminatingStructuredOutputCallIds);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}
1
+ {"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAoB,YAAY,EAAqB,MAAM,8BAA8B,CAAC;AAEtG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAO5E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAiED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuK/G","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `pi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { AssistantMessage, ImageContent, ToolResultMessage } from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionEvent } from \"../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport type { ExtensionError } from \"../core/extensions/index.ts\";\nimport type { ToolDefinition } from \"../core/extensions/types.ts\";\nimport type { CustomMessage } from \"../core/messages.ts\";\nimport { flushRawStdout, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\nfunction isCommandExtensionError(error: ExtensionError): boolean {\n\treturn error.event === \"command\" || error.extensionPath.startsWith(\"command:\");\n}\n\nfunction displayableCustomText(message: CustomMessage): string | undefined {\n\tif (message.display !== true) return undefined;\n\tif (typeof message.content === \"string\") return message.content;\n\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\n\treturn hasTextPart ? text : undefined;\n}\n\ntype MaybeTerminatingToolResult = {\n\tterminate?: boolean;\n};\n\ntype ToolExecutionEndSessionEvent = Extract<AgentSessionEvent, { type: \"tool_execution_end\" }>;\n\ntype GetToolDefinition = (name: string) => ToolDefinition | undefined;\n\nfunction isStructuredOutputTool(getToolDefinition: GetToolDefinition, name: string): boolean {\n\treturn getToolDefinition(name)?.structuredOutput === true;\n}\n\nfunction isTerminatingStructuredOutputEvent(\n\tevent: AgentSessionEvent,\n\tgetToolDefinition: GetToolDefinition,\n): event is ToolExecutionEndSessionEvent {\n\tif (event.type !== \"tool_execution_end\") return false;\n\tif (!isStructuredOutputTool(getToolDefinition, event.toolName)) return false;\n\tif (event.isError) return false;\n\tconst result = event.result as MaybeTerminatingToolResult | undefined;\n\treturn result?.terminate === true;\n}\n\nfunction textFromToolResult(message: ToolResultMessage): string | undefined {\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\treturn hasTextPart ? text : undefined;\n}\n\nfunction terminatingStructuredOutputText(\n\tmessage: ToolResultMessage,\n\tterminatingStructuredOutputCallIds: ReadonlySet<string>,\n): string | undefined {\n\tif (!terminatingStructuredOutputCallIds.has(message.toolCallId)) return undefined;\n\treturn textFromToolResult(message);\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet suppressFinalOutput = false;\n\tlet activePromptHadCommandError = false;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tconst terminatingStructuredOutputCallIds = new Set<string>();\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\tconst promptWithScopedCommandSuppression = async (\n\t\ttext: string,\n\t\tpromptOptions?: { images?: ImageContent[] },\n\t): Promise<void> => {\n\t\tactivePromptHadCommandError = false;\n\t\ttry {\n\t\t\tif (promptOptions === undefined) {\n\t\t\t\tawait session.prompt(text);\n\t\t\t} else {\n\t\t\t\tawait session.prompt(text, promptOptions);\n\t\t\t}\n\t\t} finally {\n\t\t\t// Final-output suppression is scoped to the most recent prompt so a\n\t\t\t// later successful prompt in the same invocation can still print its\n\t\t\t// result. The non-zero exit code remains sticky across prompts.\n\t\t\tsuppressFinalOutput = activePromptHadCommandError;\n\t\t}\n\t};\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconst isCommandError = isCommandExtensionError(err);\n\t\t\t\tif (isCommandError) exitCode = 1;\n\t\t\t\tactivePromptHadCommandError = activePromptHadCommandError || isCommandError;\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (isTerminatingStructuredOutputEvent(event, (name) => session.getToolDefinition(name))) {\n\t\t\t\tterminatingStructuredOutputCallIds.add(event.toolCallId);\n\t\t\t}\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(event)}\\n`);\n\t\t\t}\n\t\t});\n\t};\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait promptWithScopedCommandSuppression(initialMessage, { images: initialImages });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait promptWithScopedCommandSuppression(message);\n\t\t}\n\n\t\tconst state = session.state;\n\t\tconst lastMessage = state.messages[state.messages.length - 1];\n\n\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\tconst assistantMsg = lastMessage as AssistantMessage;\n\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\tif (mode === \"text\" && !suppressFinalOutput) {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t}\n\t\t\t\texitCode = 1;\n\t\t\t} else if (mode === \"text\" && !suppressFinalOutput) {\n\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (mode === \"text\" && !suppressFinalOutput) {\n\t\t\tif (lastMessage?.role === \"custom\") {\n\t\t\t\tconst text = displayableCustomText(lastMessage as CustomMessage);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t} else if (lastMessage?.role === \"toolResult\") {\n\t\t\t\tconst text = terminatingStructuredOutputText(lastMessage as ToolResultMessage, terminatingStructuredOutputCallIds);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}
@@ -171,24 +171,26 @@ export async function runPrintMode(runtimeHost, options) {
171
171
  for (const message of messages) {
172
172
  await promptWithScopedCommandSuppression(message);
173
173
  }
174
- if (mode === "text" && !suppressFinalOutput) {
175
- const state = session.state;
176
- const lastMessage = state.messages[state.messages.length - 1];
177
- if (lastMessage?.role === "assistant") {
178
- const assistantMsg = lastMessage;
179
- if (assistantMsg.stopReason === "error" || assistantMsg.stopReason === "aborted") {
174
+ const state = session.state;
175
+ const lastMessage = state.messages[state.messages.length - 1];
176
+ if (lastMessage?.role === "assistant") {
177
+ const assistantMsg = lastMessage;
178
+ if (assistantMsg.stopReason === "error" || assistantMsg.stopReason === "aborted") {
179
+ if (mode === "text" && !suppressFinalOutput) {
180
180
  console.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);
181
- exitCode = 1;
182
181
  }
183
- else {
184
- for (const content of assistantMsg.content) {
185
- if (content.type === "text") {
186
- writeRawStdout(`${content.text}\n`);
187
- }
182
+ exitCode = 1;
183
+ }
184
+ else if (mode === "text" && !suppressFinalOutput) {
185
+ for (const content of assistantMsg.content) {
186
+ if (content.type === "text") {
187
+ writeRawStdout(`${content.text}\n`);
188
188
  }
189
189
  }
190
190
  }
191
- else if (lastMessage?.role === "custom") {
191
+ }
192
+ else if (mode === "text" && !suppressFinalOutput) {
193
+ if (lastMessage?.role === "custom") {
192
194
  const text = displayableCustomText(lastMessage);
193
195
  if (text !== undefined) {
194
196
  writeRawStdout(`${text}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"print-mode.js","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `pi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { AssistantMessage, ImageContent, ToolResultMessage } from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionEvent } from \"../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport type { ExtensionError } from \"../core/extensions/index.ts\";\nimport type { ToolDefinition } from \"../core/extensions/types.ts\";\nimport type { CustomMessage } from \"../core/messages.ts\";\nimport { flushRawStdout, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\nfunction isCommandExtensionError(error: ExtensionError): boolean {\n\treturn error.event === \"command\" || error.extensionPath.startsWith(\"command:\");\n}\n\nfunction displayableCustomText(message: CustomMessage): string | undefined {\n\tif (message.display !== true) return undefined;\n\tif (typeof message.content === \"string\") return message.content;\n\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\n\treturn hasTextPart ? text : undefined;\n}\n\ntype MaybeTerminatingToolResult = {\n\tterminate?: boolean;\n};\n\ntype ToolExecutionEndSessionEvent = Extract<AgentSessionEvent, { type: \"tool_execution_end\" }>;\n\ntype GetToolDefinition = (name: string) => ToolDefinition | undefined;\n\nfunction isStructuredOutputTool(getToolDefinition: GetToolDefinition, name: string): boolean {\n\treturn getToolDefinition(name)?.structuredOutput === true;\n}\n\nfunction isTerminatingStructuredOutputEvent(\n\tevent: AgentSessionEvent,\n\tgetToolDefinition: GetToolDefinition,\n): event is ToolExecutionEndSessionEvent {\n\tif (event.type !== \"tool_execution_end\") return false;\n\tif (!isStructuredOutputTool(getToolDefinition, event.toolName)) return false;\n\tif (event.isError) return false;\n\tconst result = event.result as MaybeTerminatingToolResult | undefined;\n\treturn result?.terminate === true;\n}\n\nfunction textFromToolResult(message: ToolResultMessage): string | undefined {\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\treturn hasTextPart ? text : undefined;\n}\n\nfunction terminatingStructuredOutputText(\n\tmessage: ToolResultMessage,\n\tterminatingStructuredOutputCallIds: ReadonlySet<string>,\n): string | undefined {\n\tif (!terminatingStructuredOutputCallIds.has(message.toolCallId)) return undefined;\n\treturn textFromToolResult(message);\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet suppressFinalOutput = false;\n\tlet activePromptHadCommandError = false;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tconst terminatingStructuredOutputCallIds = new Set<string>();\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\tconst promptWithScopedCommandSuppression = async (\n\t\ttext: string,\n\t\tpromptOptions?: { images?: ImageContent[] },\n\t): Promise<void> => {\n\t\tactivePromptHadCommandError = false;\n\t\ttry {\n\t\t\tif (promptOptions === undefined) {\n\t\t\t\tawait session.prompt(text);\n\t\t\t} else {\n\t\t\t\tawait session.prompt(text, promptOptions);\n\t\t\t}\n\t\t} finally {\n\t\t\t// Final-output suppression is scoped to the most recent prompt so a\n\t\t\t// later successful prompt in the same invocation can still print its\n\t\t\t// result. The non-zero exit code remains sticky across prompts.\n\t\t\tsuppressFinalOutput = activePromptHadCommandError;\n\t\t}\n\t};\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconst isCommandError = isCommandExtensionError(err);\n\t\t\t\tif (isCommandError) exitCode = 1;\n\t\t\t\tactivePromptHadCommandError = activePromptHadCommandError || isCommandError;\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (isTerminatingStructuredOutputEvent(event, (name) => session.getToolDefinition(name))) {\n\t\t\t\tterminatingStructuredOutputCallIds.add(event.toolCallId);\n\t\t\t}\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(event)}\\n`);\n\t\t\t}\n\t\t});\n\t};\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait promptWithScopedCommandSuppression(initialMessage, { images: initialImages });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait promptWithScopedCommandSuppression(message);\n\t\t}\n\n\t\tif (mode === \"text\" && !suppressFinalOutput) {\n\t\t\tconst state = session.state;\n\t\t\tconst lastMessage = state.messages[state.messages.length - 1];\n\n\t\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = lastMessage as AssistantMessage;\n\t\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t\texitCode = 1;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (lastMessage?.role === \"custom\") {\n\t\t\t\tconst text = displayableCustomText(lastMessage as CustomMessage);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t} else if (lastMessage?.role === \"toolResult\") {\n\t\t\t\tconst text = terminatingStructuredOutputText(lastMessage as ToolResultMessage, terminatingStructuredOutputCallIds);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}
1
+ {"version":3,"file":"print-mode.js","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `pi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { AssistantMessage, ImageContent, ToolResultMessage } from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionEvent } from \"../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport type { ExtensionError } from \"../core/extensions/index.ts\";\nimport type { ToolDefinition } from \"../core/extensions/types.ts\";\nimport type { CustomMessage } from \"../core/messages.ts\";\nimport { flushRawStdout, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\nfunction isCommandExtensionError(error: ExtensionError): boolean {\n\treturn error.event === \"command\" || error.extensionPath.startsWith(\"command:\");\n}\n\nfunction displayableCustomText(message: CustomMessage): string | undefined {\n\tif (message.display !== true) return undefined;\n\tif (typeof message.content === \"string\") return message.content;\n\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\n\treturn hasTextPart ? text : undefined;\n}\n\ntype MaybeTerminatingToolResult = {\n\tterminate?: boolean;\n};\n\ntype ToolExecutionEndSessionEvent = Extract<AgentSessionEvent, { type: \"tool_execution_end\" }>;\n\ntype GetToolDefinition = (name: string) => ToolDefinition | undefined;\n\nfunction isStructuredOutputTool(getToolDefinition: GetToolDefinition, name: string): boolean {\n\treturn getToolDefinition(name)?.structuredOutput === true;\n}\n\nfunction isTerminatingStructuredOutputEvent(\n\tevent: AgentSessionEvent,\n\tgetToolDefinition: GetToolDefinition,\n): event is ToolExecutionEndSessionEvent {\n\tif (event.type !== \"tool_execution_end\") return false;\n\tif (!isStructuredOutputTool(getToolDefinition, event.toolName)) return false;\n\tif (event.isError) return false;\n\tconst result = event.result as MaybeTerminatingToolResult | undefined;\n\treturn result?.terminate === true;\n}\n\nfunction textFromToolResult(message: ToolResultMessage): string | undefined {\n\tlet text = \"\";\n\tlet hasTextPart = false;\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\thasTextPart = true;\n\t\t\ttext += part.text;\n\t\t}\n\t}\n\treturn hasTextPart ? text : undefined;\n}\n\nfunction terminatingStructuredOutputText(\n\tmessage: ToolResultMessage,\n\tterminatingStructuredOutputCallIds: ReadonlySet<string>,\n): string | undefined {\n\tif (!terminatingStructuredOutputCallIds.has(message.toolCallId)) return undefined;\n\treturn textFromToolResult(message);\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet suppressFinalOutput = false;\n\tlet activePromptHadCommandError = false;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tconst terminatingStructuredOutputCallIds = new Set<string>();\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\tconst promptWithScopedCommandSuppression = async (\n\t\ttext: string,\n\t\tpromptOptions?: { images?: ImageContent[] },\n\t): Promise<void> => {\n\t\tactivePromptHadCommandError = false;\n\t\ttry {\n\t\t\tif (promptOptions === undefined) {\n\t\t\t\tawait session.prompt(text);\n\t\t\t} else {\n\t\t\t\tawait session.prompt(text, promptOptions);\n\t\t\t}\n\t\t} finally {\n\t\t\t// Final-output suppression is scoped to the most recent prompt so a\n\t\t\t// later successful prompt in the same invocation can still print its\n\t\t\t// result. The non-zero exit code remains sticky across prompts.\n\t\t\tsuppressFinalOutput = activePromptHadCommandError;\n\t\t}\n\t};\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconst isCommandError = isCommandExtensionError(err);\n\t\t\t\tif (isCommandError) exitCode = 1;\n\t\t\t\tactivePromptHadCommandError = activePromptHadCommandError || isCommandError;\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (isTerminatingStructuredOutputEvent(event, (name) => session.getToolDefinition(name))) {\n\t\t\t\tterminatingStructuredOutputCallIds.add(event.toolCallId);\n\t\t\t}\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(event)}\\n`);\n\t\t\t}\n\t\t});\n\t};\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait promptWithScopedCommandSuppression(initialMessage, { images: initialImages });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait promptWithScopedCommandSuppression(message);\n\t\t}\n\n\t\tconst state = session.state;\n\t\tconst lastMessage = state.messages[state.messages.length - 1];\n\n\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\tconst assistantMsg = lastMessage as AssistantMessage;\n\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\tif (mode === \"text\" && !suppressFinalOutput) {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t}\n\t\t\t\texitCode = 1;\n\t\t\t} else if (mode === \"text\" && !suppressFinalOutput) {\n\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (mode === \"text\" && !suppressFinalOutput) {\n\t\t\tif (lastMessage?.role === \"custom\") {\n\t\t\t\tconst text = displayableCustomText(lastMessage as CustomMessage);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t} else if (lastMessage?.role === \"toolResult\") {\n\t\t\t\tconst text = terminatingStructuredOutputText(lastMessage as ToolResultMessage, terminatingStructuredOutputCallIds);\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\twriteRawStdout(`${text}\\n`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}
package/docs/settings.md CHANGED
@@ -132,12 +132,12 @@ Set `ATOMIC_SKIP_VERSION_CHECK=1` to disable the Atomic version update check. Us
132
132
  | `retry.maxRetries` | number | `3` | Maximum agent-level retry attempts |
133
133
  | `retry.baseDelayMs` | number | `2000` | Base delay for agent-level exponential backoff (2s, 4s, 8s) |
134
134
  | `retry.provider.timeoutMs` | number | SDK default | Provider/SDK request timeout in milliseconds |
135
- | `retry.provider.maxRetries` | number | `5` | Provider/SDK retry attempts (also retries dropped connections / `Connection error`) |
135
+ | `retry.provider.maxRetries` | number | `0` | Provider/SDK retry attempts. Leave unset/`0` to let Atomic's agent-level retry handle transient failures |
136
136
  | `retry.provider.maxRetryDelayMs` | number | `60000` | Max server-requested delay before failing (60s) |
137
137
 
138
138
  When a provider requests a retry delay longer than `retry.provider.maxRetryDelayMs` (e.g., Google's "quota will reset after 5h"), the request fails immediately with an informative error instead of waiting silently. Set to `0` to disable the cap.
139
139
 
140
- `retry.provider.maxRetries` defaults to `5` so transient socket drops (sandbox proxies, prod edge idle-closes) retry instead of failing as `Connection error`. The `maxRetryDelayMs` cap keeps this safe: connection errors back off briefly, while quota/rate-limit replies asking for a long delay still fail fast instead of blocking on usage limits. Set to `0` to disable provider-level retries.
140
+ `retry.provider.maxRetries` follows upstream Pi's behavior and defaults to `0` SDK/provider retries. Atomic still performs agent-level retries via `retry.maxRetries`; set `retry.provider.maxRetries` explicitly only when you want the underlying provider SDK to retry before Atomic observes the failure.
141
141
 
142
142
  ```json
143
143
  {
@@ -147,7 +147,7 @@ When a provider requests a retry delay longer than `retry.provider.maxRetryDelay
147
147
  "baseDelayMs": 2000,
148
148
  "provider": {
149
149
  "timeoutMs": 3600000,
150
- "maxRetries": 5,
150
+ "maxRetries": 0,
151
151
  "maxRetryDelayMs": 60000
152
152
  }
153
153
  }
@@ -160,7 +160,7 @@ When a provider requests a retry delay longer than `retry.provider.maxRetryDelay
160
160
  |---------|------|---------|-------------|
161
161
  | `httpIdleTimeoutMs` | number | `600000` | HTTP header/body idle timeout in milliseconds. Must be a non-negative finite number; decimals are rounded down. Set to `0` to disable the idle timeout. |
162
162
 
163
- Atomic applies this timeout to the global HTTP dispatcher used by `fetch` and provider SDK HTTP clients. The default is 600,000 ms (10 minutes), which keeps slow long-context requests working while reclaiming stale idle connections. The dispatcher also applies a fixed 10-second connect-phase timeout so an unreachable or firewall-blocked host fails fast instead of hanging until the OS TCP timeout.
163
+ Atomic applies this timeout to the global HTTP dispatcher used by `fetch` and provider SDK HTTP clients. The default is 600,000 ms (10 minutes), which keeps slow long-context requests working while reclaiming stale idle connections. Atomic does not impose a separate fixed connect-phase timeout; connection failures surface through the provider and agent retry/error paths.
164
164
 
165
165
  The `/settings` picker offers these presets:
166
166
 
package/docs/workflows.md CHANGED
@@ -696,7 +696,7 @@ Example config:
696
696
  "resumeInFlight": "ask",
697
697
  "workflowNotifications": {
698
698
  "enabled": true,
699
- "notifyOn": ["completed", "failed", "awaiting_input"]
699
+ "notifyOn": ["completed", "failed", "blocked", "awaiting_input"]
700
700
  }
701
701
  }
702
702
  ```
@@ -711,7 +711,7 @@ Runtime config defaults:
711
711
  | `statusFile` | `false` | Write a derived status file; defaults under `.atomic/workflows/status.json` when enabled |
712
712
  | `resumeInFlight` | `"ask"` | Behavior when discovering resumable in-flight work |
713
713
  | `workflowNotifications.enabled` | `true` | Emit terminal workflow lifecycle notices into the active main chat |
714
- | `workflowNotifications.notifyOn` | `["completed", "failed", "awaiting_input"]` | Lifecycle states to track; terminal `completed`/`failed` states create main-chat notices, while `awaiting_input` is tracked for dedupe/restore without waking the main agent |
714
+ | `workflowNotifications.notifyOn` | `["completed", "failed", "blocked", "awaiting_input"]` | Lifecycle states to track; terminal `completed`/`failed`/`blocked` states create main-chat notices, while `awaiting_input` is tracked for dedupe/restore without waking the main agent |
715
715
 
716
716
  Invalid JSON or invalid shapes produce `CONFIG_INVALID` diagnostics. Missing config files are ignored.
717
717
 
@@ -1007,7 +1007,7 @@ The default file backend needs no environment variable or database. It writes on
1007
1007
 
1008
1008
  ## Lifecycle Notices and Human Input
1009
1009
 
1010
- Atomic emits deduplicated main-chat notices when top-level workflow runs complete or fail. Nested child workflow completion/failure is reflected inside the expanded parent graph instead of producing separate top-level completion cards. These terminal notices are queued into the active main chat as steering/context messages (`triggerTurn: true`, `deliverAs: "steer"`) so the model can react without the user manually polling status. Awaiting-input workflow states are tracked for dedupe/restore, but they do not enqueue main-chat connect cards or wake the model; prompt state remains visible through workflow status/connect surfaces. Configure lifecycle behavior with `workflowNotifications.enabled` (default `true`) and `workflowNotifications.notifyOn` (default `["completed", "failed", "awaiting_input"]`).
1010
+ Atomic emits deduplicated main-chat notices when top-level workflow runs complete, fail, or end blocked. Nested child workflow completion/failure is reflected inside the expanded parent graph instead of producing separate top-level completion cards. These terminal notices are queued into the active main chat as steering/context messages (`triggerTurn: true`, `deliverAs: "steer"`) so the model can react without the user manually polling status. Awaiting-input workflow states are tracked for dedupe/restore, but they do not enqueue main-chat connect cards or wake the model; prompt state remains visible through workflow status/connect surfaces. Configure lifecycle behavior with `workflowNotifications.enabled` (default `true`) and `workflowNotifications.notifyOn` (default `["completed", "failed", "blocked", "awaiting_input"]`).
1011
1011
 
1012
1012
  Human input is runtime-only: call `ctx.ui.input`, `ctx.ui.confirm`, `ctx.ui.select`, `ctx.ui.editor`, or `ctx.ui.custom<T>` at the point where the workflow actually needs a decision. No builder-level declaration is required or supported.
1013
1013
 
@@ -1290,6 +1290,8 @@ Workflow outputs are runtime contracts for completed workflow runs and for paren
1290
1290
 
1291
1291
  **Return convention:** outputs are return-object keys. Atomic never infers child workflow outputs from stage names, stage order, or the final assistant message. If a parent should read `child.outputs.foo`, the child workflow's `run` must both declare `outputs: { foo: schema }` and return `{ foo: value }`. `result` is not special and is never added for you: to expose `result`, declare it in `outputs` and return `{ result }` exactly like any other output. Returning a key that is not declared in `outputs` fails the run with `atomic-workflows: workflow "<name>" returned undeclared output "<key>"; declare it in outputs or remove it from the run return`.
1292
1292
 
1293
+ **Reserved `status` output convention:** if a workflow declares and returns a top-level `status` output with the string value `"failed"` or `"blocked"`, Atomic treats that as the workflow's terminal run status instead of recording a successful completion. When present, a non-empty top-level `summary` string becomes the run error/reason shown in lifecycle notices and status surfaces. Use this convention only when the workflow is intentionally reporting its own terminal state (for example, a deterministic release gate that returns `{ status: "blocked", summary: "required checks are pending" }`). Do not use a top-level `status` field for unrelated external state such as a deployment/check you merely inspected; choose a domain-specific name like `deployment_status` or `gate_status` instead.
1294
+
1293
1295
  The `outputs` object is a schema contract, not an automatic stage selector. To expose values from any stage, capture the stage/task/child result in normal TypeScript and return it from `run` under the desired key:
1294
1296
 
1295
1297
  ```ts