@songsid/agend 2.2.0-alpha.9 → 2.2.0-beta.10
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/README.md +1 -1
- package/README.zh-TW.md +1 -1
- package/dist/agent-cli-instructions.md +16 -9
- package/dist/agent-cli.js +15 -7
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +21 -9
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-whats-new.d.ts +47 -0
- package/dist/agent-whats-new.js +147 -0
- package/dist/agent-whats-new.js.map +1 -0
- package/dist/auth-api.d.ts +2 -2
- package/dist/auth-api.js +4 -2
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.d.ts +3 -0
- package/dist/backend/antigravity.js +9 -0
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-carry.d.ts +22 -0
- package/dist/backend/claude-carry.js +170 -0
- package/dist/backend/claude-carry.js.map +1 -0
- package/dist/backend/claude-code.d.ts +65 -2
- package/dist/backend/claude-code.js +226 -33
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +33 -0
- package/dist/backend/codex-metadata.js +122 -18
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.d.ts +3 -0
- package/dist/backend/codex.js +17 -1
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +40 -3
- package/dist/backend/credential-profile.js +113 -5
- package/dist/backend/credential-profile.js.map +1 -1
- package/dist/backend/effort-metadata.d.ts +1 -1
- package/dist/backend/effort-metadata.js +3 -2
- package/dist/backend/effort-metadata.js.map +1 -1
- package/dist/backend/grok.d.ts +4 -0
- package/dist/backend/grok.js +14 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-engine-ledger.d.ts +5 -0
- package/dist/backend/kiro-engine-ledger.js +20 -0
- package/dist/backend/kiro-engine-ledger.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +6 -0
- package/dist/backend/kiro-identity.js +19 -5
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +39 -3
- package/dist/backend/kiro.js +143 -19
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.d.ts +33 -0
- package/dist/backend/launch-effort.js +123 -0
- package/dist/backend/launch-effort.js.map +1 -0
- package/dist/backend/muse.d.ts +84 -0
- package/dist/backend/muse.js +449 -53
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +33 -4
- package/dist/backend/types.js +2 -1
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-command.d.ts +91 -0
- package/dist/backend-command.js +122 -0
- package/dist/backend-command.js.map +1 -0
- package/dist/background-work-ended.d.ts +18 -0
- package/dist/background-work-ended.js +30 -0
- package/dist/background-work-ended.js.map +1 -0
- package/dist/cache-service.d.ts +2 -0
- package/dist/cache-service.js +2 -1
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +26 -1
- package/dist/channel/adapters/discord.js +98 -3
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +26 -2
- package/dist/channel/adapters/telegram.js +123 -19
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-server.js +9 -1
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +11 -0
- package/dist/channel/mcp-tools.js +24 -13
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-edit-errors.d.ts +5 -0
- package/dist/channel/message-edit-errors.js +24 -0
- package/dist/channel/message-edit-errors.js.map +1 -0
- package/dist/channel/telegram-markdown.d.ts +6 -0
- package/dist/channel/telegram-markdown.js +104 -0
- package/dist/channel/telegram-markdown.js.map +1 -0
- package/dist/channel/tool-router.js +9 -3
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +41 -3
- package/dist/cli.js +133 -28
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +2 -2
- package/dist/command-table.js +6 -3
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +59 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/cross-instance-envelope.d.ts +15 -2
- package/dist/cross-instance-envelope.js +29 -5
- package/dist/cross-instance-envelope.js.map +1 -1
- package/dist/daemon.d.ts +156 -1
- package/dist/daemon.js +764 -89
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +62 -7
- package/dist/delivery-outbox.js +309 -22
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +18 -1
- package/dist/delivery-reconciliation.js +67 -2
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/fleet-context.d.ts +10 -1
- package/dist/fleet-manager.d.ts +352 -10
- package/dist/fleet-manager.js +1925 -175
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/backend-providers/SKILL.md +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +92 -21
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +27 -3
- package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +8 -8
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +5 -5
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +4 -4
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +13 -13
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -2
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +6 -0
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +9 -9
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +8 -2
- package/dist/general-knowledge/skills/scheduling/SKILL.md +5 -3
- package/dist/general-knowledge/skills/session-management/SKILL.md +6 -5
- package/dist/general-knowledge/skills/tui-effort/SKILL.md +2 -2
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +8 -3
- package/dist/general-knowledge/steering/core-rules.md +8 -7
- package/dist/host-memory.d.ts +10 -0
- package/dist/host-memory.js +33 -1
- package/dist/host-memory.js.map +1 -1
- package/dist/human-delivery-receipts.d.ts +83 -0
- package/dist/human-delivery-receipts.js +194 -0
- package/dist/human-delivery-receipts.js.map +1 -0
- package/dist/instance-avatar.d.ts +36 -0
- package/dist/instance-avatar.js +57 -0
- package/dist/instance-avatar.js.map +1 -0
- package/dist/instance-config-impact.js +6 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +29 -6
- package/dist/instance-lifecycle.js +79 -28
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +3 -1
- package/dist/instructions.js +11 -8
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-log-gate.d.ts +42 -0
- package/dist/kiro-log-gate.js +39 -0
- package/dist/kiro-log-gate.js.map +1 -0
- package/dist/locale.js +204 -44
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +99 -0
- package/dist/log-service.js +243 -0
- package/dist/log-service.js.map +1 -0
- package/dist/log-steps.d.ts +169 -0
- package/dist/log-steps.js +858 -0
- package/dist/log-steps.js.map +1 -0
- package/dist/login-controller.d.ts +20 -3
- package/dist/login-controller.js +71 -19
- package/dist/login-controller.js.map +1 -1
- package/dist/login-flows.d.ts +5 -2
- package/dist/login-flows.js +5 -4
- package/dist/login-flows.js.map +1 -1
- package/dist/memory-pressure.d.ts +13 -1
- package/dist/memory-pressure.js +50 -10
- package/dist/memory-pressure.js.map +1 -1
- package/dist/needs-you-hub.js +2 -0
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +6 -0
- package/dist/needs-you-live.js +23 -3
- package/dist/needs-you-live.js.map +1 -1
- package/dist/next-steps.js +1 -1
- package/dist/next-steps.js.map +1 -1
- package/dist/outbound-handlers.d.ts +100 -0
- package/dist/outbound-handlers.js +263 -96
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +26 -15
- package/dist/outbound-schemas.js +24 -7
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-link-progress.d.ts +1 -1
- package/dist/public-link-progress.js +8 -2
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-preview.d.ts +101 -0
- package/dist/public-preview.js +236 -0
- package/dist/public-preview.js.map +1 -0
- package/dist/public-web-gateway.js +11 -4
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +24 -1
- package/dist/public-web-link.js +63 -9
- package/dist/public-web-link.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +3 -0
- package/dist/reply-buttons-controller.js +3 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/restart-guard.d.ts +6 -3
- package/dist/restart-guard.js +6 -3
- package/dist/restart-guard.js.map +1 -1
- package/dist/restart-progress.d.ts +33 -0
- package/dist/restart-progress.js +30 -0
- package/dist/restart-progress.js.map +1 -1
- package/dist/service-activation.d.ts +15 -7
- package/dist/service-activation.js +46 -29
- package/dist/service-activation.js.map +1 -1
- package/dist/service-installer.d.ts +31 -0
- package/dist/service-installer.js +41 -2
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.js +85 -25
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +72 -1
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +28 -4
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +7 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +1 -1
- package/dist/spawn-gate.js +5 -1
- package/dist/spawn-gate.js.map +1 -1
- package/dist/spawn-hold-reply.d.ts +12 -0
- package/dist/spawn-hold-reply.js +39 -0
- package/dist/spawn-hold-reply.js.map +1 -0
- package/dist/status-emojis.d.ts +10 -3
- package/dist/status-emojis.js +11 -2
- package/dist/status-emojis.js.map +1 -1
- package/dist/systemd-peer-bus.d.ts +95 -0
- package/dist/systemd-peer-bus.js +430 -0
- package/dist/systemd-peer-bus.js.map +1 -0
- package/dist/systemd-runtime.d.ts +27 -1
- package/dist/systemd-runtime.js +69 -7
- package/dist/systemd-runtime.js.map +1 -1
- package/dist/tips.js +4 -4
- package/dist/tips.js.map +1 -1
- package/dist/tool-progress.js +3 -2
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-commands.d.ts +42 -2
- package/dist/topic-commands.js +92 -7
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +3 -3
- package/dist/transcript-delta-reader.js +8 -8
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-jsonl.d.ts +80 -3
- package/dist/transcript-jsonl.js +147 -10
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-monitor.d.ts +19 -0
- package/dist/transcript-monitor.js +87 -15
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +78 -0
- package/dist/transcript-sources.js +375 -64
- package/dist/transcript-sources.js.map +1 -1
- package/dist/transcript-turns.d.ts +15 -2
- package/dist/transcript-turns.js +15 -2
- package/dist/transcript-turns.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +7 -15
- package/dist/tunnel/cloudflared.js +36 -1
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +5 -1
- package/dist/tunnel/purpose-lane.js +14 -7
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/tunnel/types.d.ts +5 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/turn-resume.d.ts +2 -0
- package/dist/turn-resume.js +1 -1
- package/dist/turn-resume.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/ui/chat-commands.js +1 -0
- package/dist/ui/chat-emojis.js +33 -0
- package/dist/ui/chat-mentions.js +63 -0
- package/dist/ui/chat-render.js +42 -2
- package/dist/ui/chat-store.js +2 -2
- package/dist/ui/chat-strings.js +38 -20
- package/dist/ui/chat-thread.js +69 -12
- package/dist/ui/chat-time.js +80 -0
- package/dist/ui/panel-chat.js +39 -10
- package/dist/ui/panel-details.js +2 -0
- package/dist/ui/panel-fleet.js +199 -57
- package/dist/ui/panel-log.js +428 -0
- package/dist/ui/panel-needs.js +6 -2
- package/dist/ui/panel-settings.js +137 -32
- package/dist/ui/preview-panel.js +55 -15
- package/dist/ui/preview-status.js +28 -0
- package/dist/ui/preview.js +44 -3
- package/dist/ui/settings-dialogs.js +7 -2
- package/dist/ui/settings-model.js +2 -1
- package/dist/ui/settings-strings.js +46 -4
- package/dist/ui/settings-token.js +1 -1
- package/dist/ui/shared/app-i18n.js +43 -17
- package/dist/ui/shared/app-prefs.js +250 -0
- package/dist/ui/shared/app-route.js +7 -2
- package/dist/ui/shared/app-shell.js +165 -8
- package/dist/ui/shared/app-store.js +5 -1
- package/dist/ui/shared/app-stream.js +23 -5
- package/dist/ui/shared/app.css +159 -23
- package/dist/ui/shared/app.js +11 -1
- package/dist/ui/shared/fonts/README.md +1 -1
- package/dist/ui/shared/header-tools.js +55 -5
- package/dist/ui/shared/instance-nav.js +241 -45
- package/dist/ui/shared/instance-switch.js +4 -4
- package/dist/ui/shared/panel-view.js +6 -0
- package/dist/ui/shared/signin.js +7 -7
- package/dist/ui/shared/theme.js +39 -7
- package/dist/ui/shared/tokens.css +10 -1
- package/dist/ui/shared/ui-icons.js +1 -0
- package/dist/ui/shared/usage-dialog.js +23 -5
- package/dist/ui/shared/view-strings.js +32 -4
- package/dist/ui/signin.html +1 -1
- package/dist/unrecognised-prompt.d.ts +23 -0
- package/dist/unrecognised-prompt.js +74 -0
- package/dist/unrecognised-prompt.js.map +1 -0
- package/dist/update-install.d.ts +28 -2
- package/dist/update-install.js +22 -4
- package/dist/update-install.js.map +1 -1
- package/dist/update-marker.d.ts +51 -0
- package/dist/update-marker.js +61 -0
- package/dist/update-marker.js.map +1 -1
- package/dist/update-preflight.d.ts +100 -0
- package/dist/update-preflight.js +264 -0
- package/dist/update-preflight.js.map +1 -0
- package/dist/updater-caller.d.ts +31 -0
- package/dist/updater-caller.js +109 -0
- package/dist/updater-caller.js.map +1 -0
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +1 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/providers.d.ts +34 -5
- package/dist/usage/providers.js +160 -27
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/statusline-usage.d.ts +6 -2
- package/dist/usage/statusline-usage.js +10 -4
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +1 -1
- package/dist/view-api.js +38 -8
- package/dist/view-api.js.map +1 -1
- package/dist/wake-coordinator.d.ts +11 -0
- package/dist/wake-coordinator.js +38 -4
- package/dist/wake-coordinator.js.map +1 -1
- package/dist/web-api.d.ts +49 -2
- package/dist/web-api.js +421 -31
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +2 -2
- package/dist/web-auth.js +9 -4
- package/dist/web-auth.js.map +1 -1
- package/dist/web-commands.d.ts +27 -4
- package/dist/web-commands.js +19 -4
- package/dist/web-commands.js.map +1 -1
- package/dist/web-host-guard.d.ts +3 -11
- package/dist/web-host-guard.js +3 -12
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-images.d.ts +47 -0
- package/dist/web-images.js +169 -0
- package/dist/web-images.js.map +1 -0
- package/dist/web-mentions.d.ts +44 -0
- package/dist/web-mentions.js +75 -0
- package/dist/web-mentions.js.map +1 -0
- package/dist/web-prefs.d.ts +63 -0
- package/dist/web-prefs.js +265 -0
- package/dist/web-prefs.js.map +1 -0
- package/dist/web-preview.d.ts +14 -1
- package/dist/web-preview.js +35 -13
- package/dist/web-preview.js.map +1 -1
- package/dist/web-reply-files.d.ts +45 -0
- package/dist/web-reply-files.js +223 -0
- package/dist/web-reply-files.js.map +1 -0
- package/dist/web-schedules.d.ts +12 -0
- package/dist/web-schedules.js +34 -0
- package/dist/web-schedules.js.map +1 -0
- package/dist/web-server-drain.d.ts +10 -0
- package/dist/web-server-drain.js +50 -0
- package/dist/web-server-drain.js.map +1 -0
- package/dist/web-session.d.ts +36 -1
- package/dist/web-session.js +53 -6
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +23 -0
- package/dist/web-settings-patch.js +77 -0
- package/dist/web-settings-patch.js.map +1 -0
- package/dist/web-shell-routes.d.ts +5 -1
- package/dist/web-shell-routes.js +10 -1
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-upload.d.ts +17 -4
- package/dist/web-upload.js +64 -13
- package/dist/web-upload.js.map +1 -1
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/launchd.plist.ejs +3 -1
- package/templates/systemd.service.ejs +2 -1
package/dist/transcript-jsonl.js
CHANGED
|
@@ -1,24 +1,161 @@
|
|
|
1
1
|
import { open, stat } from "node:fs/promises";
|
|
2
|
+
/** #1218 P0: the most one look reads. A busy session's delta is read over several looks, never in one buffer. */
|
|
3
|
+
export const READ_MAX_BYTES = 1024 * 1024;
|
|
4
|
+
/** #1218 P0: a line longer than this is not parsed: only its head is kept (LongLine). A tool result can be MBs. */
|
|
5
|
+
export const LINE_MAX_BYTES = 256 * 1024;
|
|
6
|
+
/** #1218 P0: how much of a long line's start is kept, enough for its type, ids and tool name. */
|
|
7
|
+
export const LONG_HEAD_BYTES = 8 * 1024;
|
|
8
|
+
/**
|
|
9
|
+
* #1218 P0 (#1786 review): a long line that a caller must not lose — a turn's record (codex `task_complete` with a long
|
|
10
|
+
* final reply, a pasted prompt) — is read whole and parsed, up to this size. Longer: skipped like any long line.
|
|
11
|
+
*/
|
|
12
|
+
export const WHOLE_LINE_MAX_BYTES = 16 * 1024 * 1024;
|
|
13
|
+
/** The line of `bytes` bytes at `offset`, as text, when it is at most `max` bytes; null otherwise or when it cannot be read whole. */
|
|
14
|
+
export async function readWholeLine(path, offset, bytes, max = WHOLE_LINE_MAX_BYTES) {
|
|
15
|
+
if (bytes <= 0 || bytes > max)
|
|
16
|
+
return null;
|
|
17
|
+
const fh = await open(path, "r");
|
|
18
|
+
try {
|
|
19
|
+
const buf = Buffer.alloc(bytes);
|
|
20
|
+
for (let filled = 0; filled < bytes;) {
|
|
21
|
+
const { bytesRead } = await fh.read(buf, filled, bytes - filled, offset + filled);
|
|
22
|
+
if (bytesRead <= 0)
|
|
23
|
+
return null;
|
|
24
|
+
filled += bytesRead;
|
|
25
|
+
}
|
|
26
|
+
return buf.toString("utf-8");
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await fh.close();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** A look's records in file order: each complete line, and each long line where it sits among them. */
|
|
33
|
+
export function* recordsInOrder(read) {
|
|
34
|
+
let next = 0;
|
|
35
|
+
for (let i = 0; i <= read.lines.length; i++) {
|
|
36
|
+
while (next < read.long.length && read.long[next].at === i)
|
|
37
|
+
yield { long: read.long[next++] };
|
|
38
|
+
if (i < read.lines.length)
|
|
39
|
+
yield { line: read.lines[i] };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* #1218 P0 (#1786 review): a caller's way through one look's records when some long lines must be read whole. `whole`
|
|
44
|
+
* picks them by their head (a turn record); each is read (≤ WHOLE_LINE_MAX_BYTES) and given back as a line, in its
|
|
45
|
+
* place. A picked long line that runs past this look is held in `pending` and given back once a later look finds its
|
|
46
|
+
* end (`longEnd`). Every other long line is given back as itself (its head). Lines the CLI is still writing wait.
|
|
47
|
+
*/
|
|
48
|
+
export async function resolveLongLines(path, read, pending, whole) {
|
|
49
|
+
const records = [];
|
|
50
|
+
if (pending && read.longEnd !== undefined) {
|
|
51
|
+
const line = await readWholeLine(path, pending.offset, read.longEnd - 1 - pending.offset).catch(() => null);
|
|
52
|
+
if (line !== null)
|
|
53
|
+
records.push({ line });
|
|
54
|
+
pending = null;
|
|
55
|
+
}
|
|
56
|
+
for (const record of recordsInOrder(read)) {
|
|
57
|
+
if (!("long" in record) || !whole(record.long.head)) {
|
|
58
|
+
records.push(record);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!record.long.complete) {
|
|
62
|
+
pending = { offset: record.long.offset };
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const line = await readWholeLine(path, record.long.offset, record.long.bytes).catch(() => null);
|
|
66
|
+
records.push(line !== null ? { line } : record);
|
|
67
|
+
}
|
|
68
|
+
return { records, pending };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* #1786 review (Fable P3): a claude-code assistant line, known by its head. Claude often writes `message` before `type`
|
|
72
|
+
* (parentUuid, isSidechain, message, requestId, type): a long reply's `"type":"assistant"` can sit past the head, while
|
|
73
|
+
* its message's `"role":"assistant"` is near the start.
|
|
74
|
+
*/
|
|
75
|
+
export function isClaudeAssistantHead(head) {
|
|
76
|
+
return head.includes('"type":"assistant"') || /"message":\{[^{}]{0,400}?"role":"assistant"/.test(head);
|
|
77
|
+
}
|
|
78
|
+
/** #1218 P0: looks per poll — a busy session is followed at up to this many READ_MAX_BYTES per poll, each awaited. */
|
|
79
|
+
export const LOOKS_PER_POLL = 4;
|
|
80
|
+
/** The first `max` bytes of `buf` as text, never ending inside a UTF-8 character. */
|
|
81
|
+
function headText(buf, max) {
|
|
82
|
+
let end = Math.min(max, buf.length);
|
|
83
|
+
if (end < buf.length)
|
|
84
|
+
while (end > 0 && (buf[end] & 0xc0) === 0x80)
|
|
85
|
+
end--;
|
|
86
|
+
return buf.toString("utf-8", 0, end);
|
|
87
|
+
}
|
|
2
88
|
/**
|
|
3
89
|
* Tail only newline-terminated JSONL records. A CLI can flush one record in
|
|
4
90
|
* several writes; the unfinished suffix must remain before the next offset.
|
|
91
|
+
*
|
|
92
|
+
* #1218 P0: bounded. One look reads at most `maxBytes` (READ_MAX_BYTES); what is beyond waits for the next look
|
|
93
|
+
* (`more`). A line over `maxLine` (LINE_MAX_BYTES) is never decoded or parsed whole: it is reported in `long` with
|
|
94
|
+
* its head, and the offset moves past it — across several looks if it is longer than one (`skipping`). Transcripts
|
|
95
|
+
* reach hundreds of MB and one tool result can be tens of MB; the fleet loop must not hold either in one buffer.
|
|
5
96
|
*/
|
|
6
|
-
export async function readNewLines(path, fromOffset) {
|
|
97
|
+
export async function readNewLines(path, fromOffset, opts = {}) {
|
|
98
|
+
const maxBytes = Math.max(1, opts.maxBytes ?? READ_MAX_BYTES);
|
|
99
|
+
const maxLine = Math.max(1, opts.maxLine ?? LINE_MAX_BYTES);
|
|
7
100
|
const stats = await stat(path);
|
|
101
|
+
const empty = (offset, skipping, more, longEnd) => ({ lines: [], offsets: [], newOffset: offset, long: [], more, skipping, ...(longEnd !== undefined ? { longEnd } : {}) });
|
|
8
102
|
if (stats.size <= fromOffset)
|
|
9
|
-
return
|
|
103
|
+
return empty(fromOffset, !!opts.skipping, false);
|
|
10
104
|
const fh = await open(path, "r");
|
|
11
105
|
try {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
106
|
+
const read = async (at, length) => {
|
|
107
|
+
const buffer = Buffer.alloc(length);
|
|
108
|
+
const { bytesRead } = await fh.read(buffer, 0, length, at);
|
|
109
|
+
return buffer.subarray(0, bytesRead);
|
|
110
|
+
};
|
|
111
|
+
let pos = fromOffset;
|
|
112
|
+
let budget = maxBytes;
|
|
113
|
+
let longEnd;
|
|
114
|
+
// Inside a long line already reported: drop through its end (its LF), within this look's budget.
|
|
115
|
+
if (opts.skipping) {
|
|
116
|
+
const chunk = await read(pos, Math.min(budget, stats.size - pos));
|
|
117
|
+
const lf = chunk.indexOf(0x0a);
|
|
118
|
+
if (lf < 0)
|
|
119
|
+
return empty(pos + chunk.length, true, pos + chunk.length < stats.size);
|
|
120
|
+
pos += lf + 1;
|
|
121
|
+
budget -= lf + 1;
|
|
122
|
+
longEnd = pos;
|
|
123
|
+
if (budget <= 0 || pos >= stats.size)
|
|
124
|
+
return empty(pos, false, pos < stats.size, longEnd);
|
|
125
|
+
}
|
|
15
126
|
// Find LF in the bytes actually read, before decoding (UTF-8 characters
|
|
16
127
|
// may themselves span writes). stat.size is not a consumed-byte boundary.
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
128
|
+
const window = await read(pos, Math.min(budget, stats.size - pos));
|
|
129
|
+
const complete = window.lastIndexOf(0x0a) + 1;
|
|
130
|
+
const lines = [];
|
|
131
|
+
const offsets = [];
|
|
132
|
+
const long = [];
|
|
133
|
+
let start = 0;
|
|
134
|
+
while (start < complete) {
|
|
135
|
+
const end = window.indexOf(0x0a, start);
|
|
136
|
+
const length = end - start;
|
|
137
|
+
if (length > maxLine)
|
|
138
|
+
long.push({ at: lines.length, head: headText(window.subarray(start, end), LONG_HEAD_BYTES), bytes: length, complete: true, offset: pos + start });
|
|
139
|
+
else {
|
|
140
|
+
const line = window.toString("utf-8", start, end);
|
|
141
|
+
if (line.trim()) {
|
|
142
|
+
lines.push(line);
|
|
143
|
+
offsets.push(pos + start);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
start = end + 1;
|
|
147
|
+
}
|
|
148
|
+
const ended = longEnd !== undefined ? { longEnd } : {};
|
|
149
|
+
// No line end after `complete`: a record still being written — unless it is already too long to be one we parse.
|
|
150
|
+
const tail = window.length - complete;
|
|
151
|
+
if (tail >= maxLine) {
|
|
152
|
+
long.push({ at: lines.length, head: headText(window.subarray(complete), LONG_HEAD_BYTES), bytes: tail, complete: false, offset: pos + complete });
|
|
153
|
+
const newOffset = pos + window.length;
|
|
154
|
+
return { lines, offsets, newOffset, long, more: newOffset < stats.size, skipping: true, ...ended };
|
|
155
|
+
}
|
|
156
|
+
const newOffset = pos + complete;
|
|
157
|
+
// More: this look was cut short by its budget, so complete records may wait past the offset.
|
|
158
|
+
return { lines, offsets, newOffset, long, more: window.length === budget && newOffset < stats.size, skipping: false, ...ended };
|
|
22
159
|
}
|
|
23
160
|
finally {
|
|
24
161
|
await fh.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-jsonl.js","sourceRoot":"","sources":["../src/transcript-jsonl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"transcript-jsonl.js","sourceRoot":"","sources":["../src/transcript-jsonl.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,10 @@ export declare class TranscriptMonitor extends EventEmitter {
|
|
|
17
17
|
private logger;
|
|
18
18
|
private source;
|
|
19
19
|
private byteOffset;
|
|
20
|
+
/** #1218 P0: the offset is inside a long line being skipped (readNewLines `skipping`). */
|
|
21
|
+
private skipping;
|
|
22
|
+
/** #1218 P0: a long assistant line being skipped, to be read whole once its end is found. */
|
|
23
|
+
private pendingLong;
|
|
20
24
|
private transcriptPath;
|
|
21
25
|
private pollTimer;
|
|
22
26
|
private offsetFile;
|
|
@@ -25,16 +29,31 @@ export declare class TranscriptMonitor extends EventEmitter {
|
|
|
25
29
|
constructor(instanceDir: string, logger: Logger, source?: TranscriptSource | null);
|
|
26
30
|
private loadOffset;
|
|
27
31
|
private saveOffset;
|
|
32
|
+
/** #1218: the transcript followed now — the source's, or claude-code's own — for the Log tab's on-demand read. */
|
|
33
|
+
currentPath(): string | null;
|
|
28
34
|
resolveTranscriptPath(): Promise<string | null>;
|
|
29
35
|
/** Snapshot the active durable conversation before an outbox pane write. */
|
|
30
36
|
reconciliationCheckpoint(): Promise<TranscriptCheckpoint | null>;
|
|
31
37
|
pollIncrement(): Promise<void>;
|
|
32
38
|
private pollSource;
|
|
33
39
|
private _doPoll;
|
|
40
|
+
/**
|
|
41
|
+
* #1218 P0: a line too long to parse (a tool result of MBs, a Write with a huge input) — what its head still says:
|
|
42
|
+
* the results it carries (by tool_use_id) and the tools it calls (by name), so the bubble does not lose the step.
|
|
43
|
+
*/
|
|
44
|
+
private processLongHead;
|
|
34
45
|
private processEntry;
|
|
35
46
|
startPolling(intervalMs?: number): void;
|
|
36
47
|
initialize(): Promise<void>;
|
|
37
48
|
stop(): void;
|
|
49
|
+
/**
|
|
50
|
+
* #1641: whether a transcript is being followed right now (its turn boundaries are evidence only then): polling, and
|
|
51
|
+
* — for a source lane (codex's rollout) — the source's own word that its last poll found and read our transcript; a
|
|
52
|
+
* source that cannot say is not following.
|
|
53
|
+
*/
|
|
54
|
+
following(): boolean;
|
|
55
|
+
/** #1641 R2: whether the current turn's state is known (see TranscriptSource.turnStateKnown); a source that cannot say does not. */
|
|
56
|
+
turnStateKnown(): boolean;
|
|
38
57
|
setTranscriptPath(path: string): void;
|
|
39
58
|
resetOffset(): void;
|
|
40
59
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
2
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import { lastLineBoundary, readNewLines } from "./transcript-jsonl.js";
|
|
4
|
+
import { LOOKS_PER_POLL, isClaudeAssistantHead, lastLineBoundary, readNewLines, resolveLongLines } from "./transcript-jsonl.js";
|
|
5
5
|
/**
|
|
6
6
|
* Emits tool_use / tool_result / assistant_text events off the CLI's own
|
|
7
7
|
* conversation record.
|
|
@@ -18,6 +18,10 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
18
18
|
logger;
|
|
19
19
|
source;
|
|
20
20
|
byteOffset = 0;
|
|
21
|
+
/** #1218 P0: the offset is inside a long line being skipped (readNewLines `skipping`). */
|
|
22
|
+
skipping = false;
|
|
23
|
+
/** #1218 P0: a long assistant line being skipped, to be read whole once its end is found. */
|
|
24
|
+
pendingLong = null;
|
|
21
25
|
transcriptPath = null;
|
|
22
26
|
pollTimer = null;
|
|
23
27
|
offsetFile;
|
|
@@ -40,6 +44,8 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
40
44
|
if (existsSync(this.offsetFile)) {
|
|
41
45
|
const data = JSON.parse(readFileSync(this.offsetFile, "utf-8"));
|
|
42
46
|
this.byteOffset = data.offset ?? 0;
|
|
47
|
+
this.skipping = false;
|
|
48
|
+
this.pendingLong = null;
|
|
43
49
|
this.transcriptPath = data.path ?? null;
|
|
44
50
|
}
|
|
45
51
|
}
|
|
@@ -60,6 +66,8 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
60
66
|
// Non-critical — will re-read some entries on restart
|
|
61
67
|
}
|
|
62
68
|
}
|
|
69
|
+
/** #1218: the transcript followed now — the source's, or claude-code's own — for the Log tab's on-demand read. */
|
|
70
|
+
currentPath() { return this.source ? this.source.currentPath?.() ?? null : this.transcriptPath; }
|
|
63
71
|
async resolveTranscriptPath() {
|
|
64
72
|
const statusFile = join(this.instanceDir, "statusline.json");
|
|
65
73
|
if (existsSync(statusFile)) {
|
|
@@ -76,8 +84,16 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
76
84
|
}
|
|
77
85
|
/** Snapshot the active durable conversation before an outbox pane write. */
|
|
78
86
|
async reconciliationCheckpoint() {
|
|
79
|
-
if (this.source?.checkpoint)
|
|
80
|
-
|
|
87
|
+
if (this.source?.checkpoint) {
|
|
88
|
+
const generation = this.generation;
|
|
89
|
+
const checkpoint = await this.source.checkpoint();
|
|
90
|
+
// #1641 R3: what the checkpoint moved past (a switch's retract and carried-in start, a skipped boundary) reaches
|
|
91
|
+
// the ledger before the delivery it guards — not at the next poll.
|
|
92
|
+
const turns = this.source.takeTurns?.() ?? [];
|
|
93
|
+
if (turns.length && generation === this.generation)
|
|
94
|
+
this.emit("turns", turns);
|
|
95
|
+
return checkpoint;
|
|
96
|
+
}
|
|
81
97
|
const path = await this.resolveTranscriptPath();
|
|
82
98
|
if (!path)
|
|
83
99
|
return null;
|
|
@@ -150,6 +166,8 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
150
166
|
// Work resumed during our own startup must be observable → read the
|
|
151
167
|
// replacement from the top.
|
|
152
168
|
this.byteOffset = 0;
|
|
169
|
+
this.skipping = false;
|
|
170
|
+
this.pendingLong = null;
|
|
153
171
|
this.saveOffset();
|
|
154
172
|
}
|
|
155
173
|
else {
|
|
@@ -159,6 +177,8 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
159
177
|
// replay the whole history.
|
|
160
178
|
try {
|
|
161
179
|
this.byteOffset = await lastLineBoundary(current);
|
|
180
|
+
this.skipping = false;
|
|
181
|
+
this.pendingLong = null;
|
|
162
182
|
}
|
|
163
183
|
catch {
|
|
164
184
|
this.transcriptPath = null;
|
|
@@ -171,25 +191,59 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
171
191
|
if (!this.transcriptPath || !existsSync(this.transcriptPath))
|
|
172
192
|
return;
|
|
173
193
|
try {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
194
|
+
// #1218 P0: bounded looks (READ_MAX_BYTES each), a few per poll, each awaited; the rest waits for the next poll.
|
|
195
|
+
const generation = this.generation;
|
|
196
|
+
for (let look = 0; look < LOOKS_PER_POLL; look++) {
|
|
197
|
+
const read = await readNewLines(this.transcriptPath, this.byteOffset, { skipping: this.skipping });
|
|
198
|
+
if (generation !== this.generation)
|
|
199
|
+
return;
|
|
200
|
+
this.skipping = read.skipping;
|
|
201
|
+
if (read.newOffset === this.byteOffset)
|
|
202
|
+
break;
|
|
203
|
+
this.byteOffset = read.newOffset;
|
|
204
|
+
// An assistant line over the line limit (a long reply, a Write of a big file) is read whole (bounded):
|
|
205
|
+
// its text and tool calls matter. A long tool result is known by its head.
|
|
206
|
+
const resolved = await resolveLongLines(this.transcriptPath, read, this.pendingLong, isClaudeAssistantHead);
|
|
207
|
+
if (generation !== this.generation)
|
|
208
|
+
return;
|
|
209
|
+
this.pendingLong = resolved.pending;
|
|
210
|
+
for (const record of resolved.records) {
|
|
211
|
+
if ("long" in record) {
|
|
212
|
+
this.processLongHead(record.long.head);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
const entry = JSON.parse(record.line);
|
|
217
|
+
this.processEntry(entry);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// Malformed complete JSONL line in transcript — skip
|
|
221
|
+
}
|
|
185
222
|
}
|
|
223
|
+
this.saveOffset();
|
|
224
|
+
if (!read.more)
|
|
225
|
+
break;
|
|
186
226
|
}
|
|
187
|
-
this.saveOffset();
|
|
188
227
|
}
|
|
189
228
|
catch (err) {
|
|
190
229
|
this.logger.debug({ err }, "TranscriptMonitor poll error");
|
|
191
230
|
}
|
|
192
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* #1218 P0: a line too long to parse (a tool result of MBs, a Write with a huge input) — what its head still says:
|
|
234
|
+
* the results it carries (by tool_use_id) and the tools it calls (by name), so the bubble does not lose the step.
|
|
235
|
+
*/
|
|
236
|
+
processLongHead(head) {
|
|
237
|
+
if (head.includes('"type":"tool_result"')) {
|
|
238
|
+
for (const m of head.matchAll(/"tool_use_id":"([^"]{1,200})"/g))
|
|
239
|
+
this.emit("tool_result", m[1], undefined);
|
|
240
|
+
}
|
|
241
|
+
for (const m of head.matchAll(/"type":"tool_use"/g)) {
|
|
242
|
+
const name = /"name":"([^"]{1,200})"/.exec(head.slice(m.index, m.index + 400));
|
|
243
|
+
if (name)
|
|
244
|
+
this.emit("tool_use", name[1], {});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
193
247
|
processEntry(entry) {
|
|
194
248
|
const msg = entry.message;
|
|
195
249
|
if (!msg?.role || !msg?.content)
|
|
@@ -224,6 +278,20 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
224
278
|
this.source?.close?.();
|
|
225
279
|
this.saveOffset();
|
|
226
280
|
}
|
|
281
|
+
/**
|
|
282
|
+
* #1641: whether a transcript is being followed right now (its turn boundaries are evidence only then): polling, and
|
|
283
|
+
* — for a source lane (codex's rollout) — the source's own word that its last poll found and read our transcript; a
|
|
284
|
+
* source that cannot say is not following.
|
|
285
|
+
*/
|
|
286
|
+
following() {
|
|
287
|
+
if (this.source)
|
|
288
|
+
return this.pollTimer !== null && this.source.following?.() === true;
|
|
289
|
+
return this.transcriptPath !== null;
|
|
290
|
+
}
|
|
291
|
+
/** #1641 R2: whether the current turn's state is known (see TranscriptSource.turnStateKnown); a source that cannot say does not. */
|
|
292
|
+
turnStateKnown() {
|
|
293
|
+
return this.source ? this.source.turnStateKnown?.() === true : true;
|
|
294
|
+
}
|
|
227
295
|
setTranscriptPath(path) {
|
|
228
296
|
if (this.transcriptPath !== path) {
|
|
229
297
|
this.resetOffset();
|
|
@@ -233,9 +301,13 @@ export class TranscriptMonitor extends EventEmitter {
|
|
|
233
301
|
resetOffset() {
|
|
234
302
|
this.generation++;
|
|
235
303
|
this.byteOffset = 0;
|
|
304
|
+
this.skipping = false;
|
|
305
|
+
this.pendingLong = null;
|
|
236
306
|
this.transcriptPath = null;
|
|
237
307
|
this.source?.reset();
|
|
238
308
|
this.saveOffset();
|
|
309
|
+
// #1641 R2: everything read before the re-baseline is about a transcript no longer followed from there.
|
|
310
|
+
this.emit("reset");
|
|
239
311
|
}
|
|
240
312
|
}
|
|
241
313
|
//# sourceMappingURL=transcript-monitor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-monitor.js","sourceRoot":"","sources":["../src/transcript-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"transcript-monitor.js","sourceRoot":"","sources":["../src/transcript-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,44 @@ export interface TranscriptSource {
|
|
|
32
32
|
checkpoint?(): Promise<TranscriptCheckpoint | null>;
|
|
33
33
|
/** Release anything held between polls; the next poll may acquire it again. */
|
|
34
34
|
close?(): void;
|
|
35
|
+
/**
|
|
36
|
+
* #1641: whether the last poll found and read this instance's own transcript. False before the first, after a reset,
|
|
37
|
+
* and whenever the last poll found none — then nothing it reports is evidence about the turn.
|
|
38
|
+
*/
|
|
39
|
+
following?(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* #1641 R2: whether the source knows the state of the CURRENT turn: it read the transcript from its start, found the
|
|
42
|
+
* last turn boundary before its baseline, or has read one since. Until then an empty ledger proves nothing.
|
|
43
|
+
*/
|
|
44
|
+
turnStateKnown?(): boolean;
|
|
45
|
+
/** #1641 R3: turn records a checkpoint decided (it moved the source past them), for the monitor to hand on at once. */
|
|
46
|
+
takeTurns?(): TranscriptTurnEvent[];
|
|
47
|
+
/** #1218: the transcript file being followed now (for the Log tab's on-demand read), or null. */
|
|
48
|
+
currentPath?(): string | null;
|
|
35
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* #1641 R3: the complete records in [from, to) that `keep` accepts — `to` is a line boundary (a checkpoint's), so
|
|
52
|
+
* nothing is cut. #1218 P0: read in READ_MAX_BYTES chunks (the range a checkpoint skips can be many MB), and only kept
|
|
53
|
+
* lines are held. A line over LINE_MAX_BYTES is judged by its head: kept, it is read whole (≤ WHOLE_LINE_MAX_BYTES —
|
|
54
|
+
* a turn's record must not be lost to the limit, #1786 review); otherwise it is skipped without being decoded.
|
|
55
|
+
*/
|
|
56
|
+
export declare function readLineRange(path: string, from: number, to: number, keep?: (line: string) => boolean): Promise<string[]>;
|
|
57
|
+
/** #1641 R2: how far back from the baseline a rollout is scanned for the last turn boundary (a turn writes a lot). */
|
|
58
|
+
export declare const ROLLOUT_TURN_SCAN_MAX_BYTES: number;
|
|
59
|
+
/**
|
|
60
|
+
* #1641 R2: the last turn boundary (task_started / task_complete / turn_aborted) a codex rollout holds before `end`,
|
|
61
|
+
* scanning back at most ROLLOUT_TURN_SCAN_MAX_BYTES: `none` when the whole prefix holds none (no turn ever started),
|
|
62
|
+
* null when the bound ran out first (unknown). Nothing else is read or replayed.
|
|
63
|
+
*/
|
|
64
|
+
export declare function lastRolloutTurnBoundary(path: string, end: number, maxBytes?: number): Promise<{
|
|
65
|
+
kind: "start";
|
|
66
|
+
turnId: string;
|
|
67
|
+
} | {
|
|
68
|
+
kind: "end";
|
|
69
|
+
turnId: string;
|
|
70
|
+
} | {
|
|
71
|
+
kind: "none";
|
|
72
|
+
} | null>;
|
|
36
73
|
/**
|
|
37
74
|
* Follows the newest rollout JSONL whose session_meta.cwd matches this
|
|
38
75
|
* instance's working directory. Rollouts are date-sharded and shared across
|
|
@@ -42,7 +79,13 @@ export declare class CodexRolloutSource implements TranscriptSource {
|
|
|
42
79
|
private workingDirectory;
|
|
43
80
|
private sessionsDir;
|
|
44
81
|
private currentFile;
|
|
82
|
+
/** #1218: the rollout followed now. */
|
|
83
|
+
currentPath(): string | null;
|
|
45
84
|
private byteOffset;
|
|
85
|
+
/** #1218 P0: the offset is inside a long line being skipped (readNewLines `skipping`). */
|
|
86
|
+
private skipping;
|
|
87
|
+
/** #1218 P0: a long line being skipped that is to be read whole once its end is found. */
|
|
88
|
+
private pendingLong;
|
|
46
89
|
/** EOF snapshots taken when the monitor attaches; existing history is skipped. */
|
|
47
90
|
private initialOffsets;
|
|
48
91
|
/** Files whose session_meta was read and did NOT match our cwd. */
|
|
@@ -57,8 +100,34 @@ export declare class CodexRolloutSource implements TranscriptSource {
|
|
|
57
100
|
/** #1510: the turn the records being read belong to (its `task_started`), carried across polls of one file. */
|
|
58
101
|
private openTurnId;
|
|
59
102
|
constructor(workingDirectory: string, sessionsDir?: string, _now?: number, index?: RolloutIndex);
|
|
103
|
+
/** #1641: the last poll found this instance's rollout and read it (see TranscriptSource.following). */
|
|
104
|
+
private lastPollFollowed;
|
|
105
|
+
/** #1641 R2: the turn open in the current file (its task_started read, no end yet), and whether that is known. */
|
|
106
|
+
private openTurn;
|
|
107
|
+
private turnKnown;
|
|
108
|
+
/** #1641 R2: boundaries decided at adoption (the old file's open turn ended, the new file's open turn carried in). */
|
|
109
|
+
private pendingTurns;
|
|
110
|
+
following(): boolean;
|
|
111
|
+
turnStateKnown(): boolean;
|
|
112
|
+
/** #1641 R3: turn records decided outside a poll (a checkpoint's adoption or skipped range), handed over now. */
|
|
113
|
+
takeTurns(): TranscriptTurnEvent[];
|
|
60
114
|
reset(): void;
|
|
61
115
|
checkpoint(): Promise<TranscriptCheckpoint | null>;
|
|
116
|
+
/**
|
|
117
|
+
* Follow `path` from `offset` (#1641 R2). A baseline past an existing file's start skips its history — but not the
|
|
118
|
+
* state of its current turn: the last boundary before the baseline says whether a turn is running now (carried in as
|
|
119
|
+
* its start; no tool, user or text record is replayed), and none within the scan bound leaves it unknown until one is
|
|
120
|
+
* read. A turn left open in the file being replaced belongs to that file, no longer followed: its busy evidence is
|
|
121
|
+
* withdrawn (retracted, not ended — nothing says how it ended).
|
|
122
|
+
*/
|
|
123
|
+
private adopt;
|
|
124
|
+
/**
|
|
125
|
+
* A turn record (a boundary, or a user message) into `turns`, keeping the open turn current; true when `entry` was
|
|
126
|
+
* one (or another event_msg), so the caller looks no further. #1510: codex 0.162 writes one task_started per turn and
|
|
127
|
+
* ends it with task_complete (last_agent_message null after a provider error) or turn_aborted; a steer lands inside
|
|
128
|
+
* the open turn as another user message.
|
|
129
|
+
*/
|
|
130
|
+
private turnRecord;
|
|
62
131
|
private snapshotExistingFiles;
|
|
63
132
|
/**
|
|
64
133
|
* Newest rollout files first.
|
|
@@ -72,6 +141,8 @@ export declare class CodexRolloutSource implements TranscriptSource {
|
|
|
72
141
|
* Baselines and checkpoints ask for a fresh listing; the 2 s poll takes the shared one.
|
|
73
142
|
*/
|
|
74
143
|
private candidateFiles;
|
|
144
|
+
/** The first of `files` that is ours (in order), or undefined. Verdicts are cached, so a known file costs no read. */
|
|
145
|
+
private firstOwned;
|
|
75
146
|
private fileBelongsToUs;
|
|
76
147
|
poll(): Promise<TranscriptEvents>;
|
|
77
148
|
}
|
|
@@ -107,6 +178,9 @@ export declare class MuseSessionSource implements TranscriptSource {
|
|
|
107
178
|
private baselineComplete;
|
|
108
179
|
private rejected;
|
|
109
180
|
private sizes;
|
|
181
|
+
/** #1218 P0: per log, whether its offset is inside a long line being skipped, and a long turn record held for its end. */
|
|
182
|
+
private skipping;
|
|
183
|
+
private pendingLong;
|
|
110
184
|
private listedAt;
|
|
111
185
|
private baselined;
|
|
112
186
|
/** intent_id → its text and time, until it materializes (bounded). */
|
|
@@ -171,6 +245,10 @@ export declare class KiroSessionSource implements TranscriptSource {
|
|
|
171
245
|
private lane;
|
|
172
246
|
private currentFile;
|
|
173
247
|
private byteOffset;
|
|
248
|
+
/** #1218 P0: the offset is inside a long line being skipped (readNewLines `skipping`). */
|
|
249
|
+
private skipping;
|
|
250
|
+
/** #1218 P0: a long line being skipped that is to be read whole once its end is found. */
|
|
251
|
+
private pendingLong;
|
|
174
252
|
private readonly createdAt;
|
|
175
253
|
private generation;
|
|
176
254
|
private cursor;
|