pi-background-tasks 2.5.0 → 2.6.0

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 (203) hide show
  1. package/BACKGROUND-TASKS-INSTRUCTIONS.md +1 -1
  2. package/README.md +70 -25
  3. package/TESTING.md +42 -2
  4. package/TEST_PLAN.md +7 -4
  5. package/dist/extensions/anthropic-attribution-child.js +4 -0
  6. package/dist/extensions/anthropic-attribution-child.js.map +1 -0
  7. package/dist/extensions/anthropic-attribution.js +107 -0
  8. package/dist/extensions/anthropic-attribution.js.map +1 -0
  9. package/dist/extensions/background-tasks.js +2 -0
  10. package/dist/extensions/background-tasks.js.map +1 -0
  11. package/dist/extensions/delegate-child.js +2 -0
  12. package/dist/extensions/delegate-child.js.map +1 -0
  13. package/dist/extensions/fusion-child.js +2 -0
  14. package/dist/extensions/fusion-child.js.map +1 -0
  15. package/dist/package.json +5 -0
  16. package/dist/src/core/anthropic-attribution-path.js +24 -0
  17. package/dist/src/core/anthropic-attribution-path.js.map +1 -0
  18. package/dist/src/core/anthropic-attribution.js +2247 -0
  19. package/dist/src/core/anthropic-attribution.js.map +1 -0
  20. package/dist/src/core/attested-pi-contract.js +5 -0
  21. package/dist/src/core/attested-pi-contract.js.map +1 -0
  22. package/dist/src/core/attested-pi-run.js +749 -0
  23. package/dist/src/core/attested-pi-run.js.map +1 -0
  24. package/dist/src/core/canonical-json.js +19 -0
  25. package/dist/src/core/canonical-json.js.map +1 -0
  26. package/dist/src/core/common.js +787 -0
  27. package/dist/src/core/common.js.map +1 -0
  28. package/dist/src/core/config.js +78 -0
  29. package/dist/src/core/config.js.map +1 -0
  30. package/dist/src/core/context/parent-snapshot.js +75 -0
  31. package/dist/src/core/context/parent-snapshot.js.map +1 -0
  32. package/dist/src/core/context/token-budget.js +631 -0
  33. package/dist/src/core/context/token-budget.js.map +1 -0
  34. package/dist/src/core/context/visible-conversation-v2.js +390 -0
  35. package/dist/src/core/context/visible-conversation-v2.js.map +1 -0
  36. package/dist/src/core/delegate/artifacts.js +357 -0
  37. package/dist/src/core/delegate/artifacts.js.map +1 -0
  38. package/dist/src/core/delegate/budget.js +266 -0
  39. package/dist/src/core/delegate/budget.js.map +1 -0
  40. package/dist/src/core/delegate/facade-contract.js +7 -0
  41. package/dist/src/core/delegate/facade-contract.js.map +1 -0
  42. package/dist/src/core/delegate/hook-contract-evidence.json +18 -0
  43. package/dist/src/core/delegate/hook-contract.js +124 -0
  44. package/dist/src/core/delegate/hook-contract.js.map +1 -0
  45. package/dist/src/core/delegate/launch.js +366 -0
  46. package/dist/src/core/delegate/launch.js.map +1 -0
  47. package/dist/src/core/delegate/result-package.js +293 -0
  48. package/dist/src/core/delegate/result-package.js.map +1 -0
  49. package/dist/src/core/delegate/runner.js +398 -0
  50. package/dist/src/core/delegate/runner.js.map +1 -0
  51. package/dist/src/core/delegate/seed.js +334 -0
  52. package/dist/src/core/delegate/seed.js.map +1 -0
  53. package/dist/src/core/delegate/types.js +103 -0
  54. package/dist/src/core/delegate/types.js.map +1 -0
  55. package/dist/src/core/durable-fs.js +372 -0
  56. package/dist/src/core/durable-fs.js.map +1 -0
  57. package/dist/src/core/extension-api.js +382 -0
  58. package/dist/src/core/extension-api.js.map +1 -0
  59. package/dist/src/core/fusion/artifacts.js +654 -0
  60. package/dist/src/core/fusion/artifacts.js.map +1 -0
  61. package/dist/src/core/fusion/budget.js +949 -0
  62. package/dist/src/core/fusion/budget.js.map +1 -0
  63. package/dist/src/core/fusion/child-protocol.js +176 -0
  64. package/dist/src/core/fusion/child-protocol.js.map +1 -0
  65. package/dist/src/core/fusion/claude-cache.js +156 -0
  66. package/dist/src/core/fusion/claude-cache.js.map +1 -0
  67. package/dist/src/core/fusion/clean-context.js +64 -0
  68. package/dist/src/core/fusion/clean-context.js.map +1 -0
  69. package/dist/src/core/fusion/config.js +349 -0
  70. package/dist/src/core/fusion/config.js.map +1 -0
  71. package/dist/src/core/fusion/context.js +184 -0
  72. package/dist/src/core/fusion/context.js.map +1 -0
  73. package/dist/src/core/fusion/evaluation.js +696 -0
  74. package/dist/src/core/fusion/evaluation.js.map +1 -0
  75. package/dist/src/core/fusion/facade-contract.js +3 -0
  76. package/dist/src/core/fusion/facade-contract.js.map +1 -0
  77. package/dist/src/core/fusion/orchestrator.js +867 -0
  78. package/dist/src/core/fusion/orchestrator.js.map +1 -0
  79. package/dist/src/core/fusion/output-contract.js +27 -0
  80. package/dist/src/core/fusion/output-contract.js.map +1 -0
  81. package/dist/src/core/fusion/pi-child.js +1741 -0
  82. package/dist/src/core/fusion/pi-child.js.map +1 -0
  83. package/dist/src/core/fusion/prompts.js +260 -0
  84. package/dist/src/core/fusion/prompts.js.map +1 -0
  85. package/dist/src/core/fusion/result-package.js +857 -0
  86. package/dist/src/core/fusion/result-package.js.map +1 -0
  87. package/dist/src/core/fusion/source-policy.js +259 -0
  88. package/dist/src/core/fusion/source-policy.js.map +1 -0
  89. package/dist/src/core/fusion/types.js +207 -0
  90. package/dist/src/core/fusion/types.js.map +1 -0
  91. package/dist/src/core/fusion/web-fetch.js +777 -0
  92. package/dist/src/core/fusion/web-fetch.js.map +1 -0
  93. package/dist/src/core/fusion/workflows.js +126 -0
  94. package/dist/src/core/fusion/workflows.js.map +1 -0
  95. package/dist/src/core/lazy-module.js +181 -0
  96. package/dist/src/core/lazy-module.js.map +1 -0
  97. package/dist/src/core/pi-launch.js +431 -0
  98. package/dist/src/core/pi-launch.js.map +1 -0
  99. package/dist/src/core/registry.js +3331 -0
  100. package/dist/src/core/registry.js.map +1 -0
  101. package/dist/src/core/reload-shell-owner.js +1396 -0
  102. package/dist/src/core/reload-shell-owner.js.map +1 -0
  103. package/dist/src/core/shell-policy.js +80 -0
  104. package/dist/src/core/shell-policy.js.map +1 -0
  105. package/dist/src/core/task-durable.js +51 -0
  106. package/dist/src/core/task-durable.js.map +1 -0
  107. package/dist/src/core/update-check.js +92 -0
  108. package/dist/src/core/update-check.js.map +1 -0
  109. package/dist/src/core/windows-taskkill.js +185 -0
  110. package/dist/src/core/windows-taskkill.js.map +1 -0
  111. package/dist/src/delegate-child-extension.js +776 -0
  112. package/dist/src/delegate-child-extension.js.map +1 -0
  113. package/dist/src/delegate-extension.js +746 -0
  114. package/dist/src/delegate-extension.js.map +1 -0
  115. package/dist/src/extension.js +953 -0
  116. package/dist/src/extension.js.map +1 -0
  117. package/dist/src/fusion-child-extension.js +760 -0
  118. package/dist/src/fusion-child-extension.js.map +1 -0
  119. package/dist/src/fusion-extension.js +1030 -0
  120. package/dist/src/fusion-extension.js.map +1 -0
  121. package/dist/src/ui/background-tasks-manager.js +689 -0
  122. package/dist/src/ui/background-tasks-manager.js.map +1 -0
  123. package/dist/src/ui/fusion-model-selector.js +277 -0
  124. package/dist/src/ui/fusion-model-selector.js.map +1 -0
  125. package/docs/INDEX.md +35 -33
  126. package/docs/api/eventbus-v1.md +21 -5
  127. package/docs/choose-a-workflow.md +2 -0
  128. package/docs/commands/bg-clear.md +3 -3
  129. package/docs/commands/bg-update.md +3 -3
  130. package/docs/commands/bg.md +18 -6
  131. package/docs/commands/claude-cache.md +4 -4
  132. package/docs/commands/fusion-models.md +49 -4
  133. package/docs/commands/fusion.md +3 -3
  134. package/docs/commands/jobs.md +3 -3
  135. package/docs/commands/kill.md +3 -3
  136. package/docs/commands/logs.md +3 -3
  137. package/docs/commands/task-manager.md +5 -5
  138. package/docs/concepts/completion-delivery.md +6 -2
  139. package/docs/getting-started.md +7 -1
  140. package/docs/manifest.json +228 -42
  141. package/docs/operations/configuration.md +58 -5
  142. package/docs/operations/releasing.md +4 -2
  143. package/docs/operations/testing.md +22 -0
  144. package/docs/operations/troubleshooting.md +6 -2
  145. package/docs/read-before-edit.md +44 -31
  146. package/docs/reference/runtime-contracts.md +87 -51
  147. package/docs/reference/shortcuts-and-dock.md +28 -14
  148. package/docs/subsystems/anthropic-attribution.md +23 -11
  149. package/docs/subsystems/attested-pi-runs.md +12 -7
  150. package/docs/subsystems/background-task-runtime.md +53 -11
  151. package/docs/subsystems/child-launch-durability-and-safety.md +28 -9
  152. package/docs/subsystems/delegation.md +16 -3
  153. package/docs/subsystems/docs-freshness-gate.md +14 -7
  154. package/docs/subsystems/fusion.md +36 -11
  155. package/docs/subsystems/host-ui-and-telemetry.md +22 -9
  156. package/docs/tools/bg_delegate.md +3 -1
  157. package/docs/tools/bg_kill.md +3 -1
  158. package/docs/tools/bg_logs.md +3 -1
  159. package/docs/tools/bg_result.md +5 -3
  160. package/docs/tools/bg_run.md +31 -5
  161. package/docs/tools/bg_run_pi_attested.md +3 -1
  162. package/docs/tools/bg_status.md +3 -1
  163. package/docs/tools/fusion_investigate.md +3 -1
  164. package/docs/tools/fusion_reason.md +3 -1
  165. package/docs/tools/fusion_research.md +3 -1
  166. package/docs/tools/fusion_validate.md +3 -1
  167. package/extensions/anthropic-attribution-child.ts +3 -0
  168. package/extensions/anthropic-attribution.ts +166 -1
  169. package/package.json +12 -10
  170. package/src/core/anthropic-attribution-path.ts +5 -4
  171. package/src/core/anthropic-attribution.ts +293 -113
  172. package/src/core/attested-pi-contract.ts +4 -0
  173. package/src/core/attested-pi-run.ts +468 -81
  174. package/src/core/canonical-json.ts +21 -0
  175. package/src/core/common.ts +450 -40
  176. package/src/core/config.ts +121 -0
  177. package/src/core/context/visible-conversation-v2.ts +3 -6
  178. package/src/core/delegate/artifacts.ts +13 -9
  179. package/src/core/delegate/budget.ts +13 -6
  180. package/src/core/delegate/facade-contract.ts +6 -0
  181. package/src/core/delegate/result-package.ts +32 -14
  182. package/src/core/delegate/runner.ts +129 -58
  183. package/src/core/delegate/seed.ts +5 -7
  184. package/src/core/durable-fs.ts +178 -30
  185. package/src/core/extension-api.ts +36 -8
  186. package/src/core/fusion/artifacts.ts +17 -16
  187. package/src/core/fusion/clean-context.ts +8 -5
  188. package/src/core/fusion/config.ts +2 -1
  189. package/src/core/fusion/context.ts +2 -6
  190. package/src/core/fusion/facade-contract.ts +2 -0
  191. package/src/core/fusion/orchestrator.ts +3 -3
  192. package/src/core/fusion/prompts.ts +1 -1
  193. package/src/core/fusion/result-package.ts +259 -72
  194. package/src/core/fusion/source-policy.ts +43 -17
  195. package/src/core/lazy-module.ts +215 -0
  196. package/src/core/pi-launch.ts +390 -65
  197. package/src/core/registry.ts +2010 -381
  198. package/src/core/reload-shell-owner.ts +1662 -0
  199. package/src/core/shell-policy.ts +134 -0
  200. package/src/core/task-durable.ts +67 -0
  201. package/src/delegate-extension.ts +404 -144
  202. package/src/extension.ts +387 -114
  203. package/src/fusion-extension.ts +202 -96
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/core/common.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, statSync, type WriteStream } from 'node:fs';\nimport { open } from 'node:fs/promises';\nimport { basename, delimiter, extname, isAbsolute, join, resolve, win32 } from 'node:path';\nimport { DEFAULT_MAX_BYTES } from '@earendil-works/pi-coding-agent';\nimport type { BackgroundTaskChildProcess } from './registry.js';\nimport type { DelegateBudgetRouteSource, DelegateExtensionMode } from './delegate/types.js';\nimport type { FusionResultDetails, FusionUsage, FusionWorkflowId } from './fusion/types.js';\n\nexport const TASK_STATUS_VALUES = ['running', 'completed', 'failed', 'killed'] as const;\nexport const TERMINAL_TASK_STATUS_VALUES = ['completed', 'failed', 'killed'] as const;\n\nexport type TaskStatus = (typeof TASK_STATUS_VALUES)[number];\nexport type TerminalTaskStatus = (typeof TERMINAL_TASK_STATUS_VALUES)[number];\nexport type KillKind = 'user' | 'timeout' | 'output_cap' | 'shutdown';\nexport type ReloadShellStopKind = KillKind | 'handoff_expired';\n\nexport type TerminalPublicationState = 'pending' | 'delivered' | 'abandoned';\nexport type TerminalPublicationAbandonReason =\n | 'registry_shutdown'\n | 'publisher_closed'\n | 'gate_rejected'\n | 'retry_exhausted'\n | 'retention_limit'\n | 'reload_handoff_expired';\n\nexport type ReloadSurvivalErrorCode =\n | 'pi_bg_survive_reload_invalid'\n | 'pi_bg_survive_reload_requires_non_agent'\n | 'pi_bg_survive_reload_unsupported_task_kind'\n | 'pi_bg_reload_owner_unavailable'\n | 'pi_bg_reload_owner_protocol_incompatible'\n | 'pi_bg_reload_owner_activation_conflict'\n | 'pi_bg_reload_owner_stale_claim'\n | 'pi_bg_reload_handoff_expired';\n\nexport class ReloadSurvivalError extends Error {\n constructor(\n readonly code: ReloadSurvivalErrorCode,\n message: string,\n ) {\n super(`${code}: ${message}`);\n this.name = 'ReloadSurvivalError';\n }\n}\n\nexport function rejectSurvivalForTaskKind(value: object, kind: string): void {\n if (!Object.prototype.hasOwnProperty.call(value, 'surviveReload')) return;\n throw new ReloadSurvivalError(\n 'pi_bg_survive_reload_unsupported_task_kind',\n `${kind} does not support surviveReload; only ordinary isAgent:false shell tasks may survive reload`,\n );\n}\n\nexport type JsonObject = Readonly<Record<PropertyKey, unknown>>;\n\nexport interface TaskContextUsage {\n tokens: number | null;\n contextWindow: number;\n percent: number | null;\n}\n\nexport interface TaskTokenUsage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n totalTokens: number;\n costTotal?: number;\n}\n\nexport interface TaskToolUsage {\n total: number;\n failed: number;\n byName: Record<string, number>;\n}\n\nexport interface ReloadSurvivalSnapshotV1 {\n schemaVersion: 'pi-background-tasks.reload-shell.v1';\n authority: 'same-process-live-owner';\n hostPid: number;\n sessionId: string;\n cwdRealpath: string;\n launchNonce: string;\n completionId: string;\n spawnedAt: number;\n childPid: number;\n timeoutDeadlineAt?: number | undefined;\n outputCapBytes: number;\n posixProcessGroupId?: number | undefined;\n windowsTreeRootPid?: number | undefined;\n leaseGeneration: number;\n handoffCount: number;\n}\n\nexport interface ReloadShellIdentityV1 {\n readonly hostPid: number;\n readonly sessionId: string;\n readonly cwdRealpath: string;\n}\n\nexport interface ReloadShellActivationLeaseV1 {\n readonly protocol: 'pi-background-tasks.reload-shell-owner.v1';\n readonly hubNonce: string;\n readonly identityKey: string;\n readonly generation: number;\n readonly activationNonce: string;\n}\n\nexport interface ReloadShellActivationClaimV1 {\n readonly protocol: 'pi-background-tasks.reload-shell-owner.v1';\n readonly hubNonce: string;\n readonly claimNonce: string;\n readonly identity: ReloadShellIdentityV1;\n readonly identityKey: string;\n readonly generation: number;\n readonly activationNonce: string;\n readonly expiresAt?: number | undefined;\n readonly executions: readonly ReloadableShellExecutionV1[];\n}\n\nexport interface ReloadShellProcessV1 {\n readonly pid?: number | undefined;\n stdout?: {\n on(event: 'data', listener: (data: Buffer | string) => void): unknown;\n off?(event: 'data', listener: (data: Buffer | string) => void): unknown;\n } | null | undefined;\n stderr?: {\n on(event: 'data', listener: (data: Buffer | string) => void): unknown;\n off?(event: 'data', listener: (data: Buffer | string) => void): unknown;\n } | null | undefined;\n kill(signal?: NodeJS.Signals): boolean;\n on(event: 'error', listener: (error: Error) => void): unknown;\n on(\n event: 'close',\n listener: (code: number | null, signal: NodeJS.Signals | null) => void,\n ): unknown;\n off?(event: 'error', listener: (error: Error) => void): unknown;\n off?(\n event: 'close',\n listener: (code: number | null, signal: NodeJS.Signals | null) => void,\n ): unknown;\n}\n\nexport interface ReloadShellOwnerEventSinkV1 {\n readonly onChanged: (execution: ReloadableShellExecutionV1) => void;\n readonly onTerminal: (execution: ReloadableShellExecutionV1) => void;\n}\n\nexport type ReloadShellNotificationState = 'disabled' | 'pending' | 'sending' | 'delivered';\n\nexport interface ReloadableShellExecutionV1 {\n readonly protocol: 'pi-background-tasks.reload-shell-owner.v1';\n readonly launchNonce: string;\n readonly completionId: string;\n readonly task: BgTask;\n child: ReloadShellProcessV1 | undefined;\n outputStream: WriteStream | undefined;\n readonly spawnedAt: number;\n readonly timeoutDeadlineAt?: number | undefined;\n readonly outputCapBytes: number;\n readonly terminal: Promise<BgTask>;\n readonly requestStop: (kind: ReloadShellStopKind, reason?: string) => Promise<BgTask>;\n phase: 'starting' | 'running' | 'stop_requested' | 'finalizing' | 'terminal' | 'released';\n closeObservation?: {\n code: number | null;\n signal: NodeJS.Signals | null;\n observedAt: number;\n } | undefined;\n admissionCommitted: boolean;\n notificationState: ReloadShellNotificationState;\n readonly commitInitialMetadata: (signal?: AbortSignal) => Promise<void>;\n readonly failAdmission: (error: Error) => void;\n readonly setOwnerEventSink: (sink: ReloadShellOwnerEventSinkV1 | undefined) => void;\n readonly markAdmissionCommitted: (generation: number, handoffCount: number) => void;\n readonly updateLeaseAudit: (generation: number, handoffCount: number) => void;\n readonly abandonReloadHandoff: () => void;\n readonly beginNotification: (lease: ReloadShellActivationLeaseV1) => string | undefined;\n readonly finishNotification: (token: string, delivered: boolean) => void;\n readonly releaseResources: () => void;\n}\n\nexport interface ReloadShellHostAdapterV1 {\n readonly activationNonce: string;\n readonly onBound: (lease: ReloadShellActivationLeaseV1) => void;\n readonly onChanged: (execution: ReloadableShellExecutionV1) => void;\n readonly onTerminal: (execution: ReloadableShellExecutionV1) => void;\n}\n\nexport interface ReloadShellOwnerHubV1 {\n readonly protocol: 'pi-background-tasks.reload-shell-owner.v1';\n readonly hubNonce: string;\n beginActivation(\n identity: ReloadShellIdentityV1,\n startReason: string,\n activationNonce: string,\n ): ReloadShellActivationClaimV1;\n commitActivation(\n claim: ReloadShellActivationClaimV1,\n adapter: ReloadShellHostAdapterV1,\n ): ReloadShellActivationLeaseV1;\n abortActivation(claim: ReloadShellActivationClaimV1, error: unknown): void;\n beginReloadHandoff(\n lease: ReloadShellActivationLeaseV1,\n ): readonly ReloadableShellExecutionV1[];\n releaseActivation(lease: ReloadShellActivationLeaseV1): void;\n registerExecution(\n lease: ReloadShellActivationLeaseV1,\n execution: ReloadableShellExecutionV1,\n ): void;\n markAdmissionCommitted(\n lease: ReloadShellActivationLeaseV1,\n execution: ReloadableShellExecutionV1,\n ): void;\n releaseExecution(\n leaseOrClaim: ReloadShellActivationLeaseV1 | ReloadShellActivationClaimV1,\n execution: ReloadableShellExecutionV1,\n ): void;\n isCurrentLease(lease: ReloadShellActivationLeaseV1): boolean;\n}\n\nexport interface BgTaskSnapshot {\n id: string;\n name?: string | undefined;\n command: string;\n description?: string | undefined;\n status: TaskStatus;\n outputPath: string;\n cwd: string;\n startTime: number;\n endTime?: number | undefined;\n exitCode?: number | null | undefined;\n signal?: string | null | undefined;\n pid?: number | undefined;\n bytesWritten: number;\n isAgent: boolean;\n surviveReload: boolean;\n reloadSurvival?: ReloadSurvivalSnapshotV1 | undefined;\n error?: string | undefined;\n notified: boolean;\n notifyOnCompletion: boolean;\n triggerOnCompletion: boolean;\n timeoutSeconds?: number | undefined;\n contextUsage?: TaskContextUsage | undefined;\n tokenUsage?: TaskTokenUsage | undefined;\n toolUsage?: TaskToolUsage | undefined;\n model?: string | undefined;\n telemetryUnavailableReason?: string | undefined;\n /** Immutable non-secret shell selection for ordinary shell tasks. */\n shellPolicy?: ShellPolicySnapshot | undefined;\n attestationPath?: string | undefined;\n delegate?: DelegateTaskFacts | undefined;\n fusion?: FusionTaskFacts | undefined;\n}\n\nexport interface AttestedPiTaskFiles {\n eventsPath: string;\n stderrPath: string;\n wrapperPath: string;\n attestationPath: string;\n}\n\nexport interface AttestedPiTaskSnapshot extends BgTaskSnapshot {\n attestedPi?: AttestedPiTaskFiles | undefined;\n}\n\n/** Delegate-specific task facts surfaced through snapshots and `bg_result`. */\nexport interface DelegateTaskFacts {\n taskId: string;\n launchNonce: string;\n artifactDir: string;\n artifactDirAbs: string;\n seedSha256: string;\n childSessionId: string;\n route: { provider: string; model: string; qualifiedId: string };\n budget: DelegateBudgetRouteSource;\n extensionMode: DelegateExtensionMode;\n autoDeliver: 'never' | 'when_small' | 'always';\n /** Set once the run reaches a terminal state and its result has been evaluated. */\n outcome?: DelegateTaskOutcome | undefined;\n}\n\nexport interface DelegateTaskOutcome {\n status: 'committed' | 'failed' | 'cancelled';\n errorCode?: string | undefined;\n answerBytes?: number | undefined;\n answerSha256?: string | undefined;\n turns?: number | undefined;\n toolCalls?: number | undefined;\n}\n\n/** Fusion-specific task facts surfaced through snapshots and `bg_result`. */\nexport interface FusionTaskFacts {\n runId: string;\n workflow: FusionWorkflowId;\n artifactDir: string;\n artifactDirAbs: string;\n state: string;\n outcome?: FusionTaskOutcome | undefined;\n /** Durable once-only accounting claim made by the first successful bg_result retrieval. */\n usageDelivered: boolean;\n}\n\nexport interface FusionTaskOutcome {\n status: 'committed' | 'failed' | 'cancelled';\n resultDetails?: FusionResultDetails | undefined;\n usage?: FusionUsage | undefined;\n error?: string | undefined;\n}\n\nexport interface BgTask extends Omit<BgTaskSnapshot, 'name'> {\n name: string;\n outputAbsPath: string;\n metadataAbsPath: string;\n eventsAbsPath?: string | undefined;\n stderrAbsPath?: string | undefined;\n wrapperAbsPath?: string | undefined;\n attestationAbsPath?: string | undefined;\n child?: BackgroundTaskChildProcess | undefined;\n /** Immutable in-memory ownership captured from a detached POSIX spawn; never restored from metadata. */\n ownedPosixProcessGroupId?: number | undefined;\n /** One-way latch preventing any later signal after group authority is released. */\n posixProcessGroupSignalAuthorityReleased?: boolean | undefined;\n stream?: WriteStream | undefined;\n timeoutHandle?: NodeJS.Timeout | undefined;\n killKind?: KillKind | undefined;\n killSignalSent?: boolean | undefined;\n killEscalationTimer?: NodeJS.Timeout | undefined;\n capExceeded?: boolean | undefined;\n finalized?: boolean | undefined;\n /** True only after the terminal EventBus emitter returns successfully; abandonment is never delivery. */\n terminalPublished: boolean;\n terminalPublicationState: TerminalPublicationState;\n terminalPublicationAbandonReason?: TerminalPublicationAbandonReason | undefined;\n terminalPublishAttempts: number;\n terminalPublishInFlight?: boolean | undefined;\n /** True only while the synchronous terminal emitter itself is on the stack. */\n terminalEmitInFlight?: boolean | undefined;\n terminalPublishRetryHandle?: NodeJS.Timeout | undefined;\n /** Optional protocol barrier used by EventBus run requests so early child exits cannot publish before the run response is observable. */\n terminalPublicationGate?: Promise<void> | undefined;\n contextUsageBuffer?: string | undefined;\n /** True when this task launched a telemetry-wrapped Pi agent; its stdout carries control lines, not raw output. */\n telemetryWrapped?: boolean | undefined;\n /** Partial trailing stdout line held between chunks while reconstructing wrapped-agent control lines. */\n agentStdoutBuffer?: string | undefined;\n telemetryUnavailableReason?: string | undefined;\n attestationPath?: string | undefined;\n attestedPi?: AttestedPiTaskFiles | undefined;\n delegate?: DelegateTaskFacts | undefined;\n fusion?: FusionTaskFacts | undefined;\n /** In-memory same-process authority for an opted ordinary shell task; never serialized. */\n reloadExecution?: ReloadableShellExecutionV1 | undefined;\n /** Fresh-registry terminal host delivery state for an imported owner execution. */\n reloadHostDeliveryInFlight?: boolean | undefined;\n reloadHostDeliverySettled?: boolean | undefined;\n reloadHostNotificationSettled?: boolean | undefined;\n /** Cancellation hook for an in-process managed task such as Fusion. */\n managedCancel?: (() => void) | undefined;\n managedCancelRequested?: boolean | undefined;\n managedStopWaitMs?: number | undefined;\n metadataWriteChain?: Promise<void> | undefined;\n waiters: Array<() => void>;\n}\n\nexport type CompletionDeliveryMode =\n | 'notification-and-wake'\n | 'notification-only'\n | 'manual-monitoring';\n\nexport interface CompletionDeliveryGuidance {\n readonly mode: CompletionDeliveryMode;\n readonly notificationEnabled: boolean;\n readonly automaticWakeEnabled: boolean;\n readonly text: string;\n}\n\n/**\n * Describe the actual parent-agent completion path for one bg_run launch.\n * A wake request cannot take effect without the notification that carries it.\n */\nexport function deriveCompletionDeliveryGuidance(\n notifyOnCompletion: boolean,\n triggerOnCompletion: boolean,\n): CompletionDeliveryGuidance {\n if (notifyOnCompletion && triggerOnCompletion) {\n return {\n mode: 'notification-and-wake',\n notificationEnabled: true,\n automaticWakeEnabled: true,\n text: [\n 'Terminal notification: enabled.',\n 'Automatic follow-up turn: enabled.',\n 'Next action: do not poll or sleep merely to wait; continue only independent useful work, otherwise end this turn and wait for <background-task-notification>.',\n ].join('\\n'),\n };\n }\n\n if (notifyOnCompletion) {\n return {\n mode: 'notification-only',\n notificationEnabled: true,\n automaticWakeEnabled: false,\n text: [\n 'Terminal notification: enabled.',\n 'Automatic follow-up turn: disabled. The terminal notification will be delivered, but it will not start an agent turn.',\n 'Next action: automatic wake-up was explicitly disabled; use bg_status/bg_logs only when deliberate monitoring is required, without tight polling.',\n ].join('\\n'),\n };\n }\n\n return {\n mode: 'manual-monitoring',\n notificationEnabled: false,\n automaticWakeEnabled: false,\n text: [\n 'Terminal notification: disabled.',\n triggerOnCompletion\n ? 'Automatic follow-up turn: disabled because terminal notifications are disabled. triggerOnCompletion has no effect while notifyOnCompletion is false.'\n : 'Automatic follow-up turn: disabled.',\n 'Next action: completion delivery was explicitly disabled; use bg_status/bg_logs only for deliberate manual monitoring, without tight polling.',\n ].join('\\n'),\n };\n}\n\nexport interface BgRunDetails {\n task: BgTaskSnapshot;\n}\n\nexport interface BgStatusDetails {\n tasks: BgTaskSnapshot[];\n}\n\nexport interface BgLogsDetails {\n task: BgTaskSnapshot;\n path: string;\n bytesRead: number;\n truncated: boolean;\n tail: boolean;\n}\n\nexport interface BgKillDetails {\n task: BgTaskSnapshot;\n message: string;\n}\n\nexport interface StartTaskOptions {\n name?: string | undefined;\n description?: string | undefined;\n isAgent?: boolean | undefined;\n timeoutSeconds?: number | undefined;\n notifyOnCompletion?: boolean | undefined;\n triggerOnCompletion?: boolean | undefined;\n surviveReload?: boolean | undefined;\n /** @internal EventBus protocol barrier; callers should not set this outside the extension service. */\n terminalPublicationGate?: Promise<void> | undefined;\n}\n\n/** Prepared delegate launch handed to the registry after preflight has succeeded. */\nexport interface StartManagedTaskOptions {\n id: string;\n name: string;\n command: string;\n description?: string | undefined;\n isAgent: boolean;\n completion: Promise<void>;\n cancel: () => void;\n notifyOnCompletion: boolean;\n triggerOnCompletion: boolean;\n fusion: FusionTaskFacts;\n stopWaitMs?: number | undefined;\n /** Prevent terminal publication until the launch receipt handoff is observable. */\n terminalPublicationGate?: Promise<void> | undefined;\n}\n\nexport interface StartDelegateTaskOptions {\n name: string;\n argv: readonly string[];\n /** Prompt bytes delivered over stdin, never as a shell or positional argument. */\n stdinBytes: Buffer;\n env: NodeJS.ProcessEnv;\n facts: DelegateTaskFacts;\n notifyOnCompletion: boolean;\n triggerOnCompletion: boolean;\n timeoutSeconds?: number | undefined;\n}\n\nexport interface StartAttestedPiTaskOptions {\n name: string;\n provider: string;\n model: string;\n prompt: string;\n reportPath: string;\n extraPiArgs?: string[] | undefined;\n thinking?: string | undefined;\n timeoutSeconds?: number | undefined;\n}\n\nexport const DEFAULT_LOG_BYTES = Math.min(DEFAULT_MAX_BYTES, 50 * 1024);\nexport const MAX_LOG_BYTES = Math.min(DEFAULT_MAX_BYTES, 50 * 1024);\nexport const COMMAND_PREVIEW_CHARS = 90;\nconst parseJsonValue: (text: string) => unknown = globalThis.JSON.parse;\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null;\n}\n\nexport function parseJsonText(text: string): unknown {\n return parseJsonValue(text);\n}\n\nexport function sanitizePathSegment(value: string): string {\n const sanitized = value.replace(/[^a-zA-Z0-9_.-]+/g, '-').replace(/^-+|-+$/g, '');\n return sanitized || 'session';\n}\n\nexport function stripMatchingQuotes(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length >= 2) {\n const first = trimmed[0];\n const last = trimmed[trimmed.length - 1];\n if ((first === '\"' && last === '\"') || (first === \"'\" && last === \"'\")) {\n return trimmed.slice(1, -1);\n }\n }\n return trimmed;\n}\n\nexport function compactWhitespace(value: string): string {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\nexport function truncateChars(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value;\n return `${value.slice(0, Math.max(0, maxChars - 1))}…`;\n}\n\nexport function normalizeTaskName(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = compactWhitespace(stripMatchingQuotes(value));\n if (!normalized) return undefined;\n return truncateChars(normalized, 80);\n}\n\nexport function deriveTaskNameFromCommand(command: string): string {\n const normalized = compactWhitespace(stripMatchingQuotes(command));\n if (!normalized) return 'Background task';\n\n const packageScript = /^(npm|pnpm|yarn|bun)\\s+(?:(run)\\s+)?([^\\s;&|]+)/.exec(normalized);\n if (packageScript) {\n const runner = packageScript[1] ?? 'npm';\n const run = packageScript[2] !== undefined ? ' run' : '';\n const script = packageScript[3] ?? '';\n return truncateChars(`${runner}${run} ${script}`, 48);\n }\n\n const words = normalized.split(/\\s+/).slice(0, 5).join(' ');\n return truncateChars(words.length > 0 ? words : normalized, 48);\n}\n\nexport function taskDisplayName(task: {\n name?: string | undefined;\n description?: string | undefined;\n command?: string | undefined;\n id?: string | undefined;\n}): string {\n const commandName =\n task.command && task.command.length > 0 ? deriveTaskNameFromCommand(task.command) : undefined;\n return (\n normalizeTaskName(task.name) ??\n normalizeTaskName(task.description) ??\n commandName ??\n task.id ??\n 'Background task'\n );\n}\n\nfunction parseNameValueAndRest(valueAndRest: string): { value: string; rest: string } | undefined {\n const input = valueAndRest.trimStart();\n if (!input) return undefined;\n const quote = input[0];\n if (quote === '\"' || quote === \"'\") {\n let escaped = false;\n let value = '';\n for (let i = 1; i < input.length; i++) {\n const char = input.charAt(i);\n if (escaped) {\n value += char;\n escaped = false;\n continue;\n }\n if (char === '\\\\') {\n escaped = true;\n continue;\n }\n if (char === quote) {\n return { value, rest: input.slice(i + 1).trimStart() };\n }\n value += char;\n }\n return undefined;\n }\n const match = /^(\\S+)(?:\\s+([\\s\\S]*))?$/.exec(input);\n if (!match) return undefined;\n const parsedValue = match[1];\n if (parsedValue === undefined) return undefined;\n return { value: parsedValue, rest: match[2]?.trimStart() ?? '' };\n}\n\nexport function parseBgCommandArgs(args: string): {\n name?: string;\n command: string;\n isAgent: boolean;\n surviveReload: boolean;\n} {\n let input = args.trim();\n let name: string | undefined;\n let isAgent = false;\n let surviveReload = false;\n\n while (input) {\n let consumed = false;\n for (const prefix of ['--name=', '-n=']) {\n if (input.startsWith(prefix)) {\n const parsed = parseNameValueAndRest(input.slice(prefix.length));\n if (!parsed) throw new Error(`${prefix.slice(0, -1)} requires a task name`);\n name = normalizeTaskName(parsed.value);\n input = parsed.rest;\n consumed = true;\n break;\n }\n }\n if (consumed) continue;\n\n for (const prefix of ['--name', '-n']) {\n if (input === prefix || input.startsWith(`${prefix} `) || input.startsWith(`${prefix}\\t`)) {\n const parsed = parseNameValueAndRest(input.slice(prefix.length));\n if (!parsed) throw new Error(`${prefix} requires a task name`);\n name = normalizeTaskName(parsed.value);\n input = parsed.rest;\n consumed = true;\n break;\n }\n }\n if (consumed) continue;\n\n for (const flag of ['--agent', '--llm-agent']) {\n if (input === flag || input.startsWith(`${flag} `) || input.startsWith(`${flag}\\t`)) {\n isAgent = true;\n input = input.slice(flag.length).trimStart();\n consumed = true;\n break;\n }\n }\n if (consumed) continue;\n\n for (const flag of ['--script', '--no-agent']) {\n if (input === flag || input.startsWith(`${flag} `) || input.startsWith(`${flag}\\t`)) {\n isAgent = false;\n input = input.slice(flag.length).trimStart();\n consumed = true;\n break;\n }\n }\n if (consumed) continue;\n\n if (\n input === '--survive-reload' ||\n input.startsWith('--survive-reload ') ||\n input.startsWith('--survive-reload\\t')\n ) {\n if (surviveReload) {\n throw new ReloadSurvivalError(\n 'pi_bg_survive_reload_invalid',\n '/bg accepts --survive-reload at most once',\n );\n }\n surviveReload = true;\n input = input.slice('--survive-reload'.length).trimStart();\n continue;\n }\n if (input.startsWith('--survive-reload=')) {\n throw new ReloadSurvivalError(\n 'pi_bg_survive_reload_invalid',\n '/bg accepts only the bare --survive-reload flag',\n );\n }\n\n if (input === '--') {\n input = '';\n break;\n }\n if (input.startsWith('-- ')) {\n input = input.slice(3).trimStart();\n break;\n }\n break;\n }\n\n if (surviveReload && isAgent) {\n throw new ReloadSurvivalError(\n 'pi_bg_survive_reload_requires_non_agent',\n 'surviveReload requires isAgent:false',\n );\n }\n return name\n ? { name, command: input, isAgent, surviveReload }\n : { command: input, isAgent, surviveReload };\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${String(ms)}ms`;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${String(seconds)}s`;\n const minutes = Math.floor(seconds / 60);\n const remSeconds = seconds % 60;\n if (minutes < 60) return `${String(minutes)}m${remSeconds > 0 ? `${String(remSeconds)}s` : ''}`;\n const hours = Math.floor(minutes / 60);\n const remMinutes = minutes % 60;\n return `${String(hours)}h${remMinutes > 0 ? `${String(remMinutes)}m` : ''}`;\n}\n\nexport function formatCompactNumber(count: number): string {\n const normalized = Math.max(0, Math.floor(count));\n if (normalized < 1000) return normalized.toString();\n if (normalized < 10000) return `${(normalized / 1000).toFixed(1)}k`;\n if (normalized < 1000000) return `${String(Math.round(normalized / 1000))}k`;\n if (normalized < 10000000) return `${(normalized / 1000000).toFixed(1)}M`;\n return `${String(Math.round(normalized / 1000000))}M`;\n}\n\nexport function formatContextUsageSummary(usage?: TaskContextUsage): string | undefined {\n if (usage?.contextWindow === undefined || usage.contextWindow <= 0) return undefined;\n const window = formatCompactNumber(usage.contextWindow);\n if (usage.percent === null || usage.tokens === null) return `ctx=?/${window}`;\n return `ctx=${usage.percent.toFixed(1)}%/${window}`;\n}\n\nexport function formatTokenUsageSummary(usage?: TaskTokenUsage): string | undefined {\n if (!usage || usage.totalTokens <= 0) return undefined;\n return `tokens=${formatCompactNumber(usage.totalTokens)}`;\n}\n\nexport function formatToolUsageSummary(usage?: TaskToolUsage): string | undefined {\n if (!usage || (usage.total <= 0 && usage.failed <= 0)) return undefined;\n const failed = usage.failed > 0 ? ` failed=${String(usage.failed)}` : '';\n return `tools=${String(usage.total)}${failed}`;\n}\n\nexport function formatModelSummary(model?: string): string | undefined {\n if (!model) return undefined;\n return `model=${model}`;\n}\n\n/**\n * Human-readable activity transcript for telemetry-wrapped Pi agents.\n *\n * The wrapper emits one `background-task-activity` control line per meaningful\n * child-agent event (assistant text, reasoning, tool start, tool end) so the\n * registry can render \"what the agent is actually doing\" into the task output\n * file instead of leaking raw telemetry JSON. Both the parser and the formatter\n * are pure so the visible transcript is fully unit-testable.\n */\nexport const AGENT_ACTIVITY_TYPE = 'background-task-activity';\nconst AGENT_ACTIVITY_DETAIL_MAX = 80;\n\nexport type AgentActivity =\n | { kind: 'assistant_text'; text: string }\n | { kind: 'reasoning'; text: string }\n | { kind: 'tool_start'; tool: string; argsSummary: string }\n | { kind: 'tool_end'; tool: string; isError: boolean; error?: string };\n\ninterface AgentActivityPayload extends JsonObject {\n readonly type?: unknown;\n readonly kind?: unknown;\n readonly text?: unknown;\n readonly tool?: unknown;\n readonly argsSummary?: unknown;\n readonly isError?: unknown;\n readonly error?: unknown;\n}\n\nfunction readActivityString(\n record: AgentActivityPayload,\n key: 'text' | 'tool' | 'argsSummary' | 'error',\n): string | undefined {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n}\n\n/** Narrow a parsed `background-task-activity` control payload into a typed {@link AgentActivity}. */\nexport function parseAgentActivity(payload: unknown): AgentActivity | undefined {\n if (!isJsonObject(payload)) return undefined;\n const record: AgentActivityPayload = payload;\n if (record.type !== AGENT_ACTIVITY_TYPE) return undefined;\n const kind = record.kind;\n if (kind === 'assistant_text' || kind === 'reasoning') {\n const text = readActivityString(record, 'text');\n if (text === undefined) return undefined;\n return { kind, text };\n }\n if (kind === 'tool_start') {\n const tool = readActivityString(record, 'tool');\n if (!tool) return undefined;\n return { kind, tool, argsSummary: readActivityString(record, 'argsSummary') ?? '' };\n }\n if (kind === 'tool_end') {\n const tool = readActivityString(record, 'tool');\n if (!tool) return undefined;\n const activity: AgentActivity = { kind, tool, isError: record.isError === true };\n const error = readActivityString(record, 'error');\n if (error !== undefined && error.trim().length > 0) activity.error = error;\n return activity;\n }\n return undefined;\n}\n\n/**\n * Render an {@link AgentActivity} into a single transcript line, or `undefined`\n * when the event carries nothing worth showing (blank text, a successful tool\n * end). Successful tool ends are intentionally silent: the matching `→` start\n * line already announced the call, and the next line implies completion.\n */\nexport function formatAgentActivityLine(activity: AgentActivity): string | undefined {\n if (activity.kind === 'assistant_text') {\n const text = activity.text.replace(/\\s+$/u, '');\n return text.trim().length > 0 ? text : undefined;\n }\n if (activity.kind === 'reasoning') {\n const text = activity.text.replace(/\\s+$/u, '');\n return text.trim().length > 0 ? `\\u2026 ${text}` : undefined;\n }\n if (activity.kind === 'tool_start') {\n const summary = compactWhitespace(activity.argsSummary);\n const suffix =\n summary.length > 0 ? ` ${truncateChars(summary, AGENT_ACTIVITY_DETAIL_MAX)}` : '';\n return `\\u2192 ${activity.tool}${suffix}`;\n }\n if (!activity.isError) return undefined;\n const detail = activity.error\n ? `: ${truncateChars(compactWhitespace(activity.error), AGENT_ACTIVITY_DETAIL_MAX)}`\n : '';\n return `\\u2717 ${activity.tool} failed${detail}`;\n}\n\nexport function shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nexport type ShellDialect = 'cmd' | 'posix' | 'user-non-posix';\nexport type ShellPolicyDialect = ShellDialect | 'bash';\nexport type ShellPolicyName = 'inherit' | 'bash' | 'sh' | 'cmd';\n\n/** Non-secret launch facts persisted for ordinary shell tasks. */\nexport interface ShellPolicySnapshot {\n readonly policy: ShellPolicyName;\n readonly executable: string;\n readonly argvPrefix: readonly string[];\n readonly dialect: ShellPolicyDialect;\n}\n\n/** One immutable shell selection shared by guidance and every ordinary spawn in an activation. */\nexport interface ResolvedShellPolicy extends ShellPolicySnapshot {\n readonly supportsPosixFunctionWrapper: boolean;\n readonly windowsVerbatimArguments: boolean;\n}\n\nexport interface ShellInvocation {\n shell: string;\n args: string[];\n dialect: ShellDialect;\n windowsVerbatimArguments: boolean;\n}\n\nexport class ShellInvocationError extends Error {\n readonly code = 'pi_bg_shell_invalid';\n\n constructor(message: string) {\n super(`pi_bg_shell_invalid: ${message}`);\n this.name = 'ShellInvocationError';\n }\n}\n\ntype ShellCandidateResult =\n | { readonly found: true }\n | { readonly found: false; readonly diagnostic: string };\n\nconst POSIX_FUNCTION_SHELLS = new Set([\n 'sh',\n 'dash',\n 'ash',\n 'ksh',\n 'ksh93',\n 'mksh',\n 'pdksh',\n 'zsh',\n 'yash',\n 'posh',\n]);\n\nfunction failShellInvocation(message: string): never {\n throw new ShellInvocationError(message);\n}\n\nfunction shellErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction freezeShellPolicy(\n policy: Omit<ResolvedShellPolicy, 'argvPrefix'> & { argvPrefix: readonly string[] },\n): ResolvedShellPolicy {\n return Object.freeze({\n ...policy,\n argvPrefix: Object.freeze([...policy.argvPrefix]),\n });\n}\n\nexport function shellPolicySnapshot(policy: ResolvedShellPolicy): ShellPolicySnapshot {\n return Object.freeze({\n policy: policy.policy,\n executable: policy.executable,\n argvPrefix: Object.freeze([...policy.argvPrefix]),\n dialect: policy.dialect,\n });\n}\n\nfunction isWindowsExecutablePath(path: string): boolean {\n const extension = extname(path).toLowerCase();\n return extension === '.exe' || extension === '.com';\n}\n\nfunction validateWindowsShellPath(path: string, label: string): string {\n if (path.length === 0) failShellInvocation(`${label} is empty`);\n if (!isAbsolute(path) && !win32.isAbsolute(path)) {\n failShellInvocation(`${label} must be an absolute path`);\n }\n if (!isWindowsExecutablePath(path)) {\n failShellInvocation(`${label} must point to a .exe or .com file`);\n }\n let stats: ReturnType<typeof statSync>;\n try {\n stats = statSync(path);\n } catch (error) {\n failShellInvocation(`${label} stat failed: ${shellErrorMessage(error)}`);\n }\n if (!stats.isFile()) failShellInvocation(`${label} must point to a regular file`);\n return path;\n}\n\nfunction inspectWindowsShellCandidate(path: string): ShellCandidateResult {\n if (!isWindowsExecutablePath(path)) {\n return { found: false, diagnostic: `${path} is not a .exe or .com path` };\n }\n try {\n const stats = statSync(path);\n if (stats.isFile()) return { found: true };\n return { found: false, diagnostic: `${path} is not a regular file` };\n } catch (error) {\n return { found: false, diagnostic: `${path}: ${shellErrorMessage(error)}` };\n }\n}\n\nfunction windowsPathValue(env: NodeJS.ProcessEnv): string {\n return env['PATH'] ?? env['Path'] ?? env['path'] ?? '';\n}\n\nfunction resolveWindowsBash(env: NodeJS.ProcessEnv): string {\n const pathValue = windowsPathValue(env);\n const diagnostics: string[] = [];\n for (const dir of pathValue.split(';').filter((entry) => entry.length > 0)) {\n for (const name of ['bash.exe', 'bash.com']) {\n const candidate = join(dir, name);\n const result = inspectWindowsShellCandidate(candidate);\n if (result.found) return candidate;\n diagnostics.push(result.diagnostic);\n }\n }\n const suffix = diagnostics.length > 0 ? `: ${diagnostics.join('; ')}` : '';\n failShellInvocation(`PI_BG_SHELL=bash could not resolve bash.exe or bash.com on PATH${suffix}`);\n}\n\nfunction validatePosixShellPath(path: string, label: string): string {\n if (path.length === 0) failShellInvocation(`${label} is empty`);\n if (!isAbsolute(path)) failShellInvocation(`${label} must be an absolute path`);\n let stats: ReturnType<typeof statSync>;\n try {\n stats = statSync(path);\n } catch (error) {\n failShellInvocation(`${label} stat failed: ${shellErrorMessage(error)}`);\n }\n if (!stats.isFile()) failShellInvocation(`${label} must point to a regular file`);\n try {\n accessSync(path, constants.X_OK);\n } catch (error) {\n failShellInvocation(`${label} must be executable: ${shellErrorMessage(error)}`);\n }\n return path;\n}\n\nfunction inspectPosixShellCandidate(path: string): boolean {\n try {\n const stats = statSync(path);\n if (!stats.isFile()) return false;\n accessSync(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolvePosixExecutable(\n name: 'bash' | 'sh',\n env: NodeJS.ProcessEnv,\n activationCwd: string,\n): string {\n const binCandidate = `/bin/${name}`;\n if (inspectPosixShellCandidate(binCandidate)) return binCandidate;\n const pathValue = env['PATH'] ?? '';\n for (const entry of pathValue.split(delimiter)) {\n if (entry.length === 0) continue;\n const directory = isAbsolute(entry) ? entry : resolve(activationCwd, entry);\n const candidate = join(directory, name);\n if (inspectPosixShellCandidate(candidate)) return candidate;\n }\n failShellInvocation(\n `PI_BG_POSIX_SHELL=${name} could not resolve executable ${binCandidate} or ${name} on PATH`,\n );\n}\n\nfunction inheritedPosixDialect(executable: string): ShellPolicyDialect {\n const name = basename(executable).toLowerCase();\n if (name === 'bash') return 'bash';\n return POSIX_FUNCTION_SHELLS.has(name) ? 'posix' : 'user-non-posix';\n}\n\n/** Resolve one activation-stable policy. New POSIX variables are intentionally ignored on Windows. */\nexport function resolveShellPolicy(\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n activationCwd: string = process.cwd(),\n): ResolvedShellPolicy {\n if (platform === 'win32') {\n const requestedShell = env['PI_BG_SHELL'];\n const requestedPath = env['PI_BG_SHELL_PATH'];\n if (requestedShell === undefined) {\n if (requestedPath !== undefined)\n failShellInvocation('PI_BG_SHELL_PATH requires PI_BG_SHELL');\n const comSpec = env['ComSpec'];\n return freezeShellPolicy({\n policy: 'cmd',\n executable: comSpec && comSpec.length > 0 ? comSpec : 'cmd.exe',\n argvPrefix: ['/d', '/s', '/c'],\n dialect: 'cmd',\n supportsPosixFunctionWrapper: false,\n windowsVerbatimArguments: true,\n });\n }\n if (requestedShell !== 'cmd' && requestedShell !== 'bash') {\n failShellInvocation('PI_BG_SHELL must be exactly cmd or bash');\n }\n const explicitPath =\n requestedPath !== undefined\n ? validateWindowsShellPath(requestedPath, 'PI_BG_SHELL_PATH')\n : undefined;\n if (requestedShell === 'cmd') {\n const comSpec = env['ComSpec'];\n return freezeShellPolicy({\n policy: 'cmd',\n executable: explicitPath ?? (comSpec && comSpec.length > 0 ? comSpec : 'cmd.exe'),\n argvPrefix: ['/d', '/s', '/c'],\n dialect: 'cmd',\n supportsPosixFunctionWrapper: false,\n windowsVerbatimArguments: true,\n });\n }\n return freezeShellPolicy({\n policy: 'bash',\n executable: explicitPath ?? resolveWindowsBash(env),\n argvPrefix: ['-c'],\n dialect: 'bash',\n supportsPosixFunctionWrapper: true,\n windowsVerbatimArguments: false,\n });\n }\n\n const configuredPolicy = env['PI_BG_POSIX_SHELL'];\n if (\n configuredPolicy !== undefined &&\n configuredPolicy !== 'inherit' &&\n configuredPolicy !== 'bash' &&\n configuredPolicy !== 'sh'\n ) {\n failShellInvocation('PI_BG_POSIX_SHELL must be exactly inherit, bash, or sh');\n }\n const policy = configuredPolicy ?? 'inherit';\n const configuredPath = env['PI_BG_POSIX_SHELL_PATH'];\n if (policy === 'inherit') {\n if (configuredPath !== undefined) {\n failShellInvocation(\n 'PI_BG_POSIX_SHELL_PATH requires PI_BG_POSIX_SHELL=bash or PI_BG_POSIX_SHELL=sh',\n );\n }\n const inherited = env['SHELL'];\n const executable = inherited && inherited.length > 0 ? inherited : '/bin/sh';\n const dialect = inheritedPosixDialect(executable);\n return freezeShellPolicy({\n policy,\n executable,\n argvPrefix: ['-c'],\n dialect,\n supportsPosixFunctionWrapper: dialect === 'bash' || dialect === 'posix',\n windowsVerbatimArguments: false,\n });\n }\n\n const executable =\n configuredPath !== undefined\n ? validatePosixShellPath(configuredPath, 'PI_BG_POSIX_SHELL_PATH')\n : resolvePosixExecutable(policy, env, activationCwd);\n return freezeShellPolicy({\n policy,\n executable,\n argvPrefix: ['-c'],\n dialect: policy === 'bash' ? 'bash' : 'posix',\n supportsPosixFunctionWrapper: true,\n windowsVerbatimArguments: false,\n });\n}\n\nexport function shellInvocationForPolicy(\n command: string,\n policy: ResolvedShellPolicy,\n): ShellInvocation {\n const dialect: ShellDialect = policy.dialect === 'bash' ? 'posix' : policy.dialect;\n return {\n shell: policy.executable,\n args:\n policy.dialect === 'cmd'\n ? [...policy.argvPrefix, `\"${command}\"`]\n : [...policy.argvPrefix, command],\n dialect,\n windowsVerbatimArguments: policy.windowsVerbatimArguments,\n };\n}\n\nexport function shellInvocation(\n command: string,\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): ShellInvocation {\n return shellInvocationForPolicy(command, resolveShellPolicy(platform, env));\n}\n\nexport function normalizeMaxBytes(value: unknown, fallback = DEFAULT_LOG_BYTES): number {\n const raw = typeof value === 'number' && Number.isFinite(value) ? Math.floor(value) : fallback;\n return Math.max(1, Math.min(MAX_LOG_BYTES, raw));\n}\n\nexport function snapshot(task: BgTask): BgTaskSnapshot {\n return {\n id: task.id,\n name: taskDisplayName(task),\n command: task.command,\n description: task.description,\n status: task.status,\n outputPath: task.outputPath,\n cwd: task.cwd,\n startTime: task.startTime,\n endTime: task.endTime,\n exitCode: task.exitCode,\n signal: task.signal,\n pid: task.pid,\n bytesWritten: task.bytesWritten,\n isAgent: task.isAgent,\n surviveReload: task.surviveReload === true,\n reloadSurvival: task.reloadSurvival,\n error: task.error,\n notified: task.notified,\n notifyOnCompletion: task.notifyOnCompletion,\n triggerOnCompletion: task.triggerOnCompletion,\n timeoutSeconds: task.timeoutSeconds,\n contextUsage: task.contextUsage,\n tokenUsage: task.tokenUsage,\n toolUsage: task.toolUsage,\n model: task.model,\n telemetryUnavailableReason: task.telemetryUnavailableReason,\n shellPolicy: task.shellPolicy,\n attestationPath: task.attestationPath,\n delegate: task.delegate,\n fusion: task.fusion,\n };\n}\n\nexport function formatSnapshotList(tasks: BgTaskSnapshot[], now = Date.now()): string {\n if (tasks.length === 0) return 'No background tasks in this Pi extension runtime.';\n return tasks\n .map((task) => {\n const statusIcon =\n task.status === 'running'\n ? '▶'\n : task.status === 'completed'\n ? '✓'\n : task.status === 'killed'\n ? '■'\n : '✗';\n const age = formatDuration((task.endTime ?? now) - task.startTime);\n const code = task.exitCode !== undefined ? ` exit=${String(task.exitCode)}` : '';\n const pid = task.pid !== undefined ? ` pid=${String(task.pid)}` : '';\n const error = task.error ? ` error=${truncateChars(task.error, 80)}` : '';\n const telemetry = [\n formatContextUsageSummary(task.contextUsage),\n formatModelSummary(task.model),\n formatTokenUsageSummary(task.tokenUsage),\n formatToolUsageSummary(task.toolUsage),\n ]\n .filter(Boolean)\n .join(' ');\n const telemetryText = telemetry ? ` ${telemetry}` : '';\n return `${statusIcon} ${task.id} ${task.status} ${age}${code}${pid}${telemetryText} — ${truncateChars(taskDisplayName(task), COMMAND_PREVIEW_CHARS)}${error}\\n output: ${task.outputPath}`;\n })\n .join('\\n');\n}\n\nexport async function boundedRead(\n filePath: string,\n maxBytes: number,\n tail: boolean,\n): Promise<{ content: string; truncated: boolean; bytesRead: number; totalBytes: number }> {\n const stats = statSync(filePath);\n const totalBytes = stats.size;\n const bytesToRead = Math.min(totalBytes, maxBytes);\n if (bytesToRead === 0) return { content: '', truncated: false, bytesRead: 0, totalBytes };\n\n const file = await open(filePath, 'r');\n try {\n const buffer = Buffer.alloc(bytesToRead);\n const position = tail ? Math.max(0, totalBytes - bytesToRead) : 0;\n const { bytesRead } = await file.read(buffer, 0, bytesToRead, position);\n return {\n content: buffer.subarray(0, bytesRead).toString('utf8'),\n truncated: totalBytes > bytesRead,\n bytesRead,\n totalBytes,\n };\n } finally {\n await file.close();\n }\n}\n\nexport function escapeXml(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nexport const UPDATE_COMMAND = '/bg-update';\n\ninterface ParsedSemver {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nconst SEMVER_PATTERN = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/;\n\nexport function parseSemver(value: string): ParsedSemver | undefined {\n if (typeof value !== 'string') return undefined;\n const match = SEMVER_PATTERN.exec(value.trim());\n if (!match) return undefined;\n const majorRaw = match[1];\n const minorRaw = match[2];\n const patchRaw = match[3];\n if (majorRaw === undefined || minorRaw === undefined || patchRaw === undefined) return undefined;\n const major = Number(majorRaw);\n const minor = Number(minorRaw);\n const patch = Number(patchRaw);\n if (!Number.isInteger(major) || !Number.isInteger(minor) || !Number.isInteger(patch))\n return undefined;\n const prerelease = match[4] !== undefined ? match[4].split('.') : [];\n return { major, minor, patch, prerelease };\n}\n\nfunction comparePrerelease(a: string[], b: string[]): number {\n if (a.length === 0 && b.length === 0) return 0;\n // A version without prerelease identifiers outranks the same core with prerelease identifiers.\n if (a.length === 0) return 1;\n if (b.length === 0) return -1;\n const shared = Math.min(a.length, b.length);\n for (let i = 0; i < shared; i++) {\n const idA = a[i];\n const idB = b[i];\n if (idA === undefined || idB === undefined) break;\n if (idA === idB) continue;\n const numericA = /^\\d+$/.test(idA);\n const numericB = /^\\d+$/.test(idB);\n if (numericA && numericB) {\n const diff = Number(idA) - Number(idB);\n if (diff !== 0) return diff < 0 ? -1 : 1;\n continue;\n }\n // Numeric identifiers always have lower precedence than non-numeric identifiers.\n if (numericA) return -1;\n if (numericB) return 1;\n return idA < idB ? -1 : 1;\n }\n if (a.length === b.length) return 0;\n return a.length < b.length ? -1 : 1;\n}\n\n/** Compare two semver strings. Returns -1/0/1, or undefined when either side is not valid semver. */\nexport function compareSemver(a: string, b: string): number | undefined {\n const left = parseSemver(a);\n const right = parseSemver(b);\n if (!left || !right) return undefined;\n if (left.major !== right.major) return left.major < right.major ? -1 : 1;\n if (left.minor !== right.minor) return left.minor < right.minor ? -1 : 1;\n if (left.patch !== right.patch) return left.patch < right.patch ? -1 : 1;\n return comparePrerelease(left.prerelease, right.prerelease);\n}\n\nexport function isNewerVersion(latest: string, current: string): boolean {\n return compareSemver(latest, current) === 1;\n}\n\n/** Footer segment shown only when a newer published version exists; undefined otherwise. */\nexport function formatUpdateSegment(\n latest: string | undefined,\n current: string,\n): string | undefined {\n if (!latest) return undefined;\n if (!isNewerVersion(latest, current)) return undefined;\n return `\\u2b06 v${latest} ${UPDATE_COMMAND}`;\n}\n"]}
@@ -0,0 +1,78 @@
1
+ export const PI_BG_FEATURE_VALUES = Object.freeze([
2
+ 'process',
3
+ 'delegate',
4
+ 'fusion',
5
+ 'attested',
6
+ 'attribution',
7
+ ]);
8
+ export const PI_BG_DEFAULT_FEATURES = PI_BG_FEATURE_VALUES;
9
+ export const PI_BG_DOCK_SHORTCUT_VALUES = Object.freeze([
10
+ 'shift+down',
11
+ 'ctrl+alt+b',
12
+ 'off',
13
+ ]);
14
+ export const PI_BG_DEFAULT_DOCK_SHORTCUT = 'shift+down';
15
+ const CONFIG_VALUE_EXCERPT_CHARS = 96;
16
+ function boundedConfigValue(value) {
17
+ if (value.length <= CONFIG_VALUE_EXCERPT_CHARS)
18
+ return JSON.stringify(value);
19
+ return `${JSON.stringify(value.slice(0, CONFIG_VALUE_EXCERPT_CHARS))}… (${String(value.length)} chars)`;
20
+ }
21
+ function invalidConfig(variable, reason, value) {
22
+ throw new Error(`pi_bg_config_invalid: ${variable} ${reason}; received ${boundedConfigValue(value)}`);
23
+ }
24
+ function parseFeatures(rawValue) {
25
+ const raw = rawValue ?? PI_BG_DEFAULT_FEATURES.join(',');
26
+ const accepted = PI_BG_FEATURE_VALUES.join(',');
27
+ if (raw.length === 0) {
28
+ invalidConfig('PI_BG_FEATURES', `must not be empty; accepted tokens: ${accepted}`, raw);
29
+ }
30
+ if (/\s/u.test(raw)) {
31
+ invalidConfig('PI_BG_FEATURES', `must contain no whitespace; accepted tokens: ${accepted}`, raw);
32
+ }
33
+ const tokens = raw.split(',');
34
+ if (tokens.some((token) => token.length === 0)) {
35
+ invalidConfig('PI_BG_FEATURES', `contains a blank comma token; accepted tokens: ${accepted}`, raw);
36
+ }
37
+ const selected = new Set();
38
+ for (const token of tokens) {
39
+ if (!PI_BG_FEATURE_VALUES.includes(token)) {
40
+ invalidConfig('PI_BG_FEATURES', `contains unknown token ${boundedConfigValue(token)}; accepted tokens: ${accepted}; bg_result is derived from delegate or fusion`, raw);
41
+ }
42
+ const feature = token;
43
+ if (selected.has(feature)) {
44
+ invalidConfig('PI_BG_FEATURES', `contains duplicate token ${feature}`, raw);
45
+ }
46
+ selected.add(feature);
47
+ }
48
+ if (!selected.has('process')) {
49
+ invalidConfig('PI_BG_FEATURES', 'must include mandatory token process', raw);
50
+ }
51
+ return Object.freeze({
52
+ process: true,
53
+ delegate: selected.has('delegate'),
54
+ fusion: selected.has('fusion'),
55
+ attested: selected.has('attested'),
56
+ attribution: selected.has('attribution'),
57
+ });
58
+ }
59
+ function parseDockShortcut(rawValue) {
60
+ const raw = rawValue ?? PI_BG_DEFAULT_DOCK_SHORTCUT;
61
+ if (!PI_BG_DOCK_SHORTCUT_VALUES.includes(raw)) {
62
+ invalidConfig('PI_BG_DOCK_SHORTCUT', `accepted values are exactly ${PI_BG_DOCK_SHORTCUT_VALUES.join(',')}`, raw);
63
+ }
64
+ return raw;
65
+ }
66
+ export function parseBackgroundTasksConfig(env = process.env) {
67
+ const features = parseFeatures(env['PI_BG_FEATURES']);
68
+ const dockShortcut = parseDockShortcut(env['PI_BG_DOCK_SHORTCUT']);
69
+ return Object.freeze({ features, dockShortcut });
70
+ }
71
+ export function dockShortcutFooterHint(shortcut) {
72
+ if (shortcut === 'shift+down')
73
+ return 'Shift↓';
74
+ if (shortcut === 'ctrl+alt+b')
75
+ return 'CtrlAltB';
76
+ return '/tasks';
77
+ }
78
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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","sourcesContent":["export const PI_BG_FEATURE_VALUES = Object.freeze([\n 'process',\n 'delegate',\n 'fusion',\n 'attested',\n 'attribution',\n] as const);\nexport type PiBackgroundFeature = (typeof PI_BG_FEATURE_VALUES)[number];\n\nexport const PI_BG_DEFAULT_FEATURES = PI_BG_FEATURE_VALUES;\n\nexport const PI_BG_DOCK_SHORTCUT_VALUES = Object.freeze([\n 'shift+down',\n 'ctrl+alt+b',\n 'off',\n] as const);\nexport type PiBackgroundDockShortcut = (typeof PI_BG_DOCK_SHORTCUT_VALUES)[number];\n\nexport const PI_BG_DEFAULT_DOCK_SHORTCUT: PiBackgroundDockShortcut = 'shift+down';\n\nexport interface PiBackgroundFeatureSelection {\n readonly process: true;\n readonly delegate: boolean;\n readonly fusion: boolean;\n readonly attested: boolean;\n readonly attribution: boolean;\n}\n\nexport interface PiBackgroundConfig {\n readonly features: PiBackgroundFeatureSelection;\n readonly dockShortcut: PiBackgroundDockShortcut;\n}\n\nconst CONFIG_VALUE_EXCERPT_CHARS = 96;\n\nfunction boundedConfigValue(value: string): string {\n if (value.length <= CONFIG_VALUE_EXCERPT_CHARS) return JSON.stringify(value);\n return `${JSON.stringify(value.slice(0, CONFIG_VALUE_EXCERPT_CHARS))}… (${String(value.length)} chars)`;\n}\n\nfunction invalidConfig(variable: string, reason: string, value: string): never {\n throw new Error(\n `pi_bg_config_invalid: ${variable} ${reason}; received ${boundedConfigValue(value)}`,\n );\n}\n\nfunction parseFeatures(rawValue: string | undefined): PiBackgroundFeatureSelection {\n const raw = rawValue ?? PI_BG_DEFAULT_FEATURES.join(',');\n const accepted = PI_BG_FEATURE_VALUES.join(',');\n if (raw.length === 0) {\n invalidConfig('PI_BG_FEATURES', `must not be empty; accepted tokens: ${accepted}`, raw);\n }\n if (/\\s/u.test(raw)) {\n invalidConfig(\n 'PI_BG_FEATURES',\n `must contain no whitespace; accepted tokens: ${accepted}`,\n raw,\n );\n }\n const tokens = raw.split(',');\n if (tokens.some((token) => token.length === 0)) {\n invalidConfig(\n 'PI_BG_FEATURES',\n `contains a blank comma token; accepted tokens: ${accepted}`,\n raw,\n );\n }\n\n const selected = new Set<PiBackgroundFeature>();\n for (const token of tokens) {\n if (!(PI_BG_FEATURE_VALUES as readonly string[]).includes(token)) {\n invalidConfig(\n 'PI_BG_FEATURES',\n `contains unknown token ${boundedConfigValue(token)}; accepted tokens: ${accepted}; bg_result is derived from delegate or fusion`,\n raw,\n );\n }\n const feature = token as PiBackgroundFeature;\n if (selected.has(feature)) {\n invalidConfig('PI_BG_FEATURES', `contains duplicate token ${feature}`, raw);\n }\n selected.add(feature);\n }\n if (!selected.has('process')) {\n invalidConfig('PI_BG_FEATURES', 'must include mandatory token process', raw);\n }\n\n return Object.freeze({\n process: true,\n delegate: selected.has('delegate'),\n fusion: selected.has('fusion'),\n attested: selected.has('attested'),\n attribution: selected.has('attribution'),\n });\n}\n\nfunction parseDockShortcut(rawValue: string | undefined): PiBackgroundDockShortcut {\n const raw = rawValue ?? PI_BG_DEFAULT_DOCK_SHORTCUT;\n if (!(PI_BG_DOCK_SHORTCUT_VALUES as readonly string[]).includes(raw)) {\n invalidConfig(\n 'PI_BG_DOCK_SHORTCUT',\n `accepted values are exactly ${PI_BG_DOCK_SHORTCUT_VALUES.join(',')}`,\n raw,\n );\n }\n return raw as PiBackgroundDockShortcut;\n}\n\nexport function parseBackgroundTasksConfig(\n env: Readonly<Record<string, string | undefined>> = process.env,\n): PiBackgroundConfig {\n const features = parseFeatures(env['PI_BG_FEATURES']);\n const dockShortcut = parseDockShortcut(env['PI_BG_DOCK_SHORTCUT']);\n return Object.freeze({ features, dockShortcut });\n}\n\nexport function dockShortcutFooterHint(shortcut: PiBackgroundDockShortcut): string {\n if (shortcut === 'shift+down') return 'Shift↓';\n if (shortcut === 'ctrl+alt+b') return 'CtrlAltB';\n return '/tasks';\n}\n"]}
@@ -0,0 +1,75 @@
1
+ import { buildSessionContext, convertToLlm, } from '@earendil-works/pi-coding-agent';
2
+ import { isJsonObject } from '../common.js';
3
+ function entriesById(entries) {
4
+ const byId = new Map();
5
+ for (const entry of entries)
6
+ byId.set(entry.id, entry);
7
+ return byId;
8
+ }
9
+ function readArray(record, key) {
10
+ const value = record[key];
11
+ return Array.isArray(value) ? value : undefined;
12
+ }
13
+ function recordOf(value) {
14
+ if (!isJsonObject(value) || Array.isArray(value))
15
+ return undefined;
16
+ return value;
17
+ }
18
+ function entryMessage(entry) {
19
+ if (entry.type !== 'message')
20
+ return undefined;
21
+ return recordOf(entry.message);
22
+ }
23
+ function toolCallPartMatches(part, toolCallId, toolName) {
24
+ const record = recordOf(part);
25
+ if (record === undefined || record['type'] !== 'toolCall')
26
+ return false;
27
+ if (toolCallId !== undefined)
28
+ return record['id'] === toolCallId;
29
+ return record['name'] === toolName;
30
+ }
31
+ function messageContainsToolCall(message, toolCallId, toolName) {
32
+ if (message['role'] !== 'assistant')
33
+ return false;
34
+ const content = readArray(message, 'content');
35
+ if (content === undefined)
36
+ return false;
37
+ for (const part of content) {
38
+ if (toolCallPartMatches(part, toolCallId, toolName))
39
+ return true;
40
+ }
41
+ return false;
42
+ }
43
+ function effectiveLeafForTool(sessionManager, toolCallId, toolName) {
44
+ const leaf = sessionManager.getLeafEntry();
45
+ if (leaf === undefined)
46
+ return { leafId: sessionManager.getLeafId(), activeToolCallLeafExcluded: false };
47
+ const message = entryMessage(leaf);
48
+ if (message !== undefined && messageContainsToolCall(message, toolCallId, toolName)) {
49
+ return { leafId: leaf.parentId, activeToolCallLeafExcluded: true };
50
+ }
51
+ return { leafId: sessionManager.getLeafId(), activeToolCallLeafExcluded: false };
52
+ }
53
+ export function resolveEffectiveLeaf(sessionManager, options) {
54
+ if (!options.excludeActiveToolCallLeaf)
55
+ return { leafId: sessionManager.getLeafId(), activeToolCallLeafExcluded: false };
56
+ return effectiveLeafForTool(sessionManager, options.toolCallId, options.toolName);
57
+ }
58
+ /**
59
+ * Freeze the parent conversation into LLM messages.
60
+ *
61
+ * Callers must complete every downstream use of the returned snapshot without
62
+ * re-reading the session, so the seed cannot drift while a child is being
63
+ * launched.
64
+ */
65
+ export function snapshotParentConversation(ctx, options) {
66
+ const entries = ctx.sessionManager.getEntries();
67
+ const leaf = resolveEffectiveLeaf(ctx.sessionManager, options);
68
+ const sessionContext = buildSessionContext(entries, leaf.leafId, entriesById(entries));
69
+ return {
70
+ messages: convertToLlm(sessionContext.messages),
71
+ leafId: leaf.leafId,
72
+ activeToolCallLeafExcluded: leaf.activeToolCallLeafExcluded,
73
+ };
74
+ }
75
+ //# sourceMappingURL=parent-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parent-snapshot.js","sourceRoot":"","sources":["../../../../src/core/context/parent-snapshot.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n buildSessionContext,\n convertToLlm,\n type SessionEntry,\n} from '@earendil-works/pi-coding-agent';\nimport type { Message } from '@earendil-works/pi-ai';\nimport { isJsonObject, type JsonObject } from '../common.js';\n\n/**\n * Pi session adapter shared by every consumer of the visible-conversation\n * transform.\n *\n * Responsible for exactly one thing: turning the parent's live Pi session into a\n * frozen `Message[]` snapshot, with the in-flight tool call that requested the\n * snapshot (and therefore its sibling calls) excluded from the branch.\n *\n * The transform itself lives in `visible-conversation-v2.ts` and never sees a\n * `SessionManager`.\n */\n\nexport interface ReadonlyParentSessionManager {\n getLeafId(): string | null;\n getLeafEntry(): SessionEntry | undefined;\n getEntries(): SessionEntry[];\n}\n\nexport interface ParentContextSource {\n cwd: string;\n sessionManager: ReadonlyParentSessionManager;\n getSystemPrompt(): string;\n}\n\nexport interface ParentSnapshotOptions {\n /** Tool call currently executing, when the snapshot is requested from a tool. */\n toolCallId?: string | undefined;\n /** Tool name used for leaf matching when no explicit call id is available. */\n toolName: string;\n /** Commands have no in-flight tool call and therefore never exclude a leaf. */\n excludeActiveToolCallLeaf: boolean;\n}\n\nexport interface ParentSnapshot {\n messages: readonly Message[];\n leafId: string | null;\n activeToolCallLeafExcluded: boolean;\n}\n\nfunction entriesById(entries: readonly SessionEntry[]): Map<string, SessionEntry> {\n const byId = new Map<string, SessionEntry>();\n for (const entry of entries) byId.set(entry.id, entry);\n return byId;\n}\n\nfunction readArray(record: JsonObject, key: string): readonly unknown[] | undefined {\n const value = record[key];\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction recordOf(value: unknown): JsonObject | undefined {\n if (!isJsonObject(value) || Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction entryMessage(entry: SessionEntry): JsonObject | undefined {\n if (entry.type !== 'message') return undefined;\n return recordOf(entry.message);\n}\n\nfunction toolCallPartMatches(\n part: unknown,\n toolCallId: string | undefined,\n toolName: string,\n): boolean {\n const record = recordOf(part);\n if (record === undefined || record['type'] !== 'toolCall') return false;\n if (toolCallId !== undefined) return record['id'] === toolCallId;\n return record['name'] === toolName;\n}\n\nfunction messageContainsToolCall(\n message: JsonObject,\n toolCallId: string | undefined,\n toolName: string,\n): boolean {\n if (message['role'] !== 'assistant') return false;\n const content = readArray(message, 'content');\n if (content === undefined) return false;\n for (const part of content) {\n if (toolCallPartMatches(part, toolCallId, toolName)) return true;\n }\n return false;\n}\n\ninterface EffectiveLeaf {\n leafId: string | null;\n activeToolCallLeafExcluded: boolean;\n}\n\nfunction effectiveLeafForTool(\n sessionManager: ReadonlyParentSessionManager,\n toolCallId: string | undefined,\n toolName: string,\n): EffectiveLeaf {\n const leaf = sessionManager.getLeafEntry();\n if (leaf === undefined)\n return { leafId: sessionManager.getLeafId(), activeToolCallLeafExcluded: false };\n const message = entryMessage(leaf);\n if (message !== undefined && messageContainsToolCall(message, toolCallId, toolName)) {\n return { leafId: leaf.parentId, activeToolCallLeafExcluded: true };\n }\n return { leafId: sessionManager.getLeafId(), activeToolCallLeafExcluded: false };\n}\n\nexport function resolveEffectiveLeaf(\n sessionManager: ReadonlyParentSessionManager,\n options: ParentSnapshotOptions,\n): EffectiveLeaf {\n if (!options.excludeActiveToolCallLeaf)\n return { leafId: sessionManager.getLeafId(), activeToolCallLeafExcluded: false };\n return effectiveLeafForTool(sessionManager, options.toolCallId, options.toolName);\n}\n\n/**\n * Freeze the parent conversation into LLM messages.\n *\n * Callers must complete every downstream use of the returned snapshot without\n * re-reading the session, so the seed cannot drift while a child is being\n * launched.\n */\nexport function snapshotParentConversation(\n ctx: ParentContextSource,\n options: ParentSnapshotOptions,\n): ParentSnapshot {\n const entries = ctx.sessionManager.getEntries();\n const leaf = resolveEffectiveLeaf(ctx.sessionManager, options);\n const sessionContext = buildSessionContext(entries, leaf.leafId, entriesById(entries));\n return {\n messages: convertToLlm(sessionContext.messages),\n leafId: leaf.leafId,\n activeToolCallLeafExcluded: leaf.activeToolCallLeafExcluded,\n };\n}\n"]}