@astralyn/pi 0.85.1 → 0.85.2
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.
- package/CHANGELOG.md +28 -0
- package/dist/cli.js +94 -91
- package/dist/core/agent-session.js +2 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/background/history.d.ts.map +1 -1
- package/dist/core/background/history.js +6 -0
- package/dist/core/background/history.js.map +1 -1
- package/dist/core/background/presentation.d.ts.map +1 -1
- package/dist/core/background/presentation.js +41 -4
- package/dist/core/background/presentation.js.map +1 -1
- package/dist/core/background/service.d.ts +2 -2
- package/dist/core/background/service.d.ts.map +1 -1
- package/dist/core/background/service.js +38 -15
- package/dist/core/background/service.js.map +1 -1
- package/dist/core/background/types.d.ts +9 -0
- package/dist/core/background/types.d.ts.map +1 -1
- package/dist/core/background/types.js +4 -0
- package/dist/core/background/types.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +5 -12
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +11 -19
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/settings.d.ts +27 -0
- package/dist/core/compaction/settings.d.ts.map +1 -0
- package/dist/core/compaction/settings.js +40 -0
- package/dist/core/compaction/settings.js.map +1 -0
- package/dist/core/keybindings.d.ts +15 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +12 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +32 -10
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +38 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +4 -0
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -7
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +7 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tools/bash.js +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +3 -1
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/extensions/background/manager.d.ts +8 -5
- package/dist/extensions/background/manager.d.ts.map +1 -1
- package/dist/extensions/background/manager.js +115 -39
- package/dist/extensions/background/manager.js.map +1 -1
- package/dist/extensions/background/task-view.d.ts +5 -0
- package/dist/extensions/background/task-view.d.ts.map +1 -1
- package/dist/extensions/background/task-view.js +4 -0
- package/dist/extensions/background/task-view.js.map +1 -1
- package/dist/extensions/btw/controller.d.ts +1 -1
- package/dist/extensions/btw/controller.d.ts.map +1 -1
- package/dist/extensions/btw/controller.js +4 -4
- package/dist/extensions/btw/controller.js.map +1 -1
- package/dist/extensions/btw/index.js +3 -3
- package/dist/extensions/btw/index.js.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/provider/catalog.d.ts +57 -0
- package/dist/extensions/provider/catalog.d.ts.map +1 -0
- package/dist/extensions/provider/catalog.js +181 -0
- package/dist/extensions/provider/catalog.js.map +1 -0
- package/dist/extensions/provider/compat-fields.d.ts +25 -0
- package/dist/extensions/provider/compat-fields.d.ts.map +1 -0
- package/dist/extensions/provider/compat-fields.js +148 -0
- package/dist/extensions/provider/compat-fields.js.map +1 -0
- package/dist/extensions/provider/configuration.d.ts +8 -0
- package/dist/extensions/provider/configuration.d.ts.map +1 -0
- package/dist/extensions/provider/configuration.js +21 -0
- package/dist/extensions/provider/configuration.js.map +1 -0
- package/dist/extensions/provider/connection.d.ts +14 -0
- package/dist/extensions/provider/connection.d.ts.map +1 -0
- package/dist/extensions/provider/connection.js +86 -0
- package/dist/extensions/provider/connection.js.map +1 -0
- package/dist/extensions/provider/constants.d.ts +38 -0
- package/dist/extensions/provider/constants.d.ts.map +1 -0
- package/dist/extensions/provider/constants.js +75 -0
- package/dist/extensions/provider/constants.js.map +1 -0
- package/dist/extensions/provider/index.d.ts +4 -0
- package/dist/extensions/provider/index.d.ts.map +1 -0
- package/dist/extensions/provider/index.js +65 -0
- package/dist/extensions/provider/index.js.map +1 -0
- package/dist/extensions/provider/probe.d.ts +34 -0
- package/dist/extensions/provider/probe.d.ts.map +1 -0
- package/dist/extensions/provider/probe.js +178 -0
- package/dist/extensions/provider/probe.js.map +1 -0
- package/dist/extensions/provider/refresh.d.ts +30 -0
- package/dist/extensions/provider/refresh.d.ts.map +1 -0
- package/dist/extensions/provider/refresh.js +66 -0
- package/dist/extensions/provider/refresh.js.map +1 -0
- package/dist/extensions/provider/store.d.ts +131 -0
- package/dist/extensions/provider/store.d.ts.map +1 -0
- package/dist/extensions/provider/store.js +503 -0
- package/dist/extensions/provider/store.js.map +1 -0
- package/dist/extensions/provider/ui/app.d.ts +25 -0
- package/dist/extensions/provider/ui/app.d.ts.map +1 -0
- package/dist/extensions/provider/ui/app.js +153 -0
- package/dist/extensions/provider/ui/app.js.map +1 -0
- package/dist/extensions/provider/ui/builtin-data.d.ts +53 -0
- package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -0
- package/dist/extensions/provider/ui/builtin-data.js +315 -0
- package/dist/extensions/provider/ui/builtin-data.js.map +1 -0
- package/dist/extensions/provider/ui/compat.d.ts +57 -0
- package/dist/extensions/provider/ui/compat.d.ts.map +1 -0
- package/dist/extensions/provider/ui/compat.js +427 -0
- package/dist/extensions/provider/ui/compat.js.map +1 -0
- package/dist/extensions/provider/ui/dialogs.d.ts +30 -0
- package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -0
- package/dist/extensions/provider/ui/dialogs.js +89 -0
- package/dist/extensions/provider/ui/dialogs.js.map +1 -0
- package/dist/extensions/provider/ui/dictionary.d.ts +29 -0
- package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -0
- package/dist/extensions/provider/ui/dictionary.js +385 -0
- package/dist/extensions/provider/ui/dictionary.js.map +1 -0
- package/dist/extensions/provider/ui/editor.d.ts +91 -0
- package/dist/extensions/provider/ui/editor.d.ts.map +1 -0
- package/dist/extensions/provider/ui/editor.js +667 -0
- package/dist/extensions/provider/ui/editor.js.map +1 -0
- package/dist/extensions/provider/ui/fetch-models.d.ts +39 -0
- package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -0
- package/dist/extensions/provider/ui/fetch-models.js +320 -0
- package/dist/extensions/provider/ui/fetch-models.js.map +1 -0
- package/dist/extensions/provider/ui/model-fields.d.ts +43 -0
- package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -0
- package/dist/extensions/provider/ui/model-fields.js +441 -0
- package/dist/extensions/provider/ui/model-fields.js.map +1 -0
- package/dist/extensions/provider/ui/model-options.d.ts +93 -0
- package/dist/extensions/provider/ui/model-options.d.ts.map +1 -0
- package/dist/extensions/provider/ui/model-options.js +529 -0
- package/dist/extensions/provider/ui/model-options.js.map +1 -0
- package/dist/extensions/provider/ui/pane.d.ts +81 -0
- package/dist/extensions/provider/ui/pane.d.ts.map +1 -0
- package/dist/extensions/provider/ui/pane.js +3 -0
- package/dist/extensions/provider/ui/pane.js.map +1 -0
- package/dist/extensions/provider/ui/provider-fields.d.ts +60 -0
- package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -0
- package/dist/extensions/provider/ui/provider-fields.js +326 -0
- package/dist/extensions/provider/ui/provider-fields.js.map +1 -0
- package/dist/extensions/provider/ui/provider-list.d.ts +34 -0
- package/dist/extensions/provider/ui/provider-list.d.ts.map +1 -0
- package/dist/extensions/provider/ui/provider-list.js +162 -0
- package/dist/extensions/provider/ui/provider-list.js.map +1 -0
- package/dist/extensions/provider/ui/session.d.ts +20 -0
- package/dist/extensions/provider/ui/session.d.ts.map +1 -0
- package/dist/extensions/provider/ui/session.js +52 -0
- package/dist/extensions/provider/ui/session.js.map +1 -0
- package/dist/extensions/provider/ui/thinking-map.d.ts +20 -0
- package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -0
- package/dist/extensions/provider/ui/thinking-map.js +166 -0
- package/dist/extensions/provider/ui/thinking-map.js.map +1 -0
- package/dist/extensions/provider/ui/value-row.d.ts +88 -0
- package/dist/extensions/provider/ui/value-row.d.ts.map +1 -0
- package/dist/extensions/provider/ui/value-row.js +158 -0
- package/dist/extensions/provider/ui/value-row.js.map +1 -0
- package/dist/extensions/statusline/index.js +2 -2
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +4 -2
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/resolve.d.ts +5 -0
- package/dist/extensions/subagent/resolve.d.ts.map +1 -1
- package/dist/extensions/subagent/resolve.js +15 -7
- package/dist/extensions/subagent/resolve.js.map +1 -1
- package/dist/extensions/subagent/schema.d.ts +2 -0
- package/dist/extensions/subagent/schema.d.ts.map +1 -1
- package/dist/extensions/subagent/schema.js +1 -0
- package/dist/extensions/subagent/schema.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +20 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +6 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +94 -91
- package/docs/bundled/README.md +1 -1
- package/docs/bundled/extensions/background.md +5 -5
- package/docs/bundled/extensions/provider.md +117 -0
- package/docs/bundled/extensions/statusline.md +1 -1
- package/docs/bundled/extensions/subagent.md +7 -3
- package/docs/compaction.md +16 -6
- package/docs/docs.json +2 -2
- package/docs/keybindings.md +3 -0
- package/docs/settings.md +11 -7
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/dist/extensions/router/constants.d.ts +0 -23
- package/dist/extensions/router/constants.d.ts.map +0 -1
- package/dist/extensions/router/constants.js +0 -30
- package/dist/extensions/router/constants.js.map +0 -1
- package/dist/extensions/router/dialog-host.d.ts +0 -60
- package/dist/extensions/router/dialog-host.d.ts.map +0 -1
- package/dist/extensions/router/dialog-host.js +0 -196
- package/dist/extensions/router/dialog-host.js.map +0 -1
- package/dist/extensions/router/dialog.d.ts +0 -45
- package/dist/extensions/router/dialog.d.ts.map +0 -1
- package/dist/extensions/router/dialog.js +0 -378
- package/dist/extensions/router/dialog.js.map +0 -1
- package/dist/extensions/router/identity.d.ts +0 -15
- package/dist/extensions/router/identity.d.ts.map +0 -1
- package/dist/extensions/router/identity.js +0 -173
- package/dist/extensions/router/identity.js.map +0 -1
- package/dist/extensions/router/index.d.ts +0 -15
- package/dist/extensions/router/index.d.ts.map +0 -1
- package/dist/extensions/router/index.js +0 -70
- package/dist/extensions/router/index.js.map +0 -1
- package/dist/extensions/router/presets.d.ts +0 -51
- package/dist/extensions/router/presets.d.ts.map +0 -1
- package/dist/extensions/router/presets.js +0 -108
- package/dist/extensions/router/presets.js.map +0 -1
- package/dist/extensions/router/probe.d.ts +0 -26
- package/dist/extensions/router/probe.d.ts.map +0 -1
- package/dist/extensions/router/probe.js +0 -216
- package/dist/extensions/router/probe.js.map +0 -1
- package/dist/extensions/router/register.d.ts +0 -12
- package/dist/extensions/router/register.d.ts.map +0 -1
- package/dist/extensions/router/register.js +0 -90
- package/dist/extensions/router/register.js.map +0 -1
- package/dist/extensions/router/state.d.ts +0 -20
- package/dist/extensions/router/state.d.ts.map +0 -1
- package/dist/extensions/router/state.js +0 -169
- package/dist/extensions/router/state.js.map +0 -1
- package/dist/extensions/router/store.d.ts +0 -12
- package/dist/extensions/router/store.d.ts.map +0 -1
- package/dist/extensions/router/store.js +0 -266
- package/dist/extensions/router/store.js.map +0 -1
- package/dist/extensions/router/stream.d.ts +0 -12
- package/dist/extensions/router/stream.d.ts.map +0 -1
- package/dist/extensions/router/stream.js +0 -233
- package/dist/extensions/router/stream.js.map +0 -1
- package/dist/extensions/router/transport.d.ts +0 -9
- package/dist/extensions/router/transport.d.ts.map +0 -1
- package/dist/extensions/router/transport.js +0 -81
- package/dist/extensions/router/transport.js.map +0 -1
- package/dist/extensions/router/types.d.ts +0 -39
- package/dist/extensions/router/types.d.ts.map +0 -1
- package/dist/extensions/router/types.js +0 -2
- package/dist/extensions/router/types.js.map +0 -1
- package/dist/extensions/router/ui.d.ts +0 -26
- package/dist/extensions/router/ui.d.ts.map +0 -1
- package/dist/extensions/router/ui.js +0 -897
- package/dist/extensions/router/ui.js.map +0 -1
- package/docs/bundled/extensions/router.md +0 -197
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/core/background/history.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAuD5C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/core/background/history.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAuD5C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CA2FlF"}
|
|
@@ -119,6 +119,12 @@ export function parseBackgroundHistory(record) {
|
|
|
119
119
|
return undefined;
|
|
120
120
|
task[key] = value;
|
|
121
121
|
}
|
|
122
|
+
const exitCode = field(source, "exitCode");
|
|
123
|
+
if (exitCode !== undefined) {
|
|
124
|
+
if (exitCode !== null && (typeof exitCode !== "number" || !Number.isSafeInteger(exitCode)))
|
|
125
|
+
return undefined;
|
|
126
|
+
task.exitCode = exitCode;
|
|
127
|
+
}
|
|
122
128
|
if (task.command !== undefined && task.command !== field(source, "command"))
|
|
123
129
|
task.commandTruncated = true;
|
|
124
130
|
const projection = field(source, "projection");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/core/background/history.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\tBACKGROUND_DETAILS_BYTES,\n\tBACKGROUND_RESULT_BYTES,\n\tBACKGROUND_TITLE_BYTES,\n\tboundedResult,\n\tboundText,\n} from \"./output.ts\";\nimport { readBackgroundProjection } from \"./presentation.ts\";\nimport type { BackgroundTask } from \"./types.ts\";\n\nexport const BACKGROUND_HISTORY_VERSION = 2;\n\n/** Read persisted data properties only; never invoke getters or custom serialization. */\nfunction dataObject(value: unknown): Record<string, unknown> {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain object\");\n\treturn value as Record<string, unknown>;\n}\n\nfunction field(object: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected accessor\");\n\treturn descriptor?.value;\n}\n\nfunction historyString(value: unknown, bytes: number, exact = false): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected string\");\n\tif (exact && (!value || value.length > bytes || Buffer.byteLength(value) > bytes || value.includes(\"\\0\")))\n\t\tthrow new Error(\"Invalid identity or path\");\n\treturn boundText(value, bytes);\n}\n\n/** Bound traversal before serialization, and omit unsupported/oversized details intact. */\nfunction historyDetails(value: unknown): unknown {\n\tlet budget = BACKGROUND_DETAILS_BYTES;\n\tfunction copy(value: unknown, depth: number): unknown {\n\t\tif (--budget < 0 || depth > 32) throw new Error(\"History details too large\");\n\t\tif (value === null || typeof value === \"boolean\") return value;\n\t\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\t\tif (typeof value === \"string\") {\n\t\t\tbudget -= value.length;\n\t\t\tif (budget < 0) throw new Error(\"History details too large\");\n\t\t\treturn value;\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length > budget) throw new Error(\"History details too large\");\n\t\t\treturn Array.from({ length: value.length }, (_, index) => copy(field(value, String(index)), depth + 1));\n\t\t}\n\t\tconst object = dataObject(value);\n\t\tconst out: Record<string, unknown> = Object.create(null);\n\t\tfor (const key in object) {\n\t\t\tif (!Object.hasOwn(object, key)) continue;\n\t\t\tbudget -= key.length + 3;\n\t\t\tout[key] = copy(field(object, key), depth + 1);\n\t\t}\n\t\treturn out;\n\t}\n\ttry {\n\t\treturn copy(value, 0);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function parseBackgroundHistory(record: unknown): BackgroundTask | undefined {\n\ttry {\n\t\tconst envelope = dataObject(record);\n\t\tif (field(envelope, \"version\") !== BACKGROUND_HISTORY_VERSION) return undefined;\n\t\tconst source = dataObject(field(envelope, \"task\"));\n\t\tconst kind = field(source, \"kind\");\n\t\tconst mode = field(source, \"mode\");\n\t\tconst status = field(source, \"status\");\n\t\tif (kind !== \"bash\" && kind !== \"subagent\") return undefined;\n\t\tif (mode !== \"foreground\" && mode !== \"background\") return undefined;\n\t\tif (\n\t\t\tstatus !== \"completed\" &&\n\t\t\tstatus !== \"partial\" &&\n\t\t\tstatus !== \"failed\" &&\n\t\t\tstatus !== \"cancelled\" &&\n\t\t\tstatus !== \"timeout\"\n\t\t)\n\t\t\treturn undefined;\n\t\tconst startedAt = field(source, \"startedAt\");\n\t\tconst endedAt = field(source, \"endedAt\");\n\t\tif (\n\t\t\ttypeof startedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(startedAt) ||\n\t\t\tstartedAt < 0 ||\n\t\t\ttypeof endedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(endedAt) ||\n\t\t\tendedAt < startedAt\n\t\t)\n\t\t\treturn undefined;\n\t\tconst anchor = field(source, \"anchorId\");\n\t\tconst task: BackgroundTask = {\n\t\t\tid: historyString(field(source, \"id\"), 512, true),\n\t\t\tkind,\n\t\t\tmode,\n\t\t\tstatus,\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t\ttitle: historyString(field(source, \"title\"), BACKGROUND_TITLE_BYTES),\n\t\t\ttoolCallId: historyString(field(source, \"toolCallId\"), 512, true),\n\t\t\tanchorId: anchor === null ? null : historyString(anchor, 8192, true),\n\t\t};\n\t\tif (!task.id.startsWith(`${kind}-`) || task.id.length <= kind.length + 1) return undefined;\n\t\tfor (const [key, bytes] of [\n\t\t\t[\"command\", 8192],\n\t\t\t[\"cwd\", 4096],\n\t\t\t[\"error\", 4096],\n\t\t\t[\"outputPath\", 8192],\n\t\t] as const) {\n\t\t\tconst value = field(source, key);\n\t\t\tif (value !== undefined) task[key] = historyString(value, bytes, key === \"outputPath\");\n\t\t}\n\t\tfor (const key of [\"commandTruncated\", \"resultTruncated\"] as const) {\n\t\t\tconst value = field(source, key);\n\t\t\tif (value !== undefined && typeof value !== \"boolean\") return undefined;\n\t\t\ttask[key] = value;\n\t\t}\n\t\tif (task.command !== undefined && task.command !== field(source, \"command\")) task.commandTruncated = true;\n\t\tconst projection = field(source, \"projection\");\n\t\tif (projection !== undefined) {\n\t\t\ttask.projection = readBackgroundProjection(projection);\n\t\t}\n\t\tconst result = field(source, \"result\");\n\t\tif (result !== undefined) {\n\t\t\tconst object = dataObject(result);\n\t\t\tconst blocks = field(object, \"content\");\n\t\t\tif (!Array.isArray(blocks)) return undefined;\n\t\t\tconst content: AgentToolResult<unknown>[\"content\"] = [];\n\t\t\tlet remaining = BACKGROUND_RESULT_BYTES;\n\t\t\tfor (let index = 0; index < blocks.length && remaining > 0; index++) {\n\t\t\t\tconst block = dataObject(field(blocks, String(index)));\n\t\t\t\tconst type = field(block, \"type\");\n\t\t\t\tif (type !== \"text\" && type !== \"image\") return undefined;\n\t\t\t\tconst original = type === \"text\" ? field(block, \"text\") : undefined;\n\t\t\t\tconst text =\n\t\t\t\t\ttype === \"text\" ? historyString(original, remaining) : \"[Image omitted from background history]\";\n\t\t\t\tif (text !== original) task.resultTruncated = true;\n\t\t\t\tcontent.push({ type: \"text\", text });\n\t\t\t\tremaining -= Math.max(1, Buffer.byteLength(text));\n\t\t\t}\n\t\t\tif (content.length < blocks.length) task.resultTruncated = true;\n\t\t\ttask.result = boundedResult({ content, details: historyDetails(field(object, \"details\")) });\n\t\t}\n\t\treturn task;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/core/background/history.ts"],"names":[],"mappings":"AACA,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,SAAS,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAE5C,yFAAyF;AACzF,SAAS,UAAU,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC5G,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACnG,OAAO,KAAgC,CAAC;AACzC,CAAC;AAED,SAAS,KAAK,CAAC,MAAc,EAAE,GAAW;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChE,IAAI,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnF,OAAO,UAAU,EAAE,KAAK,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa,EAAE,KAAK,GAAG,KAAK;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAClE,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxG,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7C,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,2FAA2F;AAC3F,SAAS,cAAc,CAAC,KAAc;IACrC,IAAI,MAAM,GAAG,wBAAwB,CAAC;IACtC,SAAS,IAAI,CAAC,KAAc,EAAE,KAAa;QAC1C,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC7E,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACvB,IAAI,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC7D,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACzG,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,GAAG,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;gBAAE,SAAS;YAC1C,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAe;IACrD,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,0BAA0B;YAAE,OAAO,SAAS,CAAC;QAChF,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QAC7D,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,SAAS,CAAC;QACrE,IACC,MAAM,KAAK,WAAW;YACtB,MAAM,KAAK,SAAS;YACpB,MAAM,KAAK,QAAQ;YACnB,MAAM,KAAK,WAAW;YACtB,MAAM,KAAK,SAAS;YAEpB,OAAO,SAAS,CAAC;QAClB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,IACC,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;YAChC,SAAS,GAAG,CAAC;YACb,OAAO,OAAO,KAAK,QAAQ;YAC3B,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;YAC9B,OAAO,GAAG,SAAS;YAEnB,OAAO,SAAS,CAAC;QAClB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACzC,MAAM,IAAI,GAAmB;YAC5B,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC;YACjD,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,SAAS;YACT,OAAO;YACP,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,CAAC;YACpE,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC;YACjE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;SACpE,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3F,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI;YAC1B,CAAC,SAAS,EAAE,IAAI,CAAC;YACjB,CAAC,KAAK,EAAE,IAAI,CAAC;YACb,CAAC,OAAO,EAAE,IAAI,CAAC;YACf,CAAC,YAAY,EAAE,IAAI,CAAC;SACX,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,YAAY,CAAC,CAAC;QACxF,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,CAAU,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC7G,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;YAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC1G,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC7C,MAAM,OAAO,GAAwC,EAAE,CAAC;YACxD,IAAI,SAAS,GAAG,uBAAuB,CAAC;YACxC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACrE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAClC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO;oBAAE,OAAO,SAAS,CAAC;gBAC1D,MAAM,QAAQ,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpE,MAAM,IAAI,GACT,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,yCAAyC,CAAC;gBAClG,IAAI,IAAI,KAAK,QAAQ;oBAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;gBAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAChE,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\tBACKGROUND_DETAILS_BYTES,\n\tBACKGROUND_RESULT_BYTES,\n\tBACKGROUND_TITLE_BYTES,\n\tboundedResult,\n\tboundText,\n} from \"./output.ts\";\nimport { readBackgroundProjection } from \"./presentation.ts\";\nimport type { BackgroundTask } from \"./types.ts\";\n\nexport const BACKGROUND_HISTORY_VERSION = 2;\n\n/** Read persisted data properties only; never invoke getters or custom serialization. */\nfunction dataObject(value: unknown): Record<string, unknown> {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain object\");\n\treturn value as Record<string, unknown>;\n}\n\nfunction field(object: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected accessor\");\n\treturn descriptor?.value;\n}\n\nfunction historyString(value: unknown, bytes: number, exact = false): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected string\");\n\tif (exact && (!value || value.length > bytes || Buffer.byteLength(value) > bytes || value.includes(\"\\0\")))\n\t\tthrow new Error(\"Invalid identity or path\");\n\treturn boundText(value, bytes);\n}\n\n/** Bound traversal before serialization, and omit unsupported/oversized details intact. */\nfunction historyDetails(value: unknown): unknown {\n\tlet budget = BACKGROUND_DETAILS_BYTES;\n\tfunction copy(value: unknown, depth: number): unknown {\n\t\tif (--budget < 0 || depth > 32) throw new Error(\"History details too large\");\n\t\tif (value === null || typeof value === \"boolean\") return value;\n\t\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\t\tif (typeof value === \"string\") {\n\t\t\tbudget -= value.length;\n\t\t\tif (budget < 0) throw new Error(\"History details too large\");\n\t\t\treturn value;\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length > budget) throw new Error(\"History details too large\");\n\t\t\treturn Array.from({ length: value.length }, (_, index) => copy(field(value, String(index)), depth + 1));\n\t\t}\n\t\tconst object = dataObject(value);\n\t\tconst out: Record<string, unknown> = Object.create(null);\n\t\tfor (const key in object) {\n\t\t\tif (!Object.hasOwn(object, key)) continue;\n\t\t\tbudget -= key.length + 3;\n\t\t\tout[key] = copy(field(object, key), depth + 1);\n\t\t}\n\t\treturn out;\n\t}\n\ttry {\n\t\treturn copy(value, 0);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function parseBackgroundHistory(record: unknown): BackgroundTask | undefined {\n\ttry {\n\t\tconst envelope = dataObject(record);\n\t\tif (field(envelope, \"version\") !== BACKGROUND_HISTORY_VERSION) return undefined;\n\t\tconst source = dataObject(field(envelope, \"task\"));\n\t\tconst kind = field(source, \"kind\");\n\t\tconst mode = field(source, \"mode\");\n\t\tconst status = field(source, \"status\");\n\t\tif (kind !== \"bash\" && kind !== \"subagent\") return undefined;\n\t\tif (mode !== \"foreground\" && mode !== \"background\") return undefined;\n\t\tif (\n\t\t\tstatus !== \"completed\" &&\n\t\t\tstatus !== \"partial\" &&\n\t\t\tstatus !== \"failed\" &&\n\t\t\tstatus !== \"cancelled\" &&\n\t\t\tstatus !== \"timeout\"\n\t\t)\n\t\t\treturn undefined;\n\t\tconst startedAt = field(source, \"startedAt\");\n\t\tconst endedAt = field(source, \"endedAt\");\n\t\tif (\n\t\t\ttypeof startedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(startedAt) ||\n\t\t\tstartedAt < 0 ||\n\t\t\ttypeof endedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(endedAt) ||\n\t\t\tendedAt < startedAt\n\t\t)\n\t\t\treturn undefined;\n\t\tconst anchor = field(source, \"anchorId\");\n\t\tconst task: BackgroundTask = {\n\t\t\tid: historyString(field(source, \"id\"), 512, true),\n\t\t\tkind,\n\t\t\tmode,\n\t\t\tstatus,\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t\ttitle: historyString(field(source, \"title\"), BACKGROUND_TITLE_BYTES),\n\t\t\ttoolCallId: historyString(field(source, \"toolCallId\"), 512, true),\n\t\t\tanchorId: anchor === null ? null : historyString(anchor, 8192, true),\n\t\t};\n\t\tif (!task.id.startsWith(`${kind}-`) || task.id.length <= kind.length + 1) return undefined;\n\t\tfor (const [key, bytes] of [\n\t\t\t[\"command\", 8192],\n\t\t\t[\"cwd\", 4096],\n\t\t\t[\"error\", 4096],\n\t\t\t[\"outputPath\", 8192],\n\t\t] as const) {\n\t\t\tconst value = field(source, key);\n\t\t\tif (value !== undefined) task[key] = historyString(value, bytes, key === \"outputPath\");\n\t\t}\n\t\tfor (const key of [\"commandTruncated\", \"resultTruncated\"] as const) {\n\t\t\tconst value = field(source, key);\n\t\t\tif (value !== undefined && typeof value !== \"boolean\") return undefined;\n\t\t\ttask[key] = value;\n\t\t}\n\t\tconst exitCode = field(source, \"exitCode\");\n\t\tif (exitCode !== undefined) {\n\t\t\tif (exitCode !== null && (typeof exitCode !== \"number\" || !Number.isSafeInteger(exitCode))) return undefined;\n\t\t\ttask.exitCode = exitCode;\n\t\t}\n\t\tif (task.command !== undefined && task.command !== field(source, \"command\")) task.commandTruncated = true;\n\t\tconst projection = field(source, \"projection\");\n\t\tif (projection !== undefined) {\n\t\t\ttask.projection = readBackgroundProjection(projection);\n\t\t}\n\t\tconst result = field(source, \"result\");\n\t\tif (result !== undefined) {\n\t\t\tconst object = dataObject(result);\n\t\t\tconst blocks = field(object, \"content\");\n\t\t\tif (!Array.isArray(blocks)) return undefined;\n\t\t\tconst content: AgentToolResult<unknown>[\"content\"] = [];\n\t\t\tlet remaining = BACKGROUND_RESULT_BYTES;\n\t\t\tfor (let index = 0; index < blocks.length && remaining > 0; index++) {\n\t\t\t\tconst block = dataObject(field(blocks, String(index)));\n\t\t\t\tconst type = field(block, \"type\");\n\t\t\t\tif (type !== \"text\" && type !== \"image\") return undefined;\n\t\t\t\tconst original = type === \"text\" ? field(block, \"text\") : undefined;\n\t\t\t\tconst text =\n\t\t\t\t\ttype === \"text\" ? historyString(original, remaining) : \"[Image omitted from background history]\";\n\t\t\t\tif (text !== original) task.resultTruncated = true;\n\t\t\t\tcontent.push({ type: \"text\", text });\n\t\t\t\tremaining -= Math.max(1, Buffer.byteLength(text));\n\t\t\t}\n\t\t\tif (content.length < blocks.length) task.resultTruncated = true;\n\t\t\ttask.result = boundedResult({ content, details: historyDetails(field(object, \"details\")) });\n\t\t}\n\t\treturn task;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../../src/core/background/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,KAAK,EACX,4BAA4B,EAC5B,oBAAoB,EACpB,cAAc,EAKd,MAAM,YAAY,CAAC;AAoEpB,uGAAuG;AACvG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAyB7E;AAcD,gHAAgH;AAChH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,4BAA4B,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../../src/core/background/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,KAAK,EACX,4BAA4B,EAC5B,oBAAoB,EACpB,cAAc,EAKd,MAAM,YAAY,CAAC;AAoEpB,uGAAuG;AACvG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAyB7E;AAcD,gHAAgH;AAChH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,4BAA4B,GAAG,SAAS,CA8EjG;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,cAAc,GAAG,4BAA4B,CA4C/F;AAkFD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,cAAc,GAAG,aAAa,CAAC,4BAA4B,CAAC,CAU7G"}
|
|
@@ -142,6 +142,11 @@ export function readBackgroundCompletion(value) {
|
|
|
142
142
|
if (kind === "bash") {
|
|
143
143
|
const command = field(source, "command");
|
|
144
144
|
const outputPath = field(source, "outputPath");
|
|
145
|
+
const exitCode = field(source, "exitCode");
|
|
146
|
+
if (exitCode !== undefined &&
|
|
147
|
+
exitCode !== null &&
|
|
148
|
+
(typeof exitCode !== "number" || !Number.isSafeInteger(exitCode)))
|
|
149
|
+
return undefined;
|
|
145
150
|
// A clipped path would name a different file. Omit oversized paths intact.
|
|
146
151
|
if (outputPath !== undefined && typeof outputPath !== "string")
|
|
147
152
|
return undefined;
|
|
@@ -151,6 +156,7 @@ export function readBackgroundCompletion(value) {
|
|
|
151
156
|
shell: optionalString(source, "shell", 128),
|
|
152
157
|
command: command === undefined ? undefined : text(command, 8192),
|
|
153
158
|
cwd: optionalString(source, "cwd", 4096),
|
|
159
|
+
...(exitCode !== undefined ? { exitCode } : {}),
|
|
154
160
|
outputPath: outputPath &&
|
|
155
161
|
!outputPath.includes("\0") &&
|
|
156
162
|
outputPath.length <= 8192 &&
|
|
@@ -204,6 +210,7 @@ export function backgroundCompletionSnapshot(task) {
|
|
|
204
210
|
: { text: task.command, truncated: task.commandTruncated ?? false },
|
|
205
211
|
cwd: task.cwd,
|
|
206
212
|
outputPath: task.outputPath,
|
|
213
|
+
...(task.exitCode !== undefined ? { exitCode: task.exitCode } : {}),
|
|
207
214
|
output: task.projection?.shell?.output ?? output,
|
|
208
215
|
}
|
|
209
216
|
: {
|
|
@@ -225,6 +232,33 @@ function modelText(value, bytes, lines) {
|
|
|
225
232
|
});
|
|
226
233
|
return result.content + (value.truncated || result.truncated ? OMISSION : "");
|
|
227
234
|
}
|
|
235
|
+
/** One bounded action hint per terminal outcome; completed work needs none. */
|
|
236
|
+
function nextStepLine(snapshot) {
|
|
237
|
+
switch (snapshot.status) {
|
|
238
|
+
case "cancelled":
|
|
239
|
+
return "Next step: the task was cancelled — do not restart it unless the user asks.";
|
|
240
|
+
case "timeout":
|
|
241
|
+
return "Next step: the task hit its timeout; inspect the partial output above, then rerun with a longer timeout or in smaller pieces if still needed.";
|
|
242
|
+
case "failed":
|
|
243
|
+
case "partial": {
|
|
244
|
+
if (snapshot.kind === "subagent") {
|
|
245
|
+
const unfinished = snapshot.workers
|
|
246
|
+
.filter((worker) => worker.status !== "completed")
|
|
247
|
+
.map((worker) => singleLine(worker.description))
|
|
248
|
+
.filter(Boolean);
|
|
249
|
+
const names = unfinished.length > 3
|
|
250
|
+
? `${unfinished.slice(0, 3).join(", ")}, +${unfinished.length - 3} more`
|
|
251
|
+
: unfinished.join(", ");
|
|
252
|
+
return names
|
|
253
|
+
? `Next step: re-delegate the unfinished work in a fresh subagent call if still needed (${names}).`
|
|
254
|
+
: "Next step: re-delegate the work in a fresh subagent call if still needed.";
|
|
255
|
+
}
|
|
256
|
+
return "Next step: diagnose from the output above before retrying; rerun only what is still needed.";
|
|
257
|
+
}
|
|
258
|
+
default:
|
|
259
|
+
return "";
|
|
260
|
+
}
|
|
261
|
+
}
|
|
228
262
|
/** The model and the card share facts; only the model receives this prose projection. */
|
|
229
263
|
function notificationText(snapshot) {
|
|
230
264
|
const header = [
|
|
@@ -240,8 +274,10 @@ function notificationText(snapshot) {
|
|
|
240
274
|
header.push(`Output: ${singleLine(snapshot.outputPath)}`);
|
|
241
275
|
}
|
|
242
276
|
const prefix = `${header.join("\n")}\n\n`;
|
|
243
|
-
const
|
|
244
|
-
const
|
|
277
|
+
const guidance = nextStepLine(snapshot);
|
|
278
|
+
const suffix = guidance ? `\n\n${guidance}` : "";
|
|
279
|
+
const remaining = BACKGROUND_RESULT_BYTES - Buffer.byteLength(prefix) - Buffer.byteLength(suffix);
|
|
280
|
+
const lines = MODEL_LINES - prefix.split("\n").length - (guidance ? 3 : 0);
|
|
245
281
|
if (snapshot.kind === "subagent" && snapshot.workers.length) {
|
|
246
282
|
// Allocate before formatting, so one verbose report cannot erase later workers.
|
|
247
283
|
const budget = Math.floor((remaining - 8 * snapshot.workers.length) / snapshot.workers.length);
|
|
@@ -256,9 +292,10 @@ function notificationText(snapshot) {
|
|
|
256
292
|
: { text: "No report returned.", truncated: worker.report.truncated };
|
|
257
293
|
return heading + reason + modelText(body, budget - Buffer.byteLength(heading + reason), lineBudget);
|
|
258
294
|
})
|
|
259
|
-
.join("\n\n---\n\n")
|
|
295
|
+
.join("\n\n---\n\n") +
|
|
296
|
+
suffix);
|
|
260
297
|
}
|
|
261
|
-
return prefix + modelText(snapshot.output ?? { text: "No text result.", truncated: false }, remaining, lines);
|
|
298
|
+
return (prefix + modelText(snapshot.output ?? { text: "No text result.", truncated: false }, remaining, lines) + suffix);
|
|
262
299
|
}
|
|
263
300
|
export function backgroundCompletionMessage(task) {
|
|
264
301
|
const details = backgroundCompletionSnapshot(task);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../../src/core/background/presentation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"../messages.ts\";\nimport { truncateHead } from \"../tools/truncate.ts\";\nimport { BACKGROUND_DETAILS_BYTES, BACKGROUND_RESULT_BYTES, BACKGROUND_TITLE_BYTES, boundText } from \"./output.ts\";\nimport type {\n\tBackgroundCompletionSnapshot,\n\tBackgroundProjection,\n\tBackgroundTask,\n\tBackgroundTerminalStatus,\n\tBackgroundText,\n\tBackgroundWorker,\n\tBackgroundWorkerReport,\n} from \"./types.ts\";\n\nconst OUTPUT_BYTES = 40 * 1024;\nconst REPORT_BYTES = 4 * 1024;\nconst MAX_WORKERS = 8;\nconst MODEL_LINES = 2000;\n\n/** Read data properties only, including at the persisted-message boundary. */\nfunction object(value: unknown): object {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected snapshot object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain snapshot\");\n\treturn value;\n}\n\nfunction field(value: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected snapshot accessor\");\n\treturn descriptor?.value;\n}\n\n/** Bound escaped JSON as well as UTF-8, without serializing an unbounded source. */\nfunction string(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected snapshot text\");\n\tconst prefix = boundText(value, bytes - 2);\n\tif (Buffer.byteLength(JSON.stringify(prefix)) <= bytes) return prefix;\n\tlet low = 0;\n\tlet high = Buffer.byteLength(prefix);\n\twhile (low < high) {\n\t\tconst middle = Math.ceil((low + high) / 2);\n\t\tif (Buffer.byteLength(JSON.stringify(boundText(prefix, middle))) <= bytes) low = middle;\n\t\telse high = middle - 1;\n\t}\n\treturn boundText(prefix, low);\n}\n\nfunction optionalString(source: object, key: string, bytes: number): string | undefined {\n\tconst value = field(source, key);\n\treturn value === undefined ? undefined : string(value, bytes);\n}\n\nfunction text(value: unknown, bytes: number): BackgroundText {\n\tconst source = object(value);\n\tconst original = field(source, \"text\");\n\tconst truncated = field(source, \"truncated\");\n\tif (typeof truncated !== \"boolean\") throw new Error(\"Expected truncation flag\");\n\tconst bounded = string(original, bytes);\n\treturn { text: bounded, truncated: truncated || bounded !== original };\n}\n\nfunction workerReport(value: unknown): BackgroundWorkerReport {\n\tconst source = object(value);\n\treturn {\n\t\tid: string(field(source, \"id\"), 256),\n\t\tlabel: string(field(source, \"label\"), 512),\n\t\tprofile: string(field(source, \"profile\"), 128),\n\t\tdescription: string(field(source, \"description\"), 512),\n\t\tstatus: string(field(source, \"status\"), 128),\n\t\treport: text(field(source, \"report\"), REPORT_BYTES),\n\t\terror: optionalString(source, \"error\", 1024),\n\t};\n}\n\nfunction workers<T>(value: unknown, read: (value: unknown) => T): T[] {\n\tif (!Array.isArray(value)) throw new Error(\"Expected workers\");\n\treturn Array.from({ length: Math.min(value.length, MAX_WORKERS) }, (_, index) => read(field(value, String(index))));\n}\n\n/** Shared by live publication and history restoration; never imports an executor's private details. */\nexport function readBackgroundProjection(value: unknown): BackgroundProjection {\n\tconst source = object(value);\n\tconst projection: BackgroundProjection = { text: optionalString(source, \"text\", 16 * 1024) };\n\tconst shell = field(source, \"shell\");\n\tif (shell !== undefined) {\n\t\tconst fields = object(shell);\n\t\tprojection.shell = {\n\t\t\tname: string(field(fields, \"name\"), 128),\n\t\t\toutput: text(field(fields, \"output\"), OUTPUT_BYTES),\n\t\t};\n\t}\n\tconst reports = field(source, \"workers\");\n\tif (reports !== undefined) {\n\t\tprojection.workers = workers(reports, (value): BackgroundWorker => {\n\t\t\tconst fields = object(value);\n\t\t\treturn {\n\t\t\t\t...workerReport(value),\n\t\t\t\tprompt: string(field(fields, \"prompt\"), 4096),\n\t\t\t\tactivity: string(field(fields, \"activity\"), 1024),\n\t\t\t\tmodel: optionalString(fields, \"model\", 256),\n\t\t\t\tusage: optionalString(fields, \"usage\", 256),\n\t\t\t};\n\t\t});\n\t}\n\treturn projection;\n}\n\nfunction terminalStatus(value: unknown): BackgroundTerminalStatus {\n\tif (\n\t\tvalue === \"completed\" ||\n\t\tvalue === \"partial\" ||\n\t\tvalue === \"failed\" ||\n\t\tvalue === \"cancelled\" ||\n\t\tvalue === \"timeout\"\n\t)\n\t\treturn value;\n\tthrow new Error(\"Expected terminal status\");\n}\n\n/** Only this format is understood. Invalid/older details receive the renderer's bounded plain-text fallback. */\nexport function readBackgroundCompletion(value: unknown): BackgroundCompletionSnapshot | undefined {\n\ttry {\n\t\tconst source = object(value);\n\t\tif (field(source, \"version\") !== 1) return undefined;\n\t\tconst taskId = field(source, \"taskId\");\n\t\tconst kind = field(source, \"kind\");\n\t\tif (kind !== \"bash\" && kind !== \"subagent\") return undefined;\n\t\tif (\n\t\t\ttypeof taskId !== \"string\" ||\n\t\t\t!taskId.startsWith(`${kind}-`) ||\n\t\t\ttaskId.length <= kind.length + 1 ||\n\t\t\ttaskId.length > 512 ||\n\t\t\tBuffer.byteLength(taskId) > 512 ||\n\t\t\ttaskId.includes(\"\\0\")\n\t\t)\n\t\t\treturn undefined;\n\t\tconst startedAt = field(source, \"startedAt\");\n\t\tconst endedAt = field(source, \"endedAt\");\n\t\tif (\n\t\t\ttypeof startedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(startedAt) ||\n\t\t\tstartedAt < 0 ||\n\t\t\ttypeof endedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(endedAt) ||\n\t\t\tendedAt < startedAt\n\t\t)\n\t\t\treturn undefined;\n\t\tconst common = {\n\t\t\tversion: 1 as const,\n\t\t\ttaskId,\n\t\t\ttitle: string(field(source, \"title\"), BACKGROUND_TITLE_BYTES),\n\t\t\tstatus: terminalStatus(field(source, \"status\")),\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t\terror: optionalString(source, \"error\", 4096),\n\t\t};\n\t\tlet snapshot: BackgroundCompletionSnapshot;\n\t\tif (kind === \"bash\") {\n\t\t\tconst command = field(source, \"command\");\n\t\t\tconst outputPath = field(source, \"outputPath\");\n\t\t\t// A clipped path would name a different file. Omit oversized paths intact.\n\t\t\tif (outputPath !== undefined && typeof outputPath !== \"string\") return undefined;\n\t\t\tsnapshot = {\n\t\t\t\t...common,\n\t\t\t\tkind,\n\t\t\t\tshell: optionalString(source, \"shell\", 128),\n\t\t\t\tcommand: command === undefined ? undefined : text(command, 8192),\n\t\t\t\tcwd: optionalString(source, \"cwd\", 4096),\n\t\t\t\toutputPath:\n\t\t\t\t\toutputPath &&\n\t\t\t\t\t!outputPath.includes(\"\\0\") &&\n\t\t\t\t\toutputPath.length <= 8192 &&\n\t\t\t\t\tBuffer.byteLength(JSON.stringify(outputPath)) <= 8192\n\t\t\t\t\t\t? outputPath\n\t\t\t\t\t\t: undefined,\n\t\t\t\toutput: text(field(source, \"output\"), OUTPUT_BYTES),\n\t\t\t};\n\t\t} else {\n\t\t\tconst output = field(source, \"output\");\n\t\t\tsnapshot = {\n\t\t\t\t...common,\n\t\t\t\tkind,\n\t\t\t\tworkers: workers(field(source, \"workers\"), workerReport),\n\t\t\t\toutput: output === undefined ? undefined : text(output, OUTPUT_BYTES),\n\t\t\t};\n\t\t}\n\t\treturn Buffer.byteLength(JSON.stringify(snapshot)) <= BACKGROUND_DETAILS_BYTES ? snapshot : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function backgroundCompletionSnapshot(task: BackgroundTask): BackgroundCompletionSnapshot {\n\tconst output: BackgroundText = {\n\t\ttext:\n\t\t\ttask.result?.content\n\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t.map((block) => block.text)\n\t\t\t\t.join(\"\\n\") ||\n\t\t\ttask.projection?.text ||\n\t\t\t\"\",\n\t\ttruncated: task.resultTruncated ?? false,\n\t};\n\tconst common = {\n\t\tversion: 1,\n\t\ttaskId: task.id,\n\t\ttitle: task.title,\n\t\tstatus: task.status,\n\t\tstartedAt: task.startedAt,\n\t\tendedAt: task.endedAt,\n\t\terror: task.error,\n\t};\n\tconst snapshot = readBackgroundCompletion(\n\t\ttask.kind === \"bash\"\n\t\t\t? {\n\t\t\t\t\t...common,\n\t\t\t\t\tkind: \"bash\",\n\t\t\t\t\tshell: task.projection?.shell?.name,\n\t\t\t\t\tcommand:\n\t\t\t\t\t\ttask.command === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: { text: task.command, truncated: task.commandTruncated ?? false },\n\t\t\t\t\tcwd: task.cwd,\n\t\t\t\t\toutputPath: task.outputPath,\n\t\t\t\t\toutput: task.projection?.shell?.output ?? output,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t...common,\n\t\t\t\t\tkind: \"subagent\",\n\t\t\t\t\tworkers: task.projection?.workers ?? [],\n\t\t\t\t\toutput: task.projection?.workers?.length ? undefined : output,\n\t\t\t\t},\n\t);\n\tif (!snapshot) throw new Error(\"Invalid background completion snapshot\");\n\treturn snapshot;\n}\n\nconst singleLine = (value: string) => value.replace(/\\s+/gu, \" \").trim();\nconst OMISSION = \"\\n[Saved output truncated; use bg read for retained task details.]\";\n\nfunction modelText(value: BackgroundText, bytes: number, lines: number): string {\n\tconst result = truncateHead(value.text, {\n\t\tmaxBytes: Math.max(0, bytes - Buffer.byteLength(OMISSION)),\n\t\tmaxLines: Math.max(1, lines - 1),\n\t});\n\treturn result.content + (value.truncated || result.truncated ? OMISSION : \"\");\n}\n\n/** The model and the card share facts; only the model receives this prose projection. */\nfunction notificationText(snapshot: BackgroundCompletionSnapshot): string {\n\tconst header = [\n\t\t`Background ${snapshot.kind} ${snapshot.taskId}: ${snapshot.status} — ${singleLine(snapshot.title)}`,\n\t\tsnapshot.error ? `Error: ${singleLine(snapshot.error)}` : \"\",\n\t].filter(Boolean);\n\tif (snapshot.kind === \"bash\") {\n\t\tif (snapshot.command) header.push(`Command:\\n${modelText(snapshot.command, 8192, 128)}`);\n\t\tif (snapshot.cwd) header.push(`cwd: ${singleLine(snapshot.cwd)}`);\n\t\tif (snapshot.outputPath) header.push(`Output: ${singleLine(snapshot.outputPath)}`);\n\t}\n\tconst prefix = `${header.join(\"\\n\")}\\n\\n`;\n\tconst remaining = BACKGROUND_RESULT_BYTES - Buffer.byteLength(prefix);\n\tconst lines = MODEL_LINES - prefix.split(\"\\n\").length;\n\tif (snapshot.kind === \"subagent\" && snapshot.workers.length) {\n\t\t// Allocate before formatting, so one verbose report cannot erase later workers.\n\t\tconst budget = Math.floor((remaining - 8 * snapshot.workers.length) / snapshot.workers.length);\n\t\tconst lineBudget = Math.floor((lines - 4 * snapshot.workers.length) / snapshot.workers.length);\n\t\treturn (\n\t\t\tprefix +\n\t\t\tsnapshot.workers\n\t\t\t\t.map((worker, index) => {\n\t\t\t\t\tconst heading = `### ${index + 1}. ${singleLine(worker.description)} (${singleLine(worker.profile)}) — ${singleLine(worker.status)}\\n\\n`;\n\t\t\t\t\tconst reason = worker.error ? `Error: ${singleLine(worker.error)}\\n\\n` : \"\";\n\t\t\t\t\tconst body = worker.report.text\n\t\t\t\t\t\t? worker.report\n\t\t\t\t\t\t: { text: \"No report returned.\", truncated: worker.report.truncated };\n\t\t\t\t\treturn heading + reason + modelText(body, budget - Buffer.byteLength(heading + reason), lineBudget);\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\\n---\\n\\n\")\n\t\t);\n\t}\n\treturn prefix + modelText(snapshot.output ?? { text: \"No text result.\", truncated: false }, remaining, lines);\n}\n\nexport function backgroundCompletionMessage(task: BackgroundTask): CustomMessage<BackgroundCompletionSnapshot> {\n\tconst details = backgroundCompletionSnapshot(task);\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType: \"background-completion\",\n\t\tdisplay: true,\n\t\tcontent: notificationText(details),\n\t\tdetails,\n\t\ttimestamp: Date.now(),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../../src/core/background/presentation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"../messages.ts\";\nimport { truncateHead } from \"../tools/truncate.ts\";\nimport { BACKGROUND_DETAILS_BYTES, BACKGROUND_RESULT_BYTES, BACKGROUND_TITLE_BYTES, boundText } from \"./output.ts\";\nimport type {\n\tBackgroundCompletionSnapshot,\n\tBackgroundProjection,\n\tBackgroundTask,\n\tBackgroundTerminalStatus,\n\tBackgroundText,\n\tBackgroundWorker,\n\tBackgroundWorkerReport,\n} from \"./types.ts\";\n\nconst OUTPUT_BYTES = 40 * 1024;\nconst REPORT_BYTES = 4 * 1024;\nconst MAX_WORKERS = 8;\nconst MODEL_LINES = 2000;\n\n/** Read data properties only, including at the persisted-message boundary. */\nfunction object(value: unknown): object {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected snapshot object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain snapshot\");\n\treturn value;\n}\n\nfunction field(value: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected snapshot accessor\");\n\treturn descriptor?.value;\n}\n\n/** Bound escaped JSON as well as UTF-8, without serializing an unbounded source. */\nfunction string(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected snapshot text\");\n\tconst prefix = boundText(value, bytes - 2);\n\tif (Buffer.byteLength(JSON.stringify(prefix)) <= bytes) return prefix;\n\tlet low = 0;\n\tlet high = Buffer.byteLength(prefix);\n\twhile (low < high) {\n\t\tconst middle = Math.ceil((low + high) / 2);\n\t\tif (Buffer.byteLength(JSON.stringify(boundText(prefix, middle))) <= bytes) low = middle;\n\t\telse high = middle - 1;\n\t}\n\treturn boundText(prefix, low);\n}\n\nfunction optionalString(source: object, key: string, bytes: number): string | undefined {\n\tconst value = field(source, key);\n\treturn value === undefined ? undefined : string(value, bytes);\n}\n\nfunction text(value: unknown, bytes: number): BackgroundText {\n\tconst source = object(value);\n\tconst original = field(source, \"text\");\n\tconst truncated = field(source, \"truncated\");\n\tif (typeof truncated !== \"boolean\") throw new Error(\"Expected truncation flag\");\n\tconst bounded = string(original, bytes);\n\treturn { text: bounded, truncated: truncated || bounded !== original };\n}\n\nfunction workerReport(value: unknown): BackgroundWorkerReport {\n\tconst source = object(value);\n\treturn {\n\t\tid: string(field(source, \"id\"), 256),\n\t\tlabel: string(field(source, \"label\"), 512),\n\t\tprofile: string(field(source, \"profile\"), 128),\n\t\tdescription: string(field(source, \"description\"), 512),\n\t\tstatus: string(field(source, \"status\"), 128),\n\t\treport: text(field(source, \"report\"), REPORT_BYTES),\n\t\terror: optionalString(source, \"error\", 1024),\n\t};\n}\n\nfunction workers<T>(value: unknown, read: (value: unknown) => T): T[] {\n\tif (!Array.isArray(value)) throw new Error(\"Expected workers\");\n\treturn Array.from({ length: Math.min(value.length, MAX_WORKERS) }, (_, index) => read(field(value, String(index))));\n}\n\n/** Shared by live publication and history restoration; never imports an executor's private details. */\nexport function readBackgroundProjection(value: unknown): BackgroundProjection {\n\tconst source = object(value);\n\tconst projection: BackgroundProjection = { text: optionalString(source, \"text\", 16 * 1024) };\n\tconst shell = field(source, \"shell\");\n\tif (shell !== undefined) {\n\t\tconst fields = object(shell);\n\t\tprojection.shell = {\n\t\t\tname: string(field(fields, \"name\"), 128),\n\t\t\toutput: text(field(fields, \"output\"), OUTPUT_BYTES),\n\t\t};\n\t}\n\tconst reports = field(source, \"workers\");\n\tif (reports !== undefined) {\n\t\tprojection.workers = workers(reports, (value): BackgroundWorker => {\n\t\t\tconst fields = object(value);\n\t\t\treturn {\n\t\t\t\t...workerReport(value),\n\t\t\t\tprompt: string(field(fields, \"prompt\"), 4096),\n\t\t\t\tactivity: string(field(fields, \"activity\"), 1024),\n\t\t\t\tmodel: optionalString(fields, \"model\", 256),\n\t\t\t\tusage: optionalString(fields, \"usage\", 256),\n\t\t\t};\n\t\t});\n\t}\n\treturn projection;\n}\n\nfunction terminalStatus(value: unknown): BackgroundTerminalStatus {\n\tif (\n\t\tvalue === \"completed\" ||\n\t\tvalue === \"partial\" ||\n\t\tvalue === \"failed\" ||\n\t\tvalue === \"cancelled\" ||\n\t\tvalue === \"timeout\"\n\t)\n\t\treturn value;\n\tthrow new Error(\"Expected terminal status\");\n}\n\n/** Only this format is understood. Invalid/older details receive the renderer's bounded plain-text fallback. */\nexport function readBackgroundCompletion(value: unknown): BackgroundCompletionSnapshot | undefined {\n\ttry {\n\t\tconst source = object(value);\n\t\tif (field(source, \"version\") !== 1) return undefined;\n\t\tconst taskId = field(source, \"taskId\");\n\t\tconst kind = field(source, \"kind\");\n\t\tif (kind !== \"bash\" && kind !== \"subagent\") return undefined;\n\t\tif (\n\t\t\ttypeof taskId !== \"string\" ||\n\t\t\t!taskId.startsWith(`${kind}-`) ||\n\t\t\ttaskId.length <= kind.length + 1 ||\n\t\t\ttaskId.length > 512 ||\n\t\t\tBuffer.byteLength(taskId) > 512 ||\n\t\t\ttaskId.includes(\"\\0\")\n\t\t)\n\t\t\treturn undefined;\n\t\tconst startedAt = field(source, \"startedAt\");\n\t\tconst endedAt = field(source, \"endedAt\");\n\t\tif (\n\t\t\ttypeof startedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(startedAt) ||\n\t\t\tstartedAt < 0 ||\n\t\t\ttypeof endedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(endedAt) ||\n\t\t\tendedAt < startedAt\n\t\t)\n\t\t\treturn undefined;\n\t\tconst common = {\n\t\t\tversion: 1 as const,\n\t\t\ttaskId,\n\t\t\ttitle: string(field(source, \"title\"), BACKGROUND_TITLE_BYTES),\n\t\t\tstatus: terminalStatus(field(source, \"status\")),\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t\terror: optionalString(source, \"error\", 4096),\n\t\t};\n\t\tlet snapshot: BackgroundCompletionSnapshot;\n\t\tif (kind === \"bash\") {\n\t\t\tconst command = field(source, \"command\");\n\t\t\tconst outputPath = field(source, \"outputPath\");\n\t\t\tconst exitCode = field(source, \"exitCode\");\n\t\t\tif (\n\t\t\t\texitCode !== undefined &&\n\t\t\t\texitCode !== null &&\n\t\t\t\t(typeof exitCode !== \"number\" || !Number.isSafeInteger(exitCode))\n\t\t\t)\n\t\t\t\treturn undefined;\n\t\t\t// A clipped path would name a different file. Omit oversized paths intact.\n\t\t\tif (outputPath !== undefined && typeof outputPath !== \"string\") return undefined;\n\t\t\tsnapshot = {\n\t\t\t\t...common,\n\t\t\t\tkind,\n\t\t\t\tshell: optionalString(source, \"shell\", 128),\n\t\t\t\tcommand: command === undefined ? undefined : text(command, 8192),\n\t\t\t\tcwd: optionalString(source, \"cwd\", 4096),\n\t\t\t\t...(exitCode !== undefined ? { exitCode } : {}),\n\t\t\t\toutputPath:\n\t\t\t\t\toutputPath &&\n\t\t\t\t\t!outputPath.includes(\"\\0\") &&\n\t\t\t\t\toutputPath.length <= 8192 &&\n\t\t\t\t\tBuffer.byteLength(JSON.stringify(outputPath)) <= 8192\n\t\t\t\t\t\t? outputPath\n\t\t\t\t\t\t: undefined,\n\t\t\t\toutput: text(field(source, \"output\"), OUTPUT_BYTES),\n\t\t\t};\n\t\t} else {\n\t\t\tconst output = field(source, \"output\");\n\t\t\tsnapshot = {\n\t\t\t\t...common,\n\t\t\t\tkind,\n\t\t\t\tworkers: workers(field(source, \"workers\"), workerReport),\n\t\t\t\toutput: output === undefined ? undefined : text(output, OUTPUT_BYTES),\n\t\t\t};\n\t\t}\n\t\treturn Buffer.byteLength(JSON.stringify(snapshot)) <= BACKGROUND_DETAILS_BYTES ? snapshot : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function backgroundCompletionSnapshot(task: BackgroundTask): BackgroundCompletionSnapshot {\n\tconst output: BackgroundText = {\n\t\ttext:\n\t\t\ttask.result?.content\n\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t.map((block) => block.text)\n\t\t\t\t.join(\"\\n\") ||\n\t\t\ttask.projection?.text ||\n\t\t\t\"\",\n\t\ttruncated: task.resultTruncated ?? false,\n\t};\n\tconst common = {\n\t\tversion: 1,\n\t\ttaskId: task.id,\n\t\ttitle: task.title,\n\t\tstatus: task.status,\n\t\tstartedAt: task.startedAt,\n\t\tendedAt: task.endedAt,\n\t\terror: task.error,\n\t};\n\tconst snapshot = readBackgroundCompletion(\n\t\ttask.kind === \"bash\"\n\t\t\t? {\n\t\t\t\t\t...common,\n\t\t\t\t\tkind: \"bash\",\n\t\t\t\t\tshell: task.projection?.shell?.name,\n\t\t\t\t\tcommand:\n\t\t\t\t\t\ttask.command === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: { text: task.command, truncated: task.commandTruncated ?? false },\n\t\t\t\t\tcwd: task.cwd,\n\t\t\t\t\toutputPath: task.outputPath,\n\t\t\t\t\t...(task.exitCode !== undefined ? { exitCode: task.exitCode } : {}),\n\t\t\t\t\toutput: task.projection?.shell?.output ?? output,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t...common,\n\t\t\t\t\tkind: \"subagent\",\n\t\t\t\t\tworkers: task.projection?.workers ?? [],\n\t\t\t\t\toutput: task.projection?.workers?.length ? undefined : output,\n\t\t\t\t},\n\t);\n\tif (!snapshot) throw new Error(\"Invalid background completion snapshot\");\n\treturn snapshot;\n}\n\nconst singleLine = (value: string) => value.replace(/\\s+/gu, \" \").trim();\nconst OMISSION = \"\\n[Saved output truncated; use bg read for retained task details.]\";\n\nfunction modelText(value: BackgroundText, bytes: number, lines: number): string {\n\tconst result = truncateHead(value.text, {\n\t\tmaxBytes: Math.max(0, bytes - Buffer.byteLength(OMISSION)),\n\t\tmaxLines: Math.max(1, lines - 1),\n\t});\n\treturn result.content + (value.truncated || result.truncated ? OMISSION : \"\");\n}\n\n/** One bounded action hint per terminal outcome; completed work needs none. */\nfunction nextStepLine(snapshot: BackgroundCompletionSnapshot): string {\n\tswitch (snapshot.status) {\n\t\tcase \"cancelled\":\n\t\t\treturn \"Next step: the task was cancelled — do not restart it unless the user asks.\";\n\t\tcase \"timeout\":\n\t\t\treturn \"Next step: the task hit its timeout; inspect the partial output above, then rerun with a longer timeout or in smaller pieces if still needed.\";\n\t\tcase \"failed\":\n\t\tcase \"partial\": {\n\t\t\tif (snapshot.kind === \"subagent\") {\n\t\t\t\tconst unfinished = snapshot.workers\n\t\t\t\t\t.filter((worker) => worker.status !== \"completed\")\n\t\t\t\t\t.map((worker) => singleLine(worker.description))\n\t\t\t\t\t.filter(Boolean);\n\t\t\t\tconst names =\n\t\t\t\t\tunfinished.length > 3\n\t\t\t\t\t\t? `${unfinished.slice(0, 3).join(\", \")}, +${unfinished.length - 3} more`\n\t\t\t\t\t\t: unfinished.join(\", \");\n\t\t\t\treturn names\n\t\t\t\t\t? `Next step: re-delegate the unfinished work in a fresh subagent call if still needed (${names}).`\n\t\t\t\t\t: \"Next step: re-delegate the work in a fresh subagent call if still needed.\";\n\t\t\t}\n\t\t\treturn \"Next step: diagnose from the output above before retrying; rerun only what is still needed.\";\n\t\t}\n\t\tdefault:\n\t\t\treturn \"\";\n\t}\n}\n\n/** The model and the card share facts; only the model receives this prose projection. */\nfunction notificationText(snapshot: BackgroundCompletionSnapshot): string {\n\tconst header = [\n\t\t`Background ${snapshot.kind} ${snapshot.taskId}: ${snapshot.status} — ${singleLine(snapshot.title)}`,\n\t\tsnapshot.error ? `Error: ${singleLine(snapshot.error)}` : \"\",\n\t].filter(Boolean);\n\tif (snapshot.kind === \"bash\") {\n\t\tif (snapshot.command) header.push(`Command:\\n${modelText(snapshot.command, 8192, 128)}`);\n\t\tif (snapshot.cwd) header.push(`cwd: ${singleLine(snapshot.cwd)}`);\n\t\tif (snapshot.outputPath) header.push(`Output: ${singleLine(snapshot.outputPath)}`);\n\t}\n\tconst prefix = `${header.join(\"\\n\")}\\n\\n`;\n\tconst guidance = nextStepLine(snapshot);\n\tconst suffix = guidance ? `\\n\\n${guidance}` : \"\";\n\tconst remaining = BACKGROUND_RESULT_BYTES - Buffer.byteLength(prefix) - Buffer.byteLength(suffix);\n\tconst lines = MODEL_LINES - prefix.split(\"\\n\").length - (guidance ? 3 : 0);\n\tif (snapshot.kind === \"subagent\" && snapshot.workers.length) {\n\t\t// Allocate before formatting, so one verbose report cannot erase later workers.\n\t\tconst budget = Math.floor((remaining - 8 * snapshot.workers.length) / snapshot.workers.length);\n\t\tconst lineBudget = Math.floor((lines - 4 * snapshot.workers.length) / snapshot.workers.length);\n\t\treturn (\n\t\t\tprefix +\n\t\t\tsnapshot.workers\n\t\t\t\t.map((worker, index) => {\n\t\t\t\t\tconst heading = `### ${index + 1}. ${singleLine(worker.description)} (${singleLine(worker.profile)}) — ${singleLine(worker.status)}\\n\\n`;\n\t\t\t\t\tconst reason = worker.error ? `Error: ${singleLine(worker.error)}\\n\\n` : \"\";\n\t\t\t\t\tconst body = worker.report.text\n\t\t\t\t\t\t? worker.report\n\t\t\t\t\t\t: { text: \"No report returned.\", truncated: worker.report.truncated };\n\t\t\t\t\treturn heading + reason + modelText(body, budget - Buffer.byteLength(heading + reason), lineBudget);\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\\n---\\n\\n\") +\n\t\t\tsuffix\n\t\t);\n\t}\n\treturn (\n\t\tprefix + modelText(snapshot.output ?? { text: \"No text result.\", truncated: false }, remaining, lines) + suffix\n\t);\n}\n\nexport function backgroundCompletionMessage(task: BackgroundTask): CustomMessage<BackgroundCompletionSnapshot> {\n\tconst details = backgroundCompletionSnapshot(task);\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType: \"background-completion\",\n\t\tdisplay: true,\n\t\tcontent: notificationText(details),\n\t\tdetails,\n\t\ttimestamp: Date.now(),\n\t};\n}\n"]}
|
|
@@ -14,8 +14,8 @@ export declare class BackgroundService implements BackgroundContext {
|
|
|
14
14
|
private readonly options;
|
|
15
15
|
constructor(options?: BackgroundServiceOptions);
|
|
16
16
|
/**
|
|
17
|
-
* Rehydrate terminal version-2 custom data only, newest endedAt
|
|
18
|
-
* wins ties). Existing runtime records win ID collisions. No execution, accounting,
|
|
17
|
+
* Rehydrate terminal version-2 custom data only, newest endedAt in each history
|
|
18
|
+
* (later input wins ties). Existing runtime records win ID collisions. No execution, accounting,
|
|
19
19
|
* notification, or deletion ownership is restored, including for worker projections.
|
|
20
20
|
* The host supplies the current branch; closed services ignore restoration.
|
|
21
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/background/service.ts"],"names":[],"mappings":"AAMA,OAAO,EAEN,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAExB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/background/service.ts"],"names":[],"mappings":"AAMA,OAAO,EAEN,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAExB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAG1B,MAAM,YAAY,CAAC;AAmDpB,0FAA0F;AAC1F,qBAAa,iBAAkB,YAAW,iBAAiB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,IAAI,MAAM,IAAI,OAAO,CAEpB;IACD,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAEvC,OAAO,GAAE,wBAA6B;IASlD;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IA0DjD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK5B,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IA8MtF,gBAAgB,IAAI,MAAM;IAgB1B,IAAI,IAAI,cAAc,EAAE;IAIxB,OAAO,CAAC,MAAM;IAWd,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc;IAIzB,IAAI,CACT,EAAE,EAAE,MAAM,EACV,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3E,OAAO,CAAC,cAAc,CAAC;IAsB1B,OAAO,CAAC,UAAU;IAYlB,wGAAwG;IAClG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BzF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIzB,OAAO,CAAC,MAAM;IAQd,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAQ3C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,IAAI;IAY3B,KAAK,IAAI,MAAM,IAAI;IAWnB,oBAAoB,IAAI,cAAc,EAAE;IAOxC,OAAO,CAAC,SAAS;IAYjB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQtC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO/B,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQrC,KAAK,IAAI,IAAI;IAaP,QAAQ,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAe1D,KAAK;IAcnB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,aAAa;IAoBrB,0FAA0F;IAC1F,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,IAAI;IAqBZ,OAAO,CAAC,IAAI;CAWZ"}
|
|
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { parseBackgroundHistory } from "./history.js";
|
|
3
3
|
import { BACKGROUND_TITLE_BYTES, boundedResult, boundText, finiteLimit, readOutputSlice, sliceText } from "./output.js";
|
|
4
4
|
import { readBackgroundProjection } from "./presentation.js";
|
|
5
|
-
import { BackgroundExecutionError, SUBAGENT_BACKGROUND_REJECTION, } from "./types.js";
|
|
5
|
+
import { BackgroundExecutionError, isForegroundShellTask, SUBAGENT_BACKGROUND_REJECTION, } from "./types.js";
|
|
6
6
|
function errorText(error) {
|
|
7
7
|
try {
|
|
8
8
|
return boundText(error instanceof Error ? error.message : String(error), 4096);
|
|
@@ -22,6 +22,14 @@ function storeResult(task, result, truncated = false) {
|
|
|
22
22
|
return original?.type !== "text" || block.type !== "text" || block.text !== original.text;
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
+
function oldestTask(tasks) {
|
|
26
|
+
let oldest;
|
|
27
|
+
for (const task of tasks) {
|
|
28
|
+
if (!oldest || task.endedAt < oldest.endedAt)
|
|
29
|
+
oldest = task;
|
|
30
|
+
}
|
|
31
|
+
return oldest;
|
|
32
|
+
}
|
|
25
33
|
/** Session-local supervision. Executors own their processes, workers and output files. */
|
|
26
34
|
export class BackgroundService {
|
|
27
35
|
get closed() {
|
|
@@ -37,11 +45,12 @@ export class BackgroundService {
|
|
|
37
45
|
this.configuredEnabled = options.enabled ?? false;
|
|
38
46
|
this.maxActive = Math.max(1, finiteLimit(options.maxActive, 8, 128));
|
|
39
47
|
this.maxHistory = finiteLimit(options.maxHistory, 32, 1024);
|
|
40
|
-
|
|
48
|
+
// Separate foreground shell history, plus the existing history/protected-record allowance.
|
|
49
|
+
this.maxRetained = this.maxActive + 2 * Math.max(1, this.maxHistory) + this.maxHistory;
|
|
41
50
|
}
|
|
42
51
|
/**
|
|
43
|
-
* Rehydrate terminal version-2 custom data only, newest endedAt
|
|
44
|
-
* wins ties). Existing runtime records win ID collisions. No execution, accounting,
|
|
52
|
+
* Rehydrate terminal version-2 custom data only, newest endedAt in each history
|
|
53
|
+
* (later input wins ties). Existing runtime records win ID collisions. No execution, accounting,
|
|
45
54
|
* notification, or deletion ownership is restored, including for worker projections.
|
|
46
55
|
* The host supplies the current branch; closed services ignore restoration.
|
|
47
56
|
*/
|
|
@@ -49,7 +58,11 @@ export class BackgroundService {
|
|
|
49
58
|
if (this.closed)
|
|
50
59
|
return;
|
|
51
60
|
// Restoration must not evict runtime-owned records or run their cleanup callbacks.
|
|
52
|
-
const
|
|
61
|
+
const history = this.historyRecords();
|
|
62
|
+
const shells = history.filter((record) => isForegroundShellTask(record.task)).length;
|
|
63
|
+
const shellCapacity = Math.max(0, this.maxHistory - shells);
|
|
64
|
+
const taskCapacity = Math.max(0, this.maxHistory - (history.length - shells));
|
|
65
|
+
const capacity = Math.max(0, Math.min(shellCapacity + taskCapacity, this.maxRetained - this.records.size - this.cleanups.size));
|
|
53
66
|
const newest = new Map();
|
|
54
67
|
for (const value of records) {
|
|
55
68
|
const task = parseBackgroundHistory(value);
|
|
@@ -67,14 +80,19 @@ export class BackgroundService {
|
|
|
67
80
|
if (previous && previous.endedAt > task.endedAt)
|
|
68
81
|
continue;
|
|
69
82
|
newest.delete(task.id);
|
|
83
|
+
const shell = isForegroundShellTask(task);
|
|
84
|
+
const limit = shell ? shellCapacity : taskCapacity;
|
|
85
|
+
if (limit === 0)
|
|
86
|
+
continue;
|
|
70
87
|
newest.set(task.id, task);
|
|
88
|
+
const group = [...newest.values()].filter((candidate) => isForegroundShellTask(candidate) === shell);
|
|
89
|
+
if (group.length > limit)
|
|
90
|
+
newest.delete(oldestTask(group).id);
|
|
71
91
|
if (newest.size > capacity) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
newest.delete(oldest.id);
|
|
92
|
+
// Protected runtime records can leave less room than both histories allow.
|
|
93
|
+
// Restore inspectable tasks before hidden foreground shell logs in that case.
|
|
94
|
+
const foreground = [...newest.values()].filter(isForegroundShellTask);
|
|
95
|
+
newest.delete(oldestTask(foreground.length ? foreground : newest.values()).id);
|
|
78
96
|
}
|
|
79
97
|
}
|
|
80
98
|
for (const task of [...newest.values()].sort((a, b) => a.endedAt - b.endedAt)) {
|
|
@@ -260,6 +278,8 @@ export class BackgroundService {
|
|
|
260
278
|
storeResult(task, completion.result);
|
|
261
279
|
if (completion.error !== undefined)
|
|
262
280
|
task.error = boundText(completion.error, 4096);
|
|
281
|
+
if (completion.exitCode !== undefined)
|
|
282
|
+
task.exitCode = completion.exitCode;
|
|
263
283
|
}
|
|
264
284
|
if (failed) {
|
|
265
285
|
task.error = errorText(error);
|
|
@@ -579,10 +599,13 @@ export class BackgroundService {
|
|
|
579
599
|
const history = this.historyRecords();
|
|
580
600
|
// Delivered history can be restored from branch snapshots; hidden rows must
|
|
581
601
|
// not occupy the current branch's history budget. Pending results stay owned.
|
|
582
|
-
const
|
|
583
|
-
const
|
|
584
|
-
|
|
585
|
-
|
|
602
|
+
const expired = history.filter((record) => !record.visible);
|
|
603
|
+
for (const shell of [false, true]) {
|
|
604
|
+
const group = history.filter((record) => record.visible && isForegroundShellTask(record.task) === shell);
|
|
605
|
+
group.sort((left, right) => (left.task.endedAt ?? 0) - (right.task.endedAt ?? 0));
|
|
606
|
+
expired.push(...group.slice(0, Math.max(0, group.length - this.maxHistory)));
|
|
607
|
+
}
|
|
608
|
+
for (const record of expired) {
|
|
586
609
|
this.records.delete(record.task.id);
|
|
587
610
|
this.cleanupOutput(record);
|
|
588
611
|
}
|