visionclaw 0.1.193 → 0.1.194-dev.feat-backup-progress-reporting.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/backup-uploader.d.ts +44 -0
- package/dist/agent/backup-uploader.d.ts.map +1 -0
- package/dist/agent/backup-uploader.js +83 -0
- package/dist/agent/backup-uploader.js.map +1 -0
- package/dist/agent/backup.d.ts +7 -1
- package/dist/agent/backup.d.ts.map +1 -1
- package/dist/agent/backup.js +337 -52
- package/dist/agent/backup.js.map +1 -1
- package/dist/agent/command-handlers.d.ts +2 -0
- package/dist/agent/command-handlers.d.ts.map +1 -1
- package/dist/agent/command-handlers.js +29 -3
- package/dist/agent/command-handlers.js.map +1 -1
- package/dist/agent/context.d.ts +2 -0
- package/dist/agent/context.d.ts.map +1 -1
- package/dist/agent/context.js +11 -1
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/data-collector.d.ts.map +1 -1
- package/dist/agent/data-collector.js +23 -38
- package/dist/agent/data-collector.js.map +1 -1
- package/dist/agent/loop.d.ts +3 -0
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +48 -0
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/message-format.d.ts.map +1 -1
- package/dist/agent/message-format.js +3 -0
- package/dist/agent/message-format.js.map +1 -1
- package/dist/agent/status.d.ts.map +1 -1
- package/dist/agent/status.js +2 -1
- package/dist/agent/status.js.map +1 -1
- package/dist/backup.d.ts +4 -1
- package/dist/backup.d.ts.map +1 -1
- package/dist/backup.js +86 -3
- package/dist/backup.js.map +1 -1
- package/dist/calendar/google-calendar.d.ts +2 -0
- package/dist/calendar/google-calendar.d.ts.map +1 -1
- package/dist/calendar/google-calendar.js +3 -0
- package/dist/calendar/google-calendar.js.map +1 -1
- package/dist/channels/interface.d.ts +9 -0
- package/dist/channels/interface.d.ts.map +1 -1
- package/dist/channels/manager.d.ts +7 -1
- package/dist/channels/manager.d.ts.map +1 -1
- package/dist/channels/manager.js +12 -0
- package/dist/channels/manager.js.map +1 -1
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +5 -0
- package/dist/channels/telegram.js.map +1 -1
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +42 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/config/types.d.ts +9 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -1
- package/dist/drive/google-drive.d.ts +1 -0
- package/dist/drive/google-drive.d.ts.map +1 -1
- package/dist/drive/google-drive.js +5 -0
- package/dist/drive/google-drive.js.map +1 -1
- package/dist/i18n/messages.d.ts +4 -0
- package/dist/i18n/messages.d.ts.map +1 -1
- package/dist/i18n/messages.js +7 -2
- package/dist/i18n/messages.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/obs/server.d.ts +7 -0
- package/dist/obs/server.d.ts.map +1 -1
- package/dist/obs/server.js +22 -0
- package/dist/obs/server.js.map +1 -1
- package/dist/onboarding/bot-profile.d.ts.map +1 -1
- package/dist/onboarding/bot-profile.js +1 -0
- package/dist/onboarding/bot-profile.js.map +1 -1
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/index.js +5 -0
- package/dist/onboarding/index.js.map +1 -1
- package/dist/onboarding/prepare-mac.d.ts +1 -0
- package/dist/onboarding/prepare-mac.d.ts.map +1 -1
- package/dist/onboarding/prepare-mac.js +32 -15
- package/dist/onboarding/prepare-mac.js.map +1 -1
- package/dist/onboarding/setup-shared.d.ts.map +1 -1
- package/dist/onboarding/setup-shared.js +6 -0
- package/dist/onboarding/setup-shared.js.map +1 -1
- package/dist/onboarding/setup-steps.d.ts.map +1 -1
- package/dist/onboarding/setup-steps.js +8 -0
- package/dist/onboarding/setup-steps.js.map +1 -1
- package/dist/realtime/agent-bridge.d.ts +7 -0
- package/dist/realtime/agent-bridge.d.ts.map +1 -0
- package/dist/realtime/agent-bridge.js +31 -0
- package/dist/realtime/agent-bridge.js.map +1 -0
- package/dist/realtime/assets/index.html +1058 -0
- package/dist/realtime/assets/samples/alloy.mp3 +0 -0
- package/dist/realtime/assets/samples/ash.mp3 +0 -0
- package/dist/realtime/assets/samples/ballad.mp3 +0 -0
- package/dist/realtime/assets/samples/cedar.mp3 +0 -0
- package/dist/realtime/assets/samples/coral.mp3 +0 -0
- package/dist/realtime/assets/samples/echo.mp3 +0 -0
- package/dist/realtime/assets/samples/marin.mp3 +0 -0
- package/dist/realtime/assets/samples/sage.mp3 +0 -0
- package/dist/realtime/assets/samples/shimmer.mp3 +0 -0
- package/dist/realtime/assets/samples/verse.mp3 +0 -0
- package/dist/realtime/context.d.ts +14 -0
- package/dist/realtime/context.d.ts.map +1 -0
- package/dist/realtime/context.js +153 -0
- package/dist/realtime/context.js.map +1 -0
- package/dist/realtime/http-helpers.d.ts +5 -0
- package/dist/realtime/http-helpers.d.ts.map +1 -0
- package/dist/realtime/http-helpers.js +29 -0
- package/dist/realtime/http-helpers.js.map +1 -0
- package/dist/realtime/index.d.ts +62 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +94 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/server.d.ts +6 -0
- package/dist/realtime/server.d.ts.map +1 -0
- package/dist/realtime/server.js +476 -0
- package/dist/realtime/server.js.map +1 -0
- package/dist/realtime/telegram-auth.d.ts +2 -0
- package/dist/realtime/telegram-auth.d.ts.map +1 -0
- package/dist/realtime/telegram-auth.js +24 -0
- package/dist/realtime/telegram-auth.js.map +1 -0
- package/dist/realtime/tools.d.ts +829 -0
- package/dist/realtime/tools.d.ts.map +1 -0
- package/dist/realtime/tools.js +630 -0
- package/dist/realtime/tools.js.map +1 -0
- package/dist/realtime/types.d.ts +62 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/types.js +3 -0
- package/dist/realtime/types.js.map +1 -0
- package/dist/realtime/voice-summarizer.d.ts +4 -0
- package/dist/realtime/voice-summarizer.d.ts.map +1 -0
- package/dist/realtime/voice-summarizer.js +129 -0
- package/dist/realtime/voice-summarizer.js.map +1 -0
- package/dist/restore.d.ts +5 -0
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +132 -16
- package/dist/restore.js.map +1 -1
- package/dist/tools/email.d.ts +1 -1
- package/dist/tools/memory.d.ts +13 -0
- package/dist/tools/memory.d.ts.map +1 -1
- package/dist/tools/memory.js +43 -43
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/stock-data.d.ts +16 -0
- package/dist/tools/stock-data.d.ts.map +1 -1
- package/dist/tools/stock-data.js +36 -38
- package/dist/tools/stock-data.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +4 -0
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +95 -23
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tos-storage.d.ts +45 -0
- package/dist/tos-storage.d.ts.map +1 -0
- package/dist/tos-storage.js +134 -0
- package/dist/tos-storage.js.map +1 -0
- package/dist-agent/bundle.cjs +170934 -167547
- package/package.json +3 -2
- package/dist/agent/applied-credential-signature.d.ts +0 -53
- package/dist/agent/applied-credential-signature.d.ts.map +0 -1
- package/dist/agent/applied-credential-signature.js +0 -137
- package/dist/agent/applied-credential-signature.js.map +0 -1
- package/dist/agent/engines/claude/cli-resolver.d.ts +0 -16
- package/dist/agent/engines/claude/cli-resolver.d.ts.map +0 -1
- package/dist/agent/engines/claude/cli-resolver.js +0 -83
- package/dist/agent/engines/claude/cli-resolver.js.map +0 -1
- package/dist/agent/engines/claude/session-browser-policy.d.ts +0 -9
- package/dist/agent/engines/claude/session-browser-policy.d.ts.map +0 -1
- package/dist/agent/engines/claude/session-browser-policy.js +0 -49
- package/dist/agent/engines/claude/session-browser-policy.js.map +0 -1
- package/dist/agent/engines/claude/session.d.ts +0 -291
- package/dist/agent/engines/claude/session.d.ts.map +0 -1
- package/dist/agent/engines/claude/session.js +0 -1177
- package/dist/agent/engines/claude/session.js.map +0 -1
- package/dist/agent/engines/client-factory.d.ts +0 -63
- package/dist/agent/engines/client-factory.d.ts.map +0 -1
- package/dist/agent/engines/client-factory.js +0 -382
- package/dist/agent/engines/client-factory.js.map +0 -1
- package/dist/agent/engines/engine.d.ts +0 -8
- package/dist/agent/engines/engine.d.ts.map +0 -1
- package/dist/agent/engines/engine.js +0 -15
- package/dist/agent/engines/engine.js.map +0 -1
- package/dist/agent/engines/openai/file-session.d.ts +0 -49
- package/dist/agent/engines/openai/file-session.d.ts.map +0 -1
- package/dist/agent/engines/openai/file-session.js +0 -108
- package/dist/agent/engines/openai/file-session.js.map +0 -1
- package/dist/agent/engines/openai/file-tools.d.ts +0 -35
- package/dist/agent/engines/openai/file-tools.d.ts.map +0 -1
- package/dist/agent/engines/openai/file-tools.js +0 -194
- package/dist/agent/engines/openai/file-tools.js.map +0 -1
- package/dist/agent/engines/openai/session.d.ts +0 -190
- package/dist/agent/engines/openai/session.d.ts.map +0 -1
- package/dist/agent/engines/openai/session.js +0 -1066
- package/dist/agent/engines/openai/session.js.map +0 -1
- package/dist/agent/engines/openai/tools.d.ts +0 -13
- package/dist/agent/engines/openai/tools.d.ts.map +0 -1
- package/dist/agent/engines/openai/tools.js +0 -248
- package/dist/agent/engines/openai/tools.js.map +0 -1
- package/dist/agent/engines/session-types.d.ts +0 -146
- package/dist/agent/engines/session-types.d.ts.map +0 -1
- package/dist/agent/engines/session-types.js +0 -2
- package/dist/agent/engines/session-types.js.map +0 -1
- package/dist/agent/engines/system-prompt-log.d.ts +0 -9
- package/dist/agent/engines/system-prompt-log.d.ts.map +0 -1
- package/dist/agent/engines/system-prompt-log.js +0 -46
- package/dist/agent/engines/system-prompt-log.js.map +0 -1
- package/dist/agent/transcript/transcript-backfill.d.ts +0 -54
- package/dist/agent/transcript/transcript-backfill.d.ts.map +0 -1
- package/dist/agent/transcript/transcript-backfill.js +0 -604
- package/dist/agent/transcript/transcript-backfill.js.map +0 -1
- package/dist/agent/transcript/transcript-indexer.d.ts +0 -273
- package/dist/agent/transcript/transcript-indexer.d.ts.map +0 -1
- package/dist/agent/transcript/transcript-indexer.js +0 -1217
- package/dist/agent/transcript/transcript-indexer.js.map +0 -1
- package/dist/agent/transcript/transcript-memory-migrations.d.ts +0 -25
- package/dist/agent/transcript/transcript-memory-migrations.d.ts.map +0 -1
- package/dist/agent/transcript/transcript-memory-migrations.js +0 -87
- package/dist/agent/transcript/transcript-memory-migrations.js.map +0 -1
- package/dist/agent/transcript-memory-migrations.d.ts +0 -25
- package/dist/agent/transcript-memory-migrations.d.ts.map +0 -1
- package/dist/agent/transcript-memory-migrations.js +0 -87
- package/dist/agent/transcript-memory-migrations.js.map +0 -1
- package/dist/agent/tunnel-credential-handler.d.ts +0 -90
- package/dist/agent/tunnel-credential-handler.d.ts.map +0 -1
- package/dist/agent/tunnel-credential-handler.js +0 -162
- package/dist/agent/tunnel-credential-handler.js.map +0 -1
- package/dist/agent/usage/usage-backfill-handler.d.ts +0 -18
- package/dist/agent/usage/usage-backfill-handler.d.ts.map +0 -1
- package/dist/agent/usage/usage-backfill-handler.js +0 -69
- package/dist/agent/usage/usage-backfill-handler.js.map +0 -1
- package/dist/agent/usage/usage-gate.d.ts +0 -25
- package/dist/agent/usage/usage-gate.d.ts.map +0 -1
- package/dist/agent/usage/usage-gate.js +0 -83
- package/dist/agent/usage/usage-gate.js.map +0 -1
- package/dist/agent/usage/usage-handler.d.ts +0 -7
- package/dist/agent/usage/usage-handler.d.ts.map +0 -1
- package/dist/agent/usage/usage-handler.js +0 -28
- package/dist/agent/usage/usage-handler.js.map +0 -1
- package/dist/agent/usage/usage-report-builder.d.ts +0 -26
- package/dist/agent/usage/usage-report-builder.d.ts.map +0 -1
- package/dist/agent/usage/usage-report-builder.js +0 -80
- package/dist/agent/usage/usage-report-builder.js.map +0 -1
- package/dist/agent/usage/usage-report-queue.d.ts +0 -26
- package/dist/agent/usage/usage-report-queue.d.ts.map +0 -1
- package/dist/agent/usage/usage-report-queue.js +0 -199
- package/dist/agent/usage/usage-report-queue.js.map +0 -1
- package/dist/agent/usage/usage-report-types.d.ts +0 -41
- package/dist/agent/usage/usage-report-types.d.ts.map +0 -1
- package/dist/agent/usage/usage-report-types.js +0 -2
- package/dist/agent/usage/usage-report-types.js.map +0 -1
- package/dist/agent/usage/usage-reporter.d.ts +0 -31
- package/dist/agent/usage/usage-reporter.d.ts.map +0 -1
- package/dist/agent/usage/usage-reporter.js +0 -102
- package/dist/agent/usage/usage-reporter.js.map +0 -1
- package/dist/agent/usage-backfill-handler.d.ts +0 -18
- package/dist/agent/usage-backfill-handler.d.ts.map +0 -1
- package/dist/agent/usage-backfill-handler.js +0 -69
- package/dist/agent/usage-backfill-handler.js.map +0 -1
- package/dist/agent/usage-gate.d.ts +0 -25
- package/dist/agent/usage-gate.d.ts.map +0 -1
- package/dist/agent/usage-gate.js +0 -83
- package/dist/agent/usage-gate.js.map +0 -1
- package/dist/agent/usage-report-builder.d.ts +0 -26
- package/dist/agent/usage-report-builder.d.ts.map +0 -1
- package/dist/agent/usage-report-builder.js +0 -80
- package/dist/agent/usage-report-builder.js.map +0 -1
- package/dist/agent/usage-report-queue.d.ts +0 -26
- package/dist/agent/usage-report-queue.d.ts.map +0 -1
- package/dist/agent/usage-report-queue.js +0 -199
- package/dist/agent/usage-report-queue.js.map +0 -1
- package/dist/agent/usage-report-types.d.ts +0 -41
- package/dist/agent/usage-report-types.d.ts.map +0 -1
- package/dist/agent/usage-report-types.js +0 -2
- package/dist/agent/usage-report-types.js.map +0 -1
- package/dist/agent/usage-reporter.d.ts +0 -31
- package/dist/agent/usage-reporter.d.ts.map +0 -1
- package/dist/agent/usage-reporter.js +0 -102
- package/dist/agent/usage-reporter.js.map +0 -1
- package/dist/agent/wake-cycle-tool-tracker.d.ts +0 -39
- package/dist/agent/wake-cycle-tool-tracker.d.ts.map +0 -1
- package/dist/agent/wake-cycle-tool-tracker.js +0 -72
- package/dist/agent/wake-cycle-tool-tracker.js.map +0 -1
- package/dist/billing/payg-handler.d.ts +0 -29
- package/dist/billing/payg-handler.d.ts.map +0 -1
- package/dist/billing/payg-handler.js +0 -92
- package/dist/billing/payg-handler.js.map +0 -1
- package/dist/billing/payment-handler.d.ts +0 -24
- package/dist/billing/payment-handler.d.ts.map +0 -1
- package/dist/billing/payment-handler.js +0 -101
- package/dist/billing/payment-handler.js.map +0 -1
- package/dist/builtin-skills/catalog/phone-adb-automation/SKILL.md +0 -412
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_input.sh +0 -132
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_launch.sh +0 -166
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_screenshot.sh +0 -87
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_security_kbd.py +0 -174
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_setup.sh +0 -274
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_swipe.sh +0 -111
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_tap.sh +0 -87
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_ui_parse.py +0 -176
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_wake_unlock.sh +0 -67
- package/dist/builtin-skills/transcribe-audio/SKILL.md +0 -122
- package/dist/data-processing/convert-demo-cli.d.ts +0 -7
- package/dist/data-processing/convert-demo-cli.d.ts.map +0 -1
- package/dist/data-processing/convert-demo-cli.js +0 -30
- package/dist/data-processing/convert-demo-cli.js.map +0 -1
- package/dist/data-processing/convert-demo.d.ts +0 -26
- package/dist/data-processing/convert-demo.d.ts.map +0 -1
- package/dist/data-processing/convert-demo.js +0 -233
- package/dist/data-processing/convert-demo.js.map +0 -1
- package/dist/obs/rdp/icons/icons/app_windows.svg +0 -4
- package/dist/obs/rdp/icons/icons/clip_get.svg +0 -4
- package/dist/obs/rdp/icons/icons/clip_send.svg +0 -4
- package/dist/obs/rdp/icons/icons/clip_shared.svg +0 -4
- package/dist/obs/rdp/icons/icons/clipboard.svg +0 -4
- package/dist/obs/rdp/icons/icons/clipboard_shared.svg +0 -4
- package/dist/obs/rdp/icons/icons/control.svg +0 -4
- package/dist/obs/rdp/icons/icons/desktop.svg +0 -4
- package/dist/obs/rdp/icons/icons/display.svg +0 -4
- package/dist/obs/rdp/icons/icons/launchpad.svg +0 -4
- package/dist/obs/rdp/icons/icons/mission_control.svg +0 -4
- package/dist/obs/rdp/icons/icons/screenshot.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_actual.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_fit.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_in.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_out.svg +0 -4
- package/dist/obs/tunnel-telemetry.d.ts +0 -46
- package/dist/obs/tunnel-telemetry.d.ts.map +0 -1
- package/dist/obs/tunnel-telemetry.js +0 -70
- package/dist/obs/tunnel-telemetry.js.map +0 -1
- package/dist/onboarding/cloudflared-cert.d.ts +0 -15
- package/dist/onboarding/cloudflared-cert.d.ts.map +0 -1
- package/dist/onboarding/cloudflared-cert.js +0 -57
- package/dist/onboarding/cloudflared-cert.js.map +0 -1
- package/dist/onboarding/playwriter-extension.d.ts +0 -19
- package/dist/onboarding/playwriter-extension.d.ts.map +0 -1
- package/dist/onboarding/playwriter-extension.js +0 -246
- package/dist/onboarding/playwriter-extension.js.map +0 -1
- package/dist/service/gbox-tun.d.ts +0 -14
- package/dist/service/gbox-tun.d.ts.map +0 -1
- package/dist/service/gbox-tun.js +0 -315
- package/dist/service/gbox-tun.js.map +0 -1
- package/dist/skills/installed.d.ts +0 -11
- package/dist/skills/installed.d.ts.map +0 -1
- package/dist/skills/installed.js +0 -35
- package/dist/skills/installed.js.map +0 -1
- package/dist/tools/coordinate-resolver.d.ts +0 -30
- package/dist/tools/coordinate-resolver.d.ts.map +0 -1
- package/dist/tools/coordinate-resolver.js +0 -104
- package/dist/tools/coordinate-resolver.js.map +0 -1
- package/dist/utils/playwriter-relay.d.ts +0 -9
- package/dist/utils/playwriter-relay.d.ts.map +0 -1
- package/dist/utils/playwriter-relay.js +0 -77
- package/dist/utils/playwriter-relay.js.map +0 -1
- package/dist/utils/wechat-monitor.d.ts +0 -21
- package/dist/utils/wechat-monitor.d.ts.map +0 -1
- package/dist/utils/wechat-monitor.js +0 -88
- package/dist/utils/wechat-monitor.js.map +0 -1
|
@@ -1,604 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Backfill historical VisionClaw runtime logs into the transcript-memory
|
|
3
|
-
* database.
|
|
4
|
-
*
|
|
5
|
-
* IMPORTANT — terminology:
|
|
6
|
-
* - "Log files" = VisionClaw runtime logs stored at
|
|
7
|
-
* `~/.visionclaw/profiles/<profile>/logs/YYYY-MM-DD.jsonl(.gz)`.
|
|
8
|
-
* Format: `{timestamp, level, category, message, data}`.
|
|
9
|
-
* - "Transcript files" = Claude Agent SDK model transcripts stored at
|
|
10
|
-
* `~/.claude/projects/<slug>/<sessionId>.jsonl`.
|
|
11
|
-
* Format: `{type:"user"|"assistant", message:{...}}`.
|
|
12
|
-
*
|
|
13
|
-
* This module operates on **log files** (not Claude transcripts).
|
|
14
|
-
*
|
|
15
|
-
* Reads JSONL (and JSONL.gz) log files from the configured logs directory,
|
|
16
|
-
* segments them into wake cycles (wake → next wake / end-of-file boundaries),
|
|
17
|
-
* matching the existing data-processing segmenter, then generates
|
|
18
|
-
* summaries + embeddings via Gemini, and inserts them into the same SQLite
|
|
19
|
-
* DB used by the live transcript indexer.
|
|
20
|
-
*
|
|
21
|
-
* Usage:
|
|
22
|
-
* visionclaw backfill-memory [--dry-run] [--since YYYY-MM-DD] [--concurrency N]
|
|
23
|
-
*/
|
|
24
|
-
import fs from "node:fs";
|
|
25
|
-
import path from "node:path";
|
|
26
|
-
import readline from "node:readline";
|
|
27
|
-
import { createGunzip } from "node:zlib";
|
|
28
|
-
import { pipeline } from "node:stream/promises";
|
|
29
|
-
import { PassThrough } from "node:stream";
|
|
30
|
-
import { getConfigDir, loadConfig } from "../../config/index.js";
|
|
31
|
-
import { generateSummary, generateEmbedding, insertWakeCycleRecord, wakeCycleExists, getWakeCycleCount, closeTranscriptMemoryDb, } from "./transcript-indexer.js";
|
|
32
|
-
import { logger } from "../../logger.js";
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// Log file discovery and streaming
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
function discoverLogFiles(logsDir, since) {
|
|
37
|
-
if (!fs.existsSync(logsDir)) {
|
|
38
|
-
console.error(`Logs directory not found: ${logsDir}`);
|
|
39
|
-
return [];
|
|
40
|
-
}
|
|
41
|
-
const files = fs
|
|
42
|
-
.readdirSync(logsDir)
|
|
43
|
-
.filter((f) => (f.endsWith(".jsonl") || f.endsWith(".jsonl.gz")) &&
|
|
44
|
-
!f.includes(".archive."))
|
|
45
|
-
.sort();
|
|
46
|
-
if (!since)
|
|
47
|
-
return files.map((f) => path.join(logsDir, f));
|
|
48
|
-
// Filter files whose date portion is >= since
|
|
49
|
-
return files
|
|
50
|
-
.filter((f) => {
|
|
51
|
-
// File names are like "2026-03-30.jsonl" or "2026-03-30.jsonl.gz"
|
|
52
|
-
const datePart = f.slice(0, 10);
|
|
53
|
-
return datePart >= since;
|
|
54
|
-
})
|
|
55
|
-
.map((f) => path.join(logsDir, f));
|
|
56
|
-
}
|
|
57
|
-
function createLogInputStream(filePath) {
|
|
58
|
-
const isGz = filePath.endsWith(".gz");
|
|
59
|
-
if (isGz) {
|
|
60
|
-
const fileStream = fs.createReadStream(filePath);
|
|
61
|
-
const gunzip = createGunzip();
|
|
62
|
-
const passthrough = new PassThrough();
|
|
63
|
-
void pipeline(fileStream, gunzip, passthrough).catch(() => {
|
|
64
|
-
// Stream errors will surface when readline tries to read
|
|
65
|
-
});
|
|
66
|
-
return passthrough;
|
|
67
|
-
}
|
|
68
|
-
return fs.createReadStream(filePath, { encoding: "utf-8" });
|
|
69
|
-
}
|
|
70
|
-
async function* streamLogEntries(filePath) {
|
|
71
|
-
const fileName = path.basename(filePath);
|
|
72
|
-
let lineIdx = 0;
|
|
73
|
-
const rl = readline.createInterface({
|
|
74
|
-
input: createLogInputStream(filePath),
|
|
75
|
-
crlfDelay: Infinity,
|
|
76
|
-
});
|
|
77
|
-
for await (const raw of rl) {
|
|
78
|
-
const trimmed = raw.trim();
|
|
79
|
-
if (!trimmed) {
|
|
80
|
-
lineIdx++;
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
try {
|
|
84
|
-
const obj = JSON.parse(trimmed);
|
|
85
|
-
yield {
|
|
86
|
-
timestamp: obj.timestamp ?? "",
|
|
87
|
-
level: obj.level ?? "",
|
|
88
|
-
category: obj.category ?? "",
|
|
89
|
-
message: obj.message ?? "",
|
|
90
|
-
data: obj.data ?? {},
|
|
91
|
-
sourceFile: fileName,
|
|
92
|
-
lineIndex: lineIdx,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// Skip malformed lines
|
|
97
|
-
}
|
|
98
|
-
lineIdx++;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
class AbortStreamingBackfillError extends Error {
|
|
102
|
-
constructor() {
|
|
103
|
-
super("streaming backfill aborted");
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
async function streamWakeCycles(filePath, onCycle) {
|
|
107
|
-
let current;
|
|
108
|
-
let entryCount = 0;
|
|
109
|
-
let cycleCount = 0;
|
|
110
|
-
for await (const entry of streamLogEntries(filePath)) {
|
|
111
|
-
entryCount++;
|
|
112
|
-
if (entry.category === "wake") {
|
|
113
|
-
if (current) {
|
|
114
|
-
current.endLine = entry.lineIndex; // exclusive: up to the next wake
|
|
115
|
-
await onCycle(current, cycleCount);
|
|
116
|
-
cycleCount++;
|
|
117
|
-
}
|
|
118
|
-
current = {
|
|
119
|
-
entries: [entry],
|
|
120
|
-
sourceFile: filePath,
|
|
121
|
-
startLine: entry.lineIndex,
|
|
122
|
-
endLine: entry.lineIndex + 1,
|
|
123
|
-
};
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
if (!current)
|
|
127
|
-
continue;
|
|
128
|
-
current.entries.push(entry);
|
|
129
|
-
current.endLine = entry.lineIndex + 1;
|
|
130
|
-
}
|
|
131
|
-
if (current) {
|
|
132
|
-
await onCycle(current, cycleCount);
|
|
133
|
-
cycleCount++;
|
|
134
|
-
}
|
|
135
|
-
return { entryCount, cycleCount };
|
|
136
|
-
}
|
|
137
|
-
// ---------------------------------------------------------------------------
|
|
138
|
-
// Condensed text generation from VisionClaw log entries
|
|
139
|
-
// ---------------------------------------------------------------------------
|
|
140
|
-
function condenseCycleEntries(entries) {
|
|
141
|
-
const parts = [];
|
|
142
|
-
for (const entry of entries) {
|
|
143
|
-
// TODO: [thinking] are purposely ignored because [thinking] is usually noisy internal narration rather than durable memory content.
|
|
144
|
-
switch (entry.category) {
|
|
145
|
-
case "incoming": {
|
|
146
|
-
const channel = entry.data.channel ?? "";
|
|
147
|
-
const sender = entry.data.sender ?? "";
|
|
148
|
-
const text = entry.data.text ?? entry.message;
|
|
149
|
-
parts.push(`[User] [${channel}] ${sender}: ${text}`);
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
case "send": {
|
|
153
|
-
const text = entry.data.text ?? entry.message;
|
|
154
|
-
if (text.length > 500) {
|
|
155
|
-
parts.push(`[Sent to Model] ${text.slice(0, 500)}...[truncated]`);
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
parts.push(`[Sent to Model] ${text}`);
|
|
159
|
-
}
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
case "assistant":
|
|
163
|
-
parts.push(`[Assistant] ${entry.message}`);
|
|
164
|
-
break;
|
|
165
|
-
case "tool_call": {
|
|
166
|
-
const name = entry.data.name ?? "unknown";
|
|
167
|
-
const input = entry.data.input;
|
|
168
|
-
const inputStr = input ? JSON.stringify(input) : "";
|
|
169
|
-
const truncated = inputStr.length > 500
|
|
170
|
-
? inputStr.slice(0, 500) + "...[truncated]"
|
|
171
|
-
: inputStr;
|
|
172
|
-
parts.push(`[Tool Call] ${name}(${truncated})`);
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
|
-
case "tool_result": {
|
|
176
|
-
// Only include errors in the condensed version
|
|
177
|
-
if (entry.level === "error") {
|
|
178
|
-
const name = entry.data.name ?? "unknown";
|
|
179
|
-
const msg = entry.message.length > 300
|
|
180
|
-
? entry.message.slice(0, 300) + "...[truncated]"
|
|
181
|
-
: entry.message;
|
|
182
|
-
parts.push(`[Tool Error] ${name}: ${msg}`);
|
|
183
|
-
}
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
186
|
-
case "wake": {
|
|
187
|
-
const trigger = entry.data.trigger ?? "unknown";
|
|
188
|
-
parts.push(`[Wake] trigger=${trigger}`);
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
case "result": {
|
|
192
|
-
const turns = entry.data.turns;
|
|
193
|
-
const cost = entry.data.cost;
|
|
194
|
-
parts.push(`[Result] turns=${turns ?? "?"} cost=$${cost ?? "?"}`);
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
// Skip debug, system, channel (noise) categories
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return parts.join("\n");
|
|
201
|
-
}
|
|
202
|
-
// ---------------------------------------------------------------------------
|
|
203
|
-
// Trivial wake cycle detection (backfill log format)
|
|
204
|
-
// ---------------------------------------------------------------------------
|
|
205
|
-
/**
|
|
206
|
-
* Base tool name suffixes considered "housekeeping". MCP tools are often
|
|
207
|
-
* prefixed by the SDK (e.g. `mcp__visionclaw__memory`), so we match by
|
|
208
|
-
* suffix to handle both bare and prefixed names.
|
|
209
|
-
*/
|
|
210
|
-
const TRIVIAL_TOOL_SUFFIXES = [
|
|
211
|
-
"memory",
|
|
212
|
-
"memory_transcript_search",
|
|
213
|
-
"memory_transcript_detail",
|
|
214
|
-
"finish",
|
|
215
|
-
"wait",
|
|
216
|
-
"switch_session",
|
|
217
|
-
];
|
|
218
|
-
/**
|
|
219
|
-
* Exact tool names from the Claude Agent SDK that are trivial.
|
|
220
|
-
*/
|
|
221
|
-
const TRIVIAL_EXACT_NAMES = new Set([
|
|
222
|
-
"ToolSearch",
|
|
223
|
-
]);
|
|
224
|
-
/**
|
|
225
|
-
* Check whether a tool name is trivial/housekeeping, handling MCP-prefixed
|
|
226
|
-
* names like `mcp__visionclaw__memory` as well as bare names like `memory`.
|
|
227
|
-
*/
|
|
228
|
-
function isTrivialTool(name) {
|
|
229
|
-
if (TRIVIAL_EXACT_NAMES.has(name))
|
|
230
|
-
return true;
|
|
231
|
-
for (const suffix of TRIVIAL_TOOL_SUFFIXES) {
|
|
232
|
-
if (name === suffix || name.endsWith(`__${suffix}`))
|
|
233
|
-
return true;
|
|
234
|
-
}
|
|
235
|
-
return false;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Check whether a backfill wake cycle only contains trivial/housekeeping
|
|
239
|
-
* tool calls and no substantive work.
|
|
240
|
-
*/
|
|
241
|
-
function isOnlyTrivialToolCallsBackfill(entries) {
|
|
242
|
-
let hasToolCalls = false;
|
|
243
|
-
for (const entry of entries) {
|
|
244
|
-
if (entry.category === "tool_call") {
|
|
245
|
-
hasToolCalls = true;
|
|
246
|
-
const name = entry.data.name ?? "";
|
|
247
|
-
if (!isTrivialTool(name)) {
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return hasToolCalls;
|
|
253
|
-
}
|
|
254
|
-
// ---------------------------------------------------------------------------
|
|
255
|
-
// Wake cycle ID generation for backfill
|
|
256
|
-
// ---------------------------------------------------------------------------
|
|
257
|
-
function generateBackfillCycleId(cycle, cycleIndex) {
|
|
258
|
-
const wakeEntry = cycle.entries.find((e) => e.category === "wake");
|
|
259
|
-
const timestamp = wakeEntry?.timestamp ?? "";
|
|
260
|
-
// Extract date from ISO timestamp (e.g., "2026-03-30T14:32:00.123+08:00" → "2026-03-30")
|
|
261
|
-
const date = timestamp.slice(0, 10) || "unknown";
|
|
262
|
-
// Detect session type from "send" entry
|
|
263
|
-
const sendEntry = cycle.entries.find((e) => e.category === "send");
|
|
264
|
-
let sessionType = "general";
|
|
265
|
-
if (sendEntry) {
|
|
266
|
-
const match = /\[Active session: (\w+)]/.exec(sendEntry.message);
|
|
267
|
-
if (match?.[1])
|
|
268
|
-
sessionType = match[1];
|
|
269
|
-
}
|
|
270
|
-
const seq = String(cycleIndex + 1).padStart(3, "0");
|
|
271
|
-
return `${date}_${sessionType}_${seq}`;
|
|
272
|
-
}
|
|
273
|
-
// ---------------------------------------------------------------------------
|
|
274
|
-
// Main backfill logic
|
|
275
|
-
// ---------------------------------------------------------------------------
|
|
276
|
-
async function processOneCycle(cycle, cycleId, config, dryRun) {
|
|
277
|
-
// Check if already indexed
|
|
278
|
-
if (wakeCycleExists(cycleId)) {
|
|
279
|
-
return "skipped_existing";
|
|
280
|
-
}
|
|
281
|
-
// Skip cycles with only trivial/housekeeping tool calls
|
|
282
|
-
if (isOnlyTrivialToolCallsBackfill(cycle.entries)) {
|
|
283
|
-
return "skipped_trivial";
|
|
284
|
-
}
|
|
285
|
-
// Condense entries
|
|
286
|
-
const condensed = condenseCycleEntries(cycle.entries);
|
|
287
|
-
if (condensed.length < 50) {
|
|
288
|
-
return "skipped_trivial";
|
|
289
|
-
}
|
|
290
|
-
// Detect session type
|
|
291
|
-
const sendEntry = cycle.entries.find((e) => e.category === "send");
|
|
292
|
-
let sessionType = "general";
|
|
293
|
-
if (sendEntry) {
|
|
294
|
-
const match = /\[Active session: (\w+)]/.exec(sendEntry.message);
|
|
295
|
-
if (match?.[1])
|
|
296
|
-
sessionType = match[1];
|
|
297
|
-
}
|
|
298
|
-
// Extract timestamps
|
|
299
|
-
const wakeEntry = cycle.entries.find((e) => e.category === "wake");
|
|
300
|
-
const resultEntry = [...cycle.entries]
|
|
301
|
-
.reverse()
|
|
302
|
-
.find((e) => e.category === "result");
|
|
303
|
-
const timestampStart = wakeEntry?.timestamp ?? new Date().toISOString();
|
|
304
|
-
const timestampEnd = resultEntry?.timestamp ?? timestampStart;
|
|
305
|
-
if (dryRun) {
|
|
306
|
-
console.log(` [DRY RUN] Would index ${cycleId}: ${condensed.length} chars, ` +
|
|
307
|
-
`${cycle.entries.length} entries, ${sessionType} session`);
|
|
308
|
-
return "indexed";
|
|
309
|
-
}
|
|
310
|
-
// Generate summary
|
|
311
|
-
const { summary, key_excerpts } = await generateSummary(condensed, config);
|
|
312
|
-
// Generate embedding (best-effort)
|
|
313
|
-
const embeddingVec = await generateEmbedding(summary, config);
|
|
314
|
-
const embeddingBlob = embeddingVec
|
|
315
|
-
? Buffer.from(embeddingVec.buffer, embeddingVec.byteOffset, embeddingVec.byteLength)
|
|
316
|
-
: null;
|
|
317
|
-
// Resolve source file path — store the absolute path to the VisionClaw log file
|
|
318
|
-
const sourceFile = path.isAbsolute(cycle.sourceFile)
|
|
319
|
-
? cycle.sourceFile
|
|
320
|
-
: path.join(getConfigDir(), "logs", cycle.sourceFile);
|
|
321
|
-
// Insert into DB
|
|
322
|
-
insertWakeCycleRecord({
|
|
323
|
-
wakeCycleId: cycleId,
|
|
324
|
-
sessionType,
|
|
325
|
-
timestampStart,
|
|
326
|
-
timestampEnd,
|
|
327
|
-
summary,
|
|
328
|
-
keyExcerpts: key_excerpts,
|
|
329
|
-
sourceFile,
|
|
330
|
-
startLine: cycle.startLine + 1, // Convert 0-indexed inclusive start → 1-indexed inclusive
|
|
331
|
-
endLine: cycle.endLine + 1, // Convert 0-indexed exclusive end → 1-indexed exclusive
|
|
332
|
-
embeddingBlob,
|
|
333
|
-
});
|
|
334
|
-
return "indexed";
|
|
335
|
-
}
|
|
336
|
-
async function sleep(ms) {
|
|
337
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
338
|
-
}
|
|
339
|
-
// ---------------------------------------------------------------------------
|
|
340
|
-
// CLI entry point
|
|
341
|
-
// ---------------------------------------------------------------------------
|
|
342
|
-
export async function runBackfillMemory(args) {
|
|
343
|
-
const options = {
|
|
344
|
-
dryRun: args.includes("--dry-run"),
|
|
345
|
-
since: null,
|
|
346
|
-
concurrency: 1,
|
|
347
|
-
};
|
|
348
|
-
const sinceIdx = args.indexOf("--since");
|
|
349
|
-
if (sinceIdx !== -1 && sinceIdx + 1 < args.length) {
|
|
350
|
-
options.since = args[sinceIdx + 1];
|
|
351
|
-
}
|
|
352
|
-
const concIdx = args.indexOf("--concurrency");
|
|
353
|
-
if (concIdx !== -1 && concIdx + 1 < args.length) {
|
|
354
|
-
options.concurrency = Math.max(1, parseInt(args[concIdx + 1], 10) || 1);
|
|
355
|
-
}
|
|
356
|
-
console.log("VisionClaw Transcript Memory Backfill");
|
|
357
|
-
console.log("─".repeat(50));
|
|
358
|
-
if (options.dryRun)
|
|
359
|
-
console.log("Mode: DRY RUN (no changes will be made)");
|
|
360
|
-
if (options.since)
|
|
361
|
-
console.log(`Since: ${options.since}`);
|
|
362
|
-
console.log();
|
|
363
|
-
// Load config for Gemini API key
|
|
364
|
-
let config;
|
|
365
|
-
try {
|
|
366
|
-
config = loadConfig();
|
|
367
|
-
}
|
|
368
|
-
catch {
|
|
369
|
-
console.error("Failed to load config. Run setup first.");
|
|
370
|
-
process.exit(1);
|
|
371
|
-
}
|
|
372
|
-
const logsDir = path.join(getConfigDir(), "logs");
|
|
373
|
-
const files = discoverLogFiles(logsDir, options.since);
|
|
374
|
-
if (files.length === 0) {
|
|
375
|
-
console.log("No log files found to process.");
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
console.log(`Found ${files.length} log file(s) to process\n`);
|
|
379
|
-
const stats = {
|
|
380
|
-
totalFiles: files.length,
|
|
381
|
-
totalCycles: 0,
|
|
382
|
-
indexedCycles: 0,
|
|
383
|
-
skippedTrivial: 0,
|
|
384
|
-
skippedExisting: 0,
|
|
385
|
-
errors: 0,
|
|
386
|
-
};
|
|
387
|
-
try {
|
|
388
|
-
for (const filePath of files) {
|
|
389
|
-
const fileName = path.basename(filePath);
|
|
390
|
-
console.log(`Processing ${fileName}...`);
|
|
391
|
-
let firstCycle = true;
|
|
392
|
-
const streamStats = await streamWakeCycles(filePath, async (cycle, cycleIndex) => {
|
|
393
|
-
if (firstCycle) {
|
|
394
|
-
firstCycle = false;
|
|
395
|
-
}
|
|
396
|
-
stats.totalCycles++;
|
|
397
|
-
const cycleId = generateBackfillCycleId(cycle, cycleIndex);
|
|
398
|
-
try {
|
|
399
|
-
const result = await processOneCycle(cycle, cycleId, config, options.dryRun);
|
|
400
|
-
switch (result) {
|
|
401
|
-
case "indexed":
|
|
402
|
-
stats.indexedCycles++;
|
|
403
|
-
console.log(` ✓ ${cycleId} (${cycle.entries.length} entries)`);
|
|
404
|
-
break;
|
|
405
|
-
case "skipped_trivial":
|
|
406
|
-
stats.skippedTrivial++;
|
|
407
|
-
break;
|
|
408
|
-
case "skipped_existing":
|
|
409
|
-
stats.skippedExisting++;
|
|
410
|
-
break;
|
|
411
|
-
case "error":
|
|
412
|
-
stats.errors++;
|
|
413
|
-
break;
|
|
414
|
-
}
|
|
415
|
-
// Rate limit: small delay between Gemini API calls
|
|
416
|
-
if (result === "indexed" && !options.dryRun) {
|
|
417
|
-
await sleep(200);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
catch (err) {
|
|
421
|
-
stats.errors++;
|
|
422
|
-
console.error(` ✗ ${cycleId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
423
|
-
// Continue processing other cycles
|
|
424
|
-
await sleep(1000); // Longer delay after error (rate limit, etc.)
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
if (streamStats.entryCount === 0) {
|
|
428
|
-
console.log(` No entries found, skipping`);
|
|
429
|
-
continue;
|
|
430
|
-
}
|
|
431
|
-
console.log(` ${streamStats.entryCount} entries → ${streamStats.cycleCount} wake cycle(s)`);
|
|
432
|
-
console.log();
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
finally {
|
|
436
|
-
closeTranscriptMemoryDb();
|
|
437
|
-
}
|
|
438
|
-
// Print summary
|
|
439
|
-
console.log("─".repeat(50));
|
|
440
|
-
console.log("Backfill Summary:");
|
|
441
|
-
console.log(` Files processed: ${stats.totalFiles}`);
|
|
442
|
-
console.log(` Wake cycles found: ${stats.totalCycles}`);
|
|
443
|
-
console.log(` Indexed: ${stats.indexedCycles}`);
|
|
444
|
-
console.log(` Skipped (trivial): ${stats.skippedTrivial}`);
|
|
445
|
-
console.log(` Skipped (existing): ${stats.skippedExisting}`);
|
|
446
|
-
console.log(` Errors: ${stats.errors}`);
|
|
447
|
-
}
|
|
448
|
-
// ---------------------------------------------------------------------------
|
|
449
|
-
// Auto-backfill: one-time background backfill on agent startup
|
|
450
|
-
// ---------------------------------------------------------------------------
|
|
451
|
-
const BACKFILL_MARKER = "transcript-memory-backfilled";
|
|
452
|
-
function writeMarker(markerPath, data) {
|
|
453
|
-
try {
|
|
454
|
-
fs.writeFileSync(markerPath, JSON.stringify(data, null, 2) + "\n");
|
|
455
|
-
}
|
|
456
|
-
catch {
|
|
457
|
-
// best-effort
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* AbortController exposed to the caller so the agent loop can cancel
|
|
462
|
-
* auto-backfill during graceful shutdown.
|
|
463
|
-
*/
|
|
464
|
-
let backfillAbortController = null;
|
|
465
|
-
/**
|
|
466
|
-
* Cancel any in-progress auto-backfill. Safe to call multiple times or when
|
|
467
|
-
* no backfill is running.
|
|
468
|
-
*/
|
|
469
|
-
export function cancelAutoBackfill() {
|
|
470
|
-
backfillAbortController?.abort();
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Check whether auto-backfill should run and execute it if needed.
|
|
474
|
-
* Called from the agent loop on startup (fire-and-forget).
|
|
475
|
-
*
|
|
476
|
-
* Conditions for auto-backfill:
|
|
477
|
-
* 1. No marker file exists (hasn't been done before)
|
|
478
|
-
* 2. The transcript-memory DB has no entries (empty/new)
|
|
479
|
-
* 3. Historical log files exist in the logs directory
|
|
480
|
-
*
|
|
481
|
-
* Robustness:
|
|
482
|
-
* - Respects an AbortSignal so the agent can stop it on shutdown.
|
|
483
|
-
* - Idempotent: already-indexed cycles are skipped via `wakeCycleExists()`.
|
|
484
|
-
* - Crash-safe: the marker file is only written after all cycles are
|
|
485
|
-
* processed. On restart the backfill resumes, skipping existing records.
|
|
486
|
-
* - Concurrent writes: live `indexWakeCycle()` can run in parallel. SQLite
|
|
487
|
-
* WAL mode + in-process synchronous driver ensures serialized writes.
|
|
488
|
-
* - DB closed during backfill: all DB operations are wrapped in try/catch
|
|
489
|
-
* so a closed-DB error does not crash the process.
|
|
490
|
-
*
|
|
491
|
-
* The backfill runs with a longer delay between API calls (500ms)
|
|
492
|
-
* to avoid competing with the agent's own Gemini usage.
|
|
493
|
-
*/
|
|
494
|
-
export async function maybeAutoBackfill(config) {
|
|
495
|
-
const configDir = getConfigDir();
|
|
496
|
-
const markerPath = path.join(configDir, BACKFILL_MARKER);
|
|
497
|
-
// 1. Already done?
|
|
498
|
-
if (fs.existsSync(markerPath)) {
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
// 2. DB already has entries? (e.g. manual backfill was run, or live indexing
|
|
502
|
-
// has been running for a while)
|
|
503
|
-
const existingCount = getWakeCycleCount();
|
|
504
|
-
if (existingCount > 0) {
|
|
505
|
-
// DB already has data — write marker and skip
|
|
506
|
-
writeMarker(markerPath, { skipped: true, existingCount });
|
|
507
|
-
logger.system(`[transcript-backfill] Skipping auto-backfill: DB already has ${existingCount} entries`);
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
// 3. Any log files to process?
|
|
511
|
-
const logsDir = path.join(configDir, "logs");
|
|
512
|
-
// TODO: For backfill, we only process logs not .claude transcripts.
|
|
513
|
-
const files = discoverLogFiles(logsDir, null);
|
|
514
|
-
if (files.length === 0) {
|
|
515
|
-
writeMarker(markerPath, { skipped: true, reason: "no_log_files" });
|
|
516
|
-
logger.system("[transcript-backfill] Skipping auto-backfill: no historical log files found");
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
// 4. Set up cancellation
|
|
520
|
-
backfillAbortController = new AbortController();
|
|
521
|
-
const { signal } = backfillAbortController;
|
|
522
|
-
// 5. Run backfill
|
|
523
|
-
logger.system(`[transcript-backfill] Starting auto-backfill of ${files.length} log file(s)...`);
|
|
524
|
-
const stats = {
|
|
525
|
-
totalFiles: files.length,
|
|
526
|
-
totalCycles: 0,
|
|
527
|
-
indexedCycles: 0,
|
|
528
|
-
skippedTrivial: 0,
|
|
529
|
-
skippedExisting: 0,
|
|
530
|
-
errors: 0,
|
|
531
|
-
};
|
|
532
|
-
let aborted = false;
|
|
533
|
-
for (const filePath of files) {
|
|
534
|
-
if (signal.aborted) {
|
|
535
|
-
aborted = true;
|
|
536
|
-
break;
|
|
537
|
-
}
|
|
538
|
-
const fileName = path.basename(filePath);
|
|
539
|
-
try {
|
|
540
|
-
const streamStats = await streamWakeCycles(filePath, async (cycle, cycleIndex) => {
|
|
541
|
-
// Re-check abort between cycles — the signal may have been set during
|
|
542
|
-
// the previous processOneCycle() await. Cast via unknown to suppress
|
|
543
|
-
// the linter's "always falsy" false positive (it doesn't model
|
|
544
|
-
// AbortSignal mutation across awaits).
|
|
545
|
-
if (signal.aborted) {
|
|
546
|
-
aborted = true;
|
|
547
|
-
throw new AbortStreamingBackfillError();
|
|
548
|
-
}
|
|
549
|
-
stats.totalCycles++;
|
|
550
|
-
const cycleId = generateBackfillCycleId(cycle, cycleIndex);
|
|
551
|
-
try {
|
|
552
|
-
const result = await processOneCycle(cycle, cycleId, config, false);
|
|
553
|
-
switch (result) {
|
|
554
|
-
case "indexed":
|
|
555
|
-
stats.indexedCycles++;
|
|
556
|
-
break;
|
|
557
|
-
case "skipped_trivial":
|
|
558
|
-
stats.skippedTrivial++;
|
|
559
|
-
break;
|
|
560
|
-
case "skipped_existing":
|
|
561
|
-
stats.skippedExisting++;
|
|
562
|
-
break;
|
|
563
|
-
case "error":
|
|
564
|
-
stats.errors++;
|
|
565
|
-
break;
|
|
566
|
-
}
|
|
567
|
-
// Longer delay for background operation to avoid starving
|
|
568
|
-
// the agent's own Gemini API calls
|
|
569
|
-
if (result === "indexed") {
|
|
570
|
-
await sleep(500);
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
catch (err) {
|
|
574
|
-
stats.errors++;
|
|
575
|
-
logger.warn(`[transcript-backfill] ${cycleId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
576
|
-
await sleep(2000);
|
|
577
|
-
}
|
|
578
|
-
});
|
|
579
|
-
logger.debug(`[transcript-backfill] ${fileName}: ${streamStats.cycleCount} cycles processed`);
|
|
580
|
-
}
|
|
581
|
-
catch (err) {
|
|
582
|
-
if (err instanceof AbortStreamingBackfillError) {
|
|
583
|
-
break;
|
|
584
|
-
}
|
|
585
|
-
logger.warn(`[transcript-backfill] Failed to process ${fileName}: ${err instanceof Error ? err.message : String(err)}`);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
backfillAbortController = null;
|
|
589
|
-
if (aborted) {
|
|
590
|
-
logger.system(`[transcript-backfill] Auto-backfill interrupted (shutdown): ` +
|
|
591
|
-
`${stats.indexedCycles} indexed so far. Will resume on next startup.`);
|
|
592
|
-
// Do NOT write marker — let backfill resume on next startup
|
|
593
|
-
return;
|
|
594
|
-
}
|
|
595
|
-
// Write marker only on successful completion
|
|
596
|
-
writeMarker(markerPath, {
|
|
597
|
-
completedAt: new Date().toISOString(),
|
|
598
|
-
...stats,
|
|
599
|
-
});
|
|
600
|
-
logger.system(`[transcript-backfill] Auto-backfill complete: ` +
|
|
601
|
-
`${stats.indexedCycles} indexed, ${stats.skippedTrivial} trivial, ` +
|
|
602
|
-
`${stats.skippedExisting} existing, ${stats.errors} errors`);
|
|
603
|
-
}
|
|
604
|
-
//# sourceMappingURL=transcript-backfill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-backfill.js","sourceRoot":"","sources":["../../../src/agent/transcript/transcript-backfill.ts"],"names":[],"mappings":"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"}
|