@code-yeongyu/senpi 2026.9.4-2 → 2026.9.4-3

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 (115) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/core/auth-storage.d.ts.map +1 -1
  3. package/dist/core/auth-storage.js +31 -41
  4. package/dist/core/auth-storage.js.map +1 -1
  5. package/dist/core/credential-pool/state-store.d.ts +1 -0
  6. package/dist/core/credential-pool/state-store.d.ts.map +1 -1
  7. package/dist/core/credential-pool/state-store.js +22 -2
  8. package/dist/core/credential-pool/state-store.js.map +1 -1
  9. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  10. package/dist/core/extensions/builtin/goal/store.js +8 -20
  11. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  12. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
  13. package/dist/core/extensions/builtin/hooks/trust-storage.js +3 -1
  14. package/dist/core/extensions/builtin/hooks/trust-storage.js.map +1 -1
  15. package/dist/core/extensions/builtin/imagegen/auth.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/imagegen/auth.js +10 -2
  17. package/dist/core/extensions/builtin/imagegen/auth.js.map +1 -1
  18. package/dist/core/extensions/builtin/loop/store.d.ts +8 -6
  19. package/dist/core/extensions/builtin/loop/store.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/loop/store.js +54 -88
  21. package/dist/core/extensions/builtin/loop/store.js.map +1 -1
  22. package/dist/core/extensions/builtin/monitor-state-event.d.ts +2 -0
  23. package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
  25. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  26. package/dist/core/extensions/builtin/terminal/extension.js +181 -3
  27. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  28. package/dist/core/extensions/builtin/terminal/manager.d.ts +10 -0
  29. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/terminal/manager.js +21 -0
  31. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  32. package/dist/core/extensions/builtin/terminal/manifest-lease.d.ts +24 -0
  33. package/dist/core/extensions/builtin/terminal/manifest-lease.d.ts.map +1 -0
  34. package/dist/core/extensions/builtin/terminal/manifest-lease.js +105 -0
  35. package/dist/core/extensions/builtin/terminal/manifest-lease.js.map +1 -0
  36. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +13 -2
  37. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/terminal/monitor-registry.js +24 -2
  39. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  40. package/dist/core/extensions/builtin/terminal/restore.d.ts +43 -0
  41. package/dist/core/extensions/builtin/terminal/restore.d.ts.map +1 -0
  42. package/dist/core/extensions/builtin/terminal/restore.js +149 -0
  43. package/dist/core/extensions/builtin/terminal/restore.js.map +1 -0
  44. package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts +110 -0
  45. package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts.map +1 -0
  46. package/dist/core/extensions/builtin/terminal/terminal-manifest.js +158 -0
  47. package/dist/core/extensions/builtin/terminal/terminal-manifest.js.map +1 -0
  48. package/dist/core/extensions/builtin/terminal/tools/bash-input.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/terminal/tools/bash-input.js +3 -2
  50. package/dist/core/extensions/builtin/terminal/tools/bash-input.js.map +1 -1
  51. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  52. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +5 -4
  53. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  54. package/dist/core/extensions/builtin/terminal/tools/bash-resize.d.ts.map +1 -1
  55. package/dist/core/extensions/builtin/terminal/tools/bash-resize.js +3 -2
  56. package/dist/core/extensions/builtin/terminal/tools/bash-resize.js.map +1 -1
  57. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +8 -0
  58. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  59. package/dist/core/extensions/builtin/terminal/tools/context.js +10 -0
  60. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  61. package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +5 -4
  63. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
  64. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +4 -1
  65. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  66. package/dist/core/extensions/builtin/terminal/tools/monitor.js +58 -14
  67. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  68. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/tool-search/index.js +1 -1
  70. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -1
  71. package/dist/core/extensions/builtin/tool-search/native-search.d.ts +9 -4
  72. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/tool-search/native-search.js +11 -6
  74. package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -1
  75. package/dist/core/extensions/builtin/tool-search/native-support.d.ts +13 -0
  76. package/dist/core/extensions/builtin/tool-search/native-support.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/tool-search/native-support.js +45 -0
  78. package/dist/core/extensions/builtin/tool-search/native-support.js.map +1 -0
  79. package/dist/core/lockfile-policy.d.ts +11 -0
  80. package/dist/core/lockfile-policy.d.ts.map +1 -1
  81. package/dist/core/lockfile-policy.js +19 -0
  82. package/dist/core/lockfile-policy.js.map +1 -1
  83. package/dist/core/session-sidecar-store.d.ts +62 -0
  84. package/dist/core/session-sidecar-store.d.ts.map +1 -0
  85. package/dist/core/session-sidecar-store.js +149 -0
  86. package/dist/core/session-sidecar-store.js.map +1 -0
  87. package/dist/core/settings-manager.d.ts.map +1 -1
  88. package/dist/core/settings-manager.js +11 -15
  89. package/dist/core/settings-manager.js.map +1 -1
  90. package/dist/modes/app-server/daemon/process.d.ts +33 -3
  91. package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
  92. package/dist/modes/app-server/daemon/process.js +57 -6
  93. package/dist/modes/app-server/daemon/process.js.map +1 -1
  94. package/dist/modes/app-server/daemon.js +9 -1
  95. package/dist/modes/app-server/daemon.js.map +1 -1
  96. package/dist/modes/rpc/host-ensure.d.ts +2 -0
  97. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  98. package/dist/modes/rpc/host-ensure.js +77 -18
  99. package/dist/modes/rpc/host-ensure.js.map +1 -1
  100. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +14 -0
  101. package/node_modules/@code-yeongyu/senpi-codemode/package.json +5 -5
  102. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +1 -1
  103. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  104. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +4 -4
  105. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  108. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  109. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +3 -0
  110. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  111. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  112. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  113. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  114. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  115. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atomic, versioned, per-session sidecar store for `/loop` state.\n *\n * Mirrors the goal store's persistence discipline (temp file + rename, per-file mutation\n * serialization, strict versioned parsing) because scheduler state must never be half\n * written or silently reset: a corrupt file arms nothing and surfaces a typed error so\n * the extension can end affected loops with `error` instead of guessing.\n *\n * Session custom entries are deliberately NOT the authoritative store: they are branch\n * nodes, so a globally scanned \"latest\" entry can come from an abandoned branch, while\n * loop schedules are session-scoped.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n\ttype CronEntry,\n\ttype DynamicCronEntry,\n\tEFFECTIVE_INTERVAL_UNITS,\n\ttype EffectiveInterval,\n\ttype EffectiveIntervalUnit,\n\ttype EpochMs,\n\ttype FixedCronEntry,\n\tisRecord,\n\tLOOP_END_REASONS,\n\tLOOP_PHASES,\n\tLOOP_SENTINELS,\n\tLOOP_STATE_VERSION,\n\tLOOP_WAKE_SOURCE_KINDS,\n\ttype LoopEndReason,\n\ttype LoopEntryFields,\n\ttype LoopFileFingerprint,\n\ttype LoopLifecycle,\n\ttype LoopPayload,\n\ttype LoopPhase,\n\ttype LoopSentinel,\n\ttype LoopState,\n\ttype LoopStoreRef,\n\ttype LoopWakeSource,\n\ttype LoopWakeSourceKind,\n\ttype PendingWakeup,\n\tREQUESTED_INTERVAL_UNITS,\n\ttype RequestedInterval,\n\ttype RequestedIntervalUnit,\n\ttype SentinelDeliveryState,\n} from \"./types.ts\";\n\nexport class InvalidLoopStoreError extends Error {\n\tconstructor(message: string, options?: { cause?: unknown }) {\n\t\tsuper(message, options);\n\t\tthis.name = \"InvalidLoopStoreError\";\n\t}\n}\n\nexport class UnsupportedLoopStoreVersionError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"UnsupportedLoopStoreVersionError\";\n\t}\n}\n\n/** Mutation callback. May be async; its result becomes the next persisted state. */\nexport type LoopStateMutation = (current: LoopState) => LoopState | Promise<LoopState>;\n\nconst mutationTails = new Map<string, Promise<void>>();\nconst snapshots = new Map<string, LoopState>();\n\nexport function encodedSessionId(ref: LoopStoreRef): string {\n\treturn encodeURIComponent(ref.sessionId);\n}\n\nexport function loopStateFilePath(ref: LoopStoreRef): string {\n\treturn join(ref.baseDir, `${encodedSessionId(ref)}.json`);\n}\n\nexport function emptyLoopState(sessionId: string): LoopState {\n\treturn { version: LOOP_STATE_VERSION, sessionId, entries: {}, activeDynamicId: null, updatedAt: 0 };\n}\n\n/**\n * Reads persisted state, or null when this session has never persisted any loop.\n * Throws {@link InvalidLoopStoreError} / {@link UnsupportedLoopStoreVersionError} on\n * unusable state so callers fail closed rather than resetting a user's schedule.\n */\nexport async function readLoopState(ref: LoopStoreRef): Promise<LoopState | null> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(loopStateFilePath(ref), \"utf8\");\n\t} catch (error) {\n\t\tif (isFileSystemError(error, \"ENOENT\")) return null;\n\t\tthrow error;\n\t}\n\tconst state = parseLoopState(raw, ref);\n\tsnapshots.set(loopStateFilePath(ref), state);\n\treturn state;\n}\n\n/** Like {@link readLoopState}, but returns an empty state when nothing is persisted. */\nexport async function loadLoopState(ref: LoopStoreRef): Promise<LoopState> {\n\treturn (await readLoopState(ref)) ?? emptyLoopState(ref.sessionId);\n}\n\n/**\n * Last successfully loaded or written state for this ref, for synchronous consumers\n * (status line, tick attribution). Undefined until the store has been touched.\n */\nexport function snapshotLoopState(ref: LoopStoreRef): LoopState | undefined {\n\treturn snapshots.get(loopStateFilePath(ref));\n}\n\n/**\n * Serializes read-modify-write cycles through a per-file promise tail so command,\n * timer, tool, and lifecycle writes cannot interleave and lose an update.\n */\nexport function mutateLoopState(ref: LoopStoreRef, mutation: LoopStateMutation): Promise<LoopState> {\n\treturn enqueue(ref, async () => {\n\t\tconst current = await loadLoopState(ref);\n\t\tconst next = await mutation(current);\n\t\tawait writeLoopState(ref, next);\n\t\treturn next;\n\t});\n}\n\n/** Persists a complete state atomically. Prefer {@link mutateLoopState} for updates. */\nexport async function writeLoopState(ref: LoopStoreRef, state: LoopState): Promise<void> {\n\tconst filePath = loopStateFilePath(ref);\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tawait writeAtomic(filePath, `${JSON.stringify(state, null, 2)}\\n`);\n\tsnapshots.set(filePath, state);\n}\n\n/** Drops cached snapshots; used when a session ends or tests reset global state. */\nexport function clearLoopStateSnapshot(ref: LoopStoreRef): void {\n\tsnapshots.delete(loopStateFilePath(ref));\n}\n\nfunction enqueue<T>(ref: LoopStoreRef, operation: () => Promise<T>): Promise<T> {\n\tconst key = loopStateFilePath(ref);\n\tconst previous = mutationTails.get(key) ?? Promise.resolve();\n\tconst run = previous.then(operation);\n\tconst tail = run.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t);\n\tmutationTails.set(key, tail);\n\tvoid tail.then(() => {\n\t\tif (mutationTails.get(key) === tail) mutationTails.delete(key);\n\t});\n\treturn run;\n}\n\nasync function writeAtomic(filePath: string, contents: string): Promise<void> {\n\tconst tempPath = join(dirname(filePath), `.loop-${randomUUID()}.tmp`);\n\ttry {\n\t\tawait writeFile(tempPath, contents, { encoding: \"utf8\", mode: 0o600 });\n\t\tawait rename(tempPath, filePath);\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait rm(tempPath, { force: true });\n\t\t} catch (cleanupError) {\n\t\t\tthrow new AggregateError(\n\t\t\t\t[error, cleanupError],\n\t\t\t\t\"loop store write failed and its temporary file could not be removed\",\n\t\t\t);\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction parseLoopState(raw: string, ref: LoopStoreRef): LoopState {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\tthrow new InvalidLoopStoreError(\"loop store contains unparseable JSON\", { cause: error });\n\t}\n\tif (!isRecord(parsed)) throw new InvalidLoopStoreError(\"loop store must be a JSON object\");\n\tif (parsed.version !== LOOP_STATE_VERSION) {\n\t\tthrow new UnsupportedLoopStoreVersionError(\n\t\t\t`unsupported loop store version: ${JSON.stringify(parsed.version)} (expected ${LOOP_STATE_VERSION})`,\n\t\t);\n\t}\n\tif (typeof parsed.sessionId !== \"string\" || parsed.sessionId.length === 0) {\n\t\tthrow new InvalidLoopStoreError(\"loop store is missing a sessionId\");\n\t}\n\tif (parsed.sessionId !== ref.sessionId) {\n\t\tthrow new InvalidLoopStoreError(\n\t\t\t`loop store sessionId ${parsed.sessionId} does not match the session it was loaded for`,\n\t\t);\n\t}\n\tif (!isEpochMs(parsed.updatedAt)) throw new InvalidLoopStoreError(\"loop store has an invalid updatedAt\");\n\tif (!isRecord(parsed.entries)) throw new InvalidLoopStoreError(\"loop store entries must be an object\");\n\n\tconst entries: Record<string, CronEntry> = {};\n\tfor (const [id, value] of Object.entries(parsed.entries)) {\n\t\tconst entry = parseEntry(id, value);\n\t\tentries[id] = entry;\n\t}\n\n\tconst activeDynamicId = parsed.activeDynamicId;\n\tif (activeDynamicId !== null) {\n\t\tif (typeof activeDynamicId !== \"string\") {\n\t\t\tthrow new InvalidLoopStoreError(\"loop store activeDynamicId must be a string or null\");\n\t\t}\n\t\tconst active = entries[activeDynamicId];\n\t\tif (active === undefined || active.kind !== \"dynamic\") {\n\t\t\tthrow new InvalidLoopStoreError(`loop store activeDynamicId ${activeDynamicId} does not name a dynamic loop`);\n\t\t}\n\t}\n\n\treturn {\n\t\tversion: LOOP_STATE_VERSION,\n\t\tsessionId: parsed.sessionId,\n\t\tentries,\n\t\tactiveDynamicId,\n\t\tupdatedAt: parsed.updatedAt,\n\t};\n}\n\nfunction parseEntry(id: string, value: unknown): CronEntry {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} is not an object`);\n\tif (value.id !== id) throw new InvalidLoopStoreError(`loop entry ${id} carries a mismatched id`);\n\tconst kind = value.kind;\n\tif (kind !== \"fixed\" && kind !== \"dynamic\") throw new InvalidLoopStoreError(`loop entry ${id} has an unknown kind`);\n\n\tconst base = parseEntryFields(id, value);\n\tif (kind === \"fixed\") {\n\t\tconst fixed: FixedCronEntry = {\n\t\t\t...base,\n\t\t\tkind: \"fixed\",\n\t\t\trequestedInterval: parseRequestedInterval(id, value.requestedInterval),\n\t\t\teffectiveInterval: parseEffectiveInterval(id, value.effectiveInterval),\n\t\t\tcronExpression: requireString(id, \"cronExpression\", value.cronExpression),\n\t\t\tnextFireAt: requireEpochMs(id, \"nextFireAt\", value.nextFireAt),\n\t\t\tintervalMs: requirePositiveInteger(id, \"intervalMs\", value.intervalMs),\n\t\t};\n\t\treturn fixed;\n\t}\n\n\tconst keepaliveCredit = value.keepaliveCredit;\n\tif (keepaliveCredit !== 0 && keepaliveCredit !== 1) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid keepaliveCredit`);\n\t}\n\tconst dynamic: DynamicCronEntry = {\n\t\t...base,\n\t\tkind: \"dynamic\",\n\t\tpendingWakeup: parsePendingWakeup(id, value.pendingWakeup),\n\t\tkeepaliveCredit,\n\t};\n\treturn dynamic;\n}\n\nfunction parseEntryFields(id: string, value: Record<string, unknown>): LoopEntryFields & LoopLifecycle {\n\tconst fields = {\n\t\tid,\n\t\toriginalArgs: requireString(id, \"originalArgs\", value.originalArgs, { allowEmpty: true }),\n\t\treentryPrompt: requireString(id, \"reentryPrompt\", value.reentryPrompt),\n\t\tpayload: parsePayload(id, value.payload),\n\t\tcreatedAt: requireEpochMs(id, \"createdAt\", value.createdAt),\n\t\tlastFiredAt: parseNullableEpochMs(id, \"lastFiredAt\", value.lastFiredAt),\n\t\texpiresAt: requireEpochMs(id, \"expiresAt\", value.expiresAt),\n\t\tlastScheduledForAt: parseNullableEpochMs(id, \"lastScheduledForAt\", value.lastScheduledForAt),\n\t\tcoalescedFirePending: requireBoolean(id, \"coalescedFirePending\", value.coalescedFirePending),\n\t\tqueuedForAt: parseNullableEpochMs(id, \"queuedForAt\", value.queuedForAt),\n\t\tnoopStreak: requireNonNegativeInteger(id, \"noopStreak\", value.noopStreak),\n\t\ttickCount: requireNonNegativeInteger(id, \"tickCount\", value.tickCount),\n\t\tsentinelDelivery: parseSentinelDelivery(id, value.sentinelDelivery),\n\t\twakeSources: parseWakeSources(id, value.wakeSources),\n\t};\n\treturn { ...fields, ...parseLifecycle(id, value) };\n}\n\ntype ParsedLifecycle =\n\t| { phase: Exclude<LoopPhase, \"ended\"> }\n\t| { phase: \"ended\"; endedAt: EpochMs; endReason: LoopEndReason; endDetail?: string };\n\nfunction parseLifecycle(id: string, value: Record<string, unknown>): ParsedLifecycle {\n\tconst phase = value.phase;\n\tif (typeof phase !== \"string\" || !isLoopPhase(phase)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid phase`);\n\t}\n\tif (phase !== \"ended\") {\n\t\tif (value.endedAt !== undefined || value.endReason !== undefined || value.endDetail !== undefined) {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} carries terminal fields while not ended`);\n\t\t}\n\t\treturn { phase };\n\t}\n\tconst endReason = value.endReason;\n\tif (typeof endReason !== \"string\" || !isLoopEndReason(endReason)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid endReason`);\n\t}\n\tconst endDetail = value.endDetail;\n\tif (endDetail !== undefined && typeof endDetail !== \"string\") {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid endDetail`);\n\t}\n\treturn {\n\t\tphase: \"ended\",\n\t\tendedAt: requireEpochMs(id, \"endedAt\", value.endedAt),\n\t\tendReason,\n\t\t...(endDetail === undefined ? {} : { endDetail }),\n\t};\n}\n\nfunction parsePayload(id: string, value: unknown): LoopPayload {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid payload`);\n\tif (value.type === \"prompt\") {\n\t\treturn { type: \"prompt\", prompt: requireString(id, \"payload.prompt\", value.prompt) };\n\t}\n\tif (value.type === \"sentinel\") {\n\t\tconst sentinel = value.sentinel;\n\t\tif (typeof sentinel !== \"string\" || !isLoopSentinel(sentinel)) {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an unknown payload sentinel`);\n\t\t}\n\t\treturn { type: \"sentinel\", sentinel };\n\t}\n\tthrow new InvalidLoopStoreError(`loop entry ${id} has an unknown payload type`);\n}\n\nfunction parseSentinelDelivery(id: string, value: unknown): SentinelDeliveryState {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid sentinelDelivery`);\n\treturn {\n\t\tautonomousPreambleDelivered: requireBoolean(\n\t\t\tid,\n\t\t\t\"sentinelDelivery.autonomousPreambleDelivered\",\n\t\t\tvalue.autonomousPreambleDelivered,\n\t\t),\n\t\tlastLoopFileDelivered: parseFingerprint(id, value.lastLoopFileDelivered),\n\t\tforceFullDelivery: requireBoolean(id, \"sentinelDelivery.forceFullDelivery\", value.forceFullDelivery),\n\t};\n}\n\nfunction parseFingerprint(id: string, value: unknown): LoopFileFingerprint | null {\n\tif (value === null) return null;\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid loop-file fingerprint`);\n\treturn {\n\t\tpath: requireString(id, \"fingerprint.path\", value.path),\n\t\tmtimeMs: requireFiniteNumber(id, \"fingerprint.mtimeMs\", value.mtimeMs),\n\t\tsize: requireNonNegativeInteger(id, \"fingerprint.size\", value.size),\n\t\tcontentHash: requireString(id, \"fingerprint.contentHash\", value.contentHash),\n\t\tanchorDeliveryId: requireString(id, \"fingerprint.anchorDeliveryId\", value.anchorDeliveryId),\n\t};\n}\n\nfunction parseWakeSources(id: string, value: unknown): readonly LoopWakeSource[] {\n\tif (!Array.isArray(value)) throw new InvalidLoopStoreError(`loop entry ${id} has invalid wakeSources`);\n\treturn value.map((candidate): LoopWakeSource => {\n\t\tif (!isRecord(candidate)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source`);\n\t\tconst source = candidate.source;\n\t\tif (typeof source !== \"string\" || !isWakeSourceKind(source)) {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an unknown wake source kind`);\n\t\t}\n\t\tconst description = candidate.description;\n\t\tif (description !== undefined && typeof description !== \"string\") {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source description`);\n\t\t}\n\t\treturn {\n\t\t\tsource,\n\t\t\tid: requireString(id, \"wakeSource.id\", candidate.id),\n\t\t\tcreatedAt: requireEpochMs(id, \"wakeSource.createdAt\", candidate.createdAt),\n\t\t\t...(description === undefined ? {} : { description }),\n\t\t};\n\t});\n}\n\nfunction parsePendingWakeup(id: string, value: unknown): PendingWakeup | null {\n\tif (value === null || value === undefined) return null;\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup`);\n\tconst source = value.source;\n\tif (source !== \"model\" && source !== \"keepalive\") {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup source`);\n\t}\n\tif (value.kind !== \"dynamic\") throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup kind`);\n\treturn {\n\t\tid: requireString(id, \"pendingWakeup.id\", value.id),\n\t\tloopId: requireString(id, \"pendingWakeup.loopId\", value.loopId),\n\t\tkind: \"dynamic\",\n\t\tsource,\n\t\trequestedDelaySeconds: requireFiniteNumber(\n\t\t\tid,\n\t\t\t\"pendingWakeup.requestedDelaySeconds\",\n\t\t\tvalue.requestedDelaySeconds,\n\t\t),\n\t\tdelaySeconds: requirePositiveInteger(id, \"pendingWakeup.delaySeconds\", value.delaySeconds),\n\t\tdueAt: requireEpochMs(id, \"pendingWakeup.dueAt\", value.dueAt),\n\t\treason: requireString(id, \"pendingWakeup.reason\", value.reason),\n\t\tprompt: requireString(id, \"pendingWakeup.prompt\", value.prompt),\n\t\tnoop: requireBoolean(id, \"pendingWakeup.noop\", value.noop),\n\t\tcreatedAt: requireEpochMs(id, \"pendingWakeup.createdAt\", value.createdAt),\n\t};\n}\n\nfunction parseRequestedInterval(id: string, value: unknown): RequestedInterval {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval`);\n\tconst unit = value.unit;\n\tif (typeof unit !== \"string\" || !isRequestedIntervalUnit(unit)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval unit`);\n\t}\n\treturn {\n\t\tvalue: requirePositiveInteger(id, \"requestedInterval.value\", value.value),\n\t\tunit,\n\t\traw: requireString(id, \"requestedInterval.raw\", value.raw),\n\t};\n}\n\nfunction parseEffectiveInterval(id: string, value: unknown): EffectiveInterval {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval`);\n\tconst unit = value.unit;\n\tif (typeof unit !== \"string\" || !isEffectiveIntervalUnit(unit)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval unit`);\n\t}\n\tconst roundingNotice = value.roundingNotice;\n\tif (roundingNotice !== undefined && typeof roundingNotice !== \"string\") {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval roundingNotice`);\n\t}\n\treturn {\n\t\tvalue: requirePositiveInteger(id, \"effectiveInterval.value\", value.value),\n\t\tunit,\n\t\thuman: requireString(id, \"effectiveInterval.human\", value.human),\n\t\trounded: requireBoolean(id, \"effectiveInterval.rounded\", value.rounded),\n\t\t...(roundingNotice === undefined ? {} : { roundingNotice }),\n\t};\n}\n\nfunction requireString(id: string, field: string, value: unknown, options?: { allowEmpty?: boolean }): string {\n\tif (typeof value !== \"string\" || (options?.allowEmpty !== true && value.length === 0)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value;\n}\n\nfunction requireBoolean(id: string, field: string, value: unknown): boolean {\n\tif (typeof value !== \"boolean\") throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\treturn value;\n}\n\nfunction requireFiniteNumber(id: string, field: string, value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value;\n}\n\nfunction requireNonNegativeInteger(id: string, field: string, value: unknown): number {\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value as number;\n}\n\nfunction requirePositiveInteger(id: string, field: string, value: unknown): number {\n\tif (!Number.isSafeInteger(value) || (value as number) <= 0) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value as number;\n}\n\nfunction requireEpochMs(id: string, field: string, value: unknown): EpochMs {\n\tif (!isEpochMs(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\treturn value;\n}\n\nfunction parseNullableEpochMs(id: string, field: string, value: unknown): EpochMs | null {\n\tif (value === null || value === undefined) return null;\n\treturn requireEpochMs(id, field, value);\n}\n\nfunction isEpochMs(value: unknown): value is EpochMs {\n\treturn Number.isSafeInteger(value) && (value as number) >= 0;\n}\n\nfunction isLoopPhase(value: string): value is LoopPhase {\n\treturn (LOOP_PHASES as readonly string[]).includes(value);\n}\n\nfunction isLoopEndReason(value: string): value is LoopEndReason {\n\treturn (LOOP_END_REASONS as readonly string[]).includes(value);\n}\n\nfunction isLoopSentinel(value: string): value is LoopSentinel {\n\treturn (LOOP_SENTINELS as readonly string[]).includes(value);\n}\n\nfunction isWakeSourceKind(value: string): value is LoopWakeSourceKind {\n\treturn (LOOP_WAKE_SOURCE_KINDS as readonly string[]).includes(value);\n}\n\nfunction isRequestedIntervalUnit(value: string): value is RequestedIntervalUnit {\n\treturn (REQUESTED_INTERVAL_UNITS as readonly string[]).includes(value);\n}\n\nfunction isEffectiveIntervalUnit(value: string): value is EffectiveIntervalUnit {\n\treturn (EFFECTIVE_INTERVAL_UNITS as readonly string[]).includes(value);\n}\n\nfunction isFileSystemError(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atomic, versioned, per-session sidecar store for `/loop` state.\n *\n * Persistence (temp file + rename, per-file mutation serialization, envelope\n * version/session checks) lives in the shared session sidecar primitive. This\n * module supplies the loop domain parser and keeps the historical exported\n * surface so callers continue to catch {@link InvalidLoopStoreError} /\n * {@link UnsupportedLoopStoreVersionError} by name.\n *\n * Session custom entries are deliberately NOT the authoritative store: they are branch\n * nodes, so a globally scanned \"latest\" entry can come from an abandoned branch, while\n * loop schedules are session-scoped.\n */\n\nimport {\n\tcreateSidecarStore,\n\tencodedSessionId as encodeSidecarSessionId,\n\tInvalidSidecarStoreError,\n\ttype SidecarStore,\n\ttype SidecarStoreRef,\n\tsidecarFilePath,\n\tUnsupportedSidecarStoreVersionError,\n} from \"../../../session-sidecar-store.ts\";\nimport {\n\ttype CronEntry,\n\ttype DynamicCronEntry,\n\tEFFECTIVE_INTERVAL_UNITS,\n\ttype EffectiveInterval,\n\ttype EffectiveIntervalUnit,\n\ttype EpochMs,\n\ttype FixedCronEntry,\n\tisRecord,\n\tLOOP_END_REASONS,\n\tLOOP_PHASES,\n\tLOOP_SENTINELS,\n\tLOOP_STATE_VERSION,\n\tLOOP_WAKE_SOURCE_KINDS,\n\ttype LoopEndReason,\n\ttype LoopEntryFields,\n\ttype LoopFileFingerprint,\n\ttype LoopLifecycle,\n\ttype LoopPayload,\n\ttype LoopPhase,\n\ttype LoopSentinel,\n\ttype LoopState,\n\ttype LoopStoreRef,\n\ttype LoopWakeSource,\n\ttype LoopWakeSourceKind,\n\ttype PendingWakeup,\n\tREQUESTED_INTERVAL_UNITS,\n\ttype RequestedInterval,\n\ttype RequestedIntervalUnit,\n\ttype SentinelDeliveryState,\n} from \"./types.ts\";\n\nexport class InvalidLoopStoreError extends InvalidSidecarStoreError {\n\tconstructor(message: string, options?: { cause?: unknown }) {\n\t\tsuper(message, options);\n\t\tthis.name = \"InvalidLoopStoreError\";\n\t}\n}\n\nexport class UnsupportedLoopStoreVersionError extends UnsupportedSidecarStoreVersionError {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"UnsupportedLoopStoreVersionError\";\n\t}\n}\n\n/** Mutation callback. May be async; its result becomes the next persisted state. */\nexport type LoopStateMutation = (current: LoopState) => LoopState | Promise<LoopState>;\n\nconst stores = new Map<string, SidecarStore<LoopState>>();\n\nexport function encodedSessionId(ref: LoopStoreRef): string {\n\treturn encodeSidecarSessionId(ref.sessionId);\n}\n\nexport function loopStateFilePath(ref: LoopStoreRef): string {\n\treturn sidecarFilePath(ref);\n}\n\nexport function emptyLoopState(sessionId: string): LoopState {\n\treturn { version: LOOP_STATE_VERSION, sessionId, entries: {}, activeDynamicId: null, updatedAt: 0 };\n}\n\nfunction storeFor(ref: LoopStoreRef): SidecarStore<LoopState> {\n\tconst filePath = loopStateFilePath(ref);\n\tconst existing = stores.get(filePath);\n\tif (existing !== undefined) return existing;\n\tconst store = createSidecarStore<LoopState>({\n\t\tbaseDir: ref.baseDir,\n\t\tsessionId: ref.sessionId,\n\t\tversion: LOOP_STATE_VERSION,\n\t\ttempPrefix: \"loop\",\n\t\tparse: parseLoopPayload,\n\t});\n\tstores.set(filePath, store);\n\treturn store;\n}\n\nfunction remapLoopStoreError(error: unknown): never {\n\tif (error instanceof InvalidLoopStoreError || error instanceof UnsupportedLoopStoreVersionError) {\n\t\tthrow error;\n\t}\n\tif (error instanceof UnsupportedSidecarStoreVersionError) {\n\t\tthrow new UnsupportedLoopStoreVersionError(error.message.replaceAll(\"sidecar store\", \"loop store\"));\n\t}\n\tif (error instanceof InvalidSidecarStoreError) {\n\t\tthrow new InvalidLoopStoreError(error.message.replaceAll(\"sidecar store\", \"loop store\"), { cause: error });\n\t}\n\tthrow error;\n}\n\n/**\n * Reads persisted state, or null when this session has never persisted any loop.\n * Throws {@link InvalidLoopStoreError} / {@link UnsupportedLoopStoreVersionError} on\n * unusable state so callers fail closed rather than resetting a user's schedule.\n */\nexport async function readLoopState(ref: LoopStoreRef): Promise<LoopState | null> {\n\ttry {\n\t\treturn await storeFor(ref).read();\n\t} catch (error) {\n\t\tremapLoopStoreError(error);\n\t}\n}\n\n/** Like {@link readLoopState}, but returns an empty state when nothing is persisted. */\nexport async function loadLoopState(ref: LoopStoreRef): Promise<LoopState> {\n\treturn (await readLoopState(ref)) ?? emptyLoopState(ref.sessionId);\n}\n\n/**\n * Last successfully loaded or written state for this ref, for synchronous consumers\n * (status line, tick attribution). Undefined until the store has been touched.\n */\nexport function snapshotLoopState(ref: LoopStoreRef): LoopState | undefined {\n\treturn storeFor(ref).snapshot();\n}\n\n/**\n * Serializes read-modify-write cycles through a per-file promise tail so command,\n * timer, tool, and lifecycle writes cannot interleave and lose an update.\n */\nexport function mutateLoopState(ref: LoopStoreRef, mutation: LoopStateMutation): Promise<LoopState> {\n\treturn storeFor(ref)\n\t\t.mutate((current) => mutation(current ?? emptyLoopState(ref.sessionId)))\n\t\t.catch((error: unknown) => remapLoopStoreError(error));\n}\n\n/** Persists a complete state atomically. Prefer {@link mutateLoopState} for updates. */\nexport async function writeLoopState(ref: LoopStoreRef, state: LoopState): Promise<void> {\n\tawait storeFor(ref).write(state);\n}\n\n/** Drops cached snapshots; used when a session ends or tests reset global state. */\nexport function clearLoopStateSnapshot(ref: LoopStoreRef): void {\n\tstoreFor(ref).clear();\n}\n\nfunction parseLoopPayload(raw: unknown, ref: SidecarStoreRef): LoopState {\n\tif (!isRecord(raw)) throw new InvalidLoopStoreError(\"loop store must be a JSON object\");\n\tif (!isEpochMs(raw.updatedAt)) throw new InvalidLoopStoreError(\"loop store has an invalid updatedAt\");\n\tif (!isRecord(raw.entries)) throw new InvalidLoopStoreError(\"loop store entries must be an object\");\n\n\tconst entries: Record<string, CronEntry> = {};\n\tfor (const [id, value] of Object.entries(raw.entries)) {\n\t\tconst entry = parseEntry(id, value);\n\t\tentries[id] = entry;\n\t}\n\n\tconst activeDynamicId = raw.activeDynamicId;\n\tif (activeDynamicId !== null) {\n\t\tif (typeof activeDynamicId !== \"string\") {\n\t\t\tthrow new InvalidLoopStoreError(\"loop store activeDynamicId must be a string or null\");\n\t\t}\n\t\tconst active = entries[activeDynamicId];\n\t\tif (active === undefined || active.kind !== \"dynamic\") {\n\t\t\tthrow new InvalidLoopStoreError(`loop store activeDynamicId ${activeDynamicId} does not name a dynamic loop`);\n\t\t}\n\t}\n\n\treturn {\n\t\tversion: LOOP_STATE_VERSION,\n\t\tsessionId: ref.sessionId,\n\t\tentries,\n\t\tactiveDynamicId,\n\t\tupdatedAt: raw.updatedAt,\n\t};\n}\n\nfunction parseEntry(id: string, value: unknown): CronEntry {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} is not an object`);\n\tif (value.id !== id) throw new InvalidLoopStoreError(`loop entry ${id} carries a mismatched id`);\n\tconst kind = value.kind;\n\tif (kind !== \"fixed\" && kind !== \"dynamic\") throw new InvalidLoopStoreError(`loop entry ${id} has an unknown kind`);\n\n\tconst base = parseEntryFields(id, value);\n\tif (kind === \"fixed\") {\n\t\tconst fixed: FixedCronEntry = {\n\t\t\t...base,\n\t\t\tkind: \"fixed\",\n\t\t\trequestedInterval: parseRequestedInterval(id, value.requestedInterval),\n\t\t\teffectiveInterval: parseEffectiveInterval(id, value.effectiveInterval),\n\t\t\tcronExpression: requireString(id, \"cronExpression\", value.cronExpression),\n\t\t\tnextFireAt: requireEpochMs(id, \"nextFireAt\", value.nextFireAt),\n\t\t\tintervalMs: requirePositiveInteger(id, \"intervalMs\", value.intervalMs),\n\t\t};\n\t\treturn fixed;\n\t}\n\n\tconst keepaliveCredit = value.keepaliveCredit;\n\tif (keepaliveCredit !== 0 && keepaliveCredit !== 1) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid keepaliveCredit`);\n\t}\n\tconst dynamic: DynamicCronEntry = {\n\t\t...base,\n\t\tkind: \"dynamic\",\n\t\tpendingWakeup: parsePendingWakeup(id, value.pendingWakeup),\n\t\tkeepaliveCredit,\n\t};\n\treturn dynamic;\n}\n\nfunction parseEntryFields(id: string, value: Record<string, unknown>): LoopEntryFields & LoopLifecycle {\n\tconst fields = {\n\t\tid,\n\t\toriginalArgs: requireString(id, \"originalArgs\", value.originalArgs, { allowEmpty: true }),\n\t\treentryPrompt: requireString(id, \"reentryPrompt\", value.reentryPrompt),\n\t\tpayload: parsePayload(id, value.payload),\n\t\tcreatedAt: requireEpochMs(id, \"createdAt\", value.createdAt),\n\t\tlastFiredAt: parseNullableEpochMs(id, \"lastFiredAt\", value.lastFiredAt),\n\t\texpiresAt: requireEpochMs(id, \"expiresAt\", value.expiresAt),\n\t\tlastScheduledForAt: parseNullableEpochMs(id, \"lastScheduledForAt\", value.lastScheduledForAt),\n\t\tcoalescedFirePending: requireBoolean(id, \"coalescedFirePending\", value.coalescedFirePending),\n\t\tqueuedForAt: parseNullableEpochMs(id, \"queuedForAt\", value.queuedForAt),\n\t\tnoopStreak: requireNonNegativeInteger(id, \"noopStreak\", value.noopStreak),\n\t\ttickCount: requireNonNegativeInteger(id, \"tickCount\", value.tickCount),\n\t\tsentinelDelivery: parseSentinelDelivery(id, value.sentinelDelivery),\n\t\twakeSources: parseWakeSources(id, value.wakeSources),\n\t};\n\treturn { ...fields, ...parseLifecycle(id, value) };\n}\n\ntype ParsedLifecycle =\n\t| { phase: Exclude<LoopPhase, \"ended\"> }\n\t| { phase: \"ended\"; endedAt: EpochMs; endReason: LoopEndReason; endDetail?: string };\n\nfunction parseLifecycle(id: string, value: Record<string, unknown>): ParsedLifecycle {\n\tconst phase = value.phase;\n\tif (typeof phase !== \"string\" || !isLoopPhase(phase)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid phase`);\n\t}\n\tif (phase !== \"ended\") {\n\t\tif (value.endedAt !== undefined || value.endReason !== undefined || value.endDetail !== undefined) {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} carries terminal fields while not ended`);\n\t\t}\n\t\treturn { phase };\n\t}\n\tconst endReason = value.endReason;\n\tif (typeof endReason !== \"string\" || !isLoopEndReason(endReason)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid endReason`);\n\t}\n\tconst endDetail = value.endDetail;\n\tif (endDetail !== undefined && typeof endDetail !== \"string\") {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid endDetail`);\n\t}\n\treturn {\n\t\tphase: \"ended\",\n\t\tendedAt: requireEpochMs(id, \"endedAt\", value.endedAt),\n\t\tendReason,\n\t\t...(endDetail === undefined ? {} : { endDetail }),\n\t};\n}\n\nfunction parsePayload(id: string, value: unknown): LoopPayload {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid payload`);\n\tif (value.type === \"prompt\") {\n\t\treturn { type: \"prompt\", prompt: requireString(id, \"payload.prompt\", value.prompt) };\n\t}\n\tif (value.type === \"sentinel\") {\n\t\tconst sentinel = value.sentinel;\n\t\tif (typeof sentinel !== \"string\" || !isLoopSentinel(sentinel)) {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an unknown payload sentinel`);\n\t\t}\n\t\treturn { type: \"sentinel\", sentinel };\n\t}\n\tthrow new InvalidLoopStoreError(`loop entry ${id} has an unknown payload type`);\n}\n\nfunction parseSentinelDelivery(id: string, value: unknown): SentinelDeliveryState {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid sentinelDelivery`);\n\treturn {\n\t\tautonomousPreambleDelivered: requireBoolean(\n\t\t\tid,\n\t\t\t\"sentinelDelivery.autonomousPreambleDelivered\",\n\t\t\tvalue.autonomousPreambleDelivered,\n\t\t),\n\t\tlastLoopFileDelivered: parseFingerprint(id, value.lastLoopFileDelivered),\n\t\tforceFullDelivery: requireBoolean(id, \"sentinelDelivery.forceFullDelivery\", value.forceFullDelivery),\n\t};\n}\n\nfunction parseFingerprint(id: string, value: unknown): LoopFileFingerprint | null {\n\tif (value === null) return null;\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid loop-file fingerprint`);\n\treturn {\n\t\tpath: requireString(id, \"fingerprint.path\", value.path),\n\t\tmtimeMs: requireFiniteNumber(id, \"fingerprint.mtimeMs\", value.mtimeMs),\n\t\tsize: requireNonNegativeInteger(id, \"fingerprint.size\", value.size),\n\t\tcontentHash: requireString(id, \"fingerprint.contentHash\", value.contentHash),\n\t\tanchorDeliveryId: requireString(id, \"fingerprint.anchorDeliveryId\", value.anchorDeliveryId),\n\t};\n}\n\nfunction parseWakeSources(id: string, value: unknown): readonly LoopWakeSource[] {\n\tif (!Array.isArray(value)) throw new InvalidLoopStoreError(`loop entry ${id} has invalid wakeSources`);\n\treturn value.map((candidate): LoopWakeSource => {\n\t\tif (!isRecord(candidate)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source`);\n\t\tconst source = candidate.source;\n\t\tif (typeof source !== \"string\" || !isWakeSourceKind(source)) {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an unknown wake source kind`);\n\t\t}\n\t\tconst description = candidate.description;\n\t\tif (description !== undefined && typeof description !== \"string\") {\n\t\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source description`);\n\t\t}\n\t\treturn {\n\t\t\tsource,\n\t\t\tid: requireString(id, \"wakeSource.id\", candidate.id),\n\t\t\tcreatedAt: requireEpochMs(id, \"wakeSource.createdAt\", candidate.createdAt),\n\t\t\t...(description === undefined ? {} : { description }),\n\t\t};\n\t});\n}\n\nfunction parsePendingWakeup(id: string, value: unknown): PendingWakeup | null {\n\tif (value === null || value === undefined) return null;\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup`);\n\tconst source = value.source;\n\tif (source !== \"model\" && source !== \"keepalive\") {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup source`);\n\t}\n\tif (value.kind !== \"dynamic\") throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup kind`);\n\treturn {\n\t\tid: requireString(id, \"pendingWakeup.id\", value.id),\n\t\tloopId: requireString(id, \"pendingWakeup.loopId\", value.loopId),\n\t\tkind: \"dynamic\",\n\t\tsource,\n\t\trequestedDelaySeconds: requireFiniteNumber(\n\t\t\tid,\n\t\t\t\"pendingWakeup.requestedDelaySeconds\",\n\t\t\tvalue.requestedDelaySeconds,\n\t\t),\n\t\tdelaySeconds: requirePositiveInteger(id, \"pendingWakeup.delaySeconds\", value.delaySeconds),\n\t\tdueAt: requireEpochMs(id, \"pendingWakeup.dueAt\", value.dueAt),\n\t\treason: requireString(id, \"pendingWakeup.reason\", value.reason),\n\t\tprompt: requireString(id, \"pendingWakeup.prompt\", value.prompt),\n\t\tnoop: requireBoolean(id, \"pendingWakeup.noop\", value.noop),\n\t\tcreatedAt: requireEpochMs(id, \"pendingWakeup.createdAt\", value.createdAt),\n\t};\n}\n\nfunction parseRequestedInterval(id: string, value: unknown): RequestedInterval {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval`);\n\tconst unit = value.unit;\n\tif (typeof unit !== \"string\" || !isRequestedIntervalUnit(unit)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval unit`);\n\t}\n\treturn {\n\t\tvalue: requirePositiveInteger(id, \"requestedInterval.value\", value.value),\n\t\tunit,\n\t\traw: requireString(id, \"requestedInterval.raw\", value.raw),\n\t};\n}\n\nfunction parseEffectiveInterval(id: string, value: unknown): EffectiveInterval {\n\tif (!isRecord(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval`);\n\tconst unit = value.unit;\n\tif (typeof unit !== \"string\" || !isEffectiveIntervalUnit(unit)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval unit`);\n\t}\n\tconst roundingNotice = value.roundingNotice;\n\tif (roundingNotice !== undefined && typeof roundingNotice !== \"string\") {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval roundingNotice`);\n\t}\n\treturn {\n\t\tvalue: requirePositiveInteger(id, \"effectiveInterval.value\", value.value),\n\t\tunit,\n\t\thuman: requireString(id, \"effectiveInterval.human\", value.human),\n\t\trounded: requireBoolean(id, \"effectiveInterval.rounded\", value.rounded),\n\t\t...(roundingNotice === undefined ? {} : { roundingNotice }),\n\t};\n}\n\nfunction requireString(id: string, field: string, value: unknown, options?: { allowEmpty?: boolean }): string {\n\tif (typeof value !== \"string\" || (options?.allowEmpty !== true && value.length === 0)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value;\n}\n\nfunction requireBoolean(id: string, field: string, value: unknown): boolean {\n\tif (typeof value !== \"boolean\") throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\treturn value;\n}\n\nfunction requireFiniteNumber(id: string, field: string, value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value;\n}\n\nfunction requireNonNegativeInteger(id: string, field: string, value: unknown): number {\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value as number;\n}\n\nfunction requirePositiveInteger(id: string, field: string, value: unknown): number {\n\tif (!Number.isSafeInteger(value) || (value as number) <= 0) {\n\t\tthrow new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\t}\n\treturn value as number;\n}\n\nfunction requireEpochMs(id: string, field: string, value: unknown): EpochMs {\n\tif (!isEpochMs(value)) throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field}`);\n\treturn value;\n}\n\nfunction parseNullableEpochMs(id: string, field: string, value: unknown): EpochMs | null {\n\tif (value === null || value === undefined) return null;\n\treturn requireEpochMs(id, field, value);\n}\n\nfunction isEpochMs(value: unknown): value is EpochMs {\n\treturn Number.isSafeInteger(value) && (value as number) >= 0;\n}\n\nfunction isLoopPhase(value: string): value is LoopPhase {\n\treturn (LOOP_PHASES as readonly string[]).includes(value);\n}\n\nfunction isLoopEndReason(value: string): value is LoopEndReason {\n\treturn (LOOP_END_REASONS as readonly string[]).includes(value);\n}\n\nfunction isLoopSentinel(value: string): value is LoopSentinel {\n\treturn (LOOP_SENTINELS as readonly string[]).includes(value);\n}\n\nfunction isWakeSourceKind(value: string): value is LoopWakeSourceKind {\n\treturn (LOOP_WAKE_SOURCE_KINDS as readonly string[]).includes(value);\n}\n\nfunction isRequestedIntervalUnit(value: string): value is RequestedIntervalUnit {\n\treturn (REQUESTED_INTERVAL_UNITS as readonly string[]).includes(value);\n}\n\nfunction isEffectiveIntervalUnit(value: string): value is EffectiveIntervalUnit {\n\treturn (EFFECTIVE_INTERVAL_UNITS as readonly string[]).includes(value);\n}\n"]}
