@xopcai/xopc 0.0.102 → 0.0.104
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 +8 -5
- package/README.zh-CN.md +8 -5
- package/dist/_virtual/_rolldown/runtime.js +2 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/feishu/src/index.d.ts +8 -1
- package/dist/extensions/feishu/src/index.js +14 -1
- package/dist/extensions/feishu/src/index.js.map +1 -0
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +2 -1
- package/dist/extensions/feishu/src/plugin.js +2 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +2 -2
- package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +1 -1
- package/dist/extensions/feishu/xopc.extension.json +66 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.js +2 -2
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/doctor.d.ts +1 -0
- package/dist/extensions/telegram/src/doctor.js +68 -0
- package/dist/extensions/telegram/src/doctor.js.map +1 -1
- package/dist/extensions/telegram/src/index.d.ts +8 -1
- package/dist/extensions/telegram/src/index.js +15 -2
- package/dist/extensions/telegram/src/index.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +13 -5
- package/dist/extensions/telegram/src/plugin.js +32 -12
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
- package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
- package/dist/extensions/telegram/src/send-options.js +8 -5
- package/dist/extensions/telegram/src/send-options.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +412 -5
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/index.d.ts +8 -0
- package/dist/extensions/weixin/src/index.js +12 -1
- package/dist/extensions/weixin/src/index.js.map +1 -0
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +2 -1
- package/dist/extensions/weixin/src/plugin.js +77 -2
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/xopc.extension.json +52 -0
- package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
- package/dist/gateway/static/root/assets/{apps-page-Uv4kOmDE.js → apps-page-L-IwQTe0.js} +1 -1
- package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
- package/dist/gateway/static/root/assets/{dist-DH4IuRV0.js → dist-C6vclgEL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-D4JYAbsX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.js → extension-page-_T62gi6e.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-drJUxxKP.js → fetch-B5aiIguv.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
- package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
- package/dist/gateway/static/root/assets/{logs-page-CiG0m81R.js → logs-page-DsjtTjBy.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-B2V7RhgD.js} +43 -43
- package/dist/gateway/static/root/assets/{note-time-DjlllCF3.js → note-time-BG8GCTr4.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
- package/dist/gateway/static/root/assets/{settings-form-section-C3_sEFfD.js → settings-form-section-r1V7dRV6.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
- package/dist/gateway/static/root/assets/share-preview-page-DOFy0FNt.js +2 -0
- package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.js → theme-store-Bo3j5Ovv.js} +1 -1
- package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-g57BRfEd.js → workflow-page.utils-DLEJ92gK.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
- package/dist/gateway/static/root/index.html +6 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +18 -6
- package/dist/src/agent/agent-manager.js +60 -35
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
- package/dist/src/agent/builtin-agent-ids.js +17 -0
- package/dist/src/agent/builtin-agent-ids.js.map +1 -0
- package/dist/src/agent/child-agent-factory.d.ts +4 -0
- package/dist/src/agent/child-agent-factory.js +28 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
- package/dist/src/agent/embedded/run-turn.js +8 -2
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/subscribe-session.js +33 -51
- package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +36 -35
- package/dist/src/agent/fallback/candidates.js +1 -1
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/inbound/attachment-pipeline.js +2 -2
- package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -1
- package/dist/src/agent/inbound/inbound-loop.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +35 -18
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service-inbound-utils.d.ts +0 -1
- package/dist/src/agent/service-inbound-utils.js +1 -17
- package/dist/src/agent/service-inbound-utils.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -4
- package/dist/src/agent/service.js +27 -15
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-config-service.d.ts +1 -0
- package/dist/src/agent/session/session-config-service.js +9 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +4 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +1 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
- package/dist/src/agent/skills/format-skills-prompt.js +3 -2
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +20 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +14 -27
- package/dist/src/agent/skills/installer.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +4 -1
- package/dist/src/agent/skills/skill-manager.js +3 -3
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
- package/dist/src/agent/skills/skill-view-path.js +3 -66
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/test-framework.js +2 -3
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
- package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
- package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
- package/dist/src/agent/tool-manuals/browser.js.map +1 -0
- package/dist/src/agent/tool-manuals/index.d.ts +10 -0
- package/dist/src/agent/tool-manuals/index.js +28 -0
- package/dist/src/agent/tool-manuals/index.js.map +1 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -5
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +5 -4
- package/dist/src/agent/tools/send-media.js +1 -2
- package/dist/src/agent/tools/send-media.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -1
- package/dist/src/agent/tools/shell.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +37 -8
- package/dist/src/agent/tools/skills-tools.js.map +1 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
- package/dist/src/agent/tools/tool-manual-tool.js +34 -0
- package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
- package/dist/src/agent/tools/web-extract.js +2 -2
- package/dist/src/agent/tools/web.js +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +7 -2
- package/dist/src/agent/workflow/catalog.js +66 -25
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
- package/dist/src/agent/workflow/subagent-runner.js +50 -4
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +10 -0
- package/dist/src/auth/credentials.d.ts +7 -0
- package/dist/src/auth/credentials.js +45 -7
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/index.d.ts +1 -1
- package/dist/src/auth/index.js.map +1 -1
- package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
- package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
- package/dist/src/auth/oauth/google-antigravity.js +1 -1
- package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
- package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
- package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
- package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
- package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
- package/dist/src/auth/oauth/index.js +2 -2
- package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
- package/dist/src/auth/oauth/kimi-coding.js +1 -1
- package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/src/auth/oauth/minimax-cn.js +1 -1
- package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
- package/dist/src/auth/oauth/minimax.js +1 -1
- package/dist/src/auth/oauth/minimax.js.map +1 -1
- package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
- package/dist/src/auth/oauth/openai-codex.js +318 -1
- package/dist/src/auth/oauth/openai-codex.js.map +1 -0
- package/dist/src/auth/profiles/store.js +3 -2
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/registry.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/index.js +3 -3
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/channels/attachments/attachment-classifiers.d.ts +1 -0
- package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
- package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
- package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
- package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
- package/dist/src/channels/dock.d.ts +0 -7
- package/dist/src/channels/dock.js +1 -21
- package/dist/src/channels/index.d.ts +1 -3
- package/dist/src/channels/index.js +1 -5
- package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
- package/dist/src/channels/lifecycle-supervisor.js +11 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
- package/dist/src/channels/manager.d.ts +1 -0
- package/dist/src/channels/manager.js +3 -0
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
- package/dist/src/channels/pairing/pairing-messages.js +1 -1
- package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
- package/dist/src/channels/pairing/pairing-service.js +8 -27
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +3 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
- package/dist/src/channels/telegram/index.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/model.js +2 -2
- package/dist/src/chat-commands/builtins/model.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/bin.js +1 -1
- package/dist/src/cli/command-manifest.js +2 -2
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +2 -4
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/auth.js +40 -52
- package/dist/src/cli/commands/auth.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
- package/dist/src/cli/commands/channels.d.ts +1 -5
- package/dist/src/cli/commands/channels.js +115 -281
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/config.js +2 -2
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -1
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -1
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +2 -1
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/models.js +192 -54
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
- package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.d.ts +1 -4
- package/dist/src/cli/commands/onboard/model.js +257 -184
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +4 -6
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
- package/dist/src/cli/commands/tui.js +13 -5
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/cli/utils/oauth-login.d.ts +17 -0
- package/dist/src/cli/utils/oauth-login.js +93 -0
- package/dist/src/cli/utils/oauth-login.js.map +1 -0
- package/dist/src/cli/utils/oauth-providers.js +2 -2
- package/dist/src/commands/agents.config.d.ts +3 -3
- package/dist/src/commands/agents.config.js +7 -7
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +1 -1
- package/dist/src/config/agent-profile.js +6 -2
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +2 -2
- package/dist/src/config/agent-typed-models.js +13 -2
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.d.ts +0 -1
- package/dist/src/config/loader.js +4 -9
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.d.ts +6 -6
- package/dist/src/config/rules.js +2 -12
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +74 -47
- package/dist/src/config/schema.js +28 -66
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/validate-channel-configs.d.ts +0 -3
- package/dist/src/config/validate-channel-configs.js +29 -10
- package/dist/src/config/validate-channel-configs.js.map +1 -1
- package/dist/src/cron/executor.js +1 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/extensions/activation-context.js +3 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/activation-planner.js +12 -0
- package/dist/src/extensions/activation-planner.js.map +1 -1
- package/dist/src/extensions/api.d.ts +5 -1
- package/dist/src/extensions/api.js +12 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/discover-extensions.js +17 -13
- package/dist/src/extensions/discover-extensions.js.map +1 -1
- package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
- package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
- package/dist/src/extensions/index.js +12 -4
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +5 -1
- package/dist/src/extensions/loader.js +12 -11
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/manifest-registry.js +98 -93
- package/dist/src/extensions/manifest-registry.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +91 -15
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/extensions/sdk/testing.js +4 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +32 -1
- package/dist/src/extensions/types/manifest.d.ts +60 -0
- package/dist/src/extensions/types/tui.d.ts +414 -5
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +16 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agent-run-relay.d.ts +2 -3
- package/dist/src/gateway/agent-run-relay.js +10 -3
- package/dist/src/gateway/agent-run-relay.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +32 -19
- package/dist/src/gateway/agents-admin.js +113 -93
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
- package/dist/src/gateway/chat-stream/mapper.js +244 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
- package/dist/src/gateway/chat-stream/protocol.js +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
- package/dist/src/gateway/hono/lib/agent-model.js +13 -11
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
- package/dist/src/gateway/hono/lib/config-payload.js +16 -15
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/oauth-async.js +2 -2
- package/dist/src/gateway/hono/oauth.js +2 -2
- package/dist/src/gateway/hono/routes/agents.js +83 -48
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +134 -214
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +5 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +25 -5
- package/dist/src/gateway/hono/routes/models.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +179 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
- package/dist/src/gateway/hono/routes/tui.js +16 -0
- package/dist/src/gateway/hono/routes/tui.js.map +1 -0
- package/dist/src/gateway/hono/routes/workflows.js +25 -1
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +5 -7
- package/dist/src/gateway/hono/sse.js +21 -38
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/protocol.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -4
- package/dist/src/gateway/service/agent-runner.js +1 -1
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
- package/dist/src/gateway/service/marketplace-service.js +7 -4
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
- package/dist/src/gateway/service/run-gateway-agent.js +63 -36
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +19 -0
- package/dist/src/gateway/service/sessions-api.js +12 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +6 -0
- package/dist/src/gateway/service.js +73 -57
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/media/store.js +3 -0
- package/dist/src/media/store.js.map +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/project-trust/trust-store.d.ts +30 -0
- package/dist/src/project-trust/trust-store.js +194 -0
- package/dist/src/project-trust/trust-store.js.map +1 -0
- package/dist/src/providers/index.d.ts +4 -4
- package/dist/src/providers/index.js +41 -22
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/presentation.d.ts +34 -0
- package/dist/src/providers/presentation.js +162 -0
- package/dist/src/providers/presentation.js.map +1 -0
- package/dist/src/routing/resolve-route.d.ts +0 -3
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
- package/dist/src/routing/resolve-tui-session-key.js +8 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/client-history.d.ts +32 -0
- package/dist/src/session/client-history.js +232 -1
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/manager.d.ts +37 -4
- package/dist/src/session/manager.js +39 -15
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +93 -1
- package/dist/src/session/session-context-for-llm.js +105 -2
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/store.d.ts +37 -0
- package/dist/src/session/store.js +127 -2
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/stored-rows-to-file-entries.js +37 -1
- package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
- package/dist/src/session/types.d.ts +14 -1
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -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/row-mappers.d.ts +14 -1
- package/dist/src/storage/sqlite/row-mappers.js +14 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-metadata.js +1 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.js +52 -25
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
- package/dist/src/tui/backends/embedded-backend.js +227 -39
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
- package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.d.ts +5 -1
- package/dist/src/tui/chat-history.js +78 -8
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-text.d.ts +5 -0
- package/dist/src/tui/clipboard-text.js +46 -0
- package/dist/src/tui/clipboard-text.js.map +1 -0
- package/dist/src/tui/components/assistant-message.d.ts +19 -3
- package/dist/src/tui/components/assistant-message.js +115 -9
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/bash-execution.d.ts +3 -2
- package/dist/src/tui/components/bash-execution.js +31 -3
- package/dist/src/tui/components/bash-execution.js.map +1 -1
- package/dist/src/tui/components/bash-summary.d.ts +23 -0
- package/dist/src/tui/components/bash-summary.js +87 -0
- package/dist/src/tui/components/bash-summary.js.map +1 -0
- package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
- package/dist/src/tui/components/branch-message-summary.js +43 -0
- package/dist/src/tui/components/branch-message-summary.js.map +1 -0
- package/dist/src/tui/components/branch-summary.d.ts +13 -0
- package/dist/src/tui/components/branch-summary.js +51 -0
- package/dist/src/tui/components/branch-summary.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +46 -6
- package/dist/src/tui/components/chat-log.js +183 -21
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/compaction-summary.d.ts +13 -0
- package/dist/src/tui/components/compaction-summary.js +46 -0
- package/dist/src/tui/components/compaction-summary.js.map +1 -0
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +2 -0
- package/dist/src/tui/components/custom-editor.js.map +1 -1
- package/dist/src/tui/components/custom-message.d.ts +23 -0
- package/dist/src/tui/components/custom-message.js +65 -0
- package/dist/src/tui/components/custom-message.js.map +1 -0
- package/dist/src/tui/components/extension-dialog.d.ts +42 -0
- package/dist/src/tui/components/extension-dialog.js +127 -0
- package/dist/src/tui/components/extension-dialog.js.map +1 -0
- package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
- package/dist/src/tui/components/scoped-models-selector.js +89 -16
- package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
- package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
- package/dist/src/tui/components/searchable-select-list.js +82 -10
- package/dist/src/tui/components/searchable-select-list.js.map +1 -1
- package/dist/src/tui/components/session-selector.d.ts +18 -4
- package/dist/src/tui/components/session-selector.js +207 -40
- package/dist/src/tui/components/session-selector.js.map +1 -1
- package/dist/src/tui/components/settings-selector.d.ts +6 -2
- package/dist/src/tui/components/settings-selector.js +126 -7
- package/dist/src/tui/components/settings-selector.js.map +1 -1
- package/dist/src/tui/components/thinking-selector.d.ts +12 -0
- package/dist/src/tui/components/thinking-selector.js +48 -0
- package/dist/src/tui/components/thinking-selector.js.map +1 -0
- package/dist/src/tui/components/tool-execution.d.ts +57 -3
- package/dist/src/tui/components/tool-execution.js +378 -28
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
- package/dist/src/tui/components/tui-bottom-bar.js +56 -11
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/tui-header.d.ts +9 -2
- package/dist/src/tui/components/tui-header.js +25 -5
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/components/user-message.d.ts +4 -2
- package/dist/src/tui/components/user-message.js +42 -9
- package/dist/src/tui/components/user-message.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +11 -0
- package/dist/src/tui/components/visual-truncate.js +27 -0
- package/dist/src/tui/components/visual-truncate.js.map +1 -0
- package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
- package/dist/src/tui/extension-host/autocomplete.js +116 -0
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
- package/dist/src/tui/extension-host/host.d.ts +31 -1
- package/dist/src/tui/extension-host/host.js +123 -6
- package/dist/src/tui/extension-host/host.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
- package/dist/src/tui/extension-host/load-extensions.js +4 -3
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
- package/dist/src/tui/extension-host/runtime-context.js +152 -0
- package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
- package/dist/src/tui/extension-host/runtime.d.ts +52 -4
- package/dist/src/tui/extension-host/runtime.js +547 -85
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/extension-host/surface.d.ts +20 -0
- package/dist/src/tui/extension-host/surface.js +30 -6
- package/dist/src/tui/extension-host/surface.js.map +1 -1
- package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
- package/dist/src/tui/extension-host/tool-renderers.js +43 -5
- package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
- package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
- package/dist/src/tui/format-tui-hotkeys.js +22 -5
- package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
- package/dist/src/tui/tui-agent-events.d.ts +8 -6
- package/dist/src/tui/tui-agent-events.js +200 -59
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +169 -3
- package/dist/src/tui/tui-command-formatters.d.ts +76 -0
- package/dist/src/tui/tui-command-formatters.js +594 -0
- package/dist/src/tui/tui-command-formatters.js.map +1 -0
- package/dist/src/tui/tui-commands.d.ts +57 -7
- package/dist/src/tui/tui-commands.js +639 -43
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-context-usage.d.ts +1 -1
- package/dist/src/tui/tui-context-usage.js +9 -1
- package/dist/src/tui/tui-context-usage.js.map +1 -1
- package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
- package/dist/src/tui/tui-extension-user-message.js +32 -0
- package/dist/src/tui/tui-extension-user-message.js.map +1 -0
- package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
- package/dist/src/tui/tui-follow-up-queue.js +18 -0
- package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
- package/dist/src/tui/tui-local-shell.d.ts +11 -1
- package/dist/src/tui/tui-local-shell.js +50 -8
- package/dist/src/tui/tui-local-shell.js.map +1 -1
- package/dist/src/tui/tui-model-picker.d.ts +26 -0
- package/dist/src/tui/tui-model-picker.js +152 -0
- package/dist/src/tui/tui-model-picker.js.map +1 -0
- package/dist/src/tui/tui-oauth-login.d.ts +16 -0
- package/dist/src/tui/tui-oauth-login.js +189 -0
- package/dist/src/tui/tui-oauth-login.js.map +1 -0
- package/dist/src/tui/tui-overlays.d.ts +3 -3
- package/dist/src/tui/tui-overlays.js +6 -7
- package/dist/src/tui/tui-overlays.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
- package/dist/src/tui/tui-picker-overlay.js +340 -30
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +41 -0
- package/dist/src/tui/tui-picker-services.js +1 -0
- package/dist/src/tui/tui-run-state.d.ts +11 -0
- package/dist/src/tui/tui-run-state.js +114 -0
- package/dist/src/tui/tui-run-state.js.map +1 -0
- package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
- package/dist/src/tui/tui-runtime-hints.js +18 -0
- package/dist/src/tui/tui-runtime-hints.js.map +1 -0
- package/dist/src/tui/tui-scoped-models.d.ts +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-scoped-models.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +5 -3
- package/dist/src/tui/tui-session-actions.js +21 -9
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-session-format.d.ts +4 -1
- package/dist/src/tui/tui-session-format.js +17 -3
- package/dist/src/tui/tui-session-format.js.map +1 -1
- package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
- package/dist/src/tui/tui-session-snapshot.js +184 -0
- package/dist/src/tui/tui-session-snapshot.js.map +1 -0
- package/dist/src/tui/tui-session-stats.d.ts +3 -0
- package/dist/src/tui/tui-session-stats.js +59 -0
- package/dist/src/tui/tui-session-stats.js.map +1 -0
- package/dist/src/tui/tui-settings.d.ts +21 -0
- package/dist/src/tui/tui-settings.js +28 -1
- package/dist/src/tui/tui-settings.js.map +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
- package/dist/src/tui/tui-startup-resources.d.ts +3 -0
- package/dist/src/tui/tui-startup-resources.js +39 -0
- package/dist/src/tui/tui-startup-resources.js.map +1 -0
- package/dist/src/tui/tui-startup-text.d.ts +10 -0
- package/dist/src/tui/tui-startup-text.js +58 -0
- package/dist/src/tui/tui-startup-text.js.map +1 -0
- package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
- package/dist/src/tui/tui-stdio-filter.js +11 -7
- package/dist/src/tui/tui-stdio-filter.js.map +1 -1
- package/dist/src/tui/tui-submit.d.ts +2 -0
- package/dist/src/tui/tui-submit.js +2 -1
- package/dist/src/tui/tui-submit.js.map +1 -1
- package/dist/src/tui/tui-tool-diff.js +61 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-tool-result.d.ts +17 -0
- package/dist/src/tui/tui-tool-result.js +74 -0
- package/dist/src/tui/tui-tool-result.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
- package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
- package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
- package/dist/src/tui/tui-transcript-tree.js +316 -0
- package/dist/src/tui/tui-transcript-tree.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +25 -34
- package/dist/src/tui/tui-types.js +12 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +1288 -112
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
- package/dist/src/workflows/domain/definition-utils.js +18 -8
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +25 -0
- package/dist/src/workflows/domain/event.d.ts +1 -0
- package/dist/src/workflows/domain/result.d.ts +15 -0
- package/dist/src/workflows/domain/run.d.ts +2 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/engine/projector.js +4 -0
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
- package/dist/src/workflows/engine/workflow-engine.js +75 -11
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.d.ts +1 -0
- package/dist/src/workflows/index.js +4 -1
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
- package/dist/src/workflows/registry/index.d.ts +2 -0
- package/dist/src/workflows/registry/index.js +2 -0
- package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
- package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
- package/dist/src/workflows/runtime/index.d.ts +2 -0
- package/dist/src/workflows/runtime/index.js +2 -1
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
- package/dist/src/workflows/service/workflow-run-service.js +10 -15
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +21 -15
- package/skills/creative/frontend-design/SKILL.md +1 -1
- package/skills/creative/theme-factory/SKILL.md +1 -1
- package/skills/documents/xlsx/SKILL.md +1 -1
- package/skills/engineering/diagnose/SKILL.md +2 -2
- package/skills/engineering/tdd/SKILL.md +1 -1
- package/skills/tools/github/SKILL.md +6 -1
- package/skills/tools/webapp-testing/SKILL.md +4 -1
- package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
- package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
- package/dist/gateway/static/root/assets/agents-DQ0mQxIA.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-BEtP53V6.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-CxTtS1hI.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-CznlPIZT.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-Dx6dE3eD.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-DuDCSb3J.js +0 -1
- package/dist/gateway/static/root/assets/field-primitives-BUwUiDf5.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-BjFW1cl-.js +0 -1
- package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
- package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-D40ZpS0Y.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BvtdbmW8.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BQamRjkV.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-D972_jaS.js +0 -3
- package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
- package/dist/gateway/static/root/assets/skills-page-QwFCB4yV.js +0 -2
- package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
- package/dist/gateway/static/root/assets/utils-DCm11_KW.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CywiB7Dw.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-Be7l_SWw.js +0 -27
- package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
- package/dist/src/agent/embedded/map-stream-events.js +0 -63
- package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/pkce.js.map +0 -1
- package/dist/src/channels/dock.js.map +0 -1
- package/dist/src/channels/plugins/bundled.d.ts +0 -11
- package/dist/src/channels/plugins/bundled.js +0 -10
- package/dist/src/channels/plugins/bundled.js.map +0 -1
- package/dist/src/channels/registry.d.ts +0 -25
- package/dist/src/channels/registry.js +0 -82
- package/dist/src/channels/registry.js.map +0 -1
- package/dist/src/config/localized-text.d.ts +0 -6
- package/dist/src/config/localized-text.js +0 -42
- package/dist/src/config/localized-text.js.map +0 -1
- package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
- package/dist/src/generated/bundled-channel-plugins.js +0 -16
- package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
- package/dist/src/tui/stream-assembler.d.ts +0 -22
- package/dist/src/tui/stream-assembler.js +0 -63
- package/dist/src/tui/stream-assembler.js.map +0 -1
- package/skills/browser/SKILL-zh.md +0 -188
- package/skills/business/company-values/SKILL-zh.md +0 -80
- package/skills/business/company-values/SKILL.md +0 -80
- package/skills/business/find-community/SKILL-zh.md +0 -50
- package/skills/business/find-community/SKILL.md +0 -50
- package/skills/business/first-customers/SKILL-zh.md +0 -76
- package/skills/business/first-customers/SKILL.md +0 -76
- package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
- package/skills/business/grow-sustainably/SKILL.md +0 -92
- package/skills/business/marketing-plan/SKILL-zh.md +0 -100
- package/skills/business/marketing-plan/SKILL.md +0 -100
- package/skills/business/minimalist-review/SKILL-zh.md +0 -82
- package/skills/business/minimalist-review/SKILL.md +0 -82
- package/skills/business/mvp/SKILL-zh.md +0 -81
- package/skills/business/mvp/SKILL.md +0 -81
- package/skills/business/pricing/SKILL-zh.md +0 -64
- package/skills/business/pricing/SKILL.md +0 -64
- package/skills/business/processize/SKILL-zh.md +0 -91
- package/skills/business/processize/SKILL.md +0 -91
- package/skills/business/validate-idea/SKILL-zh.md +0 -68
- package/skills/business/validate-idea/SKILL.md +0 -68
- package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
- package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
- package/skills/creative/algorithmic-art/SKILL.md +0 -405
- package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
- package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
- package/skills/creative/frontend-design/SKILL-zh.md +0 -42
- package/skills/creative/theme-factory/SKILL-zh.md +0 -59
- package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
- package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
- package/skills/documents/doc-coauthoring/SKILL.md +0 -375
- package/skills/documents/docx/LICENSE.txt +0 -30
- package/skills/documents/docx/SKILL-zh.md +0 -590
- package/skills/documents/docx/SKILL.md +0 -590
- package/skills/documents/docx/scripts/__init__.py +0 -1
- package/skills/documents/docx/scripts/accept_changes.py +0 -135
- package/skills/documents/docx/scripts/comment.py +0 -318
- package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/docx/scripts/office/pack.py +0 -159
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/docx/scripts/office/soffice.py +0 -183
- package/skills/documents/docx/scripts/office/unpack.py +0 -132
- package/skills/documents/docx/scripts/office/validate.py +0 -111
- package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/docx/scripts/office/validators/base.py +0 -847
- package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/docx/scripts/templates/comments.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills/documents/docx/scripts/templates/people.xml +0 -3
- package/skills/documents/pdf/LICENSE.txt +0 -30
- package/skills/documents/pdf/SKILL-zh.md +0 -314
- package/skills/documents/pdf/SKILL.md +0 -314
- package/skills/documents/pdf/forms.md +0 -294
- package/skills/documents/pdf/reference.md +0 -612
- package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
- package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
- package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
- package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
- package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
- package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
- package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
- package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
- package/skills/documents/pptx/LICENSE.txt +0 -30
- package/skills/documents/pptx/SKILL-zh.md +0 -232
- package/skills/documents/pptx/SKILL.md +0 -232
- package/skills/documents/pptx/editing.md +0 -205
- package/skills/documents/pptx/pptxgenjs.md +0 -420
- package/skills/documents/pptx/scripts/__init__.py +0 -0
- package/skills/documents/pptx/scripts/add_slide.py +0 -195
- package/skills/documents/pptx/scripts/clean.py +0 -286
- package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/pptx/scripts/office/pack.py +0 -159
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/pptx/scripts/office/soffice.py +0 -183
- package/skills/documents/pptx/scripts/office/unpack.py +0 -132
- package/skills/documents/pptx/scripts/office/validate.py +0 -111
- package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
- package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/pptx/scripts/thumbnail.py +0 -289
- package/skills/documents/xlsx/SKILL-zh.md +0 -292
- package/skills/engineering/diagnose/SKILL-zh.md +0 -117
- package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
- package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
- package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
- package/skills/engineering/grill-with-docs/SKILL.md +0 -88
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
- package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
- package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
- package/skills/engineering/tdd/SKILL-zh.md +0 -109
- package/skills/engineering/to-issues/SKILL-zh.md +0 -81
- package/skills/engineering/to-issues/SKILL.md +0 -81
- package/skills/engineering/to-prd/SKILL-zh.md +0 -76
- package/skills/engineering/to-prd/SKILL.md +0 -74
- package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
- package/skills/engineering/zoom-out/SKILL.md +0 -7
- package/skills/tools/find-skills/SKILL-zh.md +0 -440
- package/skills/tools/github/SKILL-zh.md +0 -48
- package/skills/tools/internal-comms/LICENSE.txt +0 -202
- package/skills/tools/internal-comms/SKILL-zh.md +0 -32
- package/skills/tools/internal-comms/SKILL.md +0 -32
- package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
- package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
- package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
- package/skills/tools/internal-comms/examples/general-comms.md +0 -16
- package/skills/tools/skill-creator/LICENSE.txt +0 -202
- package/skills/tools/skill-creator/SKILL-zh.md +0 -483
- package/skills/tools/skill-creator/SKILL.md +0 -485
- package/skills/tools/skill-creator/agents/analyzer.md +0 -274
- package/skills/tools/skill-creator/agents/comparator.md +0 -202
- package/skills/tools/skill-creator/agents/grader.md +0 -223
- package/skills/tools/skill-creator/assets/eval_review.html +0 -146
- package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
- package/skills/tools/skill-creator/references/schemas.md +0 -430
- package/skills/tools/skill-creator/scripts/__init__.py +0 -0
- package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
- package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
- package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
- package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
- package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
- package/skills/tools/skill-creator/scripts/utils.py +0 -47
- package/skills/tools/summarize/SKILL-zh.md +0 -47
- package/skills/tools/weather/SKILL-zh.md +0 -46
- package/skills/tools/weather/SKILL.md +0 -46
- package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
|
@@ -4,7 +4,7 @@ import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
|
|
|
4
4
|
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
5
5
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
6
6
|
import "./types.js";
|
|
7
|
-
import { buildSessionContextForLlm, mergeLlmMessagesPreservingContextRows } from "./session-context-for-llm.js";
|
|
7
|
+
import { buildSessionContextForLlm, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
|
|
8
8
|
import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
|
|
9
9
|
import { deleteSessionRecord, ensureSessionRecord, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
|
|
10
10
|
import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRowsForSession, replaceTranscriptRows, restoreCompactionCheckpoint } from "../storage/sqlite/transcript-repository.js";
|
|
@@ -246,6 +246,61 @@ var SessionStore = class {
|
|
|
246
246
|
});
|
|
247
247
|
});
|
|
248
248
|
}
|
|
249
|
+
async appendTranscriptLabelEntry(key, entry) {
|
|
250
|
+
return this.runStoreMutation(async () => {
|
|
251
|
+
requireXopcDatabase();
|
|
252
|
+
ensureSessionRecord(key, this.resolveWorkspaceCwd(key));
|
|
253
|
+
appendTranscriptEntry(key, {
|
|
254
|
+
type: "label",
|
|
255
|
+
targetId: entry.targetId,
|
|
256
|
+
label: entry.label?.trim() || void 0,
|
|
257
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
async appendTranscriptCustomEntry(key, entry) {
|
|
262
|
+
return this.runStoreMutation(async () => {
|
|
263
|
+
requireXopcDatabase();
|
|
264
|
+
ensureSessionRecord(key, this.resolveWorkspaceCwd(key));
|
|
265
|
+
appendTranscriptEntry(key, {
|
|
266
|
+
type: "custom",
|
|
267
|
+
customType: entry.customType.trim(),
|
|
268
|
+
data: entry.data,
|
|
269
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
async appendTranscriptCustomMessageEntry(key, entry) {
|
|
274
|
+
return this.runStoreMutation(async () => {
|
|
275
|
+
requireXopcDatabase();
|
|
276
|
+
ensureSessionRecord(key, this.resolveWorkspaceCwd(key));
|
|
277
|
+
appendTranscriptEntry(key, {
|
|
278
|
+
role: "custom",
|
|
279
|
+
customType: entry.customType.trim(),
|
|
280
|
+
content: entry.content ?? "",
|
|
281
|
+
display: entry.display ?? true,
|
|
282
|
+
details: entry.details,
|
|
283
|
+
timestamp: Date.now()
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
async appendTranscriptBashExecutionEntry(key, entry) {
|
|
288
|
+
return this.runStoreMutation(async () => {
|
|
289
|
+
requireXopcDatabase();
|
|
290
|
+
ensureSessionRecord(key, this.resolveWorkspaceCwd(key));
|
|
291
|
+
appendTranscriptEntry(key, {
|
|
292
|
+
role: "bashExecution",
|
|
293
|
+
command: entry.command,
|
|
294
|
+
output: entry.output ?? "",
|
|
295
|
+
exitCode: entry.exitCode ?? null,
|
|
296
|
+
signal: entry.signal ?? null,
|
|
297
|
+
excludeFromContext: entry.excludeFromContext === true,
|
|
298
|
+
truncated: entry.truncated === true,
|
|
299
|
+
fullOutputPath: entry.fullOutputPath,
|
|
300
|
+
timestamp: Date.now()
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
}
|
|
249
304
|
async saveMessages(key, messages) {
|
|
250
305
|
return this.runStoreMutation(async () => {
|
|
251
306
|
requireXopcDatabase();
|
|
@@ -360,6 +415,72 @@ var SessionStore = class {
|
|
|
360
415
|
for (const msg of messages) lines.push(`## ${msg.role}`, "", typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content), "");
|
|
361
416
|
return lines.join("\n");
|
|
362
417
|
}
|
|
418
|
+
async importSessionExport(targetKey, jsonContent) {
|
|
419
|
+
return this.runStoreMutation(async () => {
|
|
420
|
+
requireXopcDatabase();
|
|
421
|
+
if (await this.getMetadata(targetKey)) throw new Error(`Target session already exists: ${targetKey}`);
|
|
422
|
+
let parsed;
|
|
423
|
+
try {
|
|
424
|
+
parsed = JSON.parse(jsonContent);
|
|
425
|
+
} catch (err) {
|
|
426
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
427
|
+
throw new Error(`Invalid session export JSON: ${errorMessage}`);
|
|
428
|
+
}
|
|
429
|
+
const record = parsed && typeof parsed === "object" ? parsed : {};
|
|
430
|
+
const rowsSource = Array.isArray(record.transcriptRows) ? record.transcriptRows : void 0;
|
|
431
|
+
const rows = rowsSource ? transcriptRowsFromJsonArray(rowsSource) : [];
|
|
432
|
+
if (rows.length === 0) throw new Error("Session export contains no importable transcript rows");
|
|
433
|
+
ensureSessionRecord(targetKey, this.resolveWorkspaceCwd(targetKey));
|
|
434
|
+
replaceTranscriptRows(targetKey, rows);
|
|
435
|
+
const metadata = record.metadata && typeof record.metadata === "object" ? record.metadata : {};
|
|
436
|
+
const sourceKey = typeof metadata.key === "string" ? metadata.key : void 0;
|
|
437
|
+
const sourceName = typeof metadata.name === "string" ? metadata.name.trim() : "";
|
|
438
|
+
patchSessionMetadata(targetKey, {
|
|
439
|
+
name: sourceName ? `Import of ${sourceName}` : "Imported session",
|
|
440
|
+
tags: [...new Set([...Array.isArray(metadata.tags) ? metadata.tags.filter((tag) => typeof tag === "string") : [], "import"])],
|
|
441
|
+
customData: {
|
|
442
|
+
...metadata.customData && typeof metadata.customData === "object" ? metadata.customData : {},
|
|
443
|
+
...sourceKey ? { importedFromSessionKey: sourceKey } : {},
|
|
444
|
+
importedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
return {
|
|
448
|
+
sessionKey: targetKey,
|
|
449
|
+
rowCount: rows.length
|
|
450
|
+
};
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
async forkSession(sourceKey, targetKey) {
|
|
454
|
+
return this.forkSessionRows(sourceKey, targetKey);
|
|
455
|
+
}
|
|
456
|
+
async forkSessionRows(sourceKey, targetKey, options = {}) {
|
|
457
|
+
return this.runStoreMutation(async () => {
|
|
458
|
+
requireXopcDatabase();
|
|
459
|
+
const sourceMetadata = await this.getMetadata(sourceKey);
|
|
460
|
+
if (!sourceMetadata) throw new Error(`Session not found: ${sourceKey}`);
|
|
461
|
+
if (await this.getMetadata(targetKey)) throw new Error(`Target session already exists: ${targetKey}`);
|
|
462
|
+
const rows = await this.loadTranscriptRows(sourceKey);
|
|
463
|
+
if (options.throughRow !== void 0 && (options.throughRow < 1 || options.throughRow > rows.length)) throw new Error(`Invalid fork row: ${options.throughRow}`);
|
|
464
|
+
const selectedRows = options.throughRow === void 0 ? rows : rows.slice(0, Math.max(0, Math.trunc(options.throughRow)));
|
|
465
|
+
ensureSessionRecord(targetKey, this.resolveWorkspaceCwd(targetKey));
|
|
466
|
+
replaceTranscriptRows(targetKey, selectedRows);
|
|
467
|
+
patchSessionMetadata(targetKey, {
|
|
468
|
+
name: `Fork of ${sourceMetadata.name?.trim() || sourceKey}`,
|
|
469
|
+
tags: [...new Set([...sourceMetadata.tags ?? [], "fork"])],
|
|
470
|
+
customData: {
|
|
471
|
+
...sourceMetadata.customData ?? {},
|
|
472
|
+
forkedFromSessionKey: sourceKey,
|
|
473
|
+
forkedFromTranscriptId: sourceMetadata.transcriptId,
|
|
474
|
+
...options.throughRow !== void 0 ? { forkedFromRow: selectedRows.length } : {},
|
|
475
|
+
forkedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
return {
|
|
479
|
+
sessionKey: targetKey,
|
|
480
|
+
rowCount: selectedRows.length
|
|
481
|
+
};
|
|
482
|
+
});
|
|
483
|
+
}
|
|
363
484
|
async getStats() {
|
|
364
485
|
requireXopcDatabase();
|
|
365
486
|
return getGlobalSessionStats();
|
|
@@ -485,10 +606,14 @@ var SessionStore = class {
|
|
|
485
606
|
if (rawUsage && typeof rawUsage === "object") {
|
|
486
607
|
const inputTokens = typeof rawUsage.input === "number" ? rawUsage.input : void 0;
|
|
487
608
|
const outputTokens = typeof rawUsage.output === "number" ? rawUsage.output : void 0;
|
|
609
|
+
const cacheReadTokens = typeof rawUsage.cacheRead === "number" ? rawUsage.cacheRead : void 0;
|
|
610
|
+
const cacheWriteTokens = typeof rawUsage.cacheWrite === "number" ? rawUsage.cacheWrite : void 0;
|
|
488
611
|
const totalTokens = typeof rawUsage.totalTokens === "number" ? rawUsage.totalTokens : typeof rawUsage.total === "number" ? rawUsage.total : void 0;
|
|
489
|
-
if (inputTokens !== void 0 || outputTokens !== void 0 || totalTokens !== void 0) row.usage = {
|
|
612
|
+
if (inputTokens !== void 0 || outputTokens !== void 0 || cacheReadTokens !== void 0 || cacheWriteTokens !== void 0 || totalTokens !== void 0) row.usage = {
|
|
490
613
|
inputTokens,
|
|
491
614
|
outputTokens,
|
|
615
|
+
cacheReadTokens,
|
|
616
|
+
cacheWriteTokens,
|
|
492
617
|
totalTokens
|
|
493
618
|
};
|
|
494
619
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","names":[],"sources":["../../../src/session/store.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../config/schema.js';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport { readPostCompactionContext } from '../agent/reply/post-compaction-context.js';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionCompactor, type CompactionConfig, type CompactionResult } from '../agent/memory/compaction.js';\nimport { SlidingWindow, type WindowConfig } from '../agent/memory/window.js';\nimport {\n requireXopcDatabase,\n appendTranscriptEntry,\n captureCompactionCheckpoint,\n deleteSessionRecord,\n ensureSessionRecord,\n estimateTokensFromMessages,\n getCompactionCheckpointDetail,\n getGlobalSessionStats,\n getSessionMetadata,\n listCompactionCheckpoints,\n listSessionMetadata,\n listSessionsByAgent,\n loadCheckpointRows,\n loadLlmMessagesForSession,\n loadTranscriptRowsForSession,\n patchSessionMetadata,\n replaceTranscriptRows,\n resetSessionRecord,\n restoreCompactionCheckpoint,\n} from '../storage/sqlite/index.js';\nimport type { TranscriptCompactionRecord, XopcSessionTranscriptV1 } from './transcript-format.js';\nimport {\n buildSessionContextForLlm,\n mergeLlmMessagesPreservingContextRows,\n type TranscriptStoredRow,\n type XopcTranscriptContextEntry,\n} from './session-context-for-llm.js';\nimport { normalizeCompactionCheckpointId } from './compaction-checkpoints.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionExport,\n SessionTranscriptSummary,\n CompactionCheckpointSummary,\n CompactionCheckpointDetail,\n} from './types.js';\nimport { SessionStatus } from './types.js';\nimport type { Message } from './types.js';\nimport type { SessionTranscriptUpdate } from './transcript-events.js';\nimport { isAppendOnlyLlmTranscriptMessage } from './transcript-stats.js';\n\nconst log = createLogger('SessionStore');\n\nconst INDEX_VERSION = '1.0';\n\nexport interface SessionStoreOptions {\n config: Config;\n}\n\nexport class SessionStore {\n private window: SlidingWindow;\n private compactor: SessionCompactor;\n\n constructor(\n private options: SessionStoreOptions,\n windowConfig?: Partial<WindowConfig>,\n compactionConfig?: Partial<CompactionConfig>,\n ) {\n this.window = new SlidingWindow(windowConfig);\n this.compactor = new SessionCompactor(compactionConfig);\n }\n\n private resolveWorkspaceCwd(sessionKey: string): string {\n return resolveEffectiveAgentProfileForSession(this.options.config, sessionKey).resolvedWorkspacePath;\n }\n\n private async runStoreMutation<T>(fn: () => Promise<T>): Promise<T> {\n return fn();\n }\n\n async initialize(): Promise<void> {\n requireXopcDatabase();\n log.debug('Session store initialized (SQLite)');\n }\n\n getSessionsRoot(): string {\n return resolveStateDir();\n }\n\n async resolveTranscriptPath(\n sessionKey: string,\n ): Promise<{ sessionId: string; sessionKey: string }> {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(sessionKey);\n const meta = ensureSessionRecord(sessionKey, cwd);\n return { sessionId: meta.transcriptId!, sessionKey };\n }\n\n async appendTranscriptMessage(sessionKey: string, message: AgentMessage): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(sessionKey);\n ensureSessionRecord(sessionKey, cwd);\n appendTranscriptEntry(sessionKey, message);\n });\n }\n\n async getByAgent(agentId: string): Promise<SessionMetadata[]> {\n requireXopcDatabase();\n return listSessionsByAgent(agentId);\n }\n\n async getByAccount(accountId: string): Promise<SessionMetadata[]> {\n const { items } = await this.list({ limit: 100_000 });\n return items.filter((m) => m.routing?.accountId === accountId);\n }\n\n async getByPeer(peerKind: string, peerId: string): Promise<SessionMetadata[]> {\n const { items } = await this.list({ limit: 100_000 });\n return items.filter((m) => m.routing?.peerKind === peerKind && m.routing.peerId === peerId);\n }\n\n async getMainSession(channel: string, accountId: string): Promise<SessionMetadata | null> {\n const { items } = await this.list({ limit: 100_000 });\n return (\n items.find(\n (m) =>\n m.routing?.source === channel &&\n m.routing.accountId === accountId &&\n m.routing.peerKind === 'dm' &&\n m.routing.peerId === 'main',\n ) ?? null\n );\n }\n\n async refreshIndex(): Promise<void> {\n /* no-op: SQLite is authoritative */\n }\n\n async list(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n requireXopcDatabase();\n return listSessionMetadata(query);\n }\n\n async get(\n key: string,\n options?: { includeTranscriptSummary?: boolean; includeTranscriptRows?: boolean },\n ): Promise<SessionDetail | null> {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n return null;\n }\n const messages = await this.loadDisplayMessages(key);\n return this.buildSessionDetail(key, metadata, messages, options);\n }\n\n async getMessagePage(\n key: string,\n options: {\n offset?: number;\n limit?: number;\n before?: string;\n includeTranscriptSummary?: boolean;\n includeTranscriptRows?: boolean;\n } = {},\n ): Promise<{\n session: SessionDetail;\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n before?: string;\n nextBeforeCursor?: string;\n };\n } | null> {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n return null;\n }\n\n const limit = Math.min(200, Math.max(1, Math.trunc(options.limit ?? 50)));\n const offset = Math.max(0, Math.trunc(options.offset ?? 0));\n const parsedBefore = options.before ? Number.parseInt(options.before, 10) : undefined;\n const hasBeforeCursor = parsedBefore !== undefined && Number.isFinite(parsedBefore);\n\n const displayMessages = await this.loadDisplayMessages(key);\n const page = this.paginateDisplayMessages(displayMessages, {\n limit,\n offset: hasBeforeCursor ? undefined : offset,\n beforeEndIndex: hasBeforeCursor ? parsedBefore : undefined,\n });\n\n const session = await this.buildSessionDetail(key, metadata, page.messages, options);\n const nextBeforeCursor = page.startIndex > 0 ? String(page.startIndex) : undefined;\n\n return {\n session,\n pagination: {\n total: page.total,\n limit,\n offset,\n hasMore: hasBeforeCursor ? page.startIndex > 0 : offset + limit < page.total,\n ...(hasBeforeCursor ? { before: String(page.endIndex) } : {}),\n ...(nextBeforeCursor ? { nextBeforeCursor } : {}),\n },\n };\n }\n\n private async buildSessionDetail(\n key: string,\n metadata: SessionMetadata,\n messages: AgentMessage[],\n options?: { includeTranscriptSummary?: boolean; includeTranscriptRows?: boolean },\n ): Promise<SessionDetail> {\n let transcriptSummary: SessionTranscriptSummary | undefined;\n if (options?.includeTranscriptSummary) {\n const env = await this.loadTranscriptDocument(key);\n if (env) {\n transcriptSummary = {\n id: env.id,\n version: env.version,\n createdAt: env.createdAt,\n updatedAt: env.updatedAt,\n compactionCount: env.compactions?.length ?? 0,\n };\n }\n }\n let transcriptRows: TranscriptStoredRow[] | undefined;\n if (options?.includeTranscriptRows) {\n transcriptRows = await this.loadTranscriptRows(key);\n }\n return {\n ...metadata,\n messages: this.convertMessages(messages),\n ...(transcriptSummary ? { transcriptSummary } : {}),\n ...(transcriptRows !== undefined ? { transcriptRows } : {}),\n };\n }\n\n async loadTranscriptRows(key: string): Promise<TranscriptStoredRow[]> {\n requireXopcDatabase();\n return loadTranscriptRowsForSession(key);\n }\n\n async getMetadata(key: string): Promise<SessionMetadata | null> {\n requireXopcDatabase();\n return getSessionMetadata(key);\n }\n\n async updateMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n patchSessionMetadata(key, updates);\n log.debug({ key, updates }, 'Session metadata updated');\n });\n }\n\n async reset(key: string): Promise<{ sessionId: string; previousSessionId: string } | null> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n const outcome = resetSessionRecord(key, cwd);\n if (outcome) {\n log.info({ key, ...outcome }, 'Session reset');\n }\n return outcome;\n });\n }\n\n async delete(key: string): Promise<boolean> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const ok = deleteSessionRecord(key);\n if (ok) {\n log.info({ key }, 'Session deleted');\n }\n return ok;\n });\n }\n\n async deleteMany(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const success: string[] = [];\n const failed: string[] = [];\n for (const key of keys) {\n try {\n if (await this.delete(key)) {\n success.push(key);\n } else {\n failed.push(key);\n }\n } catch {\n failed.push(key);\n }\n }\n return { success, failed };\n }\n\n async setStatus(key: string, status: SessionStatus): Promise<void> {\n await this.updateMetadata(key, { status });\n }\n\n async archive(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.ARCHIVED);\n }\n\n async unarchive(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.ACTIVE);\n }\n\n async pin(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.PINNED);\n }\n\n async unpin(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.ACTIVE);\n }\n\n async loadMessages(_key: string, _options?: { fromArchive?: boolean }): Promise<AgentMessage[]> {\n requireXopcDatabase();\n return loadLlmMessagesForSession(_key);\n }\n\n async loadTranscriptDocument(key: string): Promise<XopcSessionTranscriptV1 | null> {\n const metadata = await this.getMetadata(key);\n if (!metadata?.transcriptId) {\n return null;\n }\n const rows = await this.loadTranscriptRows(key);\n const compactions: TranscriptCompactionRecord[] = [];\n for (const row of rows) {\n if ((row as { type?: string }).type === 'compaction') {\n const c = row as unknown as TranscriptCompactionRecord & { type: 'compaction' };\n compactions.push({\n at: c.at ?? new Date().toISOString(),\n summary: c.summary ?? '',\n firstKeptIndex: Number(c.firstKeptIndex ?? 0),\n tokensBefore: c.tokensBefore ?? 0,\n tokensAfter: (c as { tokensAfter?: number }).tokensAfter ?? 0,\n });\n }\n }\n return {\n type: 'xopc_session_transcript',\n version: 1,\n id: metadata.transcriptId,\n createdAt: metadata.createdAt,\n updatedAt: metadata.updatedAt,\n messages: rows,\n ...(compactions.length > 0 ? { compactions } : {}),\n };\n }\n\n async syncEmbeddedTranscriptUpdate(update: SessionTranscriptUpdate): Promise<void> {\n const sessionKey = update.sessionKey?.trim();\n if (!sessionKey) {\n return;\n }\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(sessionKey);\n ensureSessionRecord(sessionKey, cwd);\n\n if (update.message && isAppendOnlyLlmTranscriptMessage(update.message)) {\n appendTranscriptEntry(sessionKey, update.message as AgentMessage);\n }\n });\n }\n\n async appendTranscriptContextEntry(\n key: string,\n entry: Omit<XopcTranscriptContextEntry, 'kind'> & Partial<Pick<XopcTranscriptContextEntry, 'kind'>>,\n ): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n const row: XopcTranscriptContextEntry = {\n kind: 'context',\n id: typeof entry.id === 'string' ? entry.id : undefined,\n text: typeof entry.text === 'string' ? entry.text : undefined,\n data: entry.data,\n createdAt: entry.createdAt ?? new Date().toISOString(),\n };\n appendTranscriptEntry(key, row);\n });\n }\n\n async saveMessages(key: string, messages: AgentMessage[]): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n const prev = await this.loadTranscriptRows(key);\n const merged = mergeLlmMessagesPreservingContextRows(prev, messages);\n replaceTranscriptRows(key, merged);\n });\n }\n\n getWindowStats(messages: AgentMessage[]) {\n return this.window.getStats(messages);\n }\n\n needsCompaction(key: string, messages: AgentMessage[], contextWindow: number) {\n return this.compactor.needsCompaction(messages, contextWindow);\n }\n\n prepareCompaction(key: string, messages: AgentMessage[], contextWindow: number) {\n const result = this.compactor.needsCompaction(messages, contextWindow);\n return { needsCompaction: result.needed, messages, stats: result };\n }\n\n async applyCompaction(\n key: string,\n messages: AgentMessage[],\n result: CompactionResult,\n ): Promise<AgentMessage[]> {\n const compacted = this.compactor.applyCompaction(messages, result);\n return this.runStoreMutation(async () => {\n const prev = await this.loadTranscriptRows(key);\n const merged = mergeLlmMessagesPreservingContextRows(prev, compacted);\n captureCompactionCheckpoint(key);\n replaceTranscriptRows(key, merged, {\n appendCompaction: {\n at: new Date().toISOString(),\n summary: result.summary,\n firstKeptIndex: result.firstKeptIndex,\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n },\n });\n const metadata = await this.getMetadata(key);\n if (metadata) {\n await this.updateMetadata(key, { compactedCount: metadata.compactedCount + 1 });\n }\n log.info(\n { key, tokensBefore: result.tokensBefore, tokensAfter: result.tokensAfter, keptMessages: compacted.length },\n 'Session compacted',\n );\n await this.injectPostCompactionContext(key);\n return compacted;\n });\n }\n\n async compact(\n key: string,\n messages: AgentMessage[],\n contextWindow: number,\n instructions?: string,\n force?: boolean,\n ): Promise<CompactionResult> {\n void contextWindow;\n const result = await this.compactor.compact(messages, instructions, force);\n if (result.compacted) {\n await this.applyCompaction(key, messages, result);\n }\n return result;\n }\n\n async getCompactionStats(key: string) {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n return undefined;\n }\n return {\n compactionCount: metadata.compactedCount,\n totalTokensBefore: 0,\n totalTokensAfter: 0,\n lastCompactionAt: undefined,\n };\n }\n\n async listCompactionCheckpoints(key: string): Promise<CompactionCheckpointSummary[]> {\n requireXopcDatabase();\n return listCompactionCheckpoints(key);\n }\n\n async getCompactionCheckpointDetail(\n key: string,\n checkpointId: string,\n ): Promise<CompactionCheckpointDetail | null> {\n requireXopcDatabase();\n const id = normalizeCompactionCheckpointId(checkpointId);\n if (!id) {\n return null;\n }\n return getCompactionCheckpointDetail(key, id);\n }\n\n async restoreCompactionCheckpoint(key: string, checkpointId: string): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const id = normalizeCompactionCheckpointId(checkpointId);\n if (!id) {\n throw new Error(`Invalid checkpoint id: ${checkpointId}`);\n }\n restoreCompactionCheckpoint(key, id);\n });\n }\n\n async deleteSession(key: string): Promise<boolean> {\n return this.delete(key);\n }\n\n async load(key: string, options?: { fromArchive?: boolean }): Promise<AgentMessage[]> {\n return this.loadMessages(key, options);\n }\n\n async estimateTokenUsage(_key: string, messages: AgentMessage[]): Promise<number> {\n return this.estimateTokens(messages);\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n const messages = await this.loadDisplayMessages(key);\n const q = keyword.toLowerCase();\n return this.convertMessages(\n messages.filter((m) => this.extractTextContent(this.messageContent(m)).toLowerCase().includes(q)),\n );\n }\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n throw new Error(`Session not found: ${key}`);\n }\n const rows = await this.loadTranscriptRows(key);\n const messages = this.convertMessages(buildSessionContextForLlm(rows));\n const payload: SessionExport = {\n version: INDEX_VERSION,\n exportedAt: new Date().toISOString(),\n metadata,\n messages,\n transcriptRows: rows,\n };\n if (format === 'json') {\n return JSON.stringify(payload, null, 2);\n }\n const lines = [`# ${metadata.name ?? metadata.key}`, '', `Exported: ${payload.exportedAt}`, ''];\n for (const msg of messages) {\n lines.push(`## ${msg.role}`, '', typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content), '');\n }\n return lines.join('\\n');\n }\n\n async getStats(): Promise<GlobalSessionStats> {\n requireXopcDatabase();\n return getGlobalSessionStats();\n }\n\n async archiveOld(olderThanDays: number): Promise<number> {\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - olderThanDays);\n const list = await this.list({ limit: 100_000 });\n let archived = 0;\n for (const session of list.items) {\n if (session.status !== SessionStatus.ARCHIVED && session.status !== SessionStatus.PINNED) {\n const lastAccess = new Date(session.lastAccessedAt);\n if (lastAccess < cutoff) {\n await this.archive(session.key);\n archived++;\n }\n }\n }\n return archived;\n }\n\n estimateTokens(messages: AgentMessage[]): number {\n return estimateTokensFromMessages(messages);\n }\n\n private async loadDisplayMessages(key: string): Promise<AgentMessage[]> {\n requireXopcDatabase();\n const checkpoints = listCompactionCheckpoints(key);\n const rowSets: TranscriptStoredRow[][] = [];\n for (const checkpoint of [...checkpoints].reverse()) {\n rowSets.push(loadCheckpointRows(key, checkpoint.id));\n }\n rowSets.push(await this.loadTranscriptRows(key));\n\n const messages: AgentMessage[] = [];\n const seen = new Set<string>();\n for (const rows of rowSets) {\n for (const message of buildSessionContextForLlm(rows)) {\n if (this.isCompactionSummaryMessage(message)) {\n continue;\n }\n const identity = this.displayMessageIdentity(message);\n if (seen.has(identity)) {\n continue;\n }\n seen.add(identity);\n messages.push(message);\n }\n }\n return messages;\n }\n\n private paginateDisplayMessages(\n messages: AgentMessage[],\n options: {\n offset?: number;\n limit?: number;\n beforeEndIndex?: number;\n } = {},\n ): { messages: AgentMessage[]; total: number; startIndex: number; endIndex: number } {\n const total = messages.length;\n const limit = Math.min(200, Math.max(1, Math.trunc(options.limit ?? 50)));\n const offset = Math.max(0, Math.trunc(options.offset ?? 0));\n\n let startIndex: number;\n let endIndex: number;\n if (options.beforeEndIndex !== undefined && Number.isFinite(options.beforeEndIndex)) {\n endIndex = Math.min(total, Math.max(0, Math.trunc(options.beforeEndIndex)));\n startIndex = Math.max(0, endIndex - limit);\n } else {\n endIndex = Math.max(0, total - offset);\n startIndex = Math.max(0, endIndex - limit);\n }\n\n return {\n messages: messages.slice(startIndex, endIndex),\n total,\n startIndex,\n endIndex,\n };\n }\n\n private displayMessageIdentity(message: AgentMessage): string {\n const record = message as unknown as Record<string, unknown>;\n return JSON.stringify({\n role: message.role,\n timestamp: record.timestamp,\n toolCallId: record.toolCallId ?? record.tool_call_id,\n toolName: record.toolName,\n content: this.messageContent(message),\n });\n }\n\n private messageContent(msg: AgentMessage): unknown {\n return (msg as { content?: unknown }).content;\n }\n\n private isCompactionSummaryMessage(msg: AgentMessage): boolean {\n if (msg.role !== 'user') {\n return false;\n }\n const text = this.extractTextContent(this.messageContent(msg)).trim();\n return /^\\[Previous conversation summary\\]/i.test(text);\n }\n\n private extractTextContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (typeof item !== 'object' || item === null || !('type' in item)) {\n continue;\n }\n const c = item as { type?: string; text?: string; name?: string };\n if (c.type === 'text' && typeof c.text === 'string') {\n parts.push(c.text);\n } else if (c.type === 'toolCall' || c.type === 'tool_use') {\n parts.push(c.name ? `[${c.name}]` : '');\n }\n }\n return parts.join('');\n }\n return '';\n }\n\n private async injectPostCompactionContext(key: string): Promise<void> {\n const contextText = readPostCompactionContext({\n cfg: this.options.config,\n sessionKey: key,\n });\n if (!contextText?.trim()) {\n return;\n }\n try {\n await this.appendTranscriptContextEntry(key, {\n id: `post-compaction-${Date.now()}`,\n text: contextText,\n createdAt: new Date().toISOString(),\n });\n } catch (err) {\n log.warn({ err, key }, 'Post-compaction context injection failed');\n }\n }\n\n private convertMessages(messages: AgentMessage[]): Message[] {\n return messages.map((m: AgentMessage & Record<string, unknown>) => {\n const c = this.messageContent(m);\n const content: string | unknown[] =\n typeof c === 'string' ? c : Array.isArray(c) ? c : this.extractTextContent(c);\n const row: Message = {\n role: m.role as Message['role'],\n content,\n timestamp: m.timestamp ? new Date(m.timestamp as string | number).toISOString() : undefined,\n tool_call_id: (m.tool_call_id as string | undefined) || (m.toolCallId as string | undefined),\n tool_calls: m.tool_calls as Message['tool_calls'],\n name: m.name as string | undefined,\n };\n if (Array.isArray(m.media) && m.media.length > 0) {\n row.media = m.media as Message['media'];\n }\n const rawUsage = m.usage as { input?: number; output?: number; totalTokens?: number; total?: number } | undefined;\n if (rawUsage && typeof rawUsage === 'object') {\n const inputTokens = typeof rawUsage.input === 'number' ? rawUsage.input : undefined;\n const outputTokens = typeof rawUsage.output === 'number' ? rawUsage.output : undefined;\n const totalTokens = typeof rawUsage.totalTokens === 'number'\n ? rawUsage.totalTokens\n : typeof rawUsage.total === 'number'\n ? rawUsage.total\n : undefined;\n if (inputTokens !== undefined || outputTokens !== undefined || totalTokens !== undefined) {\n row.usage = { inputTokens, outputTokens, totalTokens };\n }\n }\n return row;\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","names":[],"sources":["../../../src/session/store.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../config/schema.js';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport { readPostCompactionContext } from '../agent/reply/post-compaction-context.js';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionCompactor, type CompactionConfig, type CompactionResult } from '../agent/memory/compaction.js';\nimport { SlidingWindow, type WindowConfig } from '../agent/memory/window.js';\nimport {\n requireXopcDatabase,\n appendTranscriptEntry,\n captureCompactionCheckpoint,\n deleteSessionRecord,\n ensureSessionRecord,\n estimateTokensFromMessages,\n getCompactionCheckpointDetail,\n getGlobalSessionStats,\n getSessionMetadata,\n listCompactionCheckpoints,\n listSessionMetadata,\n listSessionsByAgent,\n loadCheckpointRows,\n loadLlmMessagesForSession,\n loadTranscriptRowsForSession,\n patchSessionMetadata,\n replaceTranscriptRows,\n resetSessionRecord,\n restoreCompactionCheckpoint,\n} from '../storage/sqlite/index.js';\nimport type { TranscriptCompactionRecord, XopcSessionTranscriptV1 } from './transcript-format.js';\nimport {\n buildSessionContextForLlm,\n mergeLlmMessagesPreservingContextRows,\n transcriptRowsFromJsonArray,\n type TranscriptStoredRow,\n type XopcTranscriptContextEntry,\n type XopcTranscriptCustomMessageEntry,\n type XopcTranscriptCustomStateEntry,\n} from './session-context-for-llm.js';\nimport { normalizeCompactionCheckpointId } from './compaction-checkpoints.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionExport,\n SessionTranscriptSummary,\n CompactionCheckpointSummary,\n CompactionCheckpointDetail,\n} from './types.js';\nimport { SessionStatus } from './types.js';\nimport type { Message } from './types.js';\nimport type { SessionTranscriptUpdate } from './transcript-events.js';\nimport { isAppendOnlyLlmTranscriptMessage } from './transcript-stats.js';\n\nconst log = createLogger('SessionStore');\n\nconst INDEX_VERSION = '1.0';\n\nexport interface SessionStoreOptions {\n config: Config;\n}\n\nexport class SessionStore {\n private window: SlidingWindow;\n private compactor: SessionCompactor;\n\n constructor(\n private options: SessionStoreOptions,\n windowConfig?: Partial<WindowConfig>,\n compactionConfig?: Partial<CompactionConfig>,\n ) {\n this.window = new SlidingWindow(windowConfig);\n this.compactor = new SessionCompactor(compactionConfig);\n }\n\n private resolveWorkspaceCwd(sessionKey: string): string {\n return resolveEffectiveAgentProfileForSession(this.options.config, sessionKey).resolvedWorkspacePath;\n }\n\n private async runStoreMutation<T>(fn: () => Promise<T>): Promise<T> {\n return fn();\n }\n\n async initialize(): Promise<void> {\n requireXopcDatabase();\n log.debug('Session store initialized (SQLite)');\n }\n\n getSessionsRoot(): string {\n return resolveStateDir();\n }\n\n async resolveTranscriptPath(\n sessionKey: string,\n ): Promise<{ sessionId: string; sessionKey: string }> {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(sessionKey);\n const meta = ensureSessionRecord(sessionKey, cwd);\n return { sessionId: meta.transcriptId!, sessionKey };\n }\n\n async appendTranscriptMessage(sessionKey: string, message: AgentMessage): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(sessionKey);\n ensureSessionRecord(sessionKey, cwd);\n appendTranscriptEntry(sessionKey, message);\n });\n }\n\n async getByAgent(agentId: string): Promise<SessionMetadata[]> {\n requireXopcDatabase();\n return listSessionsByAgent(agentId);\n }\n\n async getByAccount(accountId: string): Promise<SessionMetadata[]> {\n const { items } = await this.list({ limit: 100_000 });\n return items.filter((m) => m.routing?.accountId === accountId);\n }\n\n async getByPeer(peerKind: string, peerId: string): Promise<SessionMetadata[]> {\n const { items } = await this.list({ limit: 100_000 });\n return items.filter((m) => m.routing?.peerKind === peerKind && m.routing.peerId === peerId);\n }\n\n async getMainSession(channel: string, accountId: string): Promise<SessionMetadata | null> {\n const { items } = await this.list({ limit: 100_000 });\n return (\n items.find(\n (m) =>\n m.routing?.source === channel &&\n m.routing.accountId === accountId &&\n m.routing.peerKind === 'dm' &&\n m.routing.peerId === 'main',\n ) ?? null\n );\n }\n\n async refreshIndex(): Promise<void> {\n /* no-op: SQLite is authoritative */\n }\n\n async list(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n requireXopcDatabase();\n return listSessionMetadata(query);\n }\n\n async get(\n key: string,\n options?: { includeTranscriptSummary?: boolean; includeTranscriptRows?: boolean },\n ): Promise<SessionDetail | null> {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n return null;\n }\n const messages = await this.loadDisplayMessages(key);\n return this.buildSessionDetail(key, metadata, messages, options);\n }\n\n async getMessagePage(\n key: string,\n options: {\n offset?: number;\n limit?: number;\n before?: string;\n includeTranscriptSummary?: boolean;\n includeTranscriptRows?: boolean;\n } = {},\n ): Promise<{\n session: SessionDetail;\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n before?: string;\n nextBeforeCursor?: string;\n };\n } | null> {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n return null;\n }\n\n const limit = Math.min(200, Math.max(1, Math.trunc(options.limit ?? 50)));\n const offset = Math.max(0, Math.trunc(options.offset ?? 0));\n const parsedBefore = options.before ? Number.parseInt(options.before, 10) : undefined;\n const hasBeforeCursor = parsedBefore !== undefined && Number.isFinite(parsedBefore);\n\n const displayMessages = await this.loadDisplayMessages(key);\n const page = this.paginateDisplayMessages(displayMessages, {\n limit,\n offset: hasBeforeCursor ? undefined : offset,\n beforeEndIndex: hasBeforeCursor ? parsedBefore : undefined,\n });\n\n const session = await this.buildSessionDetail(key, metadata, page.messages, options);\n const nextBeforeCursor = page.startIndex > 0 ? String(page.startIndex) : undefined;\n\n return {\n session,\n pagination: {\n total: page.total,\n limit,\n offset,\n hasMore: hasBeforeCursor ? page.startIndex > 0 : offset + limit < page.total,\n ...(hasBeforeCursor ? { before: String(page.endIndex) } : {}),\n ...(nextBeforeCursor ? { nextBeforeCursor } : {}),\n },\n };\n }\n\n private async buildSessionDetail(\n key: string,\n metadata: SessionMetadata,\n messages: AgentMessage[],\n options?: { includeTranscriptSummary?: boolean; includeTranscriptRows?: boolean },\n ): Promise<SessionDetail> {\n let transcriptSummary: SessionTranscriptSummary | undefined;\n if (options?.includeTranscriptSummary) {\n const env = await this.loadTranscriptDocument(key);\n if (env) {\n transcriptSummary = {\n id: env.id,\n version: env.version,\n createdAt: env.createdAt,\n updatedAt: env.updatedAt,\n compactionCount: env.compactions?.length ?? 0,\n };\n }\n }\n let transcriptRows: TranscriptStoredRow[] | undefined;\n if (options?.includeTranscriptRows) {\n transcriptRows = await this.loadTranscriptRows(key);\n }\n return {\n ...metadata,\n messages: this.convertMessages(messages),\n ...(transcriptSummary ? { transcriptSummary } : {}),\n ...(transcriptRows !== undefined ? { transcriptRows } : {}),\n };\n }\n\n async loadTranscriptRows(key: string): Promise<TranscriptStoredRow[]> {\n requireXopcDatabase();\n return loadTranscriptRowsForSession(key);\n }\n\n async getMetadata(key: string): Promise<SessionMetadata | null> {\n requireXopcDatabase();\n return getSessionMetadata(key);\n }\n\n async updateMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n patchSessionMetadata(key, updates);\n log.debug({ key, updates }, 'Session metadata updated');\n });\n }\n\n async reset(key: string): Promise<{ sessionId: string; previousSessionId: string } | null> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n const outcome = resetSessionRecord(key, cwd);\n if (outcome) {\n log.info({ key, ...outcome }, 'Session reset');\n }\n return outcome;\n });\n }\n\n async delete(key: string): Promise<boolean> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const ok = deleteSessionRecord(key);\n if (ok) {\n log.info({ key }, 'Session deleted');\n }\n return ok;\n });\n }\n\n async deleteMany(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const success: string[] = [];\n const failed: string[] = [];\n for (const key of keys) {\n try {\n if (await this.delete(key)) {\n success.push(key);\n } else {\n failed.push(key);\n }\n } catch {\n failed.push(key);\n }\n }\n return { success, failed };\n }\n\n async setStatus(key: string, status: SessionStatus): Promise<void> {\n await this.updateMetadata(key, { status });\n }\n\n async archive(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.ARCHIVED);\n }\n\n async unarchive(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.ACTIVE);\n }\n\n async pin(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.PINNED);\n }\n\n async unpin(key: string): Promise<void> {\n await this.setStatus(key, SessionStatus.ACTIVE);\n }\n\n async loadMessages(_key: string, _options?: { fromArchive?: boolean }): Promise<AgentMessage[]> {\n requireXopcDatabase();\n return loadLlmMessagesForSession(_key);\n }\n\n async loadTranscriptDocument(key: string): Promise<XopcSessionTranscriptV1 | null> {\n const metadata = await this.getMetadata(key);\n if (!metadata?.transcriptId) {\n return null;\n }\n const rows = await this.loadTranscriptRows(key);\n const compactions: TranscriptCompactionRecord[] = [];\n for (const row of rows) {\n if ((row as { type?: string }).type === 'compaction') {\n const c = row as unknown as TranscriptCompactionRecord & { type: 'compaction' };\n compactions.push({\n at: c.at ?? new Date().toISOString(),\n summary: c.summary ?? '',\n firstKeptIndex: Number(c.firstKeptIndex ?? 0),\n tokensBefore: c.tokensBefore ?? 0,\n tokensAfter: (c as { tokensAfter?: number }).tokensAfter ?? 0,\n });\n }\n }\n return {\n type: 'xopc_session_transcript',\n version: 1,\n id: metadata.transcriptId,\n createdAt: metadata.createdAt,\n updatedAt: metadata.updatedAt,\n messages: rows,\n ...(compactions.length > 0 ? { compactions } : {}),\n };\n }\n\n async syncEmbeddedTranscriptUpdate(update: SessionTranscriptUpdate): Promise<void> {\n const sessionKey = update.sessionKey?.trim();\n if (!sessionKey) {\n return;\n }\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(sessionKey);\n ensureSessionRecord(sessionKey, cwd);\n\n if (update.message && isAppendOnlyLlmTranscriptMessage(update.message)) {\n appendTranscriptEntry(sessionKey, update.message as AgentMessage);\n }\n });\n }\n\n async appendTranscriptContextEntry(\n key: string,\n entry: Omit<XopcTranscriptContextEntry, 'kind'> & Partial<Pick<XopcTranscriptContextEntry, 'kind'>>,\n ): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n const row: XopcTranscriptContextEntry = {\n kind: 'context',\n id: typeof entry.id === 'string' ? entry.id : undefined,\n text: typeof entry.text === 'string' ? entry.text : undefined,\n data: entry.data,\n createdAt: entry.createdAt ?? new Date().toISOString(),\n };\n appendTranscriptEntry(key, row);\n });\n }\n\n async appendTranscriptLabelEntry(\n key: string,\n entry: { targetId: string; label?: string },\n ): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n appendTranscriptEntry(key, {\n type: 'label',\n targetId: entry.targetId,\n label: entry.label?.trim() || undefined,\n timestamp: new Date().toISOString(),\n });\n });\n }\n\n async appendTranscriptCustomEntry(\n key: string,\n entry: { customType: string; data?: unknown },\n ): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n const row: XopcTranscriptCustomStateEntry = {\n type: 'custom',\n customType: entry.customType.trim(),\n data: entry.data,\n timestamp: new Date().toISOString(),\n };\n appendTranscriptEntry(key, row);\n });\n }\n\n async appendTranscriptCustomMessageEntry(\n key: string,\n entry: {\n customType: string;\n content?: string | unknown[];\n display?: boolean;\n details?: unknown;\n },\n ): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n const row: XopcTranscriptCustomMessageEntry = {\n role: 'custom',\n customType: entry.customType.trim(),\n content: entry.content ?? '',\n display: entry.display ?? true,\n details: entry.details,\n timestamp: Date.now(),\n };\n appendTranscriptEntry(key, row);\n });\n }\n\n async appendTranscriptBashExecutionEntry(\n key: string,\n entry: {\n command: string;\n output?: string;\n exitCode?: number | null;\n signal?: string | null;\n excludeFromContext?: boolean;\n truncated?: boolean;\n fullOutputPath?: string;\n },\n ): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n appendTranscriptEntry(key, {\n role: 'bashExecution',\n command: entry.command,\n output: entry.output ?? '',\n exitCode: entry.exitCode ?? null,\n signal: entry.signal ?? null,\n excludeFromContext: entry.excludeFromContext === true,\n truncated: entry.truncated === true,\n fullOutputPath: entry.fullOutputPath,\n timestamp: Date.now(),\n });\n });\n }\n\n async saveMessages(key: string, messages: AgentMessage[]): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const cwd = this.resolveWorkspaceCwd(key);\n ensureSessionRecord(key, cwd);\n const prev = await this.loadTranscriptRows(key);\n const merged = mergeLlmMessagesPreservingContextRows(prev, messages);\n replaceTranscriptRows(key, merged);\n });\n }\n\n getWindowStats(messages: AgentMessage[]) {\n return this.window.getStats(messages);\n }\n\n needsCompaction(key: string, messages: AgentMessage[], contextWindow: number) {\n return this.compactor.needsCompaction(messages, contextWindow);\n }\n\n prepareCompaction(key: string, messages: AgentMessage[], contextWindow: number) {\n const result = this.compactor.needsCompaction(messages, contextWindow);\n return { needsCompaction: result.needed, messages, stats: result };\n }\n\n async applyCompaction(\n key: string,\n messages: AgentMessage[],\n result: CompactionResult,\n ): Promise<AgentMessage[]> {\n const compacted = this.compactor.applyCompaction(messages, result);\n return this.runStoreMutation(async () => {\n const prev = await this.loadTranscriptRows(key);\n const merged = mergeLlmMessagesPreservingContextRows(prev, compacted);\n captureCompactionCheckpoint(key);\n replaceTranscriptRows(key, merged, {\n appendCompaction: {\n at: new Date().toISOString(),\n summary: result.summary,\n firstKeptIndex: result.firstKeptIndex,\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n },\n });\n const metadata = await this.getMetadata(key);\n if (metadata) {\n await this.updateMetadata(key, { compactedCount: metadata.compactedCount + 1 });\n }\n log.info(\n { key, tokensBefore: result.tokensBefore, tokensAfter: result.tokensAfter, keptMessages: compacted.length },\n 'Session compacted',\n );\n await this.injectPostCompactionContext(key);\n return compacted;\n });\n }\n\n async compact(\n key: string,\n messages: AgentMessage[],\n contextWindow: number,\n instructions?: string,\n force?: boolean,\n ): Promise<CompactionResult> {\n void contextWindow;\n const result = await this.compactor.compact(messages, instructions, force);\n if (result.compacted) {\n await this.applyCompaction(key, messages, result);\n }\n return result;\n }\n\n async getCompactionStats(key: string) {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n return undefined;\n }\n return {\n compactionCount: metadata.compactedCount,\n totalTokensBefore: 0,\n totalTokensAfter: 0,\n lastCompactionAt: undefined,\n };\n }\n\n async listCompactionCheckpoints(key: string): Promise<CompactionCheckpointSummary[]> {\n requireXopcDatabase();\n return listCompactionCheckpoints(key);\n }\n\n async getCompactionCheckpointDetail(\n key: string,\n checkpointId: string,\n ): Promise<CompactionCheckpointDetail | null> {\n requireXopcDatabase();\n const id = normalizeCompactionCheckpointId(checkpointId);\n if (!id) {\n return null;\n }\n return getCompactionCheckpointDetail(key, id);\n }\n\n async restoreCompactionCheckpoint(key: string, checkpointId: string): Promise<void> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const id = normalizeCompactionCheckpointId(checkpointId);\n if (!id) {\n throw new Error(`Invalid checkpoint id: ${checkpointId}`);\n }\n restoreCompactionCheckpoint(key, id);\n });\n }\n\n async deleteSession(key: string): Promise<boolean> {\n return this.delete(key);\n }\n\n async load(key: string, options?: { fromArchive?: boolean }): Promise<AgentMessage[]> {\n return this.loadMessages(key, options);\n }\n\n async estimateTokenUsage(_key: string, messages: AgentMessage[]): Promise<number> {\n return this.estimateTokens(messages);\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n const messages = await this.loadDisplayMessages(key);\n const q = keyword.toLowerCase();\n return this.convertMessages(\n messages.filter((m) => this.extractTextContent(this.messageContent(m)).toLowerCase().includes(q)),\n );\n }\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n const metadata = await this.getMetadata(key);\n if (!metadata) {\n throw new Error(`Session not found: ${key}`);\n }\n const rows = await this.loadTranscriptRows(key);\n const messages = this.convertMessages(buildSessionContextForLlm(rows));\n const payload: SessionExport = {\n version: INDEX_VERSION,\n exportedAt: new Date().toISOString(),\n metadata,\n messages,\n transcriptRows: rows,\n };\n if (format === 'json') {\n return JSON.stringify(payload, null, 2);\n }\n const lines = [`# ${metadata.name ?? metadata.key}`, '', `Exported: ${payload.exportedAt}`, ''];\n for (const msg of messages) {\n lines.push(`## ${msg.role}`, '', typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content), '');\n }\n return lines.join('\\n');\n }\n\n async importSessionExport(\n targetKey: string,\n jsonContent: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const existing = await this.getMetadata(targetKey);\n if (existing) {\n throw new Error(`Target session already exists: ${targetKey}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonContent);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid session export JSON: ${errorMessage}`);\n }\n\n const record = parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : {};\n const rowsSource = Array.isArray(record.transcriptRows) ? record.transcriptRows : undefined;\n const rows = rowsSource ? transcriptRowsFromJsonArray(rowsSource) : [];\n if (rows.length === 0) {\n throw new Error('Session export contains no importable transcript rows');\n }\n\n const cwd = this.resolveWorkspaceCwd(targetKey);\n ensureSessionRecord(targetKey, cwd);\n replaceTranscriptRows(targetKey, rows);\n\n const metadata = record.metadata && typeof record.metadata === 'object'\n ? record.metadata as Partial<SessionMetadata>\n : {};\n const sourceKey = typeof metadata.key === 'string' ? metadata.key : undefined;\n const sourceName = typeof metadata.name === 'string' ? metadata.name.trim() : '';\n patchSessionMetadata(targetKey, {\n name: sourceName ? `Import of ${sourceName}` : 'Imported session',\n tags: [...new Set([...(Array.isArray(metadata.tags) ? metadata.tags.filter((tag): tag is string => typeof tag === 'string') : []), 'import'])],\n customData: {\n ...(metadata.customData && typeof metadata.customData === 'object'\n ? metadata.customData as Record<string, unknown>\n : {}),\n ...(sourceKey ? { importedFromSessionKey: sourceKey } : {}),\n importedAt: new Date().toISOString(),\n },\n });\n return { sessionKey: targetKey, rowCount: rows.length };\n });\n }\n\n async forkSession(\n sourceKey: string,\n targetKey: string,\n ): Promise<{ sessionKey: string; rowCount: number }> {\n return this.forkSessionRows(sourceKey, targetKey);\n }\n\n async forkSessionRows(\n sourceKey: string,\n targetKey: string,\n options: { throughRow?: number } = {},\n ): Promise<{ sessionKey: string; rowCount: number }> {\n return this.runStoreMutation(async () => {\n requireXopcDatabase();\n const sourceMetadata = await this.getMetadata(sourceKey);\n if (!sourceMetadata) {\n throw new Error(`Session not found: ${sourceKey}`);\n }\n const existing = await this.getMetadata(targetKey);\n if (existing) {\n throw new Error(`Target session already exists: ${targetKey}`);\n }\n const rows = await this.loadTranscriptRows(sourceKey);\n if (\n options.throughRow !== undefined &&\n (options.throughRow < 1 || options.throughRow > rows.length)\n ) {\n throw new Error(`Invalid fork row: ${options.throughRow}`);\n }\n const selectedRows =\n options.throughRow === undefined ? rows : rows.slice(0, Math.max(0, Math.trunc(options.throughRow)));\n const cwd = this.resolveWorkspaceCwd(targetKey);\n ensureSessionRecord(targetKey, cwd);\n replaceTranscriptRows(targetKey, selectedRows);\n const label = sourceMetadata.name?.trim() || sourceKey;\n patchSessionMetadata(targetKey, {\n name: `Fork of ${label}`,\n tags: [...new Set([...(sourceMetadata.tags ?? []), 'fork'])],\n customData: {\n ...(sourceMetadata.customData ?? {}),\n forkedFromSessionKey: sourceKey,\n forkedFromTranscriptId: sourceMetadata.transcriptId,\n ...(options.throughRow !== undefined ? { forkedFromRow: selectedRows.length } : {}),\n forkedAt: new Date().toISOString(),\n },\n });\n return { sessionKey: targetKey, rowCount: selectedRows.length };\n });\n }\n\n async getStats(): Promise<GlobalSessionStats> {\n requireXopcDatabase();\n return getGlobalSessionStats();\n }\n\n async archiveOld(olderThanDays: number): Promise<number> {\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - olderThanDays);\n const list = await this.list({ limit: 100_000 });\n let archived = 0;\n for (const session of list.items) {\n if (session.status !== SessionStatus.ARCHIVED && session.status !== SessionStatus.PINNED) {\n const lastAccess = new Date(session.lastAccessedAt);\n if (lastAccess < cutoff) {\n await this.archive(session.key);\n archived++;\n }\n }\n }\n return archived;\n }\n\n estimateTokens(messages: AgentMessage[]): number {\n return estimateTokensFromMessages(messages);\n }\n\n private async loadDisplayMessages(key: string): Promise<AgentMessage[]> {\n requireXopcDatabase();\n const checkpoints = listCompactionCheckpoints(key);\n const rowSets: TranscriptStoredRow[][] = [];\n for (const checkpoint of [...checkpoints].reverse()) {\n rowSets.push(loadCheckpointRows(key, checkpoint.id));\n }\n rowSets.push(await this.loadTranscriptRows(key));\n\n const messages: AgentMessage[] = [];\n const seen = new Set<string>();\n for (const rows of rowSets) {\n for (const message of buildSessionContextForLlm(rows)) {\n if (this.isCompactionSummaryMessage(message)) {\n continue;\n }\n const identity = this.displayMessageIdentity(message);\n if (seen.has(identity)) {\n continue;\n }\n seen.add(identity);\n messages.push(message);\n }\n }\n return messages;\n }\n\n private paginateDisplayMessages(\n messages: AgentMessage[],\n options: {\n offset?: number;\n limit?: number;\n beforeEndIndex?: number;\n } = {},\n ): { messages: AgentMessage[]; total: number; startIndex: number; endIndex: number } {\n const total = messages.length;\n const limit = Math.min(200, Math.max(1, Math.trunc(options.limit ?? 50)));\n const offset = Math.max(0, Math.trunc(options.offset ?? 0));\n\n let startIndex: number;\n let endIndex: number;\n if (options.beforeEndIndex !== undefined && Number.isFinite(options.beforeEndIndex)) {\n endIndex = Math.min(total, Math.max(0, Math.trunc(options.beforeEndIndex)));\n startIndex = Math.max(0, endIndex - limit);\n } else {\n endIndex = Math.max(0, total - offset);\n startIndex = Math.max(0, endIndex - limit);\n }\n\n return {\n messages: messages.slice(startIndex, endIndex),\n total,\n startIndex,\n endIndex,\n };\n }\n\n private displayMessageIdentity(message: AgentMessage): string {\n const record = message as unknown as Record<string, unknown>;\n return JSON.stringify({\n role: message.role,\n timestamp: record.timestamp,\n toolCallId: record.toolCallId ?? record.tool_call_id,\n toolName: record.toolName,\n content: this.messageContent(message),\n });\n }\n\n private messageContent(msg: AgentMessage): unknown {\n return (msg as { content?: unknown }).content;\n }\n\n private isCompactionSummaryMessage(msg: AgentMessage): boolean {\n if (msg.role !== 'user') {\n return false;\n }\n const text = this.extractTextContent(this.messageContent(msg)).trim();\n return /^\\[Previous conversation summary\\]/i.test(text);\n }\n\n private extractTextContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (typeof item !== 'object' || item === null || !('type' in item)) {\n continue;\n }\n const c = item as { type?: string; text?: string; name?: string };\n if (c.type === 'text' && typeof c.text === 'string') {\n parts.push(c.text);\n } else if (c.type === 'toolCall' || c.type === 'tool_use') {\n parts.push(c.name ? `[${c.name}]` : '');\n }\n }\n return parts.join('');\n }\n return '';\n }\n\n private async injectPostCompactionContext(key: string): Promise<void> {\n const contextText = readPostCompactionContext({\n cfg: this.options.config,\n sessionKey: key,\n });\n if (!contextText?.trim()) {\n return;\n }\n try {\n await this.appendTranscriptContextEntry(key, {\n id: `post-compaction-${Date.now()}`,\n text: contextText,\n createdAt: new Date().toISOString(),\n });\n } catch (err) {\n log.warn({ err, key }, 'Post-compaction context injection failed');\n }\n }\n\n private convertMessages(messages: AgentMessage[]): Message[] {\n return messages.map((m: AgentMessage & Record<string, unknown>) => {\n const c = this.messageContent(m);\n const content: string | unknown[] =\n typeof c === 'string' ? c : Array.isArray(c) ? c : this.extractTextContent(c);\n const row: Message = {\n role: m.role as Message['role'],\n content,\n timestamp: m.timestamp ? new Date(m.timestamp as string | number).toISOString() : undefined,\n tool_call_id: (m.tool_call_id as string | undefined) || (m.toolCallId as string | undefined),\n tool_calls: m.tool_calls as Message['tool_calls'],\n name: m.name as string | undefined,\n };\n if (Array.isArray(m.media) && m.media.length > 0) {\n row.media = m.media as Message['media'];\n }\n const rawUsage = m.usage as {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n totalTokens?: number;\n total?: number;\n } | undefined;\n if (rawUsage && typeof rawUsage === 'object') {\n const inputTokens = typeof rawUsage.input === 'number' ? rawUsage.input : undefined;\n const outputTokens = typeof rawUsage.output === 'number' ? rawUsage.output : undefined;\n const cacheReadTokens = typeof rawUsage.cacheRead === 'number' ? rawUsage.cacheRead : undefined;\n const cacheWriteTokens = typeof rawUsage.cacheWrite === 'number' ? rawUsage.cacheWrite : undefined;\n const totalTokens = typeof rawUsage.totalTokens === 'number'\n ? rawUsage.totalTokens\n : typeof rawUsage.total === 'number'\n ? rawUsage.total\n : undefined;\n if (\n inputTokens !== undefined ||\n outputTokens !== undefined ||\n cacheReadTokens !== undefined ||\n cacheWriteTokens !== undefined ||\n totalTokens !== undefined\n ) {\n row.usage = {\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheWriteTokens,\n totalTokens,\n };\n }\n }\n return row;\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isTranscriptContextEntry } from "./session-context-for-llm.js";
|
|
1
|
+
import { isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptCustomStateEntry } from "./session-context-for-llm.js";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { CURRENT_SESSION_VERSION } from "@earendil-works/pi-coding-agent";
|
|
4
4
|
//#region src/session/stored-rows-to-file-entries.ts
|
|
@@ -26,6 +26,28 @@ function contextRowToCustomEntry(row, parentId, byId) {
|
|
|
26
26
|
}
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
+
function customStateRowToCustomEntry(row, parentId, byId) {
|
|
30
|
+
return {
|
|
31
|
+
type: "custom",
|
|
32
|
+
customType: row.customType?.trim() || "xopc:custom",
|
|
33
|
+
id: generateShortId(byId),
|
|
34
|
+
parentId,
|
|
35
|
+
timestamp: typeof row.timestamp === "string" ? row.timestamp : (/* @__PURE__ */ new Date()).toISOString(),
|
|
36
|
+
data: row.data
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function customMessageRowToEntry(row, parentId, byId) {
|
|
40
|
+
return {
|
|
41
|
+
type: "custom_message",
|
|
42
|
+
customType: row.customType?.trim() || "xopc:custom-message",
|
|
43
|
+
id: generateShortId(byId),
|
|
44
|
+
parentId,
|
|
45
|
+
timestamp: typeof row.timestamp === "string" ? row.timestamp : typeof row.timestamp === "number" ? new Date(row.timestamp).toISOString() : (/* @__PURE__ */ new Date()).toISOString(),
|
|
46
|
+
content: typeof row.content === "string" || Array.isArray(row.content) ? row.content : "",
|
|
47
|
+
display: row.display ?? true,
|
|
48
|
+
details: row.details
|
|
49
|
+
};
|
|
50
|
+
}
|
|
29
51
|
function compactionRecordToEntry(rec, parentId, byId) {
|
|
30
52
|
return {
|
|
31
53
|
type: "compaction",
|
|
@@ -70,6 +92,20 @@ function storedRowsToFileEntries(params) {
|
|
|
70
92
|
parentId = entry.id;
|
|
71
93
|
continue;
|
|
72
94
|
}
|
|
95
|
+
if (isTranscriptCustomStateEntry(row)) {
|
|
96
|
+
const entry = customStateRowToCustomEntry(row, parentId, byId);
|
|
97
|
+
byId.add(entry.id);
|
|
98
|
+
entries.push(entry);
|
|
99
|
+
parentId = entry.id;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (isTranscriptCustomMessageEntry(row)) {
|
|
103
|
+
const entry = customMessageRowToEntry(row, parentId, byId);
|
|
104
|
+
byId.add(entry.id);
|
|
105
|
+
entries.push(entry);
|
|
106
|
+
parentId = entry.id;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
73
109
|
if (row.type === "compaction") {
|
|
74
110
|
const entry = compactionRecordToEntry(row, parentId, byId);
|
|
75
111
|
byId.add(entry.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stored-rows-to-file-entries.js","names":[],"sources":["../../../src/session/stored-rows-to-file-entries.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport {\n CURRENT_SESSION_VERSION,\n type CompactionEntry,\n type CustomEntry,\n type FileEntry,\n type SessionMessageEntry,\n} from '@earendil-works/pi-coding-agent';\n\nimport type { TranscriptCompactionRecord } from './transcript-format.js';\nimport {\n isTranscriptContextEntry,\n type TranscriptStoredRow,\n type XopcTranscriptContextEntry,\n} from './session-context-for-llm.js';\n\nexport const XOPC_CONTEXT_CUSTOM_TYPE = 'xopc:transcript-row';\n\nfunction generateShortId(byId: Set<string>): string {\n for (let i = 0; i < 100; i++) {\n const id = randomUUID().slice(0, 8);\n if (!byId.has(id)) {\n return id;\n }\n }\n return randomUUID();\n}\n\nfunction contextRowToCustomEntry(\n row: XopcTranscriptContextEntry,\n parentId: string | null,\n byId: Set<string>,\n): CustomEntry {\n return {\n type: 'custom',\n customType: XOPC_CONTEXT_CUSTOM_TYPE,\n id: generateShortId(byId),\n parentId,\n timestamp: row.createdAt ?? new Date().toISOString(),\n data: {\n kind: 'context',\n id: row.id,\n text: row.text,\n data: row.data,\n createdAt: row.createdAt,\n },\n };\n}\n\nfunction compactionRecordToEntry(\n rec: TranscriptCompactionRecord,\n parentId: string | null,\n byId: Set<string>,\n): CompactionEntry {\n return {\n type: 'compaction',\n id: generateShortId(byId),\n parentId,\n timestamp: rec.at,\n summary: rec.summary,\n firstKeptEntryId: String(rec.firstKeptIndex),\n tokensBefore: rec.tokensBefore,\n details: { tokensAfter: rec.tokensAfter, xopc: true },\n fromHook: true,\n };\n}\n\nfunction agentMessageToEntry(\n msg: AgentMessage,\n parentId: string | null,\n byId: Set<string>,\n): SessionMessageEntry {\n return {\n type: 'message',\n id: generateShortId(byId),\n parentId,\n timestamp: new Date().toISOString(),\n message: msg,\n };\n}\n\n/** Convert SQLite transcript rows into pi-coding-agent JSONL file entries (header + tree). */\nexport function storedRowsToFileEntries(params: {\n sessionId: string;\n cwd: string;\n rows: TranscriptStoredRow[];\n appendCompaction?: TranscriptCompactionRecord;\n}): FileEntry[] {\n const byId = new Set<string>();\n const entries: FileEntry[] = [\n {\n type: 'session',\n version: CURRENT_SESSION_VERSION,\n id: params.sessionId,\n timestamp: new Date().toISOString(),\n cwd: params.cwd,\n },\n ];\n\n let parentId: string | null = null;\n for (const row of params.rows) {\n if (isTranscriptContextEntry(row)) {\n const entry = contextRowToCustomEntry(row, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n continue;\n }\n if ((row as { type?: string }).type === 'compaction') {\n const entry = compactionRecordToEntry(row as unknown as TranscriptCompactionRecord, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n continue;\n }\n const entry = agentMessageToEntry(row as AgentMessage, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n }\n\n if (params.appendCompaction) {\n const entry = compactionRecordToEntry(params.appendCompaction, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n }\n\n return entries;\n}\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"stored-rows-to-file-entries.js","names":[],"sources":["../../../src/session/stored-rows-to-file-entries.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport {\n CURRENT_SESSION_VERSION,\n type CompactionEntry,\n type CustomEntry,\n type CustomMessageEntry,\n type FileEntry,\n type SessionMessageEntry,\n} from '@earendil-works/pi-coding-agent';\n\nimport type { TranscriptCompactionRecord } from './transcript-format.js';\nimport {\n isTranscriptContextEntry,\n isTranscriptCustomMessageEntry,\n isTranscriptCustomStateEntry,\n type TranscriptStoredRow,\n type XopcTranscriptContextEntry,\n type XopcTranscriptCustomMessageEntry,\n type XopcTranscriptCustomMessageFileEntry,\n type XopcTranscriptCustomStateEntry,\n} from './session-context-for-llm.js';\n\nexport const XOPC_CONTEXT_CUSTOM_TYPE = 'xopc:transcript-row';\n\nfunction generateShortId(byId: Set<string>): string {\n for (let i = 0; i < 100; i++) {\n const id = randomUUID().slice(0, 8);\n if (!byId.has(id)) {\n return id;\n }\n }\n return randomUUID();\n}\n\nfunction contextRowToCustomEntry(\n row: XopcTranscriptContextEntry,\n parentId: string | null,\n byId: Set<string>,\n): CustomEntry {\n return {\n type: 'custom',\n customType: XOPC_CONTEXT_CUSTOM_TYPE,\n id: generateShortId(byId),\n parentId,\n timestamp: row.createdAt ?? new Date().toISOString(),\n data: {\n kind: 'context',\n id: row.id,\n text: row.text,\n data: row.data,\n createdAt: row.createdAt,\n },\n };\n}\n\nfunction customStateRowToCustomEntry(\n row: XopcTranscriptCustomStateEntry,\n parentId: string | null,\n byId: Set<string>,\n): CustomEntry {\n return {\n type: 'custom',\n customType: row.customType?.trim() || 'xopc:custom',\n id: generateShortId(byId),\n parentId,\n timestamp: typeof row.timestamp === 'string' ? row.timestamp : new Date().toISOString(),\n data: row.data,\n };\n}\n\nfunction customMessageRowToEntry(\n row: XopcTranscriptCustomMessageEntry | XopcTranscriptCustomMessageFileEntry,\n parentId: string | null,\n byId: Set<string>,\n): CustomMessageEntry {\n return {\n type: 'custom_message',\n customType: row.customType?.trim() || 'xopc:custom-message',\n id: generateShortId(byId),\n parentId,\n timestamp: typeof row.timestamp === 'string'\n ? row.timestamp\n : typeof row.timestamp === 'number'\n ? new Date(row.timestamp).toISOString()\n : new Date().toISOString(),\n content: typeof row.content === 'string' || Array.isArray(row.content)\n ? row.content as CustomMessageEntry['content']\n : '',\n display: row.display ?? true,\n details: row.details,\n };\n}\n\nfunction compactionRecordToEntry(\n rec: TranscriptCompactionRecord,\n parentId: string | null,\n byId: Set<string>,\n): CompactionEntry {\n return {\n type: 'compaction',\n id: generateShortId(byId),\n parentId,\n timestamp: rec.at,\n summary: rec.summary,\n firstKeptEntryId: String(rec.firstKeptIndex),\n tokensBefore: rec.tokensBefore,\n details: { tokensAfter: rec.tokensAfter, xopc: true },\n fromHook: true,\n };\n}\n\nfunction agentMessageToEntry(\n msg: AgentMessage,\n parentId: string | null,\n byId: Set<string>,\n): SessionMessageEntry {\n return {\n type: 'message',\n id: generateShortId(byId),\n parentId,\n timestamp: new Date().toISOString(),\n message: msg,\n };\n}\n\n/** Convert SQLite transcript rows into pi-coding-agent JSONL file entries (header + tree). */\nexport function storedRowsToFileEntries(params: {\n sessionId: string;\n cwd: string;\n rows: TranscriptStoredRow[];\n appendCompaction?: TranscriptCompactionRecord;\n}): FileEntry[] {\n const byId = new Set<string>();\n const entries: FileEntry[] = [\n {\n type: 'session',\n version: CURRENT_SESSION_VERSION,\n id: params.sessionId,\n timestamp: new Date().toISOString(),\n cwd: params.cwd,\n },\n ];\n\n let parentId: string | null = null;\n for (const row of params.rows) {\n if (isTranscriptContextEntry(row)) {\n const entry = contextRowToCustomEntry(row, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n continue;\n }\n if (isTranscriptCustomStateEntry(row)) {\n const entry = customStateRowToCustomEntry(row, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n continue;\n }\n if (isTranscriptCustomMessageEntry(row)) {\n const entry = customMessageRowToEntry(row, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n continue;\n }\n if ((row as { type?: string }).type === 'compaction') {\n const entry = compactionRecordToEntry(row as unknown as TranscriptCompactionRecord, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n continue;\n }\n const entry = agentMessageToEntry(row as AgentMessage, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n parentId = entry.id;\n }\n\n if (params.appendCompaction) {\n const entry = compactionRecordToEntry(params.appendCompaction, parentId, byId);\n byId.add(entry.id);\n entries.push(entry);\n }\n\n return entries;\n}\n"],"mappings":"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"}
|
|
@@ -21,6 +21,8 @@ export interface Message {
|
|
|
21
21
|
usage?: {
|
|
22
22
|
inputTokens?: number;
|
|
23
23
|
outputTokens?: number;
|
|
24
|
+
cacheReadTokens?: number;
|
|
25
|
+
cacheWriteTokens?: number;
|
|
24
26
|
totalTokens?: number;
|
|
25
27
|
};
|
|
26
28
|
/** Inbound attachment metadata (no base64). */
|
|
@@ -73,6 +75,7 @@ export interface GlobalSessionStats {
|
|
|
73
75
|
newestSession?: string;
|
|
74
76
|
byChannel: Record<string, number>;
|
|
75
77
|
}
|
|
78
|
+
export type SessionType = 'chat' | 'workflow-run' | 'workflow-subagent' | 'cron' | 'heartbeat';
|
|
76
79
|
/** Session metadata (stored in index) */
|
|
77
80
|
export interface SessionMetadata {
|
|
78
81
|
key: string;
|
|
@@ -98,11 +101,19 @@ export interface SessionMetadata {
|
|
|
98
101
|
* High-level origin for filtering/UI (e.g. `cron`, `heartbeat`, `webchat`).
|
|
99
102
|
* Distinct from `sourceChannel` (routing namespace).
|
|
100
103
|
*/
|
|
101
|
-
sessionType
|
|
104
|
+
sessionType: SessionType;
|
|
105
|
+
hiddenFromSessionList?: boolean;
|
|
106
|
+
parentSessionKey?: string;
|
|
107
|
+
workflowRunId?: string;
|
|
108
|
+
workflowDefinitionId?: string;
|
|
109
|
+
workflowAgentId?: string;
|
|
110
|
+
workflowAgentLabel?: string;
|
|
102
111
|
/**
|
|
103
112
|
* Stable transcript document id (wrapped on-disk format), aligned with OpenClaw `sessionId`.
|
|
104
113
|
*/
|
|
105
114
|
transcriptId?: string;
|
|
115
|
+
/** Workspace/cwd recorded for the active transcript. */
|
|
116
|
+
cwd?: string;
|
|
106
117
|
/** First activity time for this session row (ISO), from transcript header when available. */
|
|
107
118
|
sessionStartedAt?: string;
|
|
108
119
|
/** Last transcript write / interaction (ISO), updated on each persist. */
|
|
@@ -136,6 +147,8 @@ export interface SessionListQuery {
|
|
|
136
147
|
channel?: string;
|
|
137
148
|
tags?: string[];
|
|
138
149
|
search?: string;
|
|
150
|
+
sessionTypes?: SessionType[];
|
|
151
|
+
includeHidden?: boolean;
|
|
139
152
|
sortBy?: 'updatedAt' | 'createdAt' | 'messageCount' | 'lastAccessedAt';
|
|
140
153
|
sortOrder?: 'asc' | 'desc';
|
|
141
154
|
limit?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/session/types.ts"],"sourcesContent":["// Session management types\n\nimport type { TranscriptStoredRow } from './session-context-for-llm.js';\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant' | 'tool' | 'toolResult';\n /** Plain string or structured content blocks (tool calls, multimodal). */\n content: string | unknown[];\n timestamp?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_call_id$?: string;\n toolName?: string;\n isError?: boolean;\n name?: string;\n /** Token usage from the LLM response (assistant messages only). */\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n /** Inbound attachment metadata (no base64). */\n media?: Array<{\n id: string;\n bucket: string;\n type: string;\n mimeType: string;\n name: string;\n size: number;\n uri: string;\n path: string;\n }>;\n}\n\n/** Session status enum */\nexport enum SessionStatus {\n ACTIVE = 'active',\n IDLE = 'idle',\n ARCHIVED = 'archived',\n PINNED = 'pinned',\n}\n\n/** Session routing metadata */\nexport interface SessionRoutingMeta {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n mainSessionKey?: string;\n lastRoutePolicy?: 'main' | 'session';\n}\n\n/** Session-level statistics (per session) */\nexport interface SessionStats {\n messageCount: number;\n tokenCount: number;\n turnCount?: number;\n lastTurnAt?: number;\n}\n\n/** Global session statistics (aggregate) */\nexport interface GlobalSessionStats {\n totalSessions: number;\n activeSessions: number;\n archivedSessions: number;\n pinnedSessions: number;\n totalMessages: number;\n totalTokens: number;\n oldestSession?: string;\n newestSession?: string;\n byChannel: Record<string, number>;\n}\n\n/** Session metadata (stored in index) */\nexport interface SessionMetadata {\n key: string;\n name?: string;\n status: SessionStatus;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n lastAccessedAt: string;\n messageCount: number;\n estimatedTokens: number;\n compactedCount: number;\n lastFlushedAt?: string;\n flushCount?: number;\n sourceChannel: string;\n sourceChatId: string;\n customData?: Record<string, unknown>;\n /** Routing metadata */\n routing?: SessionRoutingMeta;\n /** Session statistics */\n stats?: SessionStats;\n /**\n * High-level origin for filtering/UI (e.g. `cron`, `heartbeat`, `webchat`).\n * Distinct from `sourceChannel` (routing namespace).\n */\n sessionType?: string;\n /**\n * Stable transcript document id (wrapped on-disk format), aligned with OpenClaw `sessionId`.\n */\n transcriptId?: string;\n /** First activity time for this session row (ISO), from transcript header when available. */\n sessionStartedAt?: string;\n /** Last transcript write / interaction (ISO), updated on each persist. */\n lastInteractionAt?: string;\n /**\n * Epoch ms when the last webchat run was aborted (`POST /api/agent/abort`).\n * Used with `clientCreatedAtMs` on the next POST /api/agent to drop stale queued sends.\n */\n abortCutoffTimestamp?: number;\n}\n\n/** Summary of wrapped transcript (no duplicate message bodies). */\nexport interface SessionTranscriptSummary {\n id: string;\n version: number;\n createdAt: string;\n updatedAt: string;\n compactionCount: number;\n}\n\n/** Session detail (metadata + messages) */\nexport interface SessionDetail extends SessionMetadata {\n messages: Message[];\n /** Present when loaded with `includeTranscriptSummary` (gateway `?include=transcript`). */\n transcriptSummary?: SessionTranscriptSummary;\n /** Present when loaded with `include=transcriptRows` (full on-disk rows, LLM + `kind: 'context'`). */\n transcriptRows?: TranscriptStoredRow[];\n}\n\n/** Session list query parameters */\nexport interface SessionListQuery {\n status?: SessionStatus | SessionStatus[];\n /** Single `sourceChannel`, or comma-separated list (e.g. `telegram,weixin`). */\n channel?: string;\n tags?: string[];\n search?: string;\n sortBy?: 'updatedAt' | 'createdAt' | 'messageCount' | 'lastAccessedAt';\n sortOrder?: 'asc' | 'desc';\n limit?: number;\n offset?: number;\n}\n\n/** Paginated result */\nexport interface PaginatedResult<T> {\n items: T[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n}\n\n/** Export format */\nexport type ExportFormat = 'json' | 'markdown';\n\n/** Session export data */\nexport interface SessionExport {\n version: string;\n exportedAt: string;\n metadata: SessionMetadata;\n messages: Message[];\n /** Full on-disk rows (LLM + `kind: 'context'`) for audit / round-trip. */\n transcriptRows: TranscriptStoredRow[];\n}\n\n/** On-disk pre-compaction snapshot (OpenClaw-style checkpoint list). */\nexport interface CompactionCheckpointSummary {\n id: string;\n sizeBytes: number;\n modifiedAt: string;\n}\n\nexport interface CompactionCheckpointDetail extends CompactionCheckpointSummary {\n messageCount: number;\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/session/types.ts"],"sourcesContent":["// Session management types\n\nimport type { TranscriptStoredRow } from './session-context-for-llm.js';\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant' | 'tool' | 'toolResult';\n /** Plain string or structured content blocks (tool calls, multimodal). */\n content: string | unknown[];\n timestamp?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_call_id$?: string;\n toolName?: string;\n isError?: boolean;\n name?: string;\n /** Token usage from the LLM response (assistant messages only). */\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n totalTokens?: number;\n };\n /** Inbound attachment metadata (no base64). */\n media?: Array<{\n id: string;\n bucket: string;\n type: string;\n mimeType: string;\n name: string;\n size: number;\n uri: string;\n path: string;\n }>;\n}\n\n/** Session status enum */\nexport enum SessionStatus {\n ACTIVE = 'active',\n IDLE = 'idle',\n ARCHIVED = 'archived',\n PINNED = 'pinned',\n}\n\n/** Session routing metadata */\nexport interface SessionRoutingMeta {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n mainSessionKey?: string;\n lastRoutePolicy?: 'main' | 'session';\n}\n\n/** Session-level statistics (per session) */\nexport interface SessionStats {\n messageCount: number;\n tokenCount: number;\n turnCount?: number;\n lastTurnAt?: number;\n}\n\n/** Global session statistics (aggregate) */\nexport interface GlobalSessionStats {\n totalSessions: number;\n activeSessions: number;\n archivedSessions: number;\n pinnedSessions: number;\n totalMessages: number;\n totalTokens: number;\n oldestSession?: string;\n newestSession?: string;\n byChannel: Record<string, number>;\n}\n\nexport type SessionType = 'chat' | 'workflow-run' | 'workflow-subagent' | 'cron' | 'heartbeat';\n\n/** Session metadata (stored in index) */\nexport interface SessionMetadata {\n key: string;\n name?: string;\n status: SessionStatus;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n lastAccessedAt: string;\n messageCount: number;\n estimatedTokens: number;\n compactedCount: number;\n lastFlushedAt?: string;\n flushCount?: number;\n sourceChannel: string;\n sourceChatId: string;\n customData?: Record<string, unknown>;\n /** Routing metadata */\n routing?: SessionRoutingMeta;\n /** Session statistics */\n stats?: SessionStats;\n /**\n * High-level origin for filtering/UI (e.g. `cron`, `heartbeat`, `webchat`).\n * Distinct from `sourceChannel` (routing namespace).\n */\n sessionType: SessionType;\n hiddenFromSessionList?: boolean;\n parentSessionKey?: string;\n workflowRunId?: string;\n workflowDefinitionId?: string;\n workflowAgentId?: string;\n workflowAgentLabel?: string;\n /**\n * Stable transcript document id (wrapped on-disk format), aligned with OpenClaw `sessionId`.\n */\n transcriptId?: string;\n /** Workspace/cwd recorded for the active transcript. */\n cwd?: string;\n /** First activity time for this session row (ISO), from transcript header when available. */\n sessionStartedAt?: string;\n /** Last transcript write / interaction (ISO), updated on each persist. */\n lastInteractionAt?: string;\n /**\n * Epoch ms when the last webchat run was aborted (`POST /api/agent/abort`).\n * Used with `clientCreatedAtMs` on the next POST /api/agent to drop stale queued sends.\n */\n abortCutoffTimestamp?: number;\n}\n\n/** Summary of wrapped transcript (no duplicate message bodies). */\nexport interface SessionTranscriptSummary {\n id: string;\n version: number;\n createdAt: string;\n updatedAt: string;\n compactionCount: number;\n}\n\n/** Session detail (metadata + messages) */\nexport interface SessionDetail extends SessionMetadata {\n messages: Message[];\n /** Present when loaded with `includeTranscriptSummary` (gateway `?include=transcript`). */\n transcriptSummary?: SessionTranscriptSummary;\n /** Present when loaded with `include=transcriptRows` (full on-disk rows, LLM + `kind: 'context'`). */\n transcriptRows?: TranscriptStoredRow[];\n}\n\n/** Session list query parameters */\nexport interface SessionListQuery {\n status?: SessionStatus | SessionStatus[];\n /** Single `sourceChannel`, or comma-separated list (e.g. `telegram,weixin`). */\n channel?: string;\n tags?: string[];\n search?: string;\n sessionTypes?: SessionType[];\n includeHidden?: boolean;\n sortBy?: 'updatedAt' | 'createdAt' | 'messageCount' | 'lastAccessedAt';\n sortOrder?: 'asc' | 'desc';\n limit?: number;\n offset?: number;\n}\n\n/** Paginated result */\nexport interface PaginatedResult<T> {\n items: T[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n}\n\n/** Export format */\nexport type ExportFormat = 'json' | 'markdown';\n\n/** Session export data */\nexport interface SessionExport {\n version: string;\n exportedAt: string;\n metadata: SessionMetadata;\n messages: Message[];\n /** Full on-disk rows (LLM + `kind: 'context'`) for audit / round-trip. */\n transcriptRows: TranscriptStoredRow[];\n}\n\n/** On-disk pre-compaction snapshot (OpenClaw-style checkpoint list). */\nexport interface CompactionCheckpointSummary {\n id: string;\n sizeBytes: number;\n modifiedAt: string;\n}\n\nexport interface CompactionCheckpointDetail extends CompactionCheckpointSummary {\n messageCount: number;\n}\n"],"mappings":";;AA4CA,IAAY,gBAAL,yBAAA,eAAA;AACL,eAAA,YAAA;AACA,eAAA,UAAA;AACA,eAAA,cAAA;AACA,eAAA,YAAA;;KACD"}
|
|
@@ -2,9 +2,9 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { resolveStateDir } from "../config/paths-state.js";
|
|
4
4
|
import { init_paths } from "../config/paths.js";
|
|
5
|
+
import { loadPlaywrightCoreModule } from "../browser/providers/playwright-doctor.js";
|
|
5
6
|
import { getShareStore } from "./share-store.js";
|
|
6
7
|
import { getSiteShareStore } from "./site-share-store.js";
|
|
7
|
-
import { loadPlaywrightCoreModule } from "../browser/providers/playwright-doctor.js";
|
|
8
8
|
import { mkdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
|
|
9
9
|
import { join } from "node:path";
|
|
10
10
|
//#region src/share/share-thumbnail.ts
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ALTER TABLE sessions ADD COLUMN hidden_from_session_list INTEGER NOT NULL DEFAULT 0;
|
|
2
|
+
ALTER TABLE sessions ADD COLUMN parent_session_key TEXT;
|
|
3
|
+
ALTER TABLE sessions ADD COLUMN workflow_run_id TEXT;
|
|
4
|
+
ALTER TABLE sessions ADD COLUMN workflow_definition_id TEXT;
|
|
5
|
+
ALTER TABLE sessions ADD COLUMN workflow_agent_id TEXT;
|
|
6
|
+
ALTER TABLE sessions ADD COLUMN workflow_agent_label TEXT;
|
|
7
|
+
|
|
8
|
+
UPDATE sessions SET session_type = 'chat' WHERE session_type IS NULL OR TRIM(session_type) = '';
|
|
9
|
+
|
|
10
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_type
|
|
11
|
+
ON sessions(session_type);
|
|
12
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_workflow_run
|
|
13
|
+
ON sessions(workflow_run_id);
|
|
14
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_parent
|
|
15
|
+
ON sessions(parent_session_key);
|
|
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
|
|
|
3
3
|
/** Baseline schema version applied from schema.sql on first open. */
|
|
4
4
|
export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;
|
|
5
5
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
6
|
-
export declare const XOPC_DB_SCHEMA_VERSION =
|
|
6
|
+
export declare const XOPC_DB_SCHEMA_VERSION = 4;
|
|
7
7
|
export declare function resolveMigrationsDir(override?: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
|
|
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
|
|
|
12
12
|
/** Baseline schema version applied from schema.sql on first open. */
|
|
13
13
|
const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;
|
|
14
14
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
15
|
-
const XOPC_DB_SCHEMA_VERSION =
|
|
15
|
+
const XOPC_DB_SCHEMA_VERSION = 4;
|
|
16
16
|
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
17
17
|
function resolveMigrationsDir(override) {
|
|
18
18
|
if (override) return override;
|
|
@@ -46,7 +46,7 @@ function applySingleMigration(db, migration) {
|
|
|
46
46
|
* Each step runs in its own transaction and updates schema_meta on success.
|
|
47
47
|
*/
|
|
48
48
|
function applyPendingMigrations(db, options = {}) {
|
|
49
|
-
const targetVersion = options.targetVersion ??
|
|
49
|
+
const targetVersion = options.targetVersion ?? 4;
|
|
50
50
|
let currentVersion = readSchemaVersion(db);
|
|
51
51
|
if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
|
|
52
52
|
if (currentVersion >= targetVersion) return currentVersion;
|
|
@@ -62,7 +62,7 @@ function applyPendingMigrations(db, options = {}) {
|
|
|
62
62
|
}
|
|
63
63
|
/** Inspect schema version without mutating the database. */
|
|
64
64
|
function inspectSchemaMigrationStatus(db, options = {}) {
|
|
65
|
-
const appVersion = options.targetVersion ??
|
|
65
|
+
const appVersion = options.targetVersion ?? 4;
|
|
66
66
|
const dbVersion = readSchemaVersion(db);
|
|
67
67
|
if (dbVersion > appVersion) return {
|
|
68
68
|
dbVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION =
|
|
1
|
+
{"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 4;\n\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nexport function resolveMigrationsDir(override?: string): string {\n if (override) {\n return override;\n }\n // Packaged Electron gateway bundle: `out/server/index.js` + `out/server/migrations/`.\n const siblingDir = join(MODULE_DIR, 'migrations');\n if (existsSync(siblingDir)) {\n return siblingDir;\n }\n // Dev / dist: SQL files live next to `migrations/runner.js`.\n return MODULE_DIR;\n}\n\nfunction migrationByTarget(\n migrations: SqlMigration[],\n targetVersion: number,\n): SqlMigration | undefined {\n return migrations.find((migration) => migration.targetVersion === targetVersion);\n}\n\nfunction applySingleMigration(db: DatabaseSync, migration: SqlMigration): void {\n log.info({ targetVersion: migration.targetVersion, file: migration.filename }, 'Applying SQLite migration');\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(migration.sql);\n setSchemaVersion(db, migration.targetVersion);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n const em = error instanceof Error ? error.message : String(error);\n throw new Error(\n `SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`,\n { cause: error },\n );\n }\n}\n\n/**\n * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.\n * Each step runs in its own transaction and updates schema_meta on success.\n */\nexport function applyPendingMigrations(\n db: DatabaseSync,\n options: ApplyMigrationsOptions = {},\n): number {\n const targetVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n let currentVersion = readSchemaVersion(db);\n\n if (currentVersion > targetVersion) {\n throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);\n }\n\n if (currentVersion >= targetVersion) {\n return currentVersion;\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n\n while (currentVersion < targetVersion) {\n const nextVersion = currentVersion + 1;\n const migration = migrationByTarget(migrations, nextVersion);\n if (!migration) {\n throw new DatabaseSchemaMigrationGapError(currentVersion, targetVersion, nextVersion);\n }\n applySingleMigration(db, migration);\n currentVersion = nextVersion;\n }\n\n return currentVersion;\n}\n\nexport type SchemaMigrationStatus = {\n dbVersion: number;\n appVersion: number;\n pendingVersions: number[];\n isTooNew: boolean;\n hasMigrationGap: boolean;\n missingVersion: number | null;\n};\n\n/** Inspect schema version without mutating the database. */\nexport function inspectSchemaMigrationStatus(\n db: DatabaseSync,\n options: Pick<ApplyMigrationsOptions, 'migrationsDir' | 'targetVersion'> = {},\n): SchemaMigrationStatus {\n const appVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n const dbVersion = readSchemaVersion(db);\n const isTooNew = dbVersion > appVersion;\n\n if (isTooNew) {\n return {\n dbVersion,\n appVersion,\n pendingVersions: [],\n isTooNew: true,\n hasMigrationGap: false,\n missingVersion: null,\n };\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n const pendingVersions: number[] = [];\n let hasMigrationGap = false;\n let missingVersion: number | null = null;\n\n for (let version = dbVersion + 1; version <= appVersion; version++) {\n if (migrationByTarget(migrations, version)) {\n pendingVersions.push(version);\n } else {\n hasMigrationGap = true;\n missingVersion = version;\n break;\n }\n }\n\n return {\n dbVersion,\n appVersion,\n pendingVersions,\n isTooNew: false,\n hasMigrationGap,\n missingVersion,\n };\n}\n"],"mappings":";;;;;;;;;aAMwD;AASxD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAa,kCAAkC;;AAG/C,MAAa,yBAAyB;AAEtC,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAgB,qBAAqB,UAA2B;AAC9D,KAAI,SACF,QAAO;CAGT,MAAM,aAAa,KAAK,YAAY,aAAa;AACjD,KAAI,WAAW,WAAW,CACxB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,YACA,eAC0B;AAC1B,QAAO,WAAW,MAAM,cAAc,UAAU,kBAAkB,cAAc;;AAGlF,SAAS,qBAAqB,IAAkB,WAA+B;AAC7E,KAAI,KAAK;EAAE,eAAe,UAAU;EAAe,MAAM,UAAU;EAAU,EAAE,4BAA4B;AAC3G,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,UAAU,IAAI;AACtB,mBAAiB,IAAI,UAAU,cAAc;AAC7C,KAAG,KAAK,SAAS;UACV,OAAO;AACd,MAAI;AACF,MAAG,KAAK,WAAW;UACb;EAGR,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,QAAM,IAAI,MACR,wBAAwB,UAAU,cAAc,IAAI,UAAU,SAAS,YAAY,MACnF,EAAE,OAAO,OAAO,CACjB;;;;;;;AAQL,SAAgB,uBACd,IACA,UAAkC,EAAE,EAC5B;CACR,MAAM,gBAAgB,QAAQ,iBAAA;CAC9B,IAAI,iBAAiB,kBAAkB,GAAG;AAE1C,KAAI,iBAAiB,cACnB,OAAM,IAAI,0BAA0B,gBAAgB,cAAc;AAGpE,KAAI,kBAAkB,cACpB,QAAO;CAGT,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;AAErF,QAAO,iBAAiB,eAAe;EACrC,MAAM,cAAc,iBAAiB;EACrC,MAAM,YAAY,kBAAkB,YAAY,YAAY;AAC5D,MAAI,CAAC,UACH,OAAM,IAAI,gCAAgC,gBAAgB,eAAe,YAAY;AAEvF,uBAAqB,IAAI,UAAU;AACnC,mBAAiB;;AAGnB,QAAO;;;AAaT,SAAgB,6BACd,IACA,UAA2E,EAAE,EACtD;CACvB,MAAM,aAAa,QAAQ,iBAAA;CAC3B,MAAM,YAAY,kBAAkB,GAAG;AAGvC,KAFiB,YAAY,WAG3B,QAAO;EACL;EACA;EACA,iBAAiB,EAAE;EACnB,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EACjB;CAGH,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;CACrF,MAAM,kBAA4B,EAAE;CACpC,IAAI,kBAAkB;CACtB,IAAI,iBAAgC;AAEpC,MAAK,IAAI,UAAU,YAAY,GAAG,WAAW,YAAY,UACvD,KAAI,kBAAkB,YAAY,QAAQ,CACxC,iBAAgB,KAAK,QAAQ;MACxB;AACL,oBAAkB;AAClB,mBAAiB;AACjB;;AAIJ,QAAO;EACL;EACA;EACA;EACA,UAAU;EACV;EACA;EACD"}
|