@xopcai/xopc 0.0.118 → 0.0.119
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 +2 -1
- package/README.zh-CN.md +2 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-dzUrQoeZ.js → agent-avatar-dicebear-CU8J6zou.js} +1 -1
- package/dist/gateway/static/root/assets/agents-B0hkpLhP.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-B9vfYoEr.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-ClOzIO24.js +1 -0
- package/dist/gateway/static/root/assets/{apps-page--wMEL00f.js → apps-page-DU0dz9Zo.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-Cki4SfU2.js → archive-plugin-BkVIgZzA.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-D-KnS2Do.js → attachment-load-CaCMWh1D.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-DhGDpKP3.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-CTedroVo.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D2sgvJja.js → binary-plugins-B4TO_bsn.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DIq-4Gvb.js → block-editor-DJRWwWNI.js} +28 -28
- package/dist/gateway/static/root/assets/browser-settings-page-FCDwOOBK.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-Befi89CL.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-_G8eb2vJ.js +1 -0
- package/dist/gateway/static/root/assets/channel-recipient-api-BNSuJb5f.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-C3d5JBJX.js +1 -0
- package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-yaUNvt5u.js +2 -0
- package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
- package/dist/gateway/static/root/assets/dreaming-settings-DNrdg1Ve.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DYu1KaFQ.js → extension-debug-page-DYh402XV.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B3W6QwlZ.js → extension-page-Cr_TizrN.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-D7VQ-cxE.js → extension-settings-page-BU1KoKRj.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-B7xDPu-R.js → fetch-Y7AEX4H3.js} +1 -1
- package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-api-BTBLSeUu.js → gateway-config-api-RbMmAOpX.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-C79wkXef.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CYj9FWCp.js → gateway-startup-retry-DiD_Tx4N.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-9paXuHdo.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CQQgzPr3.js → goals-config-api-DqxVi0p5.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-BHitvJAv.js → goals-page-CS0R-Af2.js} +2 -2
- package/dist/gateway/static/root/assets/goals-settings-CSuzZ8Ae.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DXPaYJm3.js +1 -0
- package/dist/gateway/static/root/assets/index-BoKafJIZ.js +191 -0
- package/dist/gateway/static/root/assets/index-CArhCcYn.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Dvg53qnd.js +1 -0
- package/dist/gateway/static/root/assets/{logs-page-C2Uqvae9.js → logs-page-DLXPcksQ.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-BwOFrJ2E.js → markdown-split-CpHxbtWJ.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Cnz6Q5G6.js → media-plugins-SFPQRSxq.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CrDHEbss.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BDF2iyRk.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CSb_hwig.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-B-Svpmza.js → note-image-lightbox-BUYURRgn.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-BsIBSFyZ.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Bss4TiwP.js → preview-open-alternatives-BHz9iWYA.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CwzSovcS.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BRNjdgKq.js → save-bar-controls-CefkOlRg.js} +1 -1
- package/dist/gateway/static/root/assets/schedule-field-CmTRoOcE.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-Dub9sy8r.js → schema-form-FMKv1vGu.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-PHmX-NmA.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BRAeKJN4.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BeFLavGi.js → settings-collapsible-section-BouO6JTi.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-dmyaPOTG.js → settings-form-section-D-4lBl6X.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-KKrbFjy8.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-BJ4Gsef5.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CrUjHPQo.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-C8glrdqe.js → share-preview-page-BDy2btRN.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-B18OBmH5.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C28-2uKQ.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Bm2ebkwl.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-CRngrlnZ.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-BltBc0b-.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-DqlWTsDb.js → use-channel-catalog-CjN-51e6.js} +1 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-DJ1dKwZy.js +1 -0
- package/dist/gateway/static/root/assets/utils-B5M5-YvK.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-C73IVZeC.js → voice-api-key-field-CeEevm7z.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-player-store-C_ArLJPM.js → voice-player-store-B7ykUlHM.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-C4PzUQjB.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-BL84_-Ky.js +18 -0
- package/dist/gateway/static/root/index.html +6 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +4 -5
- package/dist/src/agent/agent-manager.js +4 -8
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/embedded/run-for-session.js +102 -14
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.d.ts +0 -8
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/index.js +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
- package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
- package/dist/src/agent/lifecycle/progress.d.ts +0 -1
- package/dist/src/agent/lifecycle/progress.js +1 -6
- package/dist/src/agent/lifecycle/progress.js.map +1 -1
- package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
- package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
- package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
- package/dist/src/agent/middleware/self-verify.d.ts +0 -1
- package/dist/src/agent/middleware/self-verify.js +0 -2
- package/dist/src/agent/middleware/self-verify.js.map +1 -1
- package/dist/src/agent/models/index.d.ts +1 -1
- package/dist/src/agent/models/manager.d.ts +4 -20
- package/dist/src/agent/models/manager.js +9 -126
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +2 -2
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +0 -12
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/subagent-context.js +1 -1
- package/dist/src/agent/prompt/subagent-context.js.map +1 -1
- package/dist/src/agent/prompt/types.d.ts +1 -1
- package/dist/src/agent/service.d.ts +1 -9
- package/dist/src/agent/service.js +3 -40
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +2 -2
- package/dist/src/agent/session/session-config-service.d.ts +11 -11
- package/dist/src/agent/session/session-config-service.js +14 -14
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +3 -2
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/starter-agents.js +12 -12
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/automation-tool.d.ts +14 -0
- package/dist/src/agent/tools/automation-tool.js +102 -0
- package/dist/src/agent/tools/automation-tool.js.map +1 -0
- package/dist/src/agent/tools/delegate-tool.js +1 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +3 -3
- package/dist/src/agent/tools/factory.js +2 -2
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent-manifest/resolver.d.ts +1 -0
- package/dist/src/agent-manifest/resolver.js +1 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +6 -0
- package/dist/src/agent-manifest/schema.js +12 -3
- package/dist/src/agent-manifest/schema.js.map +1 -1
- package/dist/src/ai-assist/text-assist.d.ts +1 -1
- package/dist/src/ai-assist/text-assist.js +56 -0
- package/dist/src/ai-assist/text-assist.js.map +1 -1
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/automations/api/routes.d.ts +3 -0
- package/dist/src/automations/api/routes.js +193 -0
- package/dist/src/automations/api/routes.js.map +1 -0
- package/dist/src/automations/domain/index.d.ts +3 -0
- package/dist/src/automations/domain/index.js +3 -0
- package/dist/src/automations/domain/schedule.d.ts +4 -0
- package/dist/src/automations/domain/schedule.js +37 -0
- package/dist/src/automations/domain/schedule.js.map +1 -0
- package/dist/src/automations/domain/types.d.ts +160 -0
- package/dist/src/automations/domain/validation.d.ts +370 -0
- package/dist/src/automations/domain/validation.js +149 -0
- package/dist/src/automations/domain/validation.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
- package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
- package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
- package/dist/src/automations/draft/automation-draft-service.js +135 -0
- package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
- package/dist/src/automations/draft/automation-draft-validator.js +105 -0
- package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
- package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
- package/dist/src/automations/draft/index.d.ts +3 -0
- package/dist/src/automations/draft/index.js +3 -0
- package/dist/src/automations/index.d.ts +3 -0
- package/dist/src/automations/index.js +8 -0
- package/dist/src/automations/product-events.d.ts +5 -0
- package/dist/src/automations/product-events.js +21 -0
- package/dist/src/automations/product-events.js.map +1 -0
- package/dist/src/automations/service/action-executor.d.ts +9 -0
- package/dist/src/automations/service/action-executor.js +157 -0
- package/dist/src/automations/service/action-executor.js.map +1 -0
- package/dist/src/automations/service/automation-service.d.ts +54 -0
- package/dist/src/automations/service/automation-service.js +404 -0
- package/dist/src/automations/service/automation-service.js.map +1 -0
- package/dist/src/automations/service/index.d.ts +2 -0
- package/dist/src/automations/service/index.js +3 -0
- package/dist/src/automations/storage/automation-repository.d.ts +6 -0
- package/dist/src/automations/storage/automation-repository.js +61 -0
- package/dist/src/automations/storage/automation-repository.js.map +1 -0
- package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
- package/dist/src/automations/storage/automation-run-repository.js +130 -0
- package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
- package/dist/src/automations/storage/index.d.ts +2 -0
- package/dist/src/automations/storage/index.js +3 -0
- package/dist/src/channels/plugin-types.d.ts +3 -0
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/cli/command-catalog.js +0 -39
- package/dist/src/cli/command-catalog.js.map +1 -1
- package/dist/src/cli/command-loaders.js +0 -1
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +0 -4
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agents.js +7 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
- package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
- package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
- package/dist/src/cli/commands/doctor/flow.js +2 -2
- package/dist/src/cli/commands/doctor/flow.js.map +1 -1
- package/dist/src/cli/commands/gateway/call.js +2 -2
- package/dist/src/cli/commands/gateway/call.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/init.js +26 -8
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/tui.js +24 -2
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -0
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +9 -0
- package/dist/src/commands/agents.config.js +40 -2
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.js +4 -3
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/config-surface.d.ts +3 -0
- package/dist/src/config/index.d.ts +0 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/paths.d.ts +0 -9
- package/dist/src/config/paths.js +1 -14
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +0 -1
- package/dist/src/config/profile.js.map +1 -1
- package/dist/src/config/rules.js +0 -5
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +13 -12
- package/dist/src/config/schema.js +22 -26
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +0 -12
- package/dist/src/config/web-patch.js +2 -29
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/extensions/api.d.ts +2 -0
- package/dist/src/extensions/api.js +10 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
- package/dist/src/extensions/extension-registry-impl.js +8 -0
- package/dist/src/extensions/extension-registry-impl.js.map +1 -1
- package/dist/src/extensions/loader.d.ts +3 -3
- package/dist/src/extensions/loader.js +3 -3
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/sdk/testing.d.ts +2 -0
- package/dist/src/extensions/sdk/testing.js +7 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +10 -1
- package/dist/src/extensions/types/index.d.ts +1 -1
- package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +1 -0
- package/dist/src/gateway/agents-admin.js +13 -15
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
- package/dist/src/gateway/capability-presets-admin.js +19 -10
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
- package/dist/src/gateway/heartbeat/service.d.ts +0 -2
- package/dist/src/gateway/heartbeat/service.js +0 -7
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
- package/dist/src/gateway/hono/lib/config-payload.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +27 -37
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.d.ts +2 -2
- package/dist/src/gateway/hono/routes/home.js +34 -25
- package/dist/src/gateway/hono/routes/home.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -6
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
- package/dist/src/gateway/hono/routes/migrations.js +35 -0
- package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +14 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/run-loop.js +2 -0
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/security/operator-scopes.js +5 -1
- package/dist/src/gateway/security/operator-scopes.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
- package/dist/src/gateway/service/config-coordinator.js +14 -8
- package/dist/src/gateway/service/config-coordinator.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +2 -1
- package/dist/src/gateway/service/sessions-api.js +6 -1
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +7 -3
- package/dist/src/gateway/service.js +61 -27
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.js +45 -4
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
- package/dist/src/migrations/config/default-capability-preset.js +135 -0
- package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
- package/dist/src/migrations/index.d.ts +4 -0
- package/dist/src/migrations/index.js +4 -0
- package/dist/src/migrations/registry.d.ts +8 -0
- package/dist/src/migrations/registry.js +18 -0
- package/dist/src/migrations/registry.js.map +1 -0
- package/dist/src/migrations/runner.d.ts +17 -0
- package/dist/src/migrations/runner.js +191 -0
- package/dist/src/migrations/runner.js.map +1 -0
- package/dist/src/migrations/types.d.ts +34 -0
- package/dist/src/notes/service.js +24 -1
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/providers/model-registry.d.ts +0 -1
- package/dist/src/providers/model-registry.js +0 -3
- package/dist/src/providers/model-registry.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
- package/dist/src/routing/resolve-tui-session-key.js +14 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/transcript-outline.d.ts +47 -0
- package/dist/src/session/transcript-outline.js +481 -0
- package/dist/src/session/transcript-outline.js.map +1 -0
- package/dist/src/storage/sqlite/index.d.ts +0 -2
- package/dist/src/storage/sqlite/index.js +1 -3
- package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
- package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
- package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +56 -46
- package/dist/src/tui/backends/embedded-backend.d.ts +6 -0
- package/dist/src/tui/backends/embedded-backend.js +18 -7
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +14 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +4 -0
- package/dist/src/tui/tui-commands.d.ts +5 -0
- package/dist/src/tui/tui-commands.js +43 -0
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
- package/dist/src/tui/tui-transcript-tree.js +17 -257
- package/dist/src/tui/tui-transcript-tree.js.map +1 -1
- package/dist/src/tui/tui-types.d.ts +2 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +7 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/workflows/domain/index.js +1 -1
- package/dist/src/workflows/domain/run.d.ts +7 -7
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/index.js +2 -2
- package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
- package/dist/src/workflows/service/workflow-run-service.js +31 -9
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
- package/package.json +4 -2
- package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-bxYJVJpx.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-BCIykXlI.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +0 -1
- package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +0 -2
- package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
- package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +0 -1
- package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +0 -1
- package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
- package/dist/gateway/static/root/assets/format-interval-label-BzxafKxR.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +0 -1
- package/dist/gateway/static/root/assets/goals-settings-CYVY4NGp.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-DriO_CN9.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +0 -1
- package/dist/gateway/static/root/assets/index-C17Tsd_b.css +0 -1
- package/dist/gateway/static/root/assets/index-Cc41r16l.js +0 -191
- package/dist/gateway/static/root/assets/interval-presets-DFPCKW_W.js +0 -1
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CcVcqstx.js +0 -1
- package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +0 -1
- package/dist/gateway/static/root/assets/schedule-field-CUCKODde.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-DI-LN_8G.js +0 -1
- package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +0 -1
- package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +0 -18
- package/dist/src/agent/fallback/error.d.ts +0 -22
- package/dist/src/agent/fallback/error.js +0 -32
- package/dist/src/agent/fallback/error.js.map +0 -1
- package/dist/src/agent/fallback/index.d.ts +0 -5
- package/dist/src/agent/fallback/index.js +0 -9
- package/dist/src/agent/fallback/index.js.map +0 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
- package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
- package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
- package/dist/src/agent/tools/cronjob-tool.js +0 -274
- package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
- package/dist/src/cli/commands/cron-cli.d.ts +0 -2
- package/dist/src/cli/commands/cron-cli.js +0 -15
- package/dist/src/cli/commands/cron-cli.js.map +0 -1
- package/dist/src/cli/commands/cron.d.ts +0 -4
- package/dist/src/cli/commands/cron.js +0 -188
- package/dist/src/cli/commands/cron.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
- package/dist/src/cron/execution-types.d.ts +0 -42
- package/dist/src/cron/executor.d.ts +0 -67
- package/dist/src/cron/executor.js +0 -669
- package/dist/src/cron/executor.js.map +0 -1
- package/dist/src/cron/index.d.ts +0 -7
- package/dist/src/cron/index.js +0 -7
- package/dist/src/cron/job-content.d.ts +0 -5
- package/dist/src/cron/job-content.js +0 -15
- package/dist/src/cron/job-content.js.map +0 -1
- package/dist/src/cron/run-log-store.d.ts +0 -12
- package/dist/src/cron/run-log-store.js +0 -58
- package/dist/src/cron/run-log-store.js.map +0 -1
- package/dist/src/cron/schedule.d.ts +0 -10
- package/dist/src/cron/schedule.js +0 -85
- package/dist/src/cron/schedule.js.map +0 -1
- package/dist/src/cron/service.d.ts +0 -58
- package/dist/src/cron/service.js +0 -419
- package/dist/src/cron/service.js.map +0 -1
- package/dist/src/cron/types.d.ts +0 -183
- package/dist/src/cron/validation.d.ts +0 -500
- package/dist/src/cron/validation.js +0 -192
- package/dist/src/cron/validation.js.map +0 -1
- package/dist/src/cron/workflow-run-completion.d.ts +0 -23
- package/dist/src/cron/workflow-run-completion.js +0 -72
- package/dist/src/cron/workflow-run-completion.js.map +0 -1
- package/dist/src/extensions/types/phase4.js +0 -1
- package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
- package/dist/src/gateway/hono/routes/cron.js +0 -109
- package/dist/src/gateway/hono/routes/cron.js.map +0 -1
- package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
- package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
- package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
- package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
- package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
- package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
- /package/dist/src/{cron → automations/domain}/types.js +0 -0
- /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
- /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
- /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { isTranscriptBashExecutionEntry, isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptLabelEntry, isTranscriptMetadataEntry, isTranscriptSummaryMessageEntry } from "./session-context-for-llm.js";
|
|
2
|
+
//#region src/session/transcript-outline.ts
|
|
3
|
+
function asRecord(value) {
|
|
4
|
+
return value && typeof value === "object" ? value : null;
|
|
5
|
+
}
|
|
6
|
+
function stringValue(value) {
|
|
7
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
8
|
+
}
|
|
9
|
+
function truncateText(text, max = 96) {
|
|
10
|
+
const normalized = text.replace(/\s+/g, " ").trim();
|
|
11
|
+
if (normalized.length <= max) return normalized;
|
|
12
|
+
return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;
|
|
13
|
+
}
|
|
14
|
+
function contentPreview(content) {
|
|
15
|
+
return truncateText(contentText(content));
|
|
16
|
+
}
|
|
17
|
+
function contentText(content) {
|
|
18
|
+
if (typeof content === "string") return content;
|
|
19
|
+
if (!Array.isArray(content)) return "";
|
|
20
|
+
const parts = [];
|
|
21
|
+
for (const block of content) {
|
|
22
|
+
if (typeof block === "string") {
|
|
23
|
+
parts.push(block);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const obj = asRecord(block);
|
|
27
|
+
if (!obj) continue;
|
|
28
|
+
const type = stringValue(obj.type);
|
|
29
|
+
if (type === "text") parts.push(stringValue(obj.text) ?? "");
|
|
30
|
+
else if (type === "toolCall" || type === "tool_use" || type === "tool_call") parts.push(formatToolCallPreview(toolNameFromBlock(obj), toolArgsFromBlock(obj)));
|
|
31
|
+
else if (type === "image" || type === "image_url") parts.push("[image]");
|
|
32
|
+
else if (type) parts.push(`[${type}]`);
|
|
33
|
+
}
|
|
34
|
+
return parts.filter(Boolean).join(" ");
|
|
35
|
+
}
|
|
36
|
+
function collectFiles(value, out) {
|
|
37
|
+
if (typeof value === "string") {
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
if (trimmed && /(?:^\.{0,2}\/|[\\/]|\.[a-zA-Z0-9]{1,8}$)/.test(trimmed)) out.add(trimmed);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (Array.isArray(value)) {
|
|
43
|
+
for (const item of value) collectFiles(item, out);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const record = asRecord(value);
|
|
47
|
+
if (!record) return;
|
|
48
|
+
for (const key of [
|
|
49
|
+
"path",
|
|
50
|
+
"file",
|
|
51
|
+
"filePath",
|
|
52
|
+
"file_path",
|
|
53
|
+
"targetFile",
|
|
54
|
+
"target_file"
|
|
55
|
+
]) {
|
|
56
|
+
const file = stringValue(record[key]);
|
|
57
|
+
if (file) out.add(file);
|
|
58
|
+
}
|
|
59
|
+
for (const key of ["files", "paths"]) collectFiles(record[key], out);
|
|
60
|
+
}
|
|
61
|
+
function filesFromArgs(args) {
|
|
62
|
+
const files = /* @__PURE__ */ new Set();
|
|
63
|
+
collectFiles(args, files);
|
|
64
|
+
return [...files].slice(0, 8);
|
|
65
|
+
}
|
|
66
|
+
function toolKind(name, files) {
|
|
67
|
+
const normalized = name.toLowerCase().replace(/[-.]/g, "_");
|
|
68
|
+
if (files.length > 0 || normalized.includes("read") || normalized.includes("write") || normalized.includes("edit") || normalized.includes("patch")) return "file";
|
|
69
|
+
if (normalized.includes("bash") || normalized.includes("shell") || normalized.includes("command")) return "command";
|
|
70
|
+
return "tool";
|
|
71
|
+
}
|
|
72
|
+
function formatToolCallPreview(name, args) {
|
|
73
|
+
const path = stringValue(args.path) ?? stringValue(args.file_path) ?? "";
|
|
74
|
+
if (name === "read" || name === "read_file") {
|
|
75
|
+
const offset = typeof args.offset === "number" ? args.offset : void 0;
|
|
76
|
+
const limit = typeof args.limit === "number" ? args.limit : void 0;
|
|
77
|
+
let display = path;
|
|
78
|
+
if (offset !== void 0 || limit !== void 0) {
|
|
79
|
+
const start = offset ?? 1;
|
|
80
|
+
const end = limit !== void 0 ? start + limit - 1 : void 0;
|
|
81
|
+
display += `:${start}${end !== void 0 ? `-${end}` : ""}`;
|
|
82
|
+
}
|
|
83
|
+
return `[read: ${display || "file"}]`;
|
|
84
|
+
}
|
|
85
|
+
if (name === "write" || name === "write_file") return `[write: ${path || "file"}]`;
|
|
86
|
+
if (name === "edit") return `[edit: ${path || "file"}]`;
|
|
87
|
+
if (name === "bash" || name === "shell") return `[bash: ${truncateText((stringValue(args.command) ?? "").replace(/[\n\t]/g, " ").trim(), 53)}]`;
|
|
88
|
+
if (name === "grep") return `[grep: /${stringValue(args.pattern) ?? ""}/ in ${path || "."}]`;
|
|
89
|
+
if (name === "find") return `[find: ${stringValue(args.pattern) ?? ""} in ${path || "."}]`;
|
|
90
|
+
if (name === "ls") return `[ls: ${path || "."}]`;
|
|
91
|
+
const argsText = JSON.stringify(args);
|
|
92
|
+
return `[${name}: ${argsText.length > 40 ? `${argsText.slice(0, 40)}...` : argsText}]`;
|
|
93
|
+
}
|
|
94
|
+
function parseJsonRecord(value) {
|
|
95
|
+
if (typeof value !== "string" || !value.trim()) return null;
|
|
96
|
+
try {
|
|
97
|
+
return asRecord(JSON.parse(value));
|
|
98
|
+
} catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function toolNameFromBlock(obj) {
|
|
103
|
+
const fn = asRecord(obj.function);
|
|
104
|
+
return stringValue(obj.name) ?? stringValue(obj.toolName) ?? stringValue(fn?.name) ?? "tool";
|
|
105
|
+
}
|
|
106
|
+
function toolArgsFromBlock(obj) {
|
|
107
|
+
const fn = asRecord(obj.function);
|
|
108
|
+
return asRecord(obj.arguments) ?? asRecord(obj.args) ?? asRecord(obj.input) ?? asRecord(fn?.arguments) ?? parseJsonRecord(obj.arguments) ?? parseJsonRecord(obj.args) ?? parseJsonRecord(obj.input) ?? parseJsonRecord(fn?.arguments) ?? {};
|
|
109
|
+
}
|
|
110
|
+
function collectToolCallDisplays(content) {
|
|
111
|
+
if (!Array.isArray(content)) return [];
|
|
112
|
+
const calls = [];
|
|
113
|
+
for (const block of content) {
|
|
114
|
+
const obj = asRecord(block);
|
|
115
|
+
const type = obj ? stringValue(obj.type) : void 0;
|
|
116
|
+
if (!obj || type !== "toolCall" && type !== "tool_use" && type !== "tool_call") continue;
|
|
117
|
+
const id = stringValue(obj.id) ?? stringValue(obj.toolCallId) ?? stringValue(obj.tool_call_id) ?? stringValue(obj.tool_call_id$);
|
|
118
|
+
if (!id) continue;
|
|
119
|
+
const name = toolNameFromBlock(obj);
|
|
120
|
+
const args = toolArgsFromBlock(obj);
|
|
121
|
+
const files = filesFromArgs(args);
|
|
122
|
+
calls.push({
|
|
123
|
+
id,
|
|
124
|
+
name,
|
|
125
|
+
files,
|
|
126
|
+
kind: toolKind(name, files),
|
|
127
|
+
preview: formatToolCallPreview(name, args),
|
|
128
|
+
status: stringValue(obj.status) === "running" ? "running" : void 0
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return calls;
|
|
132
|
+
}
|
|
133
|
+
function rowToolCallId(row) {
|
|
134
|
+
const record = asRecord(row);
|
|
135
|
+
return stringValue(record?.toolCallId) ?? stringValue(record?.tool_call_id) ?? stringValue(record?.tool_call_id$);
|
|
136
|
+
}
|
|
137
|
+
function rowCreatedAt(row) {
|
|
138
|
+
const record = asRecord(row);
|
|
139
|
+
return stringValue(record?.createdAt) ?? stringValue(record?.timestamp);
|
|
140
|
+
}
|
|
141
|
+
function parseTimestamp(value) {
|
|
142
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
143
|
+
if (typeof value !== "string" || !value.trim()) return void 0;
|
|
144
|
+
const parsed = Date.parse(value);
|
|
145
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
146
|
+
}
|
|
147
|
+
function messageLabel(row) {
|
|
148
|
+
const role = stringValue(row.role) ?? "message";
|
|
149
|
+
if (role === "tool" || role === "toolResult") return `tool:${stringValue(row.toolName) ?? "result"}`;
|
|
150
|
+
return role;
|
|
151
|
+
}
|
|
152
|
+
function rowPreview(row) {
|
|
153
|
+
if (isTranscriptContextEntry(row)) return truncateText(row.text ?? JSON.stringify(row.data ?? {}));
|
|
154
|
+
if (isTranscriptLabelEntry(row)) return truncateText(row.label ? `label: ${row.label}` : "label cleared");
|
|
155
|
+
if (isTranscriptMetadataEntry(row)) {
|
|
156
|
+
if (row.type === "model_change") return truncateText([row.provider, row.modelId].filter(Boolean).join("/") || "model changed");
|
|
157
|
+
if (row.type === "thinking_level_change") return truncateText(row.thinkingLevel ? `thinking: ${row.thinkingLevel}` : "thinking changed");
|
|
158
|
+
return truncateText(row.name ? `title: ${row.name}` : "title cleared");
|
|
159
|
+
}
|
|
160
|
+
if (isTranscriptBashExecutionEntry(row)) return truncateText(row.command ?? "bash");
|
|
161
|
+
if (isTranscriptCustomMessageEntry(row)) {
|
|
162
|
+
const record = asRecord(row);
|
|
163
|
+
const customType = stringValue(record?.customType) ?? "custom";
|
|
164
|
+
const preview = contentPreview(record?.content);
|
|
165
|
+
return truncateText(preview ? `${customType}: ${preview}` : customType);
|
|
166
|
+
}
|
|
167
|
+
if (isTranscriptSummaryMessageEntry(row)) {
|
|
168
|
+
if (row.role === "branchSummary") return truncateText(row.summary ?? "branch summary");
|
|
169
|
+
return truncateText(row.summary ?? "compaction checkpoint");
|
|
170
|
+
}
|
|
171
|
+
const record = asRecord(row);
|
|
172
|
+
if (record?.type === "compaction") return truncateText(stringValue(record.summary) ?? "compaction checkpoint");
|
|
173
|
+
const preview = contentPreview(record?.content);
|
|
174
|
+
if (record?.role === "assistant" && !preview) {
|
|
175
|
+
if (record.stopReason === "aborted") return "(aborted)";
|
|
176
|
+
const errorMessage = stringValue(record.errorMessage);
|
|
177
|
+
if (errorMessage) return truncateText(errorMessage, 80);
|
|
178
|
+
}
|
|
179
|
+
return preview;
|
|
180
|
+
}
|
|
181
|
+
function rowContentText(row) {
|
|
182
|
+
if (isTranscriptContextEntry(row)) return row.text;
|
|
183
|
+
if (isTranscriptLabelEntry(row)) return row.label;
|
|
184
|
+
if (isTranscriptMetadataEntry(row)) {
|
|
185
|
+
if (row.type === "model_change") return [row.provider, row.modelId].filter(Boolean).join("/") || void 0;
|
|
186
|
+
if (row.type === "thinking_level_change") return row.thinkingLevel;
|
|
187
|
+
return row.name;
|
|
188
|
+
}
|
|
189
|
+
if (isTranscriptBashExecutionEntry(row)) return row.command;
|
|
190
|
+
if (isTranscriptCustomMessageEntry(row)) {
|
|
191
|
+
const record = asRecord(row);
|
|
192
|
+
return contentText(record?.content).trim() || stringValue(record?.customType);
|
|
193
|
+
}
|
|
194
|
+
if (isTranscriptSummaryMessageEntry(row)) return row.summary;
|
|
195
|
+
const record = asRecord(row);
|
|
196
|
+
if (record?.type === "compaction") return stringValue(record.summary);
|
|
197
|
+
const text = contentText(record?.content).trim();
|
|
198
|
+
return text ? text : void 0;
|
|
199
|
+
}
|
|
200
|
+
function roleForTimeline(role) {
|
|
201
|
+
if (role === "user" || role === "assistant" || role === "system") return role;
|
|
202
|
+
}
|
|
203
|
+
function inferStatus(row, toolCall) {
|
|
204
|
+
const record = asRecord(row);
|
|
205
|
+
const rawStatus = stringValue(record?.status);
|
|
206
|
+
if (rawStatus === "running" || rawStatus === "done" || rawStatus === "error") return rawStatus;
|
|
207
|
+
if (toolCall?.status) return toolCall.status;
|
|
208
|
+
if (record?.isError === true || stringValue(record?.errorMessage)) return "error";
|
|
209
|
+
if (isTranscriptBashExecutionEntry(row) && typeof row.exitCode === "number") return row.exitCode === 0 ? "done" : "error";
|
|
210
|
+
if (record?.role === "tool" || record?.role === "toolResult") return "done";
|
|
211
|
+
}
|
|
212
|
+
function titleForEntry(params) {
|
|
213
|
+
if (params.kind === "turn") {
|
|
214
|
+
if (params.role === "user") return `Turn ${params.turn}`;
|
|
215
|
+
return params.role ?? "message";
|
|
216
|
+
}
|
|
217
|
+
if (params.kind === "file" || params.kind === "command" || params.kind === "tool") return params.toolName ?? (params.label.replace(/^tool:/, "") || params.kind);
|
|
218
|
+
if (params.kind === "branch") return "branch summary";
|
|
219
|
+
return params.label;
|
|
220
|
+
}
|
|
221
|
+
function isDisplayMessageRow(row) {
|
|
222
|
+
if (isTranscriptContextEntry(row)) return false;
|
|
223
|
+
if (isTranscriptLabelEntry(row)) return false;
|
|
224
|
+
if (isTranscriptMetadataEntry(row)) return false;
|
|
225
|
+
const record = asRecord(row);
|
|
226
|
+
if (record?.type === "compaction") return false;
|
|
227
|
+
if (isTranscriptSummaryMessageEntry(row)) return false;
|
|
228
|
+
if (record?.role === "tool" || record?.role === "toolResult" || record?.role === "system") return false;
|
|
229
|
+
if (isTranscriptBashExecutionEntry(row) || isTranscriptCustomMessageEntry(row)) return true;
|
|
230
|
+
return Boolean(stringValue(record?.role));
|
|
231
|
+
}
|
|
232
|
+
function displayIndexForRow(params) {
|
|
233
|
+
const { row, role, nextDisplayIndex, lastDisplayRole } = params;
|
|
234
|
+
if (!isDisplayMessageRow(row)) return {
|
|
235
|
+
nextDisplayIndex,
|
|
236
|
+
lastDisplayRole
|
|
237
|
+
};
|
|
238
|
+
if (role === "assistant") {
|
|
239
|
+
if (lastDisplayRole === "assistant") return {
|
|
240
|
+
rowDisplayIndex: Math.max(0, nextDisplayIndex - 1),
|
|
241
|
+
nextDisplayIndex,
|
|
242
|
+
lastDisplayRole
|
|
243
|
+
};
|
|
244
|
+
return {
|
|
245
|
+
rowDisplayIndex: nextDisplayIndex,
|
|
246
|
+
nextDisplayIndex: nextDisplayIndex + 1,
|
|
247
|
+
lastDisplayRole: "assistant"
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
rowDisplayIndex: nextDisplayIndex,
|
|
252
|
+
nextDisplayIndex: nextDisplayIndex + 1,
|
|
253
|
+
lastDisplayRole: "other"
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function classifyRow(params) {
|
|
257
|
+
const { row, label, role, toolCall } = params;
|
|
258
|
+
const record = asRecord(row);
|
|
259
|
+
if (isTranscriptContextEntry(row) || isTranscriptLabelEntry(row) || isTranscriptMetadataEntry(row)) return {
|
|
260
|
+
kind: "context",
|
|
261
|
+
files: []
|
|
262
|
+
};
|
|
263
|
+
if (isTranscriptBashExecutionEntry(row)) return {
|
|
264
|
+
kind: "command",
|
|
265
|
+
files: []
|
|
266
|
+
};
|
|
267
|
+
if (isTranscriptSummaryMessageEntry(row)) return {
|
|
268
|
+
kind: row.role === "branchSummary" ? "branch" : "compaction",
|
|
269
|
+
files: []
|
|
270
|
+
};
|
|
271
|
+
if (record?.type === "compaction") return {
|
|
272
|
+
kind: "compaction",
|
|
273
|
+
files: []
|
|
274
|
+
};
|
|
275
|
+
if (role === "tool" || role === "toolResult" || label.startsWith("tool:")) {
|
|
276
|
+
const toolName = toolCall?.name ?? (label.replace(/^tool:/, "") || stringValue(record?.toolName));
|
|
277
|
+
const files = toolCall?.files ?? filesFromArgs(record ?? {});
|
|
278
|
+
return {
|
|
279
|
+
kind: toolKind(toolName ?? "tool", files),
|
|
280
|
+
files,
|
|
281
|
+
toolName
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
kind: "turn",
|
|
286
|
+
files: []
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function buildTranscriptOutline(rows) {
|
|
290
|
+
const entries = [];
|
|
291
|
+
const byOriginalId = /* @__PURE__ */ new Map();
|
|
292
|
+
const toolCallsById = /* @__PURE__ */ new Map();
|
|
293
|
+
const labelChanges = [];
|
|
294
|
+
let currentTurnId;
|
|
295
|
+
let turn = 0;
|
|
296
|
+
let nextDisplayIndex = 0;
|
|
297
|
+
let lastDisplayRole;
|
|
298
|
+
let lastAssistantDisplayIndex;
|
|
299
|
+
rows.forEach((row, index) => {
|
|
300
|
+
const rowNumber = index + 1;
|
|
301
|
+
const id = `row-${rowNumber}`;
|
|
302
|
+
const record = asRecord(row);
|
|
303
|
+
let parentId;
|
|
304
|
+
let depth = 0;
|
|
305
|
+
let label = "entry";
|
|
306
|
+
let role;
|
|
307
|
+
let toolCallPreview;
|
|
308
|
+
let toolCall;
|
|
309
|
+
if (isTranscriptContextEntry(row)) {
|
|
310
|
+
label = "context";
|
|
311
|
+
parentId = currentTurnId;
|
|
312
|
+
depth = currentTurnId ? 1 : 0;
|
|
313
|
+
} else if (asRecord(row)?.type === "compaction") {
|
|
314
|
+
label = "compaction";
|
|
315
|
+
parentId = currentTurnId;
|
|
316
|
+
depth = currentTurnId ? 1 : 0;
|
|
317
|
+
} else if (isTranscriptLabelEntry(row)) {
|
|
318
|
+
label = row.label ? `label:${row.label}` : "label:cleared";
|
|
319
|
+
parentId = currentTurnId;
|
|
320
|
+
depth = currentTurnId ? 1 : 0;
|
|
321
|
+
if (row.targetId) labelChanges.push({
|
|
322
|
+
targetId: row.targetId,
|
|
323
|
+
label: row.label,
|
|
324
|
+
timestamp: typeof row.timestamp === "string" ? row.timestamp : void 0
|
|
325
|
+
});
|
|
326
|
+
} else if (isTranscriptMetadataEntry(row)) {
|
|
327
|
+
label = row.type;
|
|
328
|
+
parentId = currentTurnId;
|
|
329
|
+
depth = currentTurnId ? 1 : 0;
|
|
330
|
+
} else if (isTranscriptBashExecutionEntry(row)) {
|
|
331
|
+
label = "bashExecution";
|
|
332
|
+
parentId = currentTurnId;
|
|
333
|
+
depth = currentTurnId ? 1 : 0;
|
|
334
|
+
} else if (isTranscriptCustomMessageEntry(row)) {
|
|
335
|
+
label = `custom:${stringValue(record?.customType) ?? "message"}`;
|
|
336
|
+
parentId = currentTurnId;
|
|
337
|
+
depth = currentTurnId ? 1 : 0;
|
|
338
|
+
} else if (isTranscriptSummaryMessageEntry(row)) {
|
|
339
|
+
label = row.role === "branchSummary" ? "branch_summary" : "compaction";
|
|
340
|
+
parentId = currentTurnId;
|
|
341
|
+
depth = currentTurnId ? 1 : 0;
|
|
342
|
+
} else {
|
|
343
|
+
const message = row;
|
|
344
|
+
role = stringValue(message.role);
|
|
345
|
+
label = messageLabel(message);
|
|
346
|
+
if (role === "tool" || role === "toolResult") {
|
|
347
|
+
const toolCallId = rowToolCallId(row);
|
|
348
|
+
toolCall = toolCallId ? toolCallsById.get(toolCallId) : void 0;
|
|
349
|
+
if (toolCall) {
|
|
350
|
+
label = `tool:${toolCall.name}`;
|
|
351
|
+
toolCallPreview = toolCall.preview;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
if (role === "user" || !currentTurnId) {
|
|
355
|
+
turn += 1;
|
|
356
|
+
currentTurnId = id;
|
|
357
|
+
depth = 0;
|
|
358
|
+
} else {
|
|
359
|
+
parentId = currentTurnId;
|
|
360
|
+
depth = 1;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
const display = displayIndexForRow({
|
|
364
|
+
row,
|
|
365
|
+
role,
|
|
366
|
+
nextDisplayIndex,
|
|
367
|
+
lastDisplayRole
|
|
368
|
+
});
|
|
369
|
+
const rowDisplayIndex = display.rowDisplayIndex;
|
|
370
|
+
nextDisplayIndex = display.nextDisplayIndex;
|
|
371
|
+
lastDisplayRole = display.lastDisplayRole;
|
|
372
|
+
if (role === "assistant" && rowDisplayIndex !== void 0) lastAssistantDisplayIndex = rowDisplayIndex;
|
|
373
|
+
const { kind, files, toolName } = classifyRow({
|
|
374
|
+
row,
|
|
375
|
+
label,
|
|
376
|
+
role,
|
|
377
|
+
toolCall
|
|
378
|
+
});
|
|
379
|
+
const preview = rowPreview(row);
|
|
380
|
+
const createdAt = rowCreatedAt(row);
|
|
381
|
+
const content = rowContentText(row);
|
|
382
|
+
const status = inferStatus(row, toolCall);
|
|
383
|
+
const timestamp = parseTimestamp(createdAt ?? record?.timestamp);
|
|
384
|
+
const entryDisplayIndex = rowDisplayIndex ?? (kind === "tool" || kind === "file" || kind === "command" ? lastAssistantDisplayIndex : void 0);
|
|
385
|
+
const meta = toolName || files.length > 0 ? {
|
|
386
|
+
...toolName ? { toolName } : {},
|
|
387
|
+
...files.length > 0 ? { files } : {}
|
|
388
|
+
} : void 0;
|
|
389
|
+
const entry = {
|
|
390
|
+
id,
|
|
391
|
+
depth,
|
|
392
|
+
label,
|
|
393
|
+
turn,
|
|
394
|
+
preview,
|
|
395
|
+
kind,
|
|
396
|
+
title: titleForEntry({
|
|
397
|
+
kind,
|
|
398
|
+
label,
|
|
399
|
+
role,
|
|
400
|
+
turn,
|
|
401
|
+
preview,
|
|
402
|
+
toolName
|
|
403
|
+
}),
|
|
404
|
+
rowNumber,
|
|
405
|
+
...timestamp !== void 0 ? { timestamp } : {},
|
|
406
|
+
...entryDisplayIndex !== void 0 ? { displayIndex: entryDisplayIndex } : {},
|
|
407
|
+
...content ? { contentText: content } : {},
|
|
408
|
+
...createdAt ? { createdAt } : {},
|
|
409
|
+
...meta ? { meta } : {},
|
|
410
|
+
...status ? { status } : {}
|
|
411
|
+
};
|
|
412
|
+
if (parentId) entry.parentId = parentId;
|
|
413
|
+
if (role) entry.role = role;
|
|
414
|
+
if (toolCallPreview) entry.toolCallPreview = toolCallPreview;
|
|
415
|
+
entries.push(entry);
|
|
416
|
+
byOriginalId.set(id, entry);
|
|
417
|
+
const originalId = stringValue(record?.id);
|
|
418
|
+
if (originalId) byOriginalId.set(originalId, entry);
|
|
419
|
+
for (const nextToolCall of collectToolCallDisplays(record?.content)) toolCallsById.set(nextToolCall.id, {
|
|
420
|
+
name: nextToolCall.name,
|
|
421
|
+
preview: nextToolCall.preview,
|
|
422
|
+
files: nextToolCall.files,
|
|
423
|
+
kind: nextToolCall.kind,
|
|
424
|
+
status: nextToolCall.status
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
for (const change of labelChanges) {
|
|
428
|
+
const target = byOriginalId.get(change.targetId);
|
|
429
|
+
if (!target) continue;
|
|
430
|
+
if (change.label?.trim()) {
|
|
431
|
+
target.userLabel = change.label.trim();
|
|
432
|
+
target.labelTimestamp = change.timestamp;
|
|
433
|
+
} else {
|
|
434
|
+
delete target.userLabel;
|
|
435
|
+
delete target.labelTimestamp;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
markCurrentTranscriptPath(entries);
|
|
439
|
+
return entries;
|
|
440
|
+
}
|
|
441
|
+
function markCurrentTranscriptPath(entries) {
|
|
442
|
+
const currentLeaf = [...entries].reverse().find(isCurrentLeafCandidate) ?? entries.at(-1);
|
|
443
|
+
if (!currentLeaf) return;
|
|
444
|
+
const byId = new Map(entries.map((entry) => [entry.id, entry]));
|
|
445
|
+
currentLeaf.isCurrentLeaf = true;
|
|
446
|
+
let currentId = currentLeaf.id;
|
|
447
|
+
while (currentId) {
|
|
448
|
+
const entry = byId.get(currentId);
|
|
449
|
+
if (!entry) break;
|
|
450
|
+
entry.isOnActivePath = true;
|
|
451
|
+
currentId = entry.parentId;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
function isCurrentLeafCandidate(entry) {
|
|
455
|
+
if (entry.label === "context") return false;
|
|
456
|
+
if (entry.label === "model_change") return false;
|
|
457
|
+
if (entry.label === "thinking_level_change") return false;
|
|
458
|
+
if (entry.label === "session_info") return false;
|
|
459
|
+
if (entry.label.startsWith("label:")) return false;
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
function buildSessionTimeline(rows) {
|
|
463
|
+
return buildTranscriptOutline(rows).map((entry) => ({
|
|
464
|
+
id: entry.id,
|
|
465
|
+
kind: entry.kind,
|
|
466
|
+
...roleForTimeline(entry.role) ? { role: roleForTimeline(entry.role) } : {},
|
|
467
|
+
title: entry.title,
|
|
468
|
+
...entry.preview ? { preview: entry.preview } : {},
|
|
469
|
+
...entry.timestamp !== void 0 ? { timestamp: entry.timestamp } : {},
|
|
470
|
+
depth: entry.depth,
|
|
471
|
+
turn: entry.turn,
|
|
472
|
+
...entry.displayIndex !== void 0 ? { displayIndex: entry.displayIndex } : {},
|
|
473
|
+
rowNumber: entry.rowNumber,
|
|
474
|
+
...entry.status ? { status: entry.status } : {},
|
|
475
|
+
...entry.meta ? { meta: entry.meta } : {}
|
|
476
|
+
}));
|
|
477
|
+
}
|
|
478
|
+
//#endregion
|
|
479
|
+
export { buildSessionTimeline, buildTranscriptOutline };
|
|
480
|
+
|
|
481
|
+
//# sourceMappingURL=transcript-outline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-outline.js","names":[],"sources":["../../../src/session/transcript-outline.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport {\n isTranscriptBashExecutionEntry,\n isTranscriptContextEntry,\n isTranscriptCustomMessageEntry,\n isTranscriptLabelEntry,\n isTranscriptMetadataEntry,\n isTranscriptSummaryMessageEntry,\n type TranscriptStoredRow,\n} from './session-context-for-llm.js';\n\nexport type SessionTimelineItemKind =\n | 'turn'\n | 'tool'\n | 'file'\n | 'command'\n | 'context'\n | 'branch'\n | 'compaction';\n\nexport type SessionTimelineItem = {\n id: string;\n kind: SessionTimelineItemKind;\n role?: 'user' | 'assistant' | 'system';\n title: string;\n preview?: string;\n timestamp?: number;\n depth: number;\n turn: number;\n displayIndex?: number;\n rowNumber?: number;\n status?: 'running' | 'done' | 'error';\n meta?: { toolName?: string; files?: string[] };\n};\n\nexport interface TranscriptOutlineEntry {\n id: string;\n parentId?: string;\n depth: number;\n label: string;\n role?: string;\n userLabel?: string;\n labelTimestamp?: string;\n turn: number;\n preview?: string;\n contentText?: string;\n toolCallPreview?: string;\n createdAt?: string;\n isOnActivePath?: boolean;\n isCurrentLeaf?: boolean;\n kind: SessionTimelineItemKind;\n title: string;\n timestamp?: number;\n displayIndex?: number;\n rowNumber: number;\n status?: 'running' | 'done' | 'error';\n meta?: { toolName?: string; files?: string[] };\n}\n\ninterface ToolCallDisplay {\n name: string;\n preview: string;\n files: string[];\n kind: SessionTimelineItemKind;\n status?: 'running' | 'done' | 'error';\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction truncateText(text: string, max = 96): string {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= max) return normalized;\n return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;\n}\n\nfunction contentPreview(content: unknown): string {\n return truncateText(contentText(content));\n}\n\nfunction contentText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n const obj = asRecord(block);\n if (!obj) continue;\n const type = stringValue(obj.type);\n if (type === 'text') {\n parts.push(stringValue(obj.text) ?? '');\n } else if (type === 'toolCall' || type === 'tool_use' || type === 'tool_call') {\n parts.push(formatToolCallPreview(\n toolNameFromBlock(obj),\n toolArgsFromBlock(obj),\n ));\n } else if (type === 'image' || type === 'image_url') {\n parts.push('[image]');\n } else if (type) {\n parts.push(`[${type}]`);\n }\n }\n return parts.filter(Boolean).join(' ');\n}\n\nfunction collectFiles(value: unknown, out: Set<string>): void {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed && /(?:^\\.{0,2}\\/|[\\\\/]|\\.[a-zA-Z0-9]{1,8}$)/.test(trimmed)) {\n out.add(trimmed);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectFiles(item, out);\n return;\n }\n const record = asRecord(value);\n if (!record) return;\n for (const key of ['path', 'file', 'filePath', 'file_path', 'targetFile', 'target_file']) {\n const file = stringValue(record[key]);\n if (file) out.add(file);\n }\n for (const key of ['files', 'paths']) {\n collectFiles(record[key], out);\n }\n}\n\nfunction filesFromArgs(args: Record<string, unknown>): string[] {\n const files = new Set<string>();\n collectFiles(args, files);\n return [...files].slice(0, 8);\n}\n\nfunction toolKind(name: string, files: readonly string[]): SessionTimelineItemKind {\n const normalized = name.toLowerCase().replace(/[-.]/g, '_');\n if (\n files.length > 0 ||\n normalized.includes('read') ||\n normalized.includes('write') ||\n normalized.includes('edit') ||\n normalized.includes('patch')\n ) {\n return 'file';\n }\n if (normalized.includes('bash') || normalized.includes('shell') || normalized.includes('command')) {\n return 'command';\n }\n return 'tool';\n}\n\nfunction formatToolCallPreview(name: string, args: Record<string, unknown>): string {\n const path = stringValue(args.path) ?? stringValue(args.file_path) ?? '';\n if (name === 'read' || name === 'read_file') {\n const offset = typeof args.offset === 'number' ? args.offset : undefined;\n const limit = typeof args.limit === 'number' ? args.limit : undefined;\n let display = path;\n if (offset !== undefined || limit !== undefined) {\n const start = offset ?? 1;\n const end = limit !== undefined ? start + limit - 1 : undefined;\n display += `:${start}${end !== undefined ? `-${end}` : ''}`;\n }\n return `[read: ${display || 'file'}]`;\n }\n if (name === 'write' || name === 'write_file') return `[write: ${path || 'file'}]`;\n if (name === 'edit') return `[edit: ${path || 'file'}]`;\n if (name === 'bash' || name === 'shell') {\n const rawCommand = stringValue(args.command) ?? '';\n const command = rawCommand.replace(/[\\n\\t]/g, ' ').trim();\n return `[bash: ${truncateText(command, 53)}]`;\n }\n if (name === 'grep') {\n const pattern = stringValue(args.pattern) ?? '';\n return `[grep: /${pattern}/ in ${path || '.'}]`;\n }\n if (name === 'find') {\n const pattern = stringValue(args.pattern) ?? '';\n return `[find: ${pattern} in ${path || '.'}]`;\n }\n if (name === 'ls') return `[ls: ${path || '.'}]`;\n const argsText = JSON.stringify(args);\n const truncatedArgs = argsText.length > 40 ? `${argsText.slice(0, 40)}...` : argsText;\n return `[${name}: ${truncatedArgs}]`;\n}\n\nfunction parseJsonRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== 'string' || !value.trim()) return null;\n try {\n return asRecord(JSON.parse(value));\n } catch {\n return null;\n }\n}\n\nfunction toolNameFromBlock(obj: Record<string, unknown>): string {\n const fn = asRecord(obj.function);\n return stringValue(obj.name) ?? stringValue(obj.toolName) ?? stringValue(fn?.name) ?? 'tool';\n}\n\nfunction toolArgsFromBlock(obj: Record<string, unknown>): Record<string, unknown> {\n const fn = asRecord(obj.function);\n return (\n asRecord(obj.arguments) ??\n asRecord(obj.args) ??\n asRecord(obj.input) ??\n asRecord(fn?.arguments) ??\n parseJsonRecord(obj.arguments) ??\n parseJsonRecord(obj.args) ??\n parseJsonRecord(obj.input) ??\n parseJsonRecord(fn?.arguments) ??\n {}\n );\n}\n\nfunction collectToolCallDisplays(content: unknown): Array<{ id: string } & ToolCallDisplay> {\n if (!Array.isArray(content)) return [];\n const calls: Array<{ id: string } & ToolCallDisplay> = [];\n for (const block of content) {\n const obj = asRecord(block);\n const type = obj ? stringValue(obj.type) : undefined;\n if (!obj || (type !== 'toolCall' && type !== 'tool_use' && type !== 'tool_call')) continue;\n const id =\n stringValue(obj.id) ??\n stringValue(obj.toolCallId) ??\n stringValue(obj.tool_call_id) ??\n stringValue(obj.tool_call_id$);\n if (!id) continue;\n const name = toolNameFromBlock(obj);\n const args = toolArgsFromBlock(obj);\n const files = filesFromArgs(args);\n calls.push({\n id,\n name,\n files,\n kind: toolKind(name, files),\n preview: formatToolCallPreview(name, args),\n status: stringValue(obj.status) === 'running' ? 'running' : undefined,\n });\n }\n return calls;\n}\n\nfunction rowToolCallId(row: unknown): string | undefined {\n const record = asRecord(row);\n return (\n stringValue(record?.toolCallId) ??\n stringValue(record?.tool_call_id) ??\n stringValue(record?.tool_call_id$)\n );\n}\n\nfunction rowCreatedAt(row: TranscriptStoredRow): string | undefined {\n const record = asRecord(row);\n return stringValue(record?.createdAt) ?? stringValue(record?.timestamp);\n}\n\nfunction parseTimestamp(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value !== 'string' || !value.trim()) return undefined;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction messageLabel(row: AgentMessage): string {\n const role = stringValue((row as { role?: unknown }).role) ?? 'message';\n if (role === 'tool' || role === 'toolResult') {\n return `tool:${stringValue((row as { toolName?: unknown }).toolName) ?? 'result'}`;\n }\n return role;\n}\n\nfunction rowPreview(row: TranscriptStoredRow): string {\n if (isTranscriptContextEntry(row)) {\n return truncateText(row.text ?? JSON.stringify(row.data ?? {}));\n }\n if (isTranscriptLabelEntry(row)) {\n return truncateText(row.label ? `label: ${row.label}` : 'label cleared');\n }\n if (isTranscriptMetadataEntry(row)) {\n if (row.type === 'model_change') {\n return truncateText([row.provider, row.modelId].filter(Boolean).join('/') || 'model changed');\n }\n if (row.type === 'thinking_level_change') {\n return truncateText(row.thinkingLevel ? `thinking: ${row.thinkingLevel}` : 'thinking changed');\n }\n return truncateText(row.name ? `title: ${row.name}` : 'title cleared');\n }\n if (isTranscriptBashExecutionEntry(row)) {\n return truncateText(row.command ?? 'bash');\n }\n if (isTranscriptCustomMessageEntry(row)) {\n const record = asRecord(row);\n const customType = stringValue(record?.customType) ?? 'custom';\n const preview = contentPreview(record?.content);\n return truncateText(preview ? `${customType}: ${preview}` : customType);\n }\n if (isTranscriptSummaryMessageEntry(row)) {\n if (row.role === 'branchSummary') {\n return truncateText(row.summary ?? 'branch summary');\n }\n return truncateText(row.summary ?? 'compaction checkpoint');\n }\n const record = asRecord(row);\n if (record?.type === 'compaction') {\n return truncateText(stringValue(record.summary) ?? 'compaction checkpoint');\n }\n const preview = contentPreview(record?.content);\n if (record?.role === 'assistant' && !preview) {\n if (record.stopReason === 'aborted') {\n return '(aborted)';\n }\n const errorMessage = stringValue(record.errorMessage);\n if (errorMessage) {\n return truncateText(errorMessage, 80);\n }\n }\n return preview;\n}\n\nfunction rowContentText(row: TranscriptStoredRow): string | undefined {\n if (isTranscriptContextEntry(row)) {\n return row.text;\n }\n if (isTranscriptLabelEntry(row)) {\n return row.label;\n }\n if (isTranscriptMetadataEntry(row)) {\n if (row.type === 'model_change') {\n return [row.provider, row.modelId].filter(Boolean).join('/') || undefined;\n }\n if (row.type === 'thinking_level_change') {\n return row.thinkingLevel;\n }\n return row.name;\n }\n if (isTranscriptBashExecutionEntry(row)) {\n return row.command;\n }\n if (isTranscriptCustomMessageEntry(row)) {\n const record = asRecord(row);\n return contentText(record?.content).trim() || stringValue(record?.customType);\n }\n if (isTranscriptSummaryMessageEntry(row)) {\n return row.summary;\n }\n const record = asRecord(row);\n if (record?.type === 'compaction') {\n return stringValue(record.summary);\n }\n const text = contentText(record?.content).trim();\n return text ? text : undefined;\n}\n\nfunction roleForTimeline(role: string | undefined): SessionTimelineItem['role'] | undefined {\n if (role === 'user' || role === 'assistant' || role === 'system') return role;\n return undefined;\n}\n\nfunction inferStatus(row: TranscriptStoredRow, toolCall?: ToolCallDisplay): SessionTimelineItem['status'] | undefined {\n const record = asRecord(row);\n const rawStatus = stringValue(record?.status);\n if (rawStatus === 'running' || rawStatus === 'done' || rawStatus === 'error') return rawStatus;\n if (toolCall?.status) return toolCall.status;\n if (record?.isError === true || stringValue(record?.errorMessage)) return 'error';\n if (isTranscriptBashExecutionEntry(row) && typeof row.exitCode === 'number') {\n return row.exitCode === 0 ? 'done' : 'error';\n }\n if (record?.role === 'tool' || record?.role === 'toolResult') return 'done';\n return undefined;\n}\n\nfunction titleForEntry(params: {\n kind: SessionTimelineItemKind;\n label: string;\n role?: string;\n turn: number;\n preview?: string;\n toolName?: string;\n}): string {\n if (params.kind === 'turn') {\n if (params.role === 'user') return `Turn ${params.turn}`;\n return params.role ?? 'message';\n }\n if (params.kind === 'file' || params.kind === 'command' || params.kind === 'tool') {\n return params.toolName ?? (params.label.replace(/^tool:/, '') || params.kind);\n }\n if (params.kind === 'branch') return 'branch summary';\n return params.label;\n}\n\nfunction isDisplayMessageRow(row: TranscriptStoredRow): boolean {\n if (isTranscriptContextEntry(row)) return false;\n if (isTranscriptLabelEntry(row)) return false;\n if (isTranscriptMetadataEntry(row)) return false;\n const record = asRecord(row);\n if (record?.type === 'compaction') return false;\n if (isTranscriptSummaryMessageEntry(row)) return false;\n if (record?.role === 'tool' || record?.role === 'toolResult' || record?.role === 'system') return false;\n if (isTranscriptBashExecutionEntry(row) || isTranscriptCustomMessageEntry(row)) return true;\n return Boolean(stringValue(record?.role));\n}\n\nfunction displayIndexForRow(params: {\n row: TranscriptStoredRow;\n role?: string;\n nextDisplayIndex: number;\n lastDisplayRole?: 'assistant' | 'other';\n}): { rowDisplayIndex?: number; nextDisplayIndex: number; lastDisplayRole?: 'assistant' | 'other' } {\n const { row, role, nextDisplayIndex, lastDisplayRole } = params;\n if (!isDisplayMessageRow(row)) {\n return { nextDisplayIndex, lastDisplayRole };\n }\n if (role === 'assistant') {\n if (lastDisplayRole === 'assistant') {\n return {\n rowDisplayIndex: Math.max(0, nextDisplayIndex - 1),\n nextDisplayIndex,\n lastDisplayRole,\n };\n }\n return {\n rowDisplayIndex: nextDisplayIndex,\n nextDisplayIndex: nextDisplayIndex + 1,\n lastDisplayRole: 'assistant',\n };\n }\n return {\n rowDisplayIndex: nextDisplayIndex,\n nextDisplayIndex: nextDisplayIndex + 1,\n lastDisplayRole: 'other',\n };\n}\n\nfunction classifyRow(params: {\n row: TranscriptStoredRow;\n label: string;\n role?: string;\n toolCall?: ToolCallDisplay;\n}): { kind: SessionTimelineItemKind; files: string[]; toolName?: string } {\n const { row, label, role, toolCall } = params;\n const record = asRecord(row);\n if (isTranscriptContextEntry(row) || isTranscriptLabelEntry(row) || isTranscriptMetadataEntry(row)) {\n return { kind: 'context', files: [] };\n }\n if (isTranscriptBashExecutionEntry(row)) {\n return { kind: 'command', files: [] };\n }\n if (isTranscriptSummaryMessageEntry(row)) {\n return { kind: row.role === 'branchSummary' ? 'branch' : 'compaction', files: [] };\n }\n if (record?.type === 'compaction') {\n return { kind: 'compaction', files: [] };\n }\n if (role === 'tool' || role === 'toolResult' || label.startsWith('tool:')) {\n const toolName = toolCall?.name ?? (label.replace(/^tool:/, '') || stringValue(record?.toolName));\n const files = toolCall?.files ?? filesFromArgs(record ?? {});\n return { kind: toolKind(toolName ?? 'tool', files), files, toolName };\n }\n return { kind: 'turn', files: [] };\n}\n\nexport function buildTranscriptOutline(rows: TranscriptStoredRow[]): TranscriptOutlineEntry[] {\n const entries: TranscriptOutlineEntry[] = [];\n const byOriginalId = new Map<string, TranscriptOutlineEntry>();\n const toolCallsById = new Map<string, ToolCallDisplay>();\n const labelChanges: Array<{ targetId: string; label?: string; timestamp?: string }> = [];\n let currentTurnId: string | undefined;\n let turn = 0;\n let nextDisplayIndex = 0;\n let lastDisplayRole: 'assistant' | 'other' | undefined;\n let lastAssistantDisplayIndex: number | undefined;\n\n rows.forEach((row, index) => {\n const rowNumber = index + 1;\n const id = `row-${rowNumber}`;\n const record = asRecord(row);\n let parentId: string | undefined;\n let depth = 0;\n let label = 'entry';\n let role: string | undefined;\n let toolCallPreview: string | undefined;\n let toolCall: ToolCallDisplay | undefined;\n\n if (isTranscriptContextEntry(row)) {\n label = 'context';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if ((asRecord(row)?.type) === 'compaction') {\n label = 'compaction';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptLabelEntry(row)) {\n label = row.label ? `label:${row.label}` : 'label:cleared';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n if (row.targetId) {\n labelChanges.push({\n targetId: row.targetId,\n label: row.label,\n timestamp: typeof row.timestamp === 'string' ? row.timestamp : undefined,\n });\n }\n } else if (isTranscriptMetadataEntry(row)) {\n label = row.type;\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptBashExecutionEntry(row)) {\n label = 'bashExecution';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptCustomMessageEntry(row)) {\n label = `custom:${stringValue(record?.customType) ?? 'message'}`;\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else if (isTranscriptSummaryMessageEntry(row)) {\n label = row.role === 'branchSummary' ? 'branch_summary' : 'compaction';\n parentId = currentTurnId;\n depth = currentTurnId ? 1 : 0;\n } else {\n const message = row as AgentMessage;\n role = stringValue((message as { role?: unknown }).role);\n label = messageLabel(message);\n if (role === 'tool' || role === 'toolResult') {\n const toolCallId = rowToolCallId(row);\n toolCall = toolCallId ? toolCallsById.get(toolCallId) : undefined;\n if (toolCall) {\n label = `tool:${toolCall.name}`;\n toolCallPreview = toolCall.preview;\n }\n }\n if (role === 'user' || !currentTurnId) {\n turn += 1;\n currentTurnId = id;\n depth = 0;\n } else {\n parentId = currentTurnId;\n depth = 1;\n }\n }\n\n const display = displayIndexForRow({\n row,\n role,\n nextDisplayIndex,\n lastDisplayRole,\n });\n const rowDisplayIndex = display.rowDisplayIndex;\n nextDisplayIndex = display.nextDisplayIndex;\n lastDisplayRole = display.lastDisplayRole;\n if (role === 'assistant' && rowDisplayIndex !== undefined) {\n lastAssistantDisplayIndex = rowDisplayIndex;\n }\n const { kind, files, toolName } = classifyRow({ row, label, role, toolCall });\n const preview = rowPreview(row);\n const createdAt = rowCreatedAt(row);\n const content = rowContentText(row);\n const status = inferStatus(row, toolCall);\n const timestamp = parseTimestamp(createdAt ?? record?.timestamp);\n const entryDisplayIndex =\n rowDisplayIndex ??\n (kind === 'tool' || kind === 'file' || kind === 'command'\n ? lastAssistantDisplayIndex\n : undefined);\n const meta =\n toolName || files.length > 0\n ? {\n ...(toolName ? { toolName } : {}),\n ...(files.length > 0 ? { files } : {}),\n }\n : undefined;\n\n const entry: TranscriptOutlineEntry = {\n id,\n depth,\n label,\n turn,\n preview,\n kind,\n title: titleForEntry({ kind, label, role, turn, preview, toolName }),\n rowNumber,\n ...(timestamp !== undefined ? { timestamp } : {}),\n ...(entryDisplayIndex !== undefined ? { displayIndex: entryDisplayIndex } : {}),\n ...(content ? { contentText: content } : {}),\n ...(createdAt ? { createdAt } : {}),\n ...(meta ? { meta } : {}),\n ...(status ? { status } : {}),\n };\n if (parentId) entry.parentId = parentId;\n if (role) entry.role = role;\n if (toolCallPreview) entry.toolCallPreview = toolCallPreview;\n entries.push(entry);\n\n byOriginalId.set(id, entry);\n const originalId = stringValue(record?.id);\n if (originalId) {\n byOriginalId.set(originalId, entry);\n }\n\n for (const nextToolCall of collectToolCallDisplays(record?.content)) {\n toolCallsById.set(nextToolCall.id, {\n name: nextToolCall.name,\n preview: nextToolCall.preview,\n files: nextToolCall.files,\n kind: nextToolCall.kind,\n status: nextToolCall.status,\n });\n }\n });\n\n for (const change of labelChanges) {\n const target = byOriginalId.get(change.targetId);\n if (!target) continue;\n if (change.label?.trim()) {\n target.userLabel = change.label.trim();\n target.labelTimestamp = change.timestamp;\n } else {\n delete target.userLabel;\n delete target.labelTimestamp;\n }\n }\n\n markCurrentTranscriptPath(entries);\n\n return entries;\n}\n\nfunction markCurrentTranscriptPath(entries: TranscriptOutlineEntry[]): void {\n const currentLeaf = [...entries].reverse().find(isCurrentLeafCandidate) ?? entries.at(-1);\n if (!currentLeaf) return;\n\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n currentLeaf.isCurrentLeaf = true;\n let currentId: string | undefined = currentLeaf.id;\n while (currentId) {\n const entry = byId.get(currentId);\n if (!entry) break;\n entry.isOnActivePath = true;\n currentId = entry.parentId;\n }\n}\n\nfunction isCurrentLeafCandidate(entry: TranscriptOutlineEntry): boolean {\n if (entry.label === 'context') return false;\n if (entry.label === 'model_change') return false;\n if (entry.label === 'thinking_level_change') return false;\n if (entry.label === 'session_info') return false;\n if (entry.label.startsWith('label:')) return false;\n return true;\n}\n\nexport function buildSessionTimeline(rows: TranscriptStoredRow[]): SessionTimelineItem[] {\n return buildTranscriptOutline(rows).map((entry) => ({\n id: entry.id,\n kind: entry.kind,\n ...(roleForTimeline(entry.role) ? { role: roleForTimeline(entry.role) } : {}),\n title: entry.title,\n ...(entry.preview ? { preview: entry.preview } : {}),\n ...(entry.timestamp !== undefined ? { timestamp: entry.timestamp } : {}),\n depth: entry.depth,\n turn: entry.turn,\n ...(entry.displayIndex !== undefined ? { displayIndex: entry.displayIndex } : {}),\n rowNumber: entry.rowNumber,\n ...(entry.status ? { status: entry.status } : {}),\n ...(entry.meta ? { meta: entry.meta } : {}),\n }));\n}\n"],"mappings":"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"}
|
|
@@ -9,8 +9,6 @@ export { buildDefaultSessionMetadata, type SessionMetadataSeed, } from './sessio
|
|
|
9
9
|
export { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow, type SessionConfigRow, type SessionRow, type TranscriptEntryRow, } from './row-mappers.js';
|
|
10
10
|
export { deleteSessionRecord, ensureSessionRecord, getCurrentSessionId, getGlobalSessionStats, findSessionKeyBySessionId, getSessionPersistedLevels, getSessionMetadata, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats, } from './session-repository.js';
|
|
11
11
|
export { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint, } from './transcript-repository.js';
|
|
12
|
-
export { appendCronRun, deleteCronRunsForJob, readAllCronRuns, readCronJobHistory, } from './cron-run-repository.js';
|
|
13
|
-
export { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs, } from './cron-job-repository.js';
|
|
14
12
|
export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } from './notes-repository.js';
|
|
15
13
|
export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
|
|
16
14
|
export { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
|
|
@@ -10,11 +10,9 @@ import { buildDefaultSessionMetadata } from "./session-metadata.js";
|
|
|
10
10
|
import { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow } from "./row-mappers.js";
|
|
11
11
|
import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getCurrentSessionId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
|
|
12
12
|
import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "./transcript-repository.js";
|
|
13
|
-
import { appendCronRun, deleteCronRunsForJob, readAllCronRuns, readCronJobHistory } from "./cron-run-repository.js";
|
|
14
|
-
import { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs } from "./cron-job-repository.js";
|
|
15
13
|
import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
|
|
16
14
|
import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
|
|
17
15
|
import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
|
|
18
16
|
import { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord } from "./memory-records-repository.js";
|
|
19
17
|
import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
|
|
20
|
-
export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION,
|
|
18
|
+
export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionKeyBySessionId, getCompactionCheckpointDetail, getCurrentSessionId, getGlobalSessionStats, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listCompactionCheckpoints, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, summarizeMemoryRecallFeedback, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS automations (
|
|
2
|
+
automation_id TEXT PRIMARY KEY,
|
|
3
|
+
name TEXT NOT NULL,
|
|
4
|
+
description TEXT,
|
|
5
|
+
enabled INTEGER NOT NULL,
|
|
6
|
+
trigger_json TEXT NOT NULL,
|
|
7
|
+
action_json TEXT NOT NULL,
|
|
8
|
+
after_run_json TEXT,
|
|
9
|
+
reliability_json TEXT,
|
|
10
|
+
state_json TEXT NOT NULL DEFAULT '{}',
|
|
11
|
+
created_at_ms INTEGER NOT NULL,
|
|
12
|
+
updated_at_ms INTEGER NOT NULL
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_automations_enabled
|
|
16
|
+
ON automations(enabled, updated_at_ms DESC);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_automations_updated
|
|
18
|
+
ON automations(updated_at_ms DESC);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS automation_runs (
|
|
21
|
+
run_id TEXT PRIMARY KEY,
|
|
22
|
+
automation_id TEXT NOT NULL,
|
|
23
|
+
automation_name TEXT NOT NULL,
|
|
24
|
+
status TEXT NOT NULL,
|
|
25
|
+
trigger_snapshot_json TEXT NOT NULL,
|
|
26
|
+
action_snapshot_json TEXT NOT NULL,
|
|
27
|
+
manual INTEGER NOT NULL,
|
|
28
|
+
created_at_ms INTEGER NOT NULL,
|
|
29
|
+
started_at_ms INTEGER,
|
|
30
|
+
ended_at_ms INTEGER,
|
|
31
|
+
duration_ms INTEGER,
|
|
32
|
+
summary TEXT,
|
|
33
|
+
error TEXT,
|
|
34
|
+
session_key TEXT,
|
|
35
|
+
workflow_run_id TEXT,
|
|
36
|
+
model TEXT
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_automation_runs_automation_created
|
|
40
|
+
ON automation_runs(automation_id, created_at_ms DESC);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_automation_runs_created
|
|
42
|
+
ON automation_runs(created_at_ms DESC);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_automation_runs_status_created
|
|
44
|
+
ON automation_runs(status, created_at_ms DESC);
|
|
45
|
+
|
|
46
|
+
DROP TABLE IF EXISTS cron_jobs;
|
|
47
|
+
DROP TABLE IF EXISTS cron_runs;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS automation_run_events (
|
|
2
|
+
event_id TEXT PRIMARY KEY,
|
|
3
|
+
run_id TEXT NOT NULL,
|
|
4
|
+
automation_id TEXT NOT NULL,
|
|
5
|
+
type TEXT NOT NULL,
|
|
6
|
+
message TEXT NOT NULL,
|
|
7
|
+
data_json TEXT,
|
|
8
|
+
created_at_ms INTEGER NOT NULL
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
CREATE INDEX IF NOT EXISTS idx_automation_run_events_run_created
|
|
12
|
+
ON automation_run_events(run_id, created_at_ms ASC);
|
|
13
|
+
CREATE INDEX IF NOT EXISTS idx_automation_run_events_automation_created
|
|
14
|
+
ON automation_run_events(automation_id, created_at_ms DESC);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ALTER TABLE automations ADD COLUMN safety_json TEXT;
|