@@ -24,6 +24,8 @@ export declare function isContinuationHoldStateEvent(data: unknown): data is Con
24
24
  /** One live watch as broadcast on the monitor state event; mirrors MonitorSnapshotEntry. */
25
25
  export interface TerminalMonitorStateMonitorEntry {
26
26
  readonly id: string;
27
+ /** Stable "mon_" identity surviving runtime id churn; absent in pre-enrichment payloads. */
28
+ readonly monitorId?: string;
27
29
  readonly description: string;
28
30
  readonly paused: boolean;
29
31
  /** Epoch milliseconds when the watch registered; lets consumers render their own elapsed labels. */
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-state-event.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/monitor-state-event.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,2BAA2B,CAAC;AACrE,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAC3D,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,oBAAoB,CAWlF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,0BAA0B,CAU9F;AAED,4FAA4F;AAC5F,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,oGAAoG;IACpG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uGAAuG;IACvG,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,gCAAgC,EAAE,CAAC;CAChE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,yBAAyB,CAS5F"}
1
+ {"version":3,"file":"monitor-state-event.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/monitor-state-event.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,2BAA2B,CAAC;AACrE,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAC3D,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,oBAAoB,CAWlF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,0BAA0B,CAU9F;AAED,4FAA4F;AAC5F,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,oGAAoG;IACpG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uGAAuG;IACvG,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,gCAAgC,EAAE,CAAC;CAChE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,yBAAyB,CAS5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-state-event.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/monitor-state-event.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAC3D,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AAmBvE;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAa;IACnD,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,QAAQ,IAAI,IAAI;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACtB,aAAa,IAAI,IAAI;QACrB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAa;IACzD,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,QAAQ,IAAI,IAAI;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACtB,QAAQ,IAAI,IAAI;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAChC,CAAC;AACH,CAAC;AAiBD,MAAM,UAAU,2BAA2B,CAAC,IAAa;IACxD,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,aAAa,IAAI,IAAI;QACrB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QACpC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;QAClC,IAAI,CAAC,WAAW,IAAI,CAAC,CACrB,CAAC;AACH,CAAC","sourcesContent":["export const TERMINAL_MONITOR_STATE_EVENT = \"terminal_monitor_state\";\nexport const WAKE_SOURCE_STATE_EVENT = \"wake_source_state\";\nexport const CONTINUATION_HOLD_STATE_EVENT = \"continuation_hold_state\";\n\nexport interface WakeSourceStateItem {\n\treadonly id: string;\n\treadonly description?: string;\n\treadonly startedAtMs?: number;\n}\n\nexport interface WakeSourceStateEvent {\n\treadonly source: string;\n\treadonly activeCount: number;\n\treadonly items?: readonly WakeSourceStateItem[];\n}\n\nexport interface ContinuationHoldStateEvent {\n\treadonly source: string;\n\treadonly active: boolean;\n}\n\n/**\n * Deliberately validates only the shared cross-package fields. Emitters may add\n * source-specific details such as `channels` or `monitors`.\n */\nexport function isWakeSourceStateEvent(data: unknown): data is WakeSourceStateEvent {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"source\" in data &&\n\t\ttypeof data.source === \"string\" &&\n\t\tdata.source.length > 0 &&\n\t\t\"activeCount\" in data &&\n\t\ttypeof data.activeCount === \"number\" &&\n\t\tNumber.isFinite(data.activeCount)\n\t);\n}\n\nexport function isContinuationHoldStateEvent(data: unknown): data is ContinuationHoldStateEvent {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"source\" in data &&\n\t\ttypeof data.source === \"string\" &&\n\t\tdata.source.length > 0 &&\n\t\t\"active\" in data &&\n\t\ttypeof data.active === \"boolean\"\n\t);\n}\n\n/** One live watch as broadcast on the monitor state event; mirrors MonitorSnapshotEntry. */\nexport interface TerminalMonitorStateMonitorEntry {\n\treadonly id: string;\n\treadonly description: string;\n\treadonly paused: boolean;\n\t/** Epoch milliseconds when the watch registered; lets consumers render their own elapsed labels. */\n\treadonly startedAtMs: number;\n}\n\nexport interface TerminalMonitorStateEvent {\n\treadonly activeCount: number;\n\t/** Per-watch detail for consumers that need more than the count; absent in pre-enrichment payloads. */\n\treadonly monitors?: readonly TerminalMonitorStateMonitorEntry[];\n}\n\nexport function isTerminalMonitorStateEvent(data: unknown): data is TerminalMonitorStateEvent {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"activeCount\" in data &&\n\t\ttypeof data.activeCount === \"number\" &&\n\t\tNumber.isInteger(data.activeCount) &&\n\t\tdata.activeCount >= 0\n\t);\n}\n"]}
1
+ {"version":3,"file":"monitor-state-event.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/monitor-state-event.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAC3D,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AAmBvE;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAa;IACnD,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,QAAQ,IAAI,IAAI;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACtB,aAAa,IAAI,IAAI;QACrB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAa;IACzD,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,QAAQ,IAAI,IAAI;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACtB,QAAQ,IAAI,IAAI;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAChC,CAAC;AACH,CAAC;AAmBD,MAAM,UAAU,2BAA2B,CAAC,IAAa;IACxD,OAAO,CACN,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,aAAa,IAAI,IAAI;QACrB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QACpC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;QAClC,IAAI,CAAC,WAAW,IAAI,CAAC,CACrB,CAAC;AACH,CAAC","sourcesContent":["export const TERMINAL_MONITOR_STATE_EVENT = \"terminal_monitor_state\";\nexport const WAKE_SOURCE_STATE_EVENT = \"wake_source_state\";\nexport const CONTINUATION_HOLD_STATE_EVENT = \"continuation_hold_state\";\n\nexport interface WakeSourceStateItem {\n\treadonly id: string;\n\treadonly description?: string;\n\treadonly startedAtMs?: number;\n}\n\nexport interface WakeSourceStateEvent {\n\treadonly source: string;\n\treadonly activeCount: number;\n\treadonly items?: readonly WakeSourceStateItem[];\n}\n\nexport interface ContinuationHoldStateEvent {\n\treadonly source: string;\n\treadonly active: boolean;\n}\n\n/**\n * Deliberately validates only the shared cross-package fields. Emitters may add\n * source-specific details such as `channels` or `monitors`.\n */\nexport function isWakeSourceStateEvent(data: unknown): data is WakeSourceStateEvent {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"source\" in data &&\n\t\ttypeof data.source === \"string\" &&\n\t\tdata.source.length > 0 &&\n\t\t\"activeCount\" in data &&\n\t\ttypeof data.activeCount === \"number\" &&\n\t\tNumber.isFinite(data.activeCount)\n\t);\n}\n\nexport function isContinuationHoldStateEvent(data: unknown): data is ContinuationHoldStateEvent {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"source\" in data &&\n\t\ttypeof data.source === \"string\" &&\n\t\tdata.source.length > 0 &&\n\t\t\"active\" in data &&\n\t\ttypeof data.active === \"boolean\"\n\t);\n}\n\n/** One live watch as broadcast on the monitor state event; mirrors MonitorSnapshotEntry. */\nexport interface TerminalMonitorStateMonitorEntry {\n\treadonly id: string;\n\t/** Stable \"mon_\" identity surviving runtime id churn; absent in pre-enrichment payloads. */\n\treadonly monitorId?: string;\n\treadonly description: string;\n\treadonly paused: boolean;\n\t/** Epoch milliseconds when the watch registered; lets consumers render their own elapsed labels. */\n\treadonly startedAtMs: number;\n}\n\nexport interface TerminalMonitorStateEvent {\n\treadonly activeCount: number;\n\t/** Per-watch detail for consumers that need more than the count; absent in pre-enrichment payloads. */\n\treadonly monitors?: readonly TerminalMonitorStateMonitorEntry[];\n}\n\nexport function isTerminalMonitorStateEvent(data: unknown): data is TerminalMonitorStateEvent {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"activeCount\" in data &&\n\t\ttypeof data.activeCount === \"number\" &&\n\t\tNumber.isInteger(data.activeCount) &&\n\t\tdata.activeCount >= 0\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAsKrE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA2GhE;AAED,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA6TrE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA4IhE;AAED,eAAe,yBAAyB,CAAC"}
@@ -1,26 +1,41 @@
1
+ import { isAbsolute, join } from "node:path";
1
2
  import { getShellEnv } from "../../../../utils/shell.js";
3
+ import { encodedSessionId } from "../../../session-sidecar-store.js";
2
4
  import { SettingsManager } from "../../../settings-manager.js";
3
5
  import { isAnthropicBashEnabled } from "../anthropic-bash/index.js";
4
6
  import { isEvalOnlyRouting } from "../eval-only-routing.js";
5
7
  import { TERMINAL_MONITOR_STATE_EVENT, WAKE_SOURCE_STATE_EVENT } from "../monitor-state-event.js";
8
+ import { acquireTerminalLease, releaseTerminalLease } from "./manifest-lease.js";
6
9
  import { MonitorNotifier } from "./monitor-notify.js";
7
10
  import { MONITOR_STATUS_KEY } from "./monitor-status.js";
8
11
  import { MonitorStatusTicker } from "./monitor-status-ticker.js";
9
- import { TerminalNotifier } from "./notify.js";
12
+ import { getTerminalNotificationDelivery, TerminalNotifier } from "./notify.js";
10
13
  import { buildTerminalPromptSection } from "./prompt.js";
14
+ import { restoreTerminalState } from "./restore.js";
11
15
  import { claimParkedBundle, parkBundle, TerminalSessionBundle, teardownParkedBundle, } from "./session-bundle.js";
12
16
  import { loadTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from "./settings.js";
13
17
  import { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS } from "./shared.js";
18
+ import { TerminalManifestWriter } from "./terminal-manifest.js";
14
19
  import { createPtyBashTool } from "./tools/bash.js";
15
20
  import { createBashInputTool } from "./tools/bash-input.js";
16
21
  import { createBashOutputTool } from "./tools/bash-output.js";
17
22
  import { createBashResizeTool } from "./tools/bash-resize.js";
18
23
  import { createKillBashTool } from "./tools/kill-bash.js";
19
- import { createMonitorTool } from "./tools/monitor.js";
24
+ import { bindTerminalManifestWriter, createMonitorTool, unbindTerminalManifestWriter } from "./tools/monitor.js";
20
25
  /** Tests and SDK callers may hand partial contexts without a session manager. */
21
26
  function sessionKeyOf(ctx) {
22
27
  return ctx?.sessionManager?.getSessionId?.();
23
28
  }
29
+ /**
30
+ * Per-session persistence dir for the terminal lease + manifest; undefined when the context
31
+ * carries no durable session dir (SDK/in-memory sessions must not persist terminal state).
32
+ */
33
+ function terminalStateDir(ctx) {
34
+ const sessionDir = ctx?.sessionManager?.getSessionDir?.();
35
+ if (sessionDir === undefined || sessionDir.length === 0 || !isAbsolute(sessionDir))
36
+ return undefined;
37
+ return join(sessionDir, "extensions", "terminal");
38
+ }
24
39
  function createBundle(state) {
25
40
  return new TerminalSessionBundle({
26
41
  maxSessions: state.settings.maxSessions,
@@ -53,6 +68,8 @@ function bundleSinks(pi, state) {
53
68
  startedAtMs: entry.startedAtMs,
54
69
  })),
55
70
  });
71
+ if (state.manifestWriter)
72
+ void state.manifestWriter.observeMonitorState(snapshot);
56
73
  },
57
74
  onBackgroundState: (snapshot) => {
58
75
  pi.events?.emit(WAKE_SOURCE_STATE_EVENT, {
@@ -60,8 +77,22 @@ function bundleSinks(pi, state) {
60
77
  activeCount: snapshot.length,
61
78
  items: snapshot,
62
79
  });
80
+ const writer = state.manifestWriter;
81
+ if (!writer)
82
+ return;
83
+ for (const entry of snapshot) {
84
+ if (state.recordedBackgroundIds.has(entry.id))
85
+ continue;
86
+ state.recordedBackgroundIds.add(entry.id);
87
+ void writer.recordBackgroundStart(entry.id, entry.description ?? entry.id, entry.startedAtMs);
88
+ }
89
+ },
90
+ onBackgroundExit: (id, runtime) => {
91
+ state.recordedBackgroundIds.delete(id);
92
+ if (state.manifestWriter)
93
+ void state.manifestWriter.recordBackgroundExit(id);
94
+ state.notifier?.notifyCompletion(id, runtime);
63
95
  },
64
- onBackgroundExit: (id, runtime) => state.notifier?.notifyCompletion(id, runtime),
65
96
  };
66
97
  }
67
98
  function buildToolContext(pi, state) {
@@ -141,6 +172,117 @@ function syncToolset(pi, state) {
141
172
  state.steppedAside = stepAside;
142
173
  pi.setActiveTools([...active]);
143
174
  }
175
+ /** Send one model-visible terminal reminder; suppressed by notify `off` and non-interactive modes. */
176
+ function sendTerminalReminder(pi, state, sentence) {
177
+ getTerminalNotificationDelivery({
178
+ sendMessage: (message, options) => pi.sendMessage(message, options),
179
+ getContext: () => state.ctx,
180
+ getMode: () => state.settings.notify,
181
+ })?.send(`<system-reminder>${sentence}</system-reminder>`);
182
+ }
183
+ function clauseWithDescriptions(label, count, descriptions) {
184
+ return descriptions.length > 0 ? `${label} ${count} (${descriptions.join(", ")})` : `${label} ${count}`;
185
+ }
186
+ /**
187
+ * The ONE coalesced restore digest. Counts come from the restore orchestrator; descriptions
188
+ * are attributed per manifest entry so the sentence stays a single message however many
189
+ * monitors there are. Empty clauses are omitted; undefined when there is nothing to report.
190
+ */
191
+ function restoreDigestSentence(digest, restoredDescriptions, lostDescriptions) {
192
+ const clauses = [];
193
+ if (digest.restored > 0)
194
+ clauses.push(clauseWithDescriptions("restored", digest.restored, restoredDescriptions));
195
+ if (digest.lost > 0)
196
+ clauses.push(clauseWithDescriptions("lost", digest.lost, lostDescriptions));
197
+ if (digest.expired > 0)
198
+ clauses.push(`expired ${digest.expired}`);
199
+ if (digest.muted > 0)
200
+ clauses.push(`${digest.muted} still muted`);
201
+ if (clauses.length === 0)
202
+ return undefined;
203
+ return `Terminal state after restart: ${clauses.join("; ")}.`;
204
+ }
205
+ /**
206
+ * Non-reload startup: acquire the persistence lease, then restore from the manifest and
207
+ * deliver EXACTLY ONE coalesced digest. A live foreign holder keeps its lease and gets one
208
+ * attached-elsewhere reminder; an unreadable manifest fails closed with one notice and no
209
+ * restore attempt. Only the lease owner records manifest state afterwards.
210
+ */
211
+ async function adoptPersistedTerminalState(pi, state, sessionKey) {
212
+ const ctx = state.ctx;
213
+ const dir = terminalStateDir(ctx);
214
+ if (dir === undefined || !ctx?.sessionManager)
215
+ return;
216
+ const lease = await acquireTerminalLease({ dir, encodedSessionId: sessionKey });
217
+ if (!lease.acquired) {
218
+ sendTerminalReminder(pi, state, `Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`);
219
+ return;
220
+ }
221
+ state.lease = { path: lease.path, pid: lease.pid };
222
+ const writer = new TerminalManifestWriter({ session: ctx.sessionManager });
223
+ state.manifestWriter = writer;
224
+ state.recordedBackgroundIds.clear();
225
+ bindTerminalManifestWriter(sessionKey, writer);
226
+ // Restoration handlers: this generation does not re-spawn persisted commands on its own,
227
+ // so every durable entry reports lost; the outcomes still flow through the orchestrator.
228
+ const outcomesById = new Map();
229
+ const reportLost = (monitor) => {
230
+ outcomesById.set(monitor.monitorId, "lost");
231
+ return { outcome: "lost" };
232
+ };
233
+ const handlers = { "restartable-command": reportLost, "checkpointed-file": reportLost };
234
+ const nowMs = Date.now();
235
+ const digest = await restoreTerminalState({ manifest: writer.store, handlers, now: () => nowMs });
236
+ let manifest = null;
237
+ let unreadable = digest.storeError;
238
+ if (!unreadable) {
239
+ try {
240
+ manifest = await writer.store.read();
241
+ }
242
+ catch {
243
+ unreadable = true;
244
+ }
245
+ }
246
+ if (unreadable) {
247
+ sendTerminalReminder(pi, state, "Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).");
248
+ return;
249
+ }
250
+ if (manifest === null)
251
+ return; // nothing was ever persisted for this session
252
+ const restoredDescriptions = [];
253
+ const lostDescriptions = [];
254
+ for (const monitor of manifest.monitors) {
255
+ if (monitor.expiresAt !== null && monitor.expiresAt < nowMs)
256
+ continue;
257
+ if (outcomesById.get(monitor.monitorId) === "restored")
258
+ restoredDescriptions.push(monitor.description);
259
+ else
260
+ lostDescriptions.push(monitor.description);
261
+ }
262
+ for (const background of manifest.backgroundSessions)
263
+ lostDescriptions.push(background.command);
264
+ const sentence = restoreDigestSentence(digest, restoredDescriptions, lostDescriptions);
265
+ if (sentence !== undefined)
266
+ sendTerminalReminder(pi, state, sentence);
267
+ }
268
+ /** Detach the manifest recorder without writing (a reload keeps live state instead). */
269
+ function detachManifestWriter(state, sessionKey) {
270
+ state.manifestWriter = null;
271
+ state.recordedBackgroundIds.clear();
272
+ if (sessionKey !== undefined)
273
+ unbindTerminalManifestWriter(sessionKey);
274
+ }
275
+ /**
276
+ * Shutdown view of the manifest: recordShutdown absorbs pending checkpoints, marks every
277
+ * live monitor `suspended`, and persists in one write. Detach FIRST so bundle teardown's
278
+ * empty-registry sync cannot touch the recorder afterwards.
279
+ */
280
+ async function suspendAndFlushManifest(state, sessionKey) {
281
+ const writer = state.manifestWriter;
282
+ detachManifestWriter(state, sessionKey);
283
+ if (writer)
284
+ await writer.recordShutdown();
285
+ }
144
286
  export function registerTerminalExtension(pi) {
145
287
  const state = {
146
288
  bundle: null,
@@ -159,6 +301,9 @@ export function registerTerminalExtension(pi) {
159
301
  shellPath: undefined,
160
302
  steppedAside: false,
161
303
  noticeShown: false,
304
+ lease: null,
305
+ manifestWriter: null,
306
+ recordedBackgroundIds: new Set(),
162
307
  };
163
308
  const toolCtx = buildToolContext(pi, state);
164
309
  pi.registerTool(createPtyBashTool(toolCtx));
@@ -201,6 +346,19 @@ export function registerTerminalExtension(pi) {
201
346
  }
202
347
  state.bundle ??= createBundle(state);
203
348
  state.bundle.bind(bundleSinks(pi, state));
349
+ if (event.reason === "reload") {
350
+ // Park/claim and the lease stay untouched: the same pid keeps holding it. The
351
+ // reload generation only rebinds the recorder so manifest coverage continues.
352
+ if (sessionKey !== undefined && terminalStateDir(ctx) !== undefined) {
353
+ const writer = new TerminalManifestWriter({ session: ctx.sessionManager });
354
+ state.manifestWriter = writer;
355
+ state.recordedBackgroundIds.clear();
356
+ bindTerminalManifestWriter(sessionKey, writer);
357
+ }
358
+ }
359
+ else if (sessionKey !== undefined) {
360
+ await adoptPersistedTerminalState(pi, state, sessionKey);
361
+ }
204
362
  syncToolset(pi, state);
205
363
  });
206
364
  pi.on("model_select", async (event, ctx) => {
@@ -234,10 +392,30 @@ export function registerTerminalExtension(pi) {
234
392
  if (event.reason === "reload" && state.bundle && sessionKey !== undefined) {
235
393
  // Keep state.bundle referenced: exit listeners captured by this instance's tool
236
394
  // context still route through the shared bundle after the new owner claims it.
395
+ // The lease is deliberately NOT released: the same pid keeps it across the reload.
396
+ detachManifestWriter(state, sessionKey);
237
397
  state.bundle.park();
238
398
  await parkBundle(sessionKey, state.bundle);
239
399
  return;
240
400
  }
401
+ if (sessionKey !== undefined)
402
+ await suspendAndFlushManifest(state, sessionKey);
403
+ const lease = state.lease;
404
+ state.lease = null;
405
+ if (lease !== null) {
406
+ await releaseTerminalLease(lease);
407
+ }
408
+ else if (sessionKey !== undefined) {
409
+ const dir = terminalStateDir(ctx) ?? terminalStateDir(state.ctx);
410
+ // A reload generation inherits the pre-reload lease without re-acquiring it;
411
+ // releasing by (path, own pid) removes exactly that file and no foreign holder's.
412
+ if (dir !== undefined) {
413
+ await releaseTerminalLease({
414
+ path: join(dir, `${encodedSessionId(sessionKey)}.lease`),
415
+ pid: process.pid,
416
+ });
417
+ }
418
+ }
241
419
  const bundle = state.bundle;
242
420
  state.bundle = null;
243
421
  await bundle?.teardown();
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { getShellEnv } from \"../../../../utils/shell.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isAnthropicBashEnabled } from \"../anthropic-bash/index.ts\";\nimport { isEvalOnlyRouting } from \"../eval-only-routing.ts\";\nimport { TERMINAL_MONITOR_STATE_EVENT, WAKE_SOURCE_STATE_EVENT } from \"../monitor-state-event.ts\";\nimport { MonitorNotifier } from \"./monitor-notify.ts\";\nimport { MONITOR_STATUS_KEY } from \"./monitor-status.ts\";\nimport { MonitorStatusTicker } from \"./monitor-status-ticker.ts\";\nimport { TerminalNotifier } from \"./notify.ts\";\nimport { buildTerminalPromptSection } from \"./prompt.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport {\n\tclaimParkedBundle,\n\tparkBundle,\n\ttype TerminalEventSinks,\n\tTerminalSessionBundle,\n\tteardownParkedBundle,\n} from \"./session-bundle.ts\";\nimport { loadTerminalSettings, type ResolvedTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from \"./settings.ts\";\nimport { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS } from \"./shared.ts\";\nimport { createPtyBashTool } from \"./tools/bash.ts\";\nimport { createBashInputTool } from \"./tools/bash-input.ts\";\nimport { createBashOutputTool } from \"./tools/bash-output.ts\";\nimport { createBashResizeTool } from \"./tools/bash-resize.ts\";\nimport type { TerminalToolContext } from \"./tools/context.ts\";\nimport { createKillBashTool } from \"./tools/kill-bash.ts\";\nimport { createMonitorTool } from \"./tools/monitor.ts\";\n\ninterface TerminalExtensionState {\n\tbundle: TerminalSessionBundle | null;\n\tsettings: ResolvedTerminalSettings;\n\tnotifier: TerminalNotifier | null;\n\tmonitorNotifier: MonitorNotifier | null;\n\tstatusTicker: MonitorStatusTicker;\n\tctx: ExtensionContext | undefined;\n\tshellPath: string | undefined;\n\tsteppedAside: boolean;\n\tnoticeShown: boolean;\n}\n\n/** Tests and SDK callers may hand partial contexts without a session manager. */\nfunction sessionKeyOf(ctx: ExtensionContext | undefined): string | undefined {\n\treturn ctx?.sessionManager?.getSessionId?.();\n}\n\nfunction createBundle(state: TerminalExtensionState): TerminalSessionBundle {\n\treturn new TerminalSessionBundle({\n\t\tmaxSessions: state.settings.maxSessions,\n\t\tscrollback: state.settings.scrollback,\n\t});\n}\n\n/** Sinks read the live instance state at call time, so notifier swaps need no re-bind. */\nfunction bundleSinks(pi: ExtensionAPI, state: TerminalExtensionState): TerminalEventSinks {\n\treturn {\n\t\tonMonitorEvent: (event) => state.monitorNotifier?.notifyEvent(event),\n\t\tonMonitorState: (snapshot) => {\n\t\t\tstate.statusTicker.sync(snapshot);\n\t\t\tconst payload = {\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tpaused: entry.paused,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t})),\n\t\t\t};\n\t\t\tpi.events?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tpi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-monitors\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t})),\n\t\t\t});\n\t\t},\n\t\tonBackgroundState: (snapshot) => {\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-background-sessions\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\titems: snapshot,\n\t\t\t});\n\t\t},\n\t\tonBackgroundExit: (id, runtime) => state.notifier?.notifyCompletion(id, runtime),\n\t};\n}\n\nfunction buildToolContext(pi: ExtensionAPI, state: TerminalExtensionState): TerminalToolContext {\n\tconst requireBundle = (): TerminalSessionBundle => {\n\t\t// Lazily create a bundle so the tools work even when invoked directly (e.g. via the\n\t\t// SDK) before `session_start` initializes one. `session_start` replaces it with a\n\t\t// settings-configured bundle and tears down any earlier one.\n\t\tif (!state.bundle) {\n\t\t\tstate.bundle = createBundle(state);\n\t\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\t}\n\t\treturn state.bundle;\n\t};\n\treturn {\n\t\tget manager() {\n\t\t\treturn requireBundle().manager;\n\t\t},\n\t\tget cwd() {\n\t\t\treturn state.ctx?.cwd ?? process.cwd();\n\t\t},\n\t\tget shellPath() {\n\t\t\treturn state.shellPath;\n\t\t},\n\t\tget defaultCols() {\n\t\t\treturn state.settings.defaultCols;\n\t\t},\n\t\tget defaultRows() {\n\t\t\treturn state.settings.defaultRows;\n\t\t},\n\t\tget timeoutAction() {\n\t\t\treturn state.settings.timeoutAction;\n\t\t},\n\t\tget monitorRegistry() {\n\t\t\treturn requireBundle().monitors;\n\t\t},\n\t\tgetEnv: () => getShellEnv(),\n\t\tgetSessionContext: () => state.ctx,\n\t\t// Exit listeners registered before a reload reach the post-reload owner through the\n\t\t// shared bundle, so this must dispatch via the bundle, never the instance notifier.\n\t\tonBackgroundStart: (id: string, description: string, startedAtMs: number) => {\n\t\t\tstate.bundle?.notifyBackgroundStart(id, description, startedAtMs);\n\t\t},\n\t\tonBackgroundExit: (id: string, runtime: TerminalRuntimeSession) => {\n\t\t\tstate.bundle?.notifyBackgroundExit(id, runtime);\n\t\t},\n\t\tonMonitorRearmed: (id: string) => state.monitorNotifier?.rearm(id),\n\t\tonMonitorsResumed: (ids: readonly string[]) => state.monitorNotifier?.resume(ids),\n\t};\n}\n\nfunction shouldStepAside(ctx: ExtensionContext | undefined): boolean {\n\treturn isAnthropicBashEnabled() && ctx?.model?.api === \"anthropic-messages\";\n}\n\n/**\n * Keep the tool surface consistent with anthropic-bash. When native Anthropic bash is active,\n * the provider replaces the PTY `bash` function, but the companions stay active because `monitor`\n * creates its own PTY session and bash_output/input/resize/kill operate on that shared registry.\n * Otherwise the PTY `bash` + companions are (re)activated. Re-evaluated on session_start AND\n * model_select.\n */\nfunction syncToolset(pi: ExtensionAPI, state: TerminalExtensionState): void {\n\tconst stepAside = shouldStepAside(state.ctx);\n\tconst active = new Set(pi.getActiveTools());\n\tif (stepAside) {\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tif (!state.noticeShown) {\n\t\t\tstate.ctx?.ui.notify(\"native Anthropic bash active — monitor sessions remain available\", \"info\");\n\t\t\tstate.noticeShown = true;\n\t\t}\n\t} else {\n\t\tactive.add(TERMINAL_BASH_TOOL);\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tstate.noticeShown = false;\n\t}\n\tstate.steppedAside = stepAside;\n\tpi.setActiveTools([...active]);\n}\n\nexport function registerTerminalExtension(pi: ExtensionAPI): void {\n\tconst state: TerminalExtensionState = {\n\t\tbundle: null,\n\t\tsettings: TERMINAL_SETTINGS_DEFAULTS,\n\t\tnotifier: null,\n\t\tmonitorNotifier: null,\n\t\tstatusTicker: new MonitorStatusTicker({\n\t\t\trender: (status) => {\n\t\t\t\tconst ctx = state.ctx;\n\t\t\t\tctx?.ui.setStatus(\n\t\t\t\t\tMONITOR_STATUS_KEY,\n\t\t\t\t\tstatus === undefined || ctx.mode !== \"tui\"\n\t\t\t\t\t\t? status\n\t\t\t\t\t\t: ctx.ui.theme.bg(\"selectedBg\", ctx.ui.theme.fg(\"text\", status)),\n\t\t\t\t);\n\t\t\t},\n\t\t}),\n\t\tctx: undefined,\n\t\tshellPath: undefined,\n\t\tsteppedAside: false,\n\t\tnoticeShown: false,\n\t};\n\tconst toolCtx = buildToolContext(pi, state);\n\n\tpi.registerTool(createPtyBashTool(toolCtx));\n\tpi.registerTool(createBashOutputTool(toolCtx));\n\tpi.registerTool(createBashInputTool(toolCtx));\n\tpi.registerTool(createBashResizeTool(toolCtx));\n\tpi.registerTool(createKillBashTool(toolCtx));\n\tpi.registerTool(createMonitorTool(toolCtx));\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tstate.ctx = ctx;\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tstate.settings = loadTerminalSettings(settingsManager);\n\t\tstate.shellPath = settingsManager.getShellPath();\n\t\tstate.notifier = new TerminalNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t});\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = new MonitorNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t\tgetSettings: () => state.settings.monitor,\n\t\t\tpauseMonitors: (ids) => state.bundle?.monitors.pause(ids) ?? [],\n\t\t});\n\t\tconst sessionKey = sessionKeyOf(ctx);\n\t\tif (event.reason === \"reload\") {\n\t\t\tconst claimed = sessionKey === undefined ? undefined : claimParkedBundle(sessionKey);\n\t\t\tif (claimed) {\n\t\t\t\tawait state.bundle?.teardown();\n\t\t\t\tstate.bundle = claimed;\n\t\t\t}\n\t\t} else {\n\t\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t\t\tawait state.bundle?.teardown();\n\t\t\tstate.bundle = createBundle(state);\n\t\t}\n\t\tstate.bundle ??= createBundle(state);\n\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"model_select\", async (event, ctx) => {\n\t\tstate.ctx = { ...ctx, model: event.model };\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"input\", (event) => {\n\t\tif (event.source === \"extension\") return;\n\t\tstate.monitorNotifier?.noteActivity();\n\t\tconst resumed = state.bundle?.monitors.resume() ?? [];\n\t\tif (resumed.length > 0) state.monitorNotifier?.resume(resumed.map((monitor) => monitor.id));\n\t});\n\n\tpi.on(\"tool_call\", () => {\n\t\tstate.monitorNotifier?.noteActivity();\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tif (state.steppedAside) return undefined;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${buildTerminalPromptSection({ evalOnly: isEvalOnlyRouting(pi) })}`,\n\t\t};\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = null;\n\t\tstate.notifier = null;\n\t\tstate.statusTicker.stop();\n\t\tconst sessionKey = sessionKeyOf(ctx) ?? sessionKeyOf(state.ctx);\n\t\tif (event.reason === \"reload\" && state.bundle && sessionKey !== undefined) {\n\t\t\t// Keep state.bundle referenced: exit listeners captured by this instance's tool\n\t\t\t// context still route through the shared bundle after the new owner claims it.\n\t\t\tstate.bundle.park();\n\t\t\tawait parkBundle(sessionKey, state.bundle);\n\t\t\treturn;\n\t\t}\n\t\tconst bundle = state.bundle;\n\t\tstate.bundle = null;\n\t\tawait bundle?.teardown();\n\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t});\n}\n\nexport default registerTerminalExtension;\n"]}
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute, join } from \"node:path\";\nimport { getShellEnv } from \"../../../../utils/shell.ts\";\nimport { encodedSessionId } from \"../../../session-sidecar-store.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isAnthropicBashEnabled } from \"../anthropic-bash/index.ts\";\nimport { isEvalOnlyRouting } from \"../eval-only-routing.ts\";\nimport { TERMINAL_MONITOR_STATE_EVENT, WAKE_SOURCE_STATE_EVENT } from \"../monitor-state-event.ts\";\nimport { acquireTerminalLease, releaseTerminalLease } from \"./manifest-lease.ts\";\nimport { MonitorNotifier } from \"./monitor-notify.ts\";\nimport { MONITOR_STATUS_KEY } from \"./monitor-status.ts\";\nimport { MonitorStatusTicker } from \"./monitor-status-ticker.ts\";\nimport { getTerminalNotificationDelivery, TerminalNotifier } from \"./notify.ts\";\nimport { buildTerminalPromptSection } from \"./prompt.ts\";\nimport { type RestoreDigest, type RestoreHandlers, type RestoreOutcome, restoreTerminalState } from \"./restore.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport {\n\tclaimParkedBundle,\n\tparkBundle,\n\ttype TerminalEventSinks,\n\tTerminalSessionBundle,\n\tteardownParkedBundle,\n} from \"./session-bundle.ts\";\nimport { loadTerminalSettings, type ResolvedTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from \"./settings.ts\";\nimport { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS } from \"./shared.ts\";\nimport { type ManifestMonitor, TerminalManifestWriter } from \"./terminal-manifest.ts\";\nimport { createPtyBashTool } from \"./tools/bash.ts\";\nimport { createBashInputTool } from \"./tools/bash-input.ts\";\nimport { createBashOutputTool } from \"./tools/bash-output.ts\";\nimport { createBashResizeTool } from \"./tools/bash-resize.ts\";\nimport type { TerminalToolContext } from \"./tools/context.ts\";\nimport { createKillBashTool } from \"./tools/kill-bash.ts\";\nimport { bindTerminalManifestWriter, createMonitorTool, unbindTerminalManifestWriter } from \"./tools/monitor.ts\";\n\ninterface TerminalExtensionState {\n\tbundle: TerminalSessionBundle | null;\n\tsettings: ResolvedTerminalSettings;\n\tnotifier: TerminalNotifier | null;\n\tmonitorNotifier: MonitorNotifier | null;\n\tstatusTicker: MonitorStatusTicker;\n\tctx: ExtensionContext | undefined;\n\tshellPath: string | undefined;\n\tsteppedAside: boolean;\n\tnoticeShown: boolean;\n\t/** Set only when this generation acquired the persistence lease (non-reload starts). */\n\tlease: { path: string; pid: number } | null;\n\t/** Manifest recorder; present only while this process owns the session's lease. */\n\tmanifestWriter: TerminalManifestWriter | null;\n\trecordedBackgroundIds: Set<string>;\n}\n\n/** Tests and SDK callers may hand partial contexts without a session manager. */\nfunction sessionKeyOf(ctx: ExtensionContext | undefined): string | undefined {\n\treturn ctx?.sessionManager?.getSessionId?.();\n}\n\n/**\n * Per-session persistence dir for the terminal lease + manifest; undefined when the context\n * carries no durable session dir (SDK/in-memory sessions must not persist terminal state).\n */\nfunction terminalStateDir(ctx: ExtensionContext | undefined): string | undefined {\n\tconst sessionDir = ctx?.sessionManager?.getSessionDir?.();\n\tif (sessionDir === undefined || sessionDir.length === 0 || !isAbsolute(sessionDir)) return undefined;\n\treturn join(sessionDir, \"extensions\", \"terminal\");\n}\n\nfunction createBundle(state: TerminalExtensionState): TerminalSessionBundle {\n\treturn new TerminalSessionBundle({\n\t\tmaxSessions: state.settings.maxSessions,\n\t\tscrollback: state.settings.scrollback,\n\t});\n}\n\n/** Sinks read the live instance state at call time, so notifier swaps need no re-bind. */\nfunction bundleSinks(pi: ExtensionAPI, state: TerminalExtensionState): TerminalEventSinks {\n\treturn {\n\t\tonMonitorEvent: (event) => state.monitorNotifier?.notifyEvent(event),\n\t\tonMonitorState: (snapshot) => {\n\t\t\tstate.statusTicker.sync(snapshot);\n\t\t\tconst payload = {\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tpaused: entry.paused,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t})),\n\t\t\t};\n\t\t\tpi.events?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tpi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-monitors\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t})),\n\t\t\t});\n\t\t\tif (state.manifestWriter) void state.manifestWriter.observeMonitorState(snapshot);\n\t\t},\n\t\tonBackgroundState: (snapshot) => {\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-background-sessions\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\titems: snapshot,\n\t\t\t});\n\t\t\tconst writer = state.manifestWriter;\n\t\t\tif (!writer) return;\n\t\t\tfor (const entry of snapshot) {\n\t\t\t\tif (state.recordedBackgroundIds.has(entry.id)) continue;\n\t\t\t\tstate.recordedBackgroundIds.add(entry.id);\n\t\t\t\tvoid writer.recordBackgroundStart(entry.id, entry.description ?? entry.id, entry.startedAtMs);\n\t\t\t}\n\t\t},\n\t\tonBackgroundExit: (id, runtime) => {\n\t\t\tstate.recordedBackgroundIds.delete(id);\n\t\t\tif (state.manifestWriter) void state.manifestWriter.recordBackgroundExit(id);\n\t\t\tstate.notifier?.notifyCompletion(id, runtime);\n\t\t},\n\t};\n}\n\nfunction buildToolContext(pi: ExtensionAPI, state: TerminalExtensionState): TerminalToolContext {\n\tconst requireBundle = (): TerminalSessionBundle => {\n\t\t// Lazily create a bundle so the tools work even when invoked directly (e.g. via the\n\t\t// SDK) before `session_start` initializes one. `session_start` replaces it with a\n\t\t// settings-configured bundle and tears down any earlier one.\n\t\tif (!state.bundle) {\n\t\t\tstate.bundle = createBundle(state);\n\t\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\t}\n\t\treturn state.bundle;\n\t};\n\treturn {\n\t\tget manager() {\n\t\t\treturn requireBundle().manager;\n\t\t},\n\t\tget cwd() {\n\t\t\treturn state.ctx?.cwd ?? process.cwd();\n\t\t},\n\t\tget shellPath() {\n\t\t\treturn state.shellPath;\n\t\t},\n\t\tget defaultCols() {\n\t\t\treturn state.settings.defaultCols;\n\t\t},\n\t\tget defaultRows() {\n\t\t\treturn state.settings.defaultRows;\n\t\t},\n\t\tget timeoutAction() {\n\t\t\treturn state.settings.timeoutAction;\n\t\t},\n\t\tget monitorRegistry() {\n\t\t\treturn requireBundle().monitors;\n\t\t},\n\t\tgetEnv: () => getShellEnv(),\n\t\tgetSessionContext: () => state.ctx,\n\t\t// Exit listeners registered before a reload reach the post-reload owner through the\n\t\t// shared bundle, so this must dispatch via the bundle, never the instance notifier.\n\t\tonBackgroundStart: (id: string, description: string, startedAtMs: number) => {\n\t\t\tstate.bundle?.notifyBackgroundStart(id, description, startedAtMs);\n\t\t},\n\t\tonBackgroundExit: (id: string, runtime: TerminalRuntimeSession) => {\n\t\t\tstate.bundle?.notifyBackgroundExit(id, runtime);\n\t\t},\n\t\tonMonitorRearmed: (id: string) => state.monitorNotifier?.rearm(id),\n\t\tonMonitorsResumed: (ids: readonly string[]) => state.monitorNotifier?.resume(ids),\n\t};\n}\n\nfunction shouldStepAside(ctx: ExtensionContext | undefined): boolean {\n\treturn isAnthropicBashEnabled() && ctx?.model?.api === \"anthropic-messages\";\n}\n\n/**\n * Keep the tool surface consistent with anthropic-bash. When native Anthropic bash is active,\n * the provider replaces the PTY `bash` function, but the companions stay active because `monitor`\n * creates its own PTY session and bash_output/input/resize/kill operate on that shared registry.\n * Otherwise the PTY `bash` + companions are (re)activated. Re-evaluated on session_start AND\n * model_select.\n */\nfunction syncToolset(pi: ExtensionAPI, state: TerminalExtensionState): void {\n\tconst stepAside = shouldStepAside(state.ctx);\n\tconst active = new Set(pi.getActiveTools());\n\tif (stepAside) {\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tif (!state.noticeShown) {\n\t\t\tstate.ctx?.ui.notify(\"native Anthropic bash active — monitor sessions remain available\", \"info\");\n\t\t\tstate.noticeShown = true;\n\t\t}\n\t} else {\n\t\tactive.add(TERMINAL_BASH_TOOL);\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tstate.noticeShown = false;\n\t}\n\tstate.steppedAside = stepAside;\n\tpi.setActiveTools([...active]);\n}\n\n/** Send one model-visible terminal reminder; suppressed by notify `off` and non-interactive modes. */\nfunction sendTerminalReminder(pi: ExtensionAPI, state: TerminalExtensionState, sentence: string): void {\n\tgetTerminalNotificationDelivery({\n\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\tgetContext: () => state.ctx,\n\t\tgetMode: () => state.settings.notify,\n\t})?.send(`<system-reminder>${sentence}</system-reminder>`);\n}\n\nfunction clauseWithDescriptions(label: string, count: number, descriptions: readonly string[]): string {\n\treturn descriptions.length > 0 ? `${label} ${count} (${descriptions.join(\", \")})` : `${label} ${count}`;\n}\n\n/**\n * The ONE coalesced restore digest. Counts come from the restore orchestrator; descriptions\n * are attributed per manifest entry so the sentence stays a single message however many\n * monitors there are. Empty clauses are omitted; undefined when there is nothing to report.\n */\nfunction restoreDigestSentence(\n\tdigest: RestoreDigest,\n\trestoredDescriptions: readonly string[],\n\tlostDescriptions: readonly string[],\n): string | undefined {\n\tconst clauses: string[] = [];\n\tif (digest.restored > 0) clauses.push(clauseWithDescriptions(\"restored\", digest.restored, restoredDescriptions));\n\tif (digest.lost > 0) clauses.push(clauseWithDescriptions(\"lost\", digest.lost, lostDescriptions));\n\tif (digest.expired > 0) clauses.push(`expired ${digest.expired}`);\n\tif (digest.muted > 0) clauses.push(`${digest.muted} still muted`);\n\tif (clauses.length === 0) return undefined;\n\treturn `Terminal state after restart: ${clauses.join(\"; \")}.`;\n}\n\n/**\n * Non-reload startup: acquire the persistence lease, then restore from the manifest and\n * deliver EXACTLY ONE coalesced digest. A live foreign holder keeps its lease and gets one\n * attached-elsewhere reminder; an unreadable manifest fails closed with one notice and no\n * restore attempt. Only the lease owner records manifest state afterwards.\n */\nasync function adoptPersistedTerminalState(\n\tpi: ExtensionAPI,\n\tstate: TerminalExtensionState,\n\tsessionKey: string,\n): Promise<void> {\n\tconst ctx = state.ctx;\n\tconst dir = terminalStateDir(ctx);\n\tif (dir === undefined || !ctx?.sessionManager) return;\n\tconst lease = await acquireTerminalLease({ dir, encodedSessionId: sessionKey });\n\tif (!lease.acquired) {\n\t\tsendTerminalReminder(\n\t\t\tpi,\n\t\t\tstate,\n\t\t\t`Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`,\n\t\t);\n\t\treturn;\n\t}\n\tstate.lease = { path: lease.path, pid: lease.pid };\n\tconst writer = new TerminalManifestWriter({ session: ctx.sessionManager });\n\tstate.manifestWriter = writer;\n\tstate.recordedBackgroundIds.clear();\n\tbindTerminalManifestWriter(sessionKey, writer);\n\n\t// Restoration handlers: this generation does not re-spawn persisted commands on its own,\n\t// so every durable entry reports lost; the outcomes still flow through the orchestrator.\n\tconst outcomesById = new Map<string, RestoreOutcome>();\n\tconst reportLost = (monitor: ManifestMonitor): { outcome: RestoreOutcome } => {\n\t\toutcomesById.set(monitor.monitorId, \"lost\");\n\t\treturn { outcome: \"lost\" };\n\t};\n\tconst handlers: RestoreHandlers = { \"restartable-command\": reportLost, \"checkpointed-file\": reportLost };\n\tconst nowMs = Date.now();\n\tconst digest = await restoreTerminalState({ manifest: writer.store, handlers, now: () => nowMs });\n\n\tlet manifest = null;\n\tlet unreadable = digest.storeError;\n\tif (!unreadable) {\n\t\ttry {\n\t\t\tmanifest = await writer.store.read();\n\t\t} catch {\n\t\t\tunreadable = true;\n\t\t}\n\t}\n\tif (unreadable) {\n\t\tsendTerminalReminder(\n\t\t\tpi,\n\t\t\tstate,\n\t\t\t\"Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).\",\n\t\t);\n\t\treturn;\n\t}\n\tif (manifest === null) return; // nothing was ever persisted for this session\n\n\tconst restoredDescriptions: string[] = [];\n\tconst lostDescriptions: string[] = [];\n\tfor (const monitor of manifest.monitors) {\n\t\tif (monitor.expiresAt !== null && monitor.expiresAt < nowMs) continue;\n\t\tif (outcomesById.get(monitor.monitorId) === \"restored\") restoredDescriptions.push(monitor.description);\n\t\telse lostDescriptions.push(monitor.description);\n\t}\n\tfor (const background of manifest.backgroundSessions) lostDescriptions.push(background.command);\n\tconst sentence = restoreDigestSentence(digest, restoredDescriptions, lostDescriptions);\n\tif (sentence !== undefined) sendTerminalReminder(pi, state, sentence);\n}\n\n/** Detach the manifest recorder without writing (a reload keeps live state instead). */\nfunction detachManifestWriter(state: TerminalExtensionState, sessionKey: string | undefined): void {\n\tstate.manifestWriter = null;\n\tstate.recordedBackgroundIds.clear();\n\tif (sessionKey !== undefined) unbindTerminalManifestWriter(sessionKey);\n}\n\n/**\n * Shutdown view of the manifest: recordShutdown absorbs pending checkpoints, marks every\n * live monitor `suspended`, and persists in one write. Detach FIRST so bundle teardown's\n * empty-registry sync cannot touch the recorder afterwards.\n */\nasync function suspendAndFlushManifest(state: TerminalExtensionState, sessionKey: string): Promise<void> {\n\tconst writer = state.manifestWriter;\n\tdetachManifestWriter(state, sessionKey);\n\tif (writer) await writer.recordShutdown();\n}\n\nexport function registerTerminalExtension(pi: ExtensionAPI): void {\n\tconst state: TerminalExtensionState = {\n\t\tbundle: null,\n\t\tsettings: TERMINAL_SETTINGS_DEFAULTS,\n\t\tnotifier: null,\n\t\tmonitorNotifier: null,\n\t\tstatusTicker: new MonitorStatusTicker({\n\t\t\trender: (status) => {\n\t\t\t\tconst ctx = state.ctx;\n\t\t\t\tctx?.ui.setStatus(\n\t\t\t\t\tMONITOR_STATUS_KEY,\n\t\t\t\t\tstatus === undefined || ctx.mode !== \"tui\"\n\t\t\t\t\t\t? status\n\t\t\t\t\t\t: ctx.ui.theme.bg(\"selectedBg\", ctx.ui.theme.fg(\"text\", status)),\n\t\t\t\t);\n\t\t\t},\n\t\t}),\n\t\tctx: undefined,\n\t\tshellPath: undefined,\n\t\tsteppedAside: false,\n\t\tnoticeShown: false,\n\t\tlease: null,\n\t\tmanifestWriter: null,\n\t\trecordedBackgroundIds: new Set(),\n\t};\n\tconst toolCtx = buildToolContext(pi, state);\n\n\tpi.registerTool(createPtyBashTool(toolCtx));\n\tpi.registerTool(createBashOutputTool(toolCtx));\n\tpi.registerTool(createBashInputTool(toolCtx));\n\tpi.registerTool(createBashResizeTool(toolCtx));\n\tpi.registerTool(createKillBashTool(toolCtx));\n\tpi.registerTool(createMonitorTool(toolCtx));\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tstate.ctx = ctx;\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tstate.settings = loadTerminalSettings(settingsManager);\n\t\tstate.shellPath = settingsManager.getShellPath();\n\t\tstate.notifier = new TerminalNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t});\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = new MonitorNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t\tgetSettings: () => state.settings.monitor,\n\t\t\tpauseMonitors: (ids) => state.bundle?.monitors.pause(ids) ?? [],\n\t\t});\n\t\tconst sessionKey = sessionKeyOf(ctx);\n\t\tif (event.reason === \"reload\") {\n\t\t\tconst claimed = sessionKey === undefined ? undefined : claimParkedBundle(sessionKey);\n\t\t\tif (claimed) {\n\t\t\t\tawait state.bundle?.teardown();\n\t\t\t\tstate.bundle = claimed;\n\t\t\t}\n\t\t} else {\n\t\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t\t\tawait state.bundle?.teardown();\n\t\t\tstate.bundle = createBundle(state);\n\t\t}\n\t\tstate.bundle ??= createBundle(state);\n\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\tif (event.reason === \"reload\") {\n\t\t\t// Park/claim and the lease stay untouched: the same pid keeps holding it. The\n\t\t\t// reload generation only rebinds the recorder so manifest coverage continues.\n\t\t\tif (sessionKey !== undefined && terminalStateDir(ctx) !== undefined) {\n\t\t\t\tconst writer = new TerminalManifestWriter({ session: ctx.sessionManager });\n\t\t\t\tstate.manifestWriter = writer;\n\t\t\t\tstate.recordedBackgroundIds.clear();\n\t\t\t\tbindTerminalManifestWriter(sessionKey, writer);\n\t\t\t}\n\t\t} else if (sessionKey !== undefined) {\n\t\t\tawait adoptPersistedTerminalState(pi, state, sessionKey);\n\t\t}\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"model_select\", async (event, ctx) => {\n\t\tstate.ctx = { ...ctx, model: event.model };\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"input\", (event) => {\n\t\tif (event.source === \"extension\") return;\n\t\tstate.monitorNotifier?.noteActivity();\n\t\tconst resumed = state.bundle?.monitors.resume() ?? [];\n\t\tif (resumed.length > 0) state.monitorNotifier?.resume(resumed.map((monitor) => monitor.id));\n\t});\n\n\tpi.on(\"tool_call\", () => {\n\t\tstate.monitorNotifier?.noteActivity();\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tif (state.steppedAside) return undefined;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${buildTerminalPromptSection({ evalOnly: isEvalOnlyRouting(pi) })}`,\n\t\t};\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = null;\n\t\tstate.notifier = null;\n\t\tstate.statusTicker.stop();\n\t\tconst sessionKey = sessionKeyOf(ctx) ?? sessionKeyOf(state.ctx);\n\t\tif (event.reason === \"reload\" && state.bundle && sessionKey !== undefined) {\n\t\t\t// Keep state.bundle referenced: exit listeners captured by this instance's tool\n\t\t\t// context still route through the shared bundle after the new owner claims it.\n\t\t\t// The lease is deliberately NOT released: the same pid keeps it across the reload.\n\t\t\tdetachManifestWriter(state, sessionKey);\n\t\t\tstate.bundle.park();\n\t\t\tawait parkBundle(sessionKey, state.bundle);\n\t\t\treturn;\n\t\t}\n\t\tif (sessionKey !== undefined) await suspendAndFlushManifest(state, sessionKey);\n\t\tconst lease = state.lease;\n\t\tstate.lease = null;\n\t\tif (lease !== null) {\n\t\t\tawait releaseTerminalLease(lease);\n\t\t} else if (sessionKey !== undefined) {\n\t\t\tconst dir = terminalStateDir(ctx) ?? terminalStateDir(state.ctx);\n\t\t\t// A reload generation inherits the pre-reload lease without re-acquiring it;\n\t\t\t// releasing by (path, own pid) removes exactly that file and no foreign holder's.\n\t\t\tif (dir !== undefined) {\n\t\t\t\tawait releaseTerminalLease({\n\t\t\t\t\tpath: join(dir, `${encodedSessionId(sessionKey)}.lease`),\n\t\t\t\t\tpid: process.pid,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst bundle = state.bundle;\n\t\tstate.bundle = null;\n\t\tawait bundle?.teardown();\n\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t});\n}\n\nexport default registerTerminalExtension;\n"]}