@xopcai/xopc 0.0.142 → 0.0.144
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-EAVnrCAs.js} +1 -1
- package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Bu568NpC.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DSkm9bp_.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-C99N0vV6.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-CHTDqME5.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-CBt6U3-S.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-BRtxOLlM.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-CUlXfgXd.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-Bg1ntFSD.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.js +2 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-Dm5EqQyK.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
- package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
- package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
- package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-BOzjh-OK.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet-C-Drhqyk.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-CRGiolqF.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-Dw1L3M84.js} +1 -1
- package/dist/gateway/static/root/assets/dist-SwiI0Xu3.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-Dcl8LJG_.js} +1 -1
- package/dist/gateway/static/root/assets/extension-page-i_BXmO_x.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-2sLP2kkA.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-CAODVDiA.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-B4qeLKQS.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-lgsop664.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +1 -0
- package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
- package/dist/gateway/static/root/assets/index-VWvztcst.js +257 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-BpwpMmlk.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-BTRFTK0w.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-BABfIZPU.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-88QBHW9a.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +2 -0
- package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-je95DZOf.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-BJbwi7Rc.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-qWMQ9mod.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-kxd270Gs.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-DLnD-MuD.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-DQprvu5J.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-Cqq7Y98y.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-b6rXULL5.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-BtBVz3cX.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-BNJbtklV.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-Cq9J7i7v.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CdSwi1gT.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-C-V73ZaJ.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-settings-panel-B8hlamVB.js +1 -0
- package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils-Dx01V8qF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.js +1 -0
- package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-fzWTxF26.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-Dt_x8LGg.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.js +11 -0
- package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
- package/dist/gateway/static/root/connector-icons/README.md +11 -0
- package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
- package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
- package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
- package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
- package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
- package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
- package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
- package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
- package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
- package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
- package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
- package/dist/gateway/static/root/connector-icons/github.svg +10 -0
- package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
- package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
- package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
- package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
- package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
- package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
- package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
- package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
- package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
- package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
- package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
- package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
- package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
- package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
- package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
- package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
- package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
- package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
- package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
- package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
- package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
- package/dist/gateway/static/root/connector-icons/time.svg +6 -0
- package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
- package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
- package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
- package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
- package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
- package/dist/gateway/static/root/index.html +10 -7
- package/dist/package.js +1 -1
- package/dist/src/activity/emitter.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +12 -4
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/prompts.d.ts +1 -1
- package/dist/src/agent/background-review/prompts.js +3 -2
- package/dist/src/agent/background-review/prompts.js.map +1 -1
- package/dist/src/agent/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
- package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
- package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +7 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +5 -2
- package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
- package/dist/src/agent/memory/context/planner.d.ts +1 -0
- package/dist/src/agent/memory/context/planner.js +60 -14
- package/dist/src/agent/memory/context/planner.js.map +1 -1
- package/dist/src/agent/memory/context/types.d.ts +3 -1
- package/dist/src/agent/memory/lifecycle.d.ts +11 -0
- package/dist/src/agent/memory/lifecycle.js +50 -0
- package/dist/src/agent/memory/lifecycle.js.map +1 -0
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/memory/source-origin.d.ts +3 -0
- package/dist/src/agent/memory/source-origin.js +19 -0
- package/dist/src/agent/memory/source-origin.js.map +1 -0
- package/dist/src/agent/memory/understanding/service.js +5 -0
- package/dist/src/agent/memory/understanding/service.js.map +1 -1
- package/dist/src/agent/memory/user-context-coordinator.js +7 -2
- package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
- package/dist/src/agent/prompt/sections/behavior.js +30 -1
- package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
- package/dist/src/agent/prompt/system-prompt.js +6 -3
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +22 -0
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +2 -0
- package/dist/src/agent/service.js +12 -6
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +2 -2
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
- package/dist/src/agent/tools/composio-tool.d.ts +18 -5
- package/dist/src/agent/tools/composio-tool.js +252 -35
- package/dist/src/agent/tools/composio-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -3
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.js +2 -2
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
- package/dist/src/agent/tools/workflow-tool.js +4 -17
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/tools/xopc-use-tool.js +1 -1
- package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
- package/dist/src/agent/workflow/builtins/index.js +226 -41
- package/dist/src/agent/workflow/builtins/index.js.map +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +32 -34
- package/dist/src/agent/workflow/catalog.js +158 -154
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/index.d.ts +4 -6
- package/dist/src/agent/workflow/index.js +2 -5
- package/dist/src/agent/workflow/snapshot.d.ts +2 -2
- package/dist/src/agent/workflow/snapshot.js +2 -2
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
- package/dist/src/agent/workflow/structured-output-tool.js +2 -2
- package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -1
- package/dist/src/agent/workflow/types.d.ts +31 -26
- package/dist/src/agent/workspace-runtime/registry.js +2 -2
- package/dist/src/agent-manifest/index.d.ts +1 -0
- package/dist/src/agent-manifest/index.js +3 -1
- package/dist/src/agent-manifest/index.js.map +1 -1
- package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
- package/dist/src/agent-manifest/preset-chain.js +32 -0
- package/dist/src/agent-manifest/preset-chain.js.map +1 -0
- package/dist/src/agent-manifest/resolver.js +3 -10
- package/dist/src/agent-manifest/resolver.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +4 -4
- package/dist/src/automations/api/routes.js +14 -2
- package/dist/src/automations/api/routes.js.map +1 -1
- package/dist/src/automations/domain/validation.d.ts +14 -14
- package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
- package/dist/src/browser/providers/browser-ext-install.js +42 -17
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/capabilities/store-connector.d.ts +0 -1
- package/dist/src/capabilities/store-connector.js +4 -6
- package/dist/src/capabilities/store-connector.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/builtins/review.js +72 -73
- package/dist/src/chat-commands/builtins/review.js.map +1 -1
- package/dist/src/chat-commands/builtins/workflow.js +9 -54
- package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-create.js +2 -2
- package/dist/src/cli/commands/extension-create.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +43 -37
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.d.ts +6 -0
- package/dist/src/cli/commands/extension-pack.js +4 -3
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/goal.js +2 -2
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +3 -3
- package/dist/src/commands/agents.config.d.ts +1 -0
- package/dist/src/commands/agents.config.js +1 -0
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +6 -6
- package/dist/src/config/schema.js +6 -22
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -1
- package/dist/src/connectors/approval.d.ts +2 -0
- package/dist/src/connectors/approval.js +33 -0
- package/dist/src/connectors/approval.js.map +1 -0
- package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
- package/dist/src/connectors/auth-provider-registry.js +17 -0
- package/dist/src/connectors/auth-provider-registry.js.map +1 -0
- package/dist/src/connectors/builtin-catalog.js +55 -116
- package/dist/src/connectors/builtin-catalog.js.map +1 -1
- package/dist/src/connectors/catalog.js +7 -2
- package/dist/src/connectors/catalog.js.map +1 -1
- package/dist/src/connectors/composio-catalog.d.ts +19 -0
- package/dist/src/connectors/composio-catalog.js +237 -0
- package/dist/src/connectors/composio-catalog.js.map +1 -0
- package/dist/src/connectors/composio-logo.d.ts +1 -0
- package/dist/src/connectors/composio-logo.js +51 -0
- package/dist/src/connectors/composio-logo.js.map +1 -0
- package/dist/src/connectors/composio-sessions.d.ts +116 -0
- package/dist/src/connectors/composio-sessions.js +296 -0
- package/dist/src/connectors/composio-sessions.js.map +1 -0
- package/dist/src/connectors/composio-triggers.d.ts +17 -0
- package/dist/src/connectors/composio-triggers.js +48 -5
- package/dist/src/connectors/composio-triggers.js.map +1 -1
- package/dist/src/connectors/composio.d.ts +31 -2
- package/dist/src/connectors/composio.js +374 -151
- package/dist/src/connectors/composio.js.map +1 -1
- package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
- package/dist/src/connectors/connector-memory-sync.js +90 -0
- package/dist/src/connectors/connector-memory-sync.js.map +1 -0
- package/dist/src/connectors/install.js +35 -92
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +6 -2
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/integration-strategy.d.ts +3 -0
- package/dist/src/connectors/integration-strategy.js +29 -0
- package/dist/src/connectors/integration-strategy.js.map +1 -0
- package/dist/src/connectors/policy.d.ts +13 -0
- package/dist/src/connectors/policy.js +48 -0
- package/dist/src/connectors/policy.js.map +1 -0
- package/dist/src/connectors/providers.js +1 -1
- package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
- package/dist/src/connectors/runtime-adapter-registry.js +154 -0
- package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
- package/dist/src/connectors/types.d.ts +113 -4
- package/dist/src/connectors/workflow-preflight.d.ts +20 -0
- package/dist/src/connectors/workflow-preflight.js +70 -0
- package/dist/src/connectors/workflow-preflight.js.map +1 -0
- package/dist/src/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/install-transaction.d.ts +16 -0
- package/dist/src/extensions/install-transaction.js +76 -0
- package/dist/src/extensions/install-transaction.js.map +1 -0
- package/dist/src/extensions/install.d.ts +2 -0
- package/dist/src/extensions/install.js +23 -1
- package/dist/src/extensions/install.js.map +1 -1
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/gateway/agents-admin.d.ts +2 -0
- package/dist/src/gateway/agents-admin.js +7 -0
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
- package/dist/src/gateway/capability-presets-admin.js +11 -4
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +17 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +3 -0
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +188 -25
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +22 -3
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.d.ts +60 -1
- package/dist/src/gateway/hono/routes/home.js +244 -18
- package/dist/src/gateway/hono/routes/home.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.js +17 -4
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +106 -5
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +137 -22
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/routes/you.d.ts +23 -0
- package/dist/src/gateway/hono/routes/you.js +538 -0
- package/dist/src/gateway/hono/routes/you.js.map +1 -0
- package/dist/src/gateway/hono/sse.d.ts +2 -1
- package/dist/src/gateway/hono/sse.js +2 -1
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
- package/dist/src/gateway/service/marketplace-service.js +96 -40
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -0
- package/dist/src/gateway/service.js +13 -7
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +7 -5
- package/dist/src/goals/goal-service.js +25 -13
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.js +46 -7
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/goals/types.d.ts +24 -0
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +3 -3
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.js +1 -1
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.js +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
- package/dist/src/storage/sqlite/connector-repository.js +385 -0
- package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -0
- package/dist/src/storage/sqlite/index.js +4 -1
- package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
- package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
- package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
- package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
- package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
- package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
- package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -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.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
- package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
- package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
- package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
- package/dist/src/tui/backends/embedded-backend.js +4 -4
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/components/assistant-message.js +15 -0
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/tui-agent-events.js +85 -1
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-command-formatters.js +9 -9
- package/dist/src/tui/tui-command-formatters.js.map +1 -1
- package/dist/src/tui/tui-commands.js +4 -4
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/user-context/import.d.ts +12 -0
- package/dist/src/user-context/import.js +48 -0
- package/dist/src/user-context/import.js.map +1 -0
- package/dist/src/user-context/profile.d.ts +37 -0
- package/dist/src/user-context/profile.js +165 -0
- package/dist/src/user-context/profile.js.map +1 -0
- package/dist/src/user-context/projection.d.ts +54 -0
- package/dist/src/user-context/projection.js +121 -0
- package/dist/src/user-context/projection.js.map +1 -0
- package/dist/src/user-context/source-recommendations.d.ts +13 -0
- package/dist/src/user-context/source-recommendations.js +86 -0
- package/dist/src/user-context/source-recommendations.js.map +1 -0
- package/dist/src/user-context/trust-policy.d.ts +11 -0
- package/dist/src/user-context/trust-policy.js +31 -0
- package/dist/src/user-context/trust-policy.js.map +1 -0
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/work-items/work-item-service.js +1 -1
- package/dist/src/workflows/authoring/index.d.ts +1 -0
- package/dist/src/workflows/authoring/index.js +2 -0
- package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
- package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
- package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
- package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
- package/dist/src/workflows/domain/definition-utils.js +28 -26
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +79 -6
- package/dist/src/workflows/domain/event.d.ts +18 -2
- package/dist/src/workflows/domain/index.js +3 -3
- package/dist/src/workflows/domain/run.d.ts +16 -2
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/domain/validation.d.ts +9 -5
- package/dist/src/workflows/domain/validation.js +183 -40
- package/dist/src/workflows/domain/validation.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
- package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
- package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-service.js +5 -9
- package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
- package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
- package/dist/src/workflows/engine/projector.js +43 -1
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
- package/dist/src/workflows/engine/workflow-engine.js +24 -4
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.js +4 -7
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
- package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
- package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
- package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/index.d.ts +1 -2
- package/dist/src/workflows/runtime/index.js +2 -5
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
- package/dist/src/workflows/service/workflow-run-service.js +15 -1
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +3 -3
- package/package.json +5 -4
- package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
- package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
- package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
- package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
- package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
- package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
- package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
- package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
- package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
- package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
- package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
- package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
- package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
- package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
- package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
- package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
- package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
- package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
- package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
- package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
- package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
- package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
- package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
- package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
- package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/release-check.js +0 -174
- package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
- package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/research.js +0 -188
- package/dist/src/agent/workflow/builtins/research.js.map +0 -1
- package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
- package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
- package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
- package/dist/src/agent/workflow/last-run-memory.js +0 -60
- package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
- package/dist/src/agent/workflow/lint.d.ts +0 -38
- package/dist/src/agent/workflow/lint.js +0 -74
- package/dist/src/agent/workflow/lint.js.map +0 -1
- package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
- package/dist/src/agent/workflow/meta-locale.js +0 -62
- package/dist/src/agent/workflow/meta-locale.js.map +0 -1
- package/dist/src/agent/workflow/parser.d.ts +0 -20
- package/dist/src/agent/workflow/parser.js +0 -152
- package/dist/src/agent/workflow/parser.js.map +0 -1
- package/dist/src/agent/workflow/runtime.d.ts +0 -34
- package/dist/src/agent/workflow/runtime.js +0 -402
- package/dist/src/agent/workflow/runtime.js.map +0 -1
- package/dist/src/connectors/oauth.d.ts +0 -22
- package/dist/src/connectors/oauth.js +0 -99
- package/dist/src/connectors/oauth.js.map +0 -1
- package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
- package/dist/src/workflows/runtime/script-runtime.js +0 -3
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
- package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
|
@@ -19,6 +19,9 @@ const STREAM_TOUCH_EVENTS = new Set([
|
|
|
19
19
|
"assistant_delta",
|
|
20
20
|
"thinking_delta",
|
|
21
21
|
"thinking_end",
|
|
22
|
+
"review_start",
|
|
23
|
+
"review_delta",
|
|
24
|
+
"review_end",
|
|
22
25
|
"review",
|
|
23
26
|
"tool_start",
|
|
24
27
|
"tool_update",
|
|
@@ -106,11 +109,55 @@ function appendReviewBlock(message, review) {
|
|
|
106
109
|
const target = typeof rec.target === "string" ? rec.target : "working tree changes";
|
|
107
110
|
const existing = content.findIndex((block) => block.type === "review" && block.target === target);
|
|
108
111
|
if (existing >= 0) {
|
|
109
|
-
content[existing] =
|
|
112
|
+
content[existing] = {
|
|
113
|
+
...review,
|
|
114
|
+
reviewId: content[existing].reviewId,
|
|
115
|
+
status: content[existing].status === "error" ? "error" : "complete",
|
|
116
|
+
analysisMarkdown: content[existing].analysisMarkdown,
|
|
117
|
+
errorMessage: content[existing].errorMessage
|
|
118
|
+
};
|
|
110
119
|
return;
|
|
111
120
|
}
|
|
112
121
|
content.push(review);
|
|
113
122
|
}
|
|
123
|
+
function reviewBlocks(message) {
|
|
124
|
+
const content = message.content;
|
|
125
|
+
return Array.isArray(content) ? content.filter((block) => !!block && typeof block === "object") : [];
|
|
126
|
+
}
|
|
127
|
+
function reviewBlockForId(message, reviewId) {
|
|
128
|
+
return reviewBlocks(message).find((block) => block.type === "review" && block.reviewId === reviewId);
|
|
129
|
+
}
|
|
130
|
+
function startReviewBlock(message, review) {
|
|
131
|
+
const existing = reviewBlockForId(message, review.reviewId);
|
|
132
|
+
if (existing) {
|
|
133
|
+
existing.target = review.target || existing.target;
|
|
134
|
+
existing.status = review.stage;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const msg = message;
|
|
138
|
+
if (!Array.isArray(msg.content)) msg.content = [];
|
|
139
|
+
msg.content.push({
|
|
140
|
+
type: "review",
|
|
141
|
+
reviewId: review.reviewId,
|
|
142
|
+
target: review.target || "working tree changes",
|
|
143
|
+
findings: [],
|
|
144
|
+
overallCorrectness: "unknown",
|
|
145
|
+
overallExplanation: "",
|
|
146
|
+
status: review.stage
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function appendReviewDraft(message, reviewId, delta) {
|
|
150
|
+
const review = reviewBlockForId(message, reviewId);
|
|
151
|
+
if (!review || !delta) return;
|
|
152
|
+
review.status = "reviewing";
|
|
153
|
+
review.analysisMarkdown = `${typeof review.analysisMarkdown === "string" ? review.analysisMarkdown : ""}${delta}`;
|
|
154
|
+
}
|
|
155
|
+
function finishReviewBlock(message, reviewId, status, errorMessage) {
|
|
156
|
+
const review = reviewBlockForId(message, reviewId);
|
|
157
|
+
if (!review) return;
|
|
158
|
+
review.status = status;
|
|
159
|
+
if (status === "error" && errorMessage) review.errorMessage = errorMessage;
|
|
160
|
+
}
|
|
114
161
|
function finalizeThinking(message) {
|
|
115
162
|
const content = message.content;
|
|
116
163
|
if (!Array.isArray(content)) return;
|
|
@@ -195,6 +242,43 @@ function dispatchAgentEvent(event, data, state, chatLog, tui, setActivityStatus,
|
|
|
195
242
|
tui.requestRender();
|
|
196
243
|
break;
|
|
197
244
|
}
|
|
245
|
+
case "review_start": {
|
|
246
|
+
const reviewId = typeof p.reviewId === "string" ? p.reviewId : "";
|
|
247
|
+
if (!reviewId) break;
|
|
248
|
+
const message = assistantForRun(runId);
|
|
249
|
+
startReviewBlock(message, {
|
|
250
|
+
reviewId,
|
|
251
|
+
target: typeof p.target === "string" ? p.target : "working tree changes",
|
|
252
|
+
stage: p.stage === "preparing" ? "preparing" : "reviewing"
|
|
253
|
+
});
|
|
254
|
+
chatLog.startAssistant(message, runId);
|
|
255
|
+
chatLog.updateAssistant(message, runId);
|
|
256
|
+
markRunEvent(state, "streaming", runId, event, source);
|
|
257
|
+
setActivityStatus("reviewing");
|
|
258
|
+
tui.requestRender();
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case "review_delta": {
|
|
262
|
+
const reviewId = typeof p.reviewId === "string" ? p.reviewId : "";
|
|
263
|
+
const delta = typeof p.delta === "string" ? p.delta : "";
|
|
264
|
+
if (!reviewId || !delta) break;
|
|
265
|
+
const message = assistantForRun(runId);
|
|
266
|
+
appendReviewDraft(message, reviewId, delta);
|
|
267
|
+
chatLog.updateAssistant(message, runId);
|
|
268
|
+
markRunEvent(state, "streaming", runId, event, source);
|
|
269
|
+
setActivityStatus("reviewing");
|
|
270
|
+
tui.requestRender();
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
case "review_end": {
|
|
274
|
+
const reviewId = typeof p.reviewId === "string" ? p.reviewId : "";
|
|
275
|
+
if (!reviewId) break;
|
|
276
|
+
const message = assistantForRun(runId);
|
|
277
|
+
finishReviewBlock(message, reviewId, p.status === "error" ? "error" : "complete", typeof p.message === "string" ? p.message : void 0);
|
|
278
|
+
chatLog.updateAssistant(message, runId);
|
|
279
|
+
tui.requestRender();
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
198
282
|
case "tool_start": {
|
|
199
283
|
const toolName = String(p.toolName ?? "unknown");
|
|
200
284
|
const toolCallId = String(p.toolCallId || "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-agent-events.js","names":[],"sources":["../../../src/tui/tui-agent-events.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { TUI } from '@earendil-works/pi-tui';\n\nimport { formatAgentRunErrorForDisplay } from '../agent/client-error-format.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport { createAssistantMessageFromText } from './components/assistant-message.js';\nimport { markRunEvent, markRunIdleAfterCompletion } from './tui-run-state.js';\nimport type { TuiEventSource, TuiState } from './tui-types.js';\n\nconst seenStreamEventKeys = new Set<string>();\nconst assistantByRun = new Map<string, AgentMessage>();\n\nexport function clearSeenStreamEvents(): void {\n seenStreamEventKeys.clear();\n assistantByRun.clear();\n}\n\nexport function clearSeenStreamEventsForRun(runId: string): void {\n const prefix = `${runId}:`;\n for (const key of Array.from(seenStreamEventKeys)) {\n if (key.startsWith(prefix)) seenStreamEventKeys.delete(key);\n }\n assistantByRun.delete(runId);\n}\n\nconst STREAM_TOUCH_EVENTS = new Set([\n 'run_start',\n 'assistant_message_start',\n 'assistant_delta',\n 'thinking_delta',\n 'thinking_end',\n 'review',\n 'tool_start',\n 'tool_update',\n 'tool_end',\n 'assistant_message_end',\n 'progress',\n]);\n\nconst DIRECT_RESPONSE_OWNED_EVENTS = new Set([...STREAM_TOUCH_EVENTS, 'run_end', 'error']);\n\nfunction resolveEventRunId(data: Record<string, unknown>, state: TuiState): string | null {\n if (typeof data.runId === 'string' && data.runId) return data.runId;\n return state.activeRunId ?? state.runStatus.runId ?? state.runStatus.lastCompletedRunId;\n}\n\nexport function shouldSkipDuplicateBroadcastEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'broadcast') return false;\n if (!DIRECT_RESPONSE_OWNED_EVENTS.has(event)) return false;\n const directRunId = state.runStatus.directStreamRunId;\n if (!directRunId) return false;\n return resolveEventRunId(data, state) === directRunId;\n}\n\nfunction streamEventKey(data: Record<string, unknown>, state: TuiState): string | null {\n const runId = resolveEventRunId(data, state);\n const seq = data.seq;\n if (!runId || typeof seq !== 'number' || !Number.isFinite(seq)) return null;\n return `${runId}:${seq}`;\n}\n\nfunction shouldSkipSeenStreamEvent(\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'agent-response' && source !== 'agent-resume' && source !== 'broadcast') return false;\n const key = streamEventKey(data, state);\n if (!key) return false;\n if (seenStreamEventKeys.has(key)) return true;\n seenStreamEventKeys.add(key);\n return false;\n}\n\nfunction payload(data: Record<string, unknown>): Record<string, unknown> {\n return data.payload && typeof data.payload === 'object' ? data.payload as Record<string, unknown> : {};\n}\n\nfunction assistantForRun(runId: string): AgentMessage {\n let message = assistantByRun.get(runId);\n if (!message) {\n message = createAssistantMessageFromText('') as AgentMessage;\n assistantByRun.set(runId, message);\n }\n return message;\n}\n\nfunction appendAssistantText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'text' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'text', text: delta });\n}\n\nfunction appendThinkingText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'thinking' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'thinking', text: delta, streaming: true });\n}\n\nfunction appendReviewBlock(message: AgentMessage, review: unknown): void {\n if (!review || typeof review !== 'object' || Array.isArray(review)) return;\n const rec = review as { type?: unknown; target?: unknown };\n if (rec.type !== 'review') return;\n const msg = message as { content?: unknown };\n if (!Array.isArray(msg.content)) msg.content = [];\n const content = msg.content as Array<Record<string, unknown>>;\n const target = typeof rec.target === 'string' ? rec.target : 'working tree changes';\n const existing = content.findIndex((block) => block.type === 'review' && block.target === target);\n if (existing >= 0) {\n content[existing] = review as Record<string, unknown>;\n return;\n }\n content.push(review as Record<string, unknown>);\n}\n\nfunction finalizeThinking(message: AgentMessage): void {\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n const rec = block as { type?: unknown; streaming?: boolean };\n if (rec.type === 'thinking') rec.streaming = false;\n }\n}\n\nfunction errorAssistantMessage(errorContent: string): AgentMessage {\n return {\n ...createAssistantMessageFromText(''),\n stopReason: 'error',\n errorMessage: errorContent,\n } as AgentMessage;\n}\n\nexport function dispatchAgentEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n chatLog: ChatLog,\n tui: TUI,\n setActivityStatus: (status: string) => void,\n touchStreamingActivity?: () => void,\n onRunEnded?: () => void,\n onAssistantFinalized?: (message: AgentMessage, options?: { errorMessage?: string }) => void,\n source: TuiEventSource = 'unknown',\n): void {\n if (shouldSkipSeenStreamEvent(data, state, source)) return;\n if (shouldSkipDuplicateBroadcastEvent(event, data, state, source)) return;\n\n if (STREAM_TOUCH_EVENTS.has(event)) touchStreamingActivity?.();\n\n const runId = resolveEventRunId(data, state) ?? state.activeRunId ?? 'default';\n const p = payload(data);\n\n switch (event) {\n case 'run_start': {\n state.activeRunId = runId;\n markRunEvent(state, 'waiting', runId, event, source);\n setActivityStatus('waiting');\n break;\n }\n case 'user_message': {\n const message = p.message as { content?: unknown } | undefined;\n chatLog.addUser(Array.isArray(message?.content) || typeof message?.content === 'string' ? message.content : []);\n tui.requestRender();\n break;\n }\n case 'user_transcript': {\n chatLog.addUser(String(p.text ?? ''));\n tui.requestRender();\n break;\n }\n case 'assistant_message_start': {\n const message = assistantForRun(runId);\n chatLog.startAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendAssistantText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendThinkingText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.updateAssistant(message, runId);\n tui.requestRender();\n break;\n }\n case 'review': {\n const message = assistantForRun(runId);\n appendReviewBlock(message, p.review);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'tool_start': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, p.args ?? {}, runId);\n chatLog.markToolExecutionStarted(toolCallId);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_update': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, {}, runId);\n if ('details' in p) chatLog.updateToolDetails(toolCallId, p.details);\n if (typeof p.textDelta === 'string') chatLog.updateToolResult(toolCallId, { text: p.textDelta }, false, true);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_end': {\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.updateToolResult(toolCallId, p.result, p.status === 'error' || p.status === 'cancelled', false);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_message_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.finalizeAssistant(message, runId);\n assistantByRun.delete(runId);\n onAssistantFinalized?.(message);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'error': {\n const errorContent = formatAgentRunErrorForDisplay(String(p.message ?? 'Unknown error'));\n const message = errorAssistantMessage(errorContent);\n chatLog.finalizeAssistant(message, runId);\n onAssistantFinalized?.(message, { errorMessage: errorContent });\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'run_end': {\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'progress': {\n const stage = typeof p.stage === 'string' ? p.stage : '';\n const message = typeof p.message === 'string' ? p.message : stage;\n state.progressMessage = message || null;\n markRunEvent(state, 'progress', runId, event, source);\n setActivityStatus(message ? `progress: ${message}` : 'running');\n tui.requestRender();\n break;\n }\n }\n}\n\nexport const DEFAULT_STREAMING_WATCHDOG_MS = 30_000;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tui-agent-events.js","names":[],"sources":["../../../src/tui/tui-agent-events.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { TUI } from '@earendil-works/pi-tui';\n\nimport { formatAgentRunErrorForDisplay } from '../agent/client-error-format.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport { createAssistantMessageFromText } from './components/assistant-message.js';\nimport { markRunEvent, markRunIdleAfterCompletion } from './tui-run-state.js';\nimport type { TuiEventSource, TuiState } from './tui-types.js';\n\nconst seenStreamEventKeys = new Set<string>();\nconst assistantByRun = new Map<string, AgentMessage>();\n\nexport function clearSeenStreamEvents(): void {\n seenStreamEventKeys.clear();\n assistantByRun.clear();\n}\n\nexport function clearSeenStreamEventsForRun(runId: string): void {\n const prefix = `${runId}:`;\n for (const key of Array.from(seenStreamEventKeys)) {\n if (key.startsWith(prefix)) seenStreamEventKeys.delete(key);\n }\n assistantByRun.delete(runId);\n}\n\nconst STREAM_TOUCH_EVENTS = new Set([\n 'run_start',\n 'assistant_message_start',\n 'assistant_delta',\n 'thinking_delta',\n 'thinking_end',\n 'review_start',\n 'review_delta',\n 'review_end',\n 'review',\n 'tool_start',\n 'tool_update',\n 'tool_end',\n 'assistant_message_end',\n 'progress',\n]);\n\nconst DIRECT_RESPONSE_OWNED_EVENTS = new Set([...STREAM_TOUCH_EVENTS, 'run_end', 'error']);\n\nfunction resolveEventRunId(data: Record<string, unknown>, state: TuiState): string | null {\n if (typeof data.runId === 'string' && data.runId) return data.runId;\n return state.activeRunId ?? state.runStatus.runId ?? state.runStatus.lastCompletedRunId;\n}\n\nexport function shouldSkipDuplicateBroadcastEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'broadcast') return false;\n if (!DIRECT_RESPONSE_OWNED_EVENTS.has(event)) return false;\n const directRunId = state.runStatus.directStreamRunId;\n if (!directRunId) return false;\n return resolveEventRunId(data, state) === directRunId;\n}\n\nfunction streamEventKey(data: Record<string, unknown>, state: TuiState): string | null {\n const runId = resolveEventRunId(data, state);\n const seq = data.seq;\n if (!runId || typeof seq !== 'number' || !Number.isFinite(seq)) return null;\n return `${runId}:${seq}`;\n}\n\nfunction shouldSkipSeenStreamEvent(\n data: Record<string, unknown>,\n state: TuiState,\n source: TuiEventSource,\n): boolean {\n if (source !== 'agent-response' && source !== 'agent-resume' && source !== 'broadcast') return false;\n const key = streamEventKey(data, state);\n if (!key) return false;\n if (seenStreamEventKeys.has(key)) return true;\n seenStreamEventKeys.add(key);\n return false;\n}\n\nfunction payload(data: Record<string, unknown>): Record<string, unknown> {\n return data.payload && typeof data.payload === 'object' ? data.payload as Record<string, unknown> : {};\n}\n\nfunction assistantForRun(runId: string): AgentMessage {\n let message = assistantByRun.get(runId);\n if (!message) {\n message = createAssistantMessageFromText('') as AgentMessage;\n assistantByRun.set(runId, message);\n }\n return message;\n}\n\nfunction appendAssistantText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'text' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'text', text: delta });\n}\n\nfunction appendThinkingText(message: AgentMessage, delta: string): void {\n const rec = message as { content?: unknown };\n if (!Array.isArray(rec.content)) rec.content = [];\n const content = rec.content as Array<Record<string, unknown>>;\n const last = content[content.length - 1];\n if (last?.type === 'thinking' && typeof last.text === 'string') {\n last.text += delta;\n return;\n }\n content.push({ type: 'thinking', text: delta, streaming: true });\n}\n\nfunction appendReviewBlock(message: AgentMessage, review: unknown): void {\n if (!review || typeof review !== 'object' || Array.isArray(review)) return;\n const rec = review as { type?: unknown; target?: unknown };\n if (rec.type !== 'review') return;\n const msg = message as { content?: unknown };\n if (!Array.isArray(msg.content)) msg.content = [];\n const content = msg.content as Array<Record<string, unknown>>;\n const target = typeof rec.target === 'string' ? rec.target : 'working tree changes';\n const existing = content.findIndex((block) => block.type === 'review' && block.target === target);\n if (existing >= 0) {\n content[existing] = {\n ...(review as Record<string, unknown>),\n reviewId: content[existing].reviewId,\n status: content[existing].status === 'error' ? 'error' : 'complete',\n analysisMarkdown: content[existing].analysisMarkdown,\n errorMessage: content[existing].errorMessage,\n };\n return;\n }\n content.push(review as Record<string, unknown>);\n}\n\ntype ReviewContentBlock = Record<string, unknown> & { type?: unknown };\n\nfunction reviewBlocks(message: AgentMessage): ReviewContentBlock[] {\n const content = (message as { content?: unknown }).content;\n return Array.isArray(content)\n ? content.filter((block): block is ReviewContentBlock => !!block && typeof block === 'object')\n : [];\n}\n\nfunction reviewBlockForId(message: AgentMessage, reviewId: string): ReviewContentBlock | undefined {\n return reviewBlocks(message).find((block) => block.type === 'review' && block.reviewId === reviewId);\n}\n\nfunction startReviewBlock(\n message: AgentMessage,\n review: { reviewId: string; target: string; stage: 'preparing' | 'reviewing' },\n): void {\n const existing = reviewBlockForId(message, review.reviewId);\n if (existing) {\n existing.target = review.target || existing.target;\n existing.status = review.stage;\n return;\n }\n const msg = message as { content?: unknown };\n if (!Array.isArray(msg.content)) msg.content = [];\n (msg.content as ReviewContentBlock[]).push({\n type: 'review',\n reviewId: review.reviewId,\n target: review.target || 'working tree changes',\n findings: [],\n overallCorrectness: 'unknown',\n overallExplanation: '',\n status: review.stage,\n });\n}\n\nfunction appendReviewDraft(message: AgentMessage, reviewId: string, delta: string): void {\n const review = reviewBlockForId(message, reviewId);\n if (!review || !delta) return;\n review.status = 'reviewing';\n review.analysisMarkdown = `${typeof review.analysisMarkdown === 'string' ? review.analysisMarkdown : ''}${delta}`;\n}\n\nfunction finishReviewBlock(message: AgentMessage, reviewId: string, status: 'complete' | 'error', errorMessage?: string): void {\n const review = reviewBlockForId(message, reviewId);\n if (!review) return;\n review.status = status;\n if (status === 'error' && errorMessage) review.errorMessage = errorMessage;\n}\n\nfunction finalizeThinking(message: AgentMessage): void {\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n const rec = block as { type?: unknown; streaming?: boolean };\n if (rec.type === 'thinking') rec.streaming = false;\n }\n}\n\nfunction errorAssistantMessage(errorContent: string): AgentMessage {\n return {\n ...createAssistantMessageFromText(''),\n stopReason: 'error',\n errorMessage: errorContent,\n } as AgentMessage;\n}\n\nexport function dispatchAgentEvent(\n event: string,\n data: Record<string, unknown>,\n state: TuiState,\n chatLog: ChatLog,\n tui: TUI,\n setActivityStatus: (status: string) => void,\n touchStreamingActivity?: () => void,\n onRunEnded?: () => void,\n onAssistantFinalized?: (message: AgentMessage, options?: { errorMessage?: string }) => void,\n source: TuiEventSource = 'unknown',\n): void {\n if (shouldSkipSeenStreamEvent(data, state, source)) return;\n if (shouldSkipDuplicateBroadcastEvent(event, data, state, source)) return;\n\n if (STREAM_TOUCH_EVENTS.has(event)) touchStreamingActivity?.();\n\n const runId = resolveEventRunId(data, state) ?? state.activeRunId ?? 'default';\n const p = payload(data);\n\n switch (event) {\n case 'run_start': {\n state.activeRunId = runId;\n markRunEvent(state, 'waiting', runId, event, source);\n setActivityStatus('waiting');\n break;\n }\n case 'user_message': {\n const message = p.message as { content?: unknown } | undefined;\n chatLog.addUser(Array.isArray(message?.content) || typeof message?.content === 'string' ? message.content : []);\n tui.requestRender();\n break;\n }\n case 'user_transcript': {\n chatLog.addUser(String(p.text ?? ''));\n tui.requestRender();\n break;\n }\n case 'assistant_message_start': {\n const message = assistantForRun(runId);\n chatLog.startAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendAssistantText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_delta': {\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!delta) break;\n const message = assistantForRun(runId);\n appendThinkingText(message, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'thinking_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.updateAssistant(message, runId);\n tui.requestRender();\n break;\n }\n case 'review': {\n const message = assistantForRun(runId);\n appendReviewBlock(message, p.review);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'review_start': {\n const reviewId = typeof p.reviewId === 'string' ? p.reviewId : '';\n if (!reviewId) break;\n const message = assistantForRun(runId);\n startReviewBlock(message, {\n reviewId,\n target: typeof p.target === 'string' ? p.target : 'working tree changes',\n stage: p.stage === 'preparing' ? 'preparing' : 'reviewing',\n });\n chatLog.startAssistant(message, runId);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('reviewing');\n tui.requestRender();\n break;\n }\n case 'review_delta': {\n const reviewId = typeof p.reviewId === 'string' ? p.reviewId : '';\n const delta = typeof p.delta === 'string' ? p.delta : '';\n if (!reviewId || !delta) break;\n const message = assistantForRun(runId);\n appendReviewDraft(message, reviewId, delta);\n chatLog.updateAssistant(message, runId);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('reviewing');\n tui.requestRender();\n break;\n }\n case 'review_end': {\n const reviewId = typeof p.reviewId === 'string' ? p.reviewId : '';\n if (!reviewId) break;\n const message = assistantForRun(runId);\n finishReviewBlock(\n message,\n reviewId,\n p.status === 'error' ? 'error' : 'complete',\n typeof p.message === 'string' ? p.message : undefined,\n );\n chatLog.updateAssistant(message, runId);\n tui.requestRender();\n break;\n }\n case 'tool_start': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, p.args ?? {}, runId);\n chatLog.markToolExecutionStarted(toolCallId);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_update': {\n const toolName = String(p.toolName ?? 'unknown');\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.startTool(toolCallId, toolName, {}, runId);\n if ('details' in p) chatLog.updateToolDetails(toolCallId, p.details);\n if (typeof p.textDelta === 'string') chatLog.updateToolResult(toolCallId, { text: p.textDelta }, false, true);\n markRunEvent(state, 'tool', runId, event, source);\n setActivityStatus('running');\n tui.requestRender();\n break;\n }\n case 'tool_end': {\n const toolCallId = String(p.toolCallId || '');\n if (!toolCallId) break;\n chatLog.updateToolResult(toolCallId, p.result, p.status === 'error' || p.status === 'cancelled', false);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'assistant_message_end': {\n const message = assistantForRun(runId);\n finalizeThinking(message);\n chatLog.finalizeAssistant(message, runId);\n assistantByRun.delete(runId);\n onAssistantFinalized?.(message);\n markRunEvent(state, 'streaming', runId, event, source);\n setActivityStatus('streaming');\n tui.requestRender();\n break;\n }\n case 'error': {\n const errorContent = formatAgentRunErrorForDisplay(String(p.message ?? 'Unknown error'));\n const message = errorAssistantMessage(errorContent);\n chatLog.finalizeAssistant(message, runId);\n onAssistantFinalized?.(message, { errorMessage: errorContent });\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'run_end': {\n assistantByRun.delete(runId);\n state.activeRunId = null;\n markRunIdleAfterCompletion(state, runId, event, source);\n setActivityStatus('idle');\n onRunEnded?.();\n tui.requestRender();\n break;\n }\n case 'progress': {\n const stage = typeof p.stage === 'string' ? p.stage : '';\n const message = typeof p.message === 'string' ? p.message : stage;\n state.progressMessage = message || null;\n markRunEvent(state, 'progress', runId, event, source);\n setActivityStatus(message ? `progress: ${message}` : 'running');\n tui.requestRender();\n break;\n }\n }\n}\n\nexport const DEFAULT_STREAMING_WATCHDOG_MS = 30_000;\n"],"mappings":";;;;AASA,MAAM,sCAAsB,IAAI,KAAa;AAC7C,MAAM,iCAAiB,IAAI,KAA2B;AAEtD,SAAgB,wBAA8B;AAC5C,qBAAoB,OAAO;AAC3B,gBAAe,OAAO;;AAGxB,SAAgB,4BAA4B,OAAqB;CAC/D,MAAM,SAAS,GAAG,MAAM;AACxB,MAAK,MAAM,OAAO,MAAM,KAAK,oBAAoB,CAC/C,KAAI,IAAI,WAAW,OAAO,CAAE,qBAAoB,OAAO,IAAI;AAE7D,gBAAe,OAAO,MAAM;;AAG9B,MAAM,sBAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,+BAA+B,IAAI,IAAI;CAAC,GAAG;CAAqB;CAAW;CAAQ,CAAC;AAE1F,SAAS,kBAAkB,MAA+B,OAAgC;AACxF,KAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAO,QAAO,KAAK;AAC9D,QAAO,MAAM,eAAe,MAAM,UAAU,SAAS,MAAM,UAAU;;AAGvE,SAAgB,kCACd,OACA,MACA,OACA,QACS;AACT,KAAI,WAAW,YAAa,QAAO;AACnC,KAAI,CAAC,6BAA6B,IAAI,MAAM,CAAE,QAAO;CACrD,MAAM,cAAc,MAAM,UAAU;AACpC,KAAI,CAAC,YAAa,QAAO;AACzB,QAAO,kBAAkB,MAAM,MAAM,KAAK;;AAG5C,SAAS,eAAe,MAA+B,OAAgC;CACrF,MAAM,QAAQ,kBAAkB,MAAM,MAAM;CAC5C,MAAM,MAAM,KAAK;AACjB,KAAI,CAAC,SAAS,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI,CAAE,QAAO;AACvE,QAAO,GAAG,MAAM,GAAG;;AAGrB,SAAS,0BACP,MACA,OACA,QACS;AACT,KAAI,WAAW,oBAAoB,WAAW,kBAAkB,WAAW,YAAa,QAAO;CAC/F,MAAM,MAAM,eAAe,MAAM,MAAM;AACvC,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI,oBAAoB,IAAI,IAAI,CAAE,QAAO;AACzC,qBAAoB,IAAI,IAAI;AAC5B,QAAO;;AAGT,SAAS,QAAQ,MAAwD;AACvE,QAAO,KAAK,WAAW,OAAO,KAAK,YAAY,WAAW,KAAK,UAAqC,EAAE;;AAGxG,SAAS,gBAAgB,OAA6B;CACpD,IAAI,UAAU,eAAe,IAAI,MAAM;AACvC,KAAI,CAAC,SAAS;AACZ,YAAU,+BAA+B,GAAG;AAC5C,iBAAe,IAAI,OAAO,QAAQ;;AAEpC,QAAO;;AAGT,SAAS,oBAAoB,SAAuB,OAAqB;CACvE,MAAM,MAAM;AACZ,KAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,CAAE,KAAI,UAAU,EAAE;CACjD,MAAM,UAAU,IAAI;CACpB,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,KAAI,MAAM,SAAS,UAAU,OAAO,KAAK,SAAS,UAAU;AAC1D,OAAK,QAAQ;AACb;;AAEF,SAAQ,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAO,CAAC;;AAG7C,SAAS,mBAAmB,SAAuB,OAAqB;CACtE,MAAM,MAAM;AACZ,KAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,CAAE,KAAI,UAAU,EAAE;CACjD,MAAM,UAAU,IAAI;CACpB,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,KAAI,MAAM,SAAS,cAAc,OAAO,KAAK,SAAS,UAAU;AAC9D,OAAK,QAAQ;AACb;;AAEF,SAAQ,KAAK;EAAE,MAAM;EAAY,MAAM;EAAO,WAAW;EAAM,CAAC;;AAGlE,SAAS,kBAAkB,SAAuB,QAAuB;AACvE,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAAE;CACpE,MAAM,MAAM;AACZ,KAAI,IAAI,SAAS,SAAU;CAC3B,MAAM,MAAM;AACZ,KAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,CAAE,KAAI,UAAU,EAAE;CACjD,MAAM,UAAU,IAAI;CACpB,MAAM,SAAS,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;CAC7D,MAAM,WAAW,QAAQ,WAAW,UAAU,MAAM,SAAS,YAAY,MAAM,WAAW,OAAO;AACjG,KAAI,YAAY,GAAG;AACjB,UAAQ,YAAY;GAClB,GAAI;GACJ,UAAU,QAAQ,UAAU;GAC5B,QAAQ,QAAQ,UAAU,WAAW,UAAU,UAAU;GACzD,kBAAkB,QAAQ,UAAU;GACpC,cAAc,QAAQ,UAAU;GACjC;AACD;;AAEF,SAAQ,KAAK,OAAkC;;AAKjD,SAAS,aAAa,SAA6C;CACjE,MAAM,UAAW,QAAkC;AACnD,QAAO,MAAM,QAAQ,QAAQ,GACzB,QAAQ,QAAQ,UAAuC,CAAC,CAAC,SAAS,OAAO,UAAU,SAAS,GAC5F,EAAE;;AAGR,SAAS,iBAAiB,SAAuB,UAAkD;AACjG,QAAO,aAAa,QAAQ,CAAC,MAAM,UAAU,MAAM,SAAS,YAAY,MAAM,aAAa,SAAS;;AAGtG,SAAS,iBACP,SACA,QACM;CACN,MAAM,WAAW,iBAAiB,SAAS,OAAO,SAAS;AAC3D,KAAI,UAAU;AACZ,WAAS,SAAS,OAAO,UAAU,SAAS;AAC5C,WAAS,SAAS,OAAO;AACzB;;CAEF,MAAM,MAAM;AACZ,KAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,CAAE,KAAI,UAAU,EAAE;AAChD,KAAI,QAAiC,KAAK;EACzC,MAAM;EACN,UAAU,OAAO;EACjB,QAAQ,OAAO,UAAU;EACzB,UAAU,EAAE;EACZ,oBAAoB;EACpB,oBAAoB;EACpB,QAAQ,OAAO;EAChB,CAAC;;AAGJ,SAAS,kBAAkB,SAAuB,UAAkB,OAAqB;CACvF,MAAM,SAAS,iBAAiB,SAAS,SAAS;AAClD,KAAI,CAAC,UAAU,CAAC,MAAO;AACvB,QAAO,SAAS;AAChB,QAAO,mBAAmB,GAAG,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAAmB,KAAK;;AAG5G,SAAS,kBAAkB,SAAuB,UAAkB,QAA8B,cAA6B;CAC7H,MAAM,SAAS,iBAAiB,SAAS,SAAS;AAClD,KAAI,CAAC,OAAQ;AACb,QAAO,SAAS;AAChB,KAAI,WAAW,WAAW,aAAc,QAAO,eAAe;;AAGhE,SAAS,iBAAiB,SAA6B;CACrD,MAAM,UAAW,QAAkC;AACnD,KAAI,CAAC,MAAM,QAAQ,QAAQ,CAAE;AAC7B,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;EACzC,MAAM,MAAM;AACZ,MAAI,IAAI,SAAS,WAAY,KAAI,YAAY;;;AAIjD,SAAS,sBAAsB,cAAoC;AACjE,QAAO;EACL,GAAG,+BAA+B,GAAG;EACrC,YAAY;EACZ,cAAc;EACf;;AAGH,SAAgB,mBACd,OACA,MACA,OACA,SACA,KACA,mBACA,wBACA,YACA,sBACA,SAAyB,WACnB;AACN,KAAI,0BAA0B,MAAM,OAAO,OAAO,CAAE;AACpD,KAAI,kCAAkC,OAAO,MAAM,OAAO,OAAO,CAAE;AAEnE,KAAI,oBAAoB,IAAI,MAAM,CAAE,2BAA0B;CAE9D,MAAM,QAAQ,kBAAkB,MAAM,MAAM,IAAI,MAAM,eAAe;CACrE,MAAM,IAAI,QAAQ,KAAK;AAEvB,SAAQ,OAAR;EACE,KAAK;AACH,SAAM,cAAc;AACpB,gBAAa,OAAO,WAAW,OAAO,OAAO,OAAO;AACpD,qBAAkB,UAAU;AAC5B;EAEF,KAAK,gBAAgB;GACnB,MAAM,UAAU,EAAE;AAClB,WAAQ,QAAQ,MAAM,QAAQ,SAAS,QAAQ,IAAI,OAAO,SAAS,YAAY,WAAW,QAAQ,UAAU,EAAE,CAAC;AAC/G,OAAI,eAAe;AACnB;;EAEF,KAAK;AACH,WAAQ,QAAQ,OAAO,EAAE,QAAQ,GAAG,CAAC;AACrC,OAAI,eAAe;AACnB;EAEF,KAAK,2BAA2B;GAC9B,MAAM,UAAU,gBAAgB,MAAM;AACtC,WAAQ,eAAe,SAAS,MAAM;AACtC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,mBAAmB;GACtB,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AACtD,OAAI,CAAC,MAAO;GACZ,MAAM,UAAU,gBAAgB,MAAM;AACtC,uBAAoB,SAAS,MAAM;AACnC,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,kBAAkB;GACrB,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AACtD,OAAI,CAAC,MAAO;GACZ,MAAM,UAAU,gBAAgB,MAAM;AACtC,sBAAmB,SAAS,MAAM;AAClC,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,gBAAgB;GACnB,MAAM,UAAU,gBAAgB,MAAM;AACtC,oBAAiB,QAAQ;AACzB,WAAQ,gBAAgB,SAAS,MAAM;AACvC,OAAI,eAAe;AACnB;;EAEF,KAAK,UAAU;GACb,MAAM,UAAU,gBAAgB,MAAM;AACtC,qBAAkB,SAAS,EAAE,OAAO;AACpC,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,gBAAgB;GACnB,MAAM,WAAW,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC/D,OAAI,CAAC,SAAU;GACf,MAAM,UAAU,gBAAgB,MAAM;AACtC,oBAAiB,SAAS;IACxB;IACA,QAAQ,OAAO,EAAE,WAAW,WAAW,EAAE,SAAS;IAClD,OAAO,EAAE,UAAU,cAAc,cAAc;IAChD,CAAC;AACF,WAAQ,eAAe,SAAS,MAAM;AACtC,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,gBAAgB;GACnB,MAAM,WAAW,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;GAC/D,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AACtD,OAAI,CAAC,YAAY,CAAC,MAAO;GACzB,MAAM,UAAU,gBAAgB,MAAM;AACtC,qBAAkB,SAAS,UAAU,MAAM;AAC3C,WAAQ,gBAAgB,SAAS,MAAM;AACvC,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,cAAc;GACjB,MAAM,WAAW,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC/D,OAAI,CAAC,SAAU;GACf,MAAM,UAAU,gBAAgB,MAAM;AACtC,qBACE,SACA,UACA,EAAE,WAAW,UAAU,UAAU,YACjC,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,KAAA,EAC7C;AACD,WAAQ,gBAAgB,SAAS,MAAM;AACvC,OAAI,eAAe;AACnB;;EAEF,KAAK,cAAc;GACjB,MAAM,WAAW,OAAO,EAAE,YAAY,UAAU;GAChD,MAAM,aAAa,OAAO,EAAE,cAAc,GAAG;AAC7C,OAAI,CAAC,WAAY;AACjB,WAAQ,UAAU,YAAY,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM;AAC5D,WAAQ,yBAAyB,WAAW;AAC5C,gBAAa,OAAO,QAAQ,OAAO,OAAO,OAAO;AACjD,qBAAkB,UAAU;AAC5B,OAAI,eAAe;AACnB;;EAEF,KAAK,eAAe;GAClB,MAAM,WAAW,OAAO,EAAE,YAAY,UAAU;GAChD,MAAM,aAAa,OAAO,EAAE,cAAc,GAAG;AAC7C,OAAI,CAAC,WAAY;AACjB,WAAQ,UAAU,YAAY,UAAU,EAAE,EAAE,MAAM;AAClD,OAAI,aAAa,EAAG,SAAQ,kBAAkB,YAAY,EAAE,QAAQ;AACpE,OAAI,OAAO,EAAE,cAAc,SAAU,SAAQ,iBAAiB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,KAAK;AAC7G,gBAAa,OAAO,QAAQ,OAAO,OAAO,OAAO;AACjD,qBAAkB,UAAU;AAC5B,OAAI,eAAe;AACnB;;EAEF,KAAK,YAAY;GACf,MAAM,aAAa,OAAO,EAAE,cAAc,GAAG;AAC7C,OAAI,CAAC,WAAY;AACjB,WAAQ,iBAAiB,YAAY,EAAE,QAAQ,EAAE,WAAW,WAAW,EAAE,WAAW,aAAa,MAAM;AACvG,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,yBAAyB;GAC5B,MAAM,UAAU,gBAAgB,MAAM;AACtC,oBAAiB,QAAQ;AACzB,WAAQ,kBAAkB,SAAS,MAAM;AACzC,kBAAe,OAAO,MAAM;AAC5B,0BAAuB,QAAQ;AAC/B,gBAAa,OAAO,aAAa,OAAO,OAAO,OAAO;AACtD,qBAAkB,YAAY;AAC9B,OAAI,eAAe;AACnB;;EAEF,KAAK,SAAS;GACZ,MAAM,eAAe,8BAA8B,OAAO,EAAE,WAAW,gBAAgB,CAAC;GACxF,MAAM,UAAU,sBAAsB,aAAa;AACnD,WAAQ,kBAAkB,SAAS,MAAM;AACzC,0BAAuB,SAAS,EAAE,cAAc,cAAc,CAAC;AAC/D,kBAAe,OAAO,MAAM;AAC5B,SAAM,cAAc;AACpB,8BAA2B,OAAO,OAAO,OAAO,OAAO;AACvD,qBAAkB,OAAO;AACzB,iBAAc;AACd,OAAI,eAAe;AACnB;;EAEF,KAAK;AACH,kBAAe,OAAO,MAAM;AAC5B,SAAM,cAAc;AACpB,8BAA2B,OAAO,OAAO,OAAO,OAAO;AACvD,qBAAkB,OAAO;AACzB,iBAAc;AACd,OAAI,eAAe;AACnB;EAEF,KAAK,YAAY;GACf,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;GACtD,MAAM,UAAU,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AAC5D,SAAM,kBAAkB,WAAW;AACnC,gBAAa,OAAO,YAAY,OAAO,OAAO,OAAO;AACrD,qBAAkB,UAAU,aAAa,YAAY,UAAU;AAC/D,OAAI,eAAe;AACnB;;;;AAKN,MAAa,gCAAgC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { parseAgentSessionKey } from "../routing/session-key-utils.js";
|
|
2
|
+
import { init_agent_session_key } from "../routing/agent-session-key.js";
|
|
1
3
|
import { getLogDir } from "../utils/logger/config.js";
|
|
2
4
|
import { getRuntimeLogStats } from "../utils/logger/stats.js";
|
|
3
5
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { parseAgentSessionKey } from "../routing/session-key-utils.js";
|
|
5
|
-
import { init_agent_session_key } from "../routing/agent-session-key.js";
|
|
6
6
|
import { resolveConfigPath } from "../config/paths.js";
|
|
7
7
|
import { getProviderDisplayName, getSortedProviders, init_providers, providerSupportsApiKey, providerSupportsOAuth } from "../providers/index.js";
|
|
8
8
|
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
@@ -409,17 +409,17 @@ function formatTuiWorkflowsInfo(entries) {
|
|
|
409
409
|
}
|
|
410
410
|
function formatTuiWorkflowDetail(name) {
|
|
411
411
|
const loaded = createWorkflowCatalog().load(name);
|
|
412
|
-
const meta = loaded.meta;
|
|
413
412
|
const lines = [
|
|
414
413
|
`Workflow: ${loaded.name}`,
|
|
415
414
|
"",
|
|
416
|
-
`Source: ${loaded.source}
|
|
417
|
-
`Description: ${
|
|
415
|
+
`Source: ${loaded.metadata.source}`,
|
|
416
|
+
`Description: ${loaded.description}`,
|
|
417
|
+
`Revision: ${loaded.revision}`
|
|
418
418
|
];
|
|
419
|
-
if (
|
|
420
|
-
if (
|
|
421
|
-
if (
|
|
422
|
-
lines.push("", "
|
|
419
|
+
if (loaded.metadata.whenToUse) lines.push(`When to use: ${loaded.metadata.whenToUse}`);
|
|
420
|
+
if (loaded.metadata.tags.length) lines.push(`Tags: ${loaded.metadata.tags.join(", ")}`);
|
|
421
|
+
if (loaded.metadata.estimatedAgents) lines.push(`Agents: ${loaded.metadata.estimatedAgents.min}-${loaded.metadata.estimatedAgents.max}`);
|
|
422
|
+
lines.push("", "Flow:", loaded.graph.nodes.map((node) => `- ${node.title} (${node.kind})`).join("\n"));
|
|
423
423
|
return lines.join("\n");
|
|
424
424
|
}
|
|
425
425
|
function formatTuiSessionStatsBlock(stats) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-command-formatters.js","names":[],"sources":["../../../src/tui/tui-command-formatters.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport { visibleWidth } from '@earendil-works/pi-tui';\n\nimport type {\n TuiCompactionResult,\n TuiExportFormat,\n TuiModelChoice,\n TuiShareAudience,\n TuiShareMode,\n TuiShareRequest,\n TuiShareResult,\n TuiSessionStats,\n TuiSessionItem,\n TuiTranscriptTreeEntry,\n} from './tui-backend.js';\nimport { computeContextUsagePercent, formatContextUsageLabel } from './tui-context-usage.js';\nimport type { TuiState } from './tui-types.js';\nimport { formatSessionPickerDescription } from './tui-session-format.js';\nimport { formatTuiTranscriptTreeEntryDisplayText } from './tui-transcript-tree.js';\nimport { createWorkflowCatalog, type CatalogEntry } from '../agent/workflow/catalog.js';\nimport { normalizeVerboseLevel, type VerboseLevel } from '../agent/transcript/thinking-types.js';\nimport type { AuthProfileEntry } from '../auth/profiles/index.js';\nimport type { Config } from '../config/schema.js';\nimport { resolveConfigPath } from '../config/index.js';\nimport type { ProjectTrustStoreEntry } from '../project-trust/trust-store.js';\nimport {\n getProviderDisplayName,\n getSortedProviders,\n providerSupportsApiKey,\n providerSupportsOAuth,\n} from '../providers/index.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport { getLogDir, getRuntimeLogStats } from '../utils/logger.js';\n\nexport interface TuiExportRequest {\n format: TuiExportFormat;\n outputPath?: string;\n}\n\nexport interface TuiImportRequest {\n inputPath?: string;\n targetKey?: string;\n}\n\nexport type TuiDebugDeps = {\n state: TuiState;\n tui: unknown;\n};\n\nconst SHARE_AUDIENCES = new Set<TuiShareAudience>(['friend', 'colleague', 'public']);\nconst SHARE_MODES = new Set<TuiShareMode>(['auto', 'force-file', 'force-site', 'force-zip']);\n\nfunction formatMaybe(value: string | undefined | null): string {\n const trimmed = value?.trim();\n return trimmed ? trimmed : '-';\n}\n\nfunction formatNumber(value: number | undefined | null): string {\n return value == null ? '-' : value.toLocaleString();\n}\n\nexport function formatModelLabel(state: TuiState): string {\n const provider = state.sessionInfo.modelProvider?.trim();\n const model = state.sessionInfo.model?.trim();\n if (provider && model) {\n return `${provider}/${model}`;\n }\n return formatMaybe(model ?? provider);\n}\n\nexport function nextVerboseLevel(current: string | undefined | null): VerboseLevel {\n const normalized = normalizeVerboseLevel(current);\n if (normalized === 'off') return 'on';\n if (normalized === 'on') return 'full';\n return 'off';\n}\n\nfunction splitCommandArgs(input: string): string[] {\n const tokens: string[] = [];\n const re = /\"([^\"]*)\"|'([^']*)'|(\\S+)/g;\n for (const match of input.matchAll(re)) {\n tokens.push(match[1] ?? match[2] ?? match[3] ?? '');\n }\n return tokens;\n}\n\nfunction normalizeExportFormat(raw: string | undefined): TuiExportFormat | undefined {\n const value = raw?.trim().toLowerCase();\n if (value === 'json' || value === 'markdown' || value === 'md' || value === 'html') {\n return value === 'md' ? 'markdown' : value;\n }\n return undefined;\n}\n\nfunction inferExportFormatFromPath(path: string | undefined): TuiExportFormat | undefined {\n const lower = path?.trim().toLowerCase();\n if (!lower) return undefined;\n if (lower.endsWith('.json')) return 'json';\n if (lower.endsWith('.md') || lower.endsWith('.markdown')) return 'markdown';\n if (lower.endsWith('.html') || lower.endsWith('.htm')) return 'html';\n return undefined;\n}\n\nexport function parseTuiExportRequest(args: string): TuiExportRequest {\n const tokens = splitCommandArgs(args.trim());\n const first = tokens[0];\n const explicitFormat = normalizeExportFormat(first);\n if (explicitFormat) {\n const outputPath = tokens[1];\n return { format: explicitFormat, outputPath };\n }\n const outputPath = first;\n return {\n format: inferExportFormatFromPath(outputPath) ?? 'html',\n outputPath,\n };\n}\n\nexport function parseTuiImportRequest(args: string): TuiImportRequest {\n const tokens = splitCommandArgs(args.trim());\n return {\n inputPath: tokens[0],\n targetKey: tokens[1],\n };\n}\n\nexport function parseTuiShareRequest(args: string): TuiShareRequest | null {\n const tokens = splitCommandArgs(args.trim());\n const path = tokens.shift();\n if (!path) return null;\n\n const request: TuiShareRequest = { path };\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n const lower = token.toLowerCase();\n const next = tokens[i + 1];\n\n if (lower === '--friend' || lower === '--colleague' || lower === '--public') {\n request.audience = lower.slice(2) as TuiShareAudience;\n continue;\n }\n if (SHARE_AUDIENCES.has(lower as TuiShareAudience)) {\n request.audience = lower as TuiShareAudience;\n continue;\n }\n if (lower === '--file') {\n request.mode = 'force-file';\n continue;\n }\n if (lower === '--site') {\n request.mode = 'force-site';\n continue;\n }\n if (lower === '--zip') {\n request.mode = 'force-zip';\n continue;\n }\n if (SHARE_MODES.has(lower as TuiShareMode)) {\n request.mode = lower as TuiShareMode;\n continue;\n }\n if ((lower === '--title' || lower === '-t') && next) {\n request.title = next;\n i += 1;\n continue;\n }\n if ((lower === '--description' || lower === '--desc' || lower === '-d') && next) {\n request.description = next;\n i += 1;\n continue;\n }\n }\n return request;\n}\n\nexport function formatTuiShareResult(result: TuiShareResult): string {\n const lines = [\n 'Share',\n '',\n `Kind: ${result.kind}`,\n `URL: ${result.shareUrl}`,\n ];\n if (result.title?.trim()) lines.push(`Title: ${result.title.trim()}`);\n if (result.expiresAt?.trim()) lines.push(`Expires: ${result.expiresAt.trim()}`);\n if (result.maxViews != null) lines.push(`Max Views: ${formatNumber(result.maxViews)}`);\n if (result.reachability?.trim()) {\n lines.push(`Reachability: ${result.reachability.trim()}`);\n }\n if (result.reachabilityHint?.trim()) {\n lines.push(`Hint: ${result.reachabilityHint.trim()}`);\n }\n if (result.thumbnailUrl?.trim()) {\n lines.push(`Thumbnail: ${result.thumbnailUrl.trim()}`);\n }\n if (result.routingReason?.trim()) {\n lines.push(`Routing: ${result.routingReason.trim()}`);\n }\n if (result.routingHint?.trim()) {\n lines.push(`Routing Hint: ${result.routingHint.trim()}`);\n }\n return lines.join('\\n');\n}\n\nfunction formatModelChoice(choice: TuiModelChoice): string {\n const ref = `${choice.provider}/${choice.id}`;\n const name = choice.name?.trim();\n const suffix = name && name !== choice.id ? ` — ${name}` : '';\n return `${ref}${suffix}`;\n}\n\nfunction formatAuthProfileExpires(expires: number | undefined): string {\n if (!expires) return '';\n const date = new Date(expires);\n if (Number.isNaN(date.getTime())) return '';\n return `, expires ${date.toISOString()}`;\n}\n\nfunction formatAuthProfileLine(profile: AuthProfileEntry): string {\n const email = profile.email?.trim() ? `, ${profile.email.trim()}` : '';\n const key = profile.hasKey ? 'has credential' : 'empty credential';\n return ` ${profile.provider} — ${profile.profileId} (${profile.type}, ${key}${email}${formatAuthProfileExpires(profile.expires)})`;\n}\n\nexport function formatTuiStoredAuthProfilesInfo(\n profiles: AuthProfileEntry[],\n options: { authStorePath?: string } = {},\n): string {\n if (profiles.length === 0) {\n return [\n 'Auth Profiles',\n '',\n 'No stored auth profiles found.',\n 'Environment variables and config credentials are unchanged by /logout.',\n ].join('\\n');\n }\n\n const sorted = [...profiles].sort((a, b) => {\n const byProvider = a.provider.localeCompare(b.provider);\n return byProvider || a.profileId.localeCompare(b.profileId);\n });\n const lines = ['Auth Profiles', '', ...sorted.map(formatAuthProfileLine)];\n lines.push('', 'Use /logout <provider> to remove stored profiles for one provider.');\n lines.push('Environment variables and config credentials are unchanged.');\n if (options.authStorePath) {\n lines.push(`Store: ${options.authStorePath}`);\n }\n return lines.join('\\n');\n}\n\nexport function formatTuiLoginInfo(provider?: string): string {\n const trimmedProvider = provider?.trim();\n if (trimmedProvider) {\n const displayName = getProviderDisplayName(trimmedProvider);\n const lines = ['Login', '', `${trimmedProvider} — ${displayName}`, ''];\n if (providerSupportsOAuth(trimmedProvider)) {\n lines.push(`OAuth: /login ${trimmedProvider} (or xopc auth login ${trimmedProvider})`);\n }\n if (providerSupportsApiKey(trimmedProvider)) {\n lines.push(`API key: xopc auth set ${trimmedProvider} <key>`);\n }\n if (!providerSupportsOAuth(trimmedProvider) && !providerSupportsApiKey(trimmedProvider)) {\n lines.push('No direct xopc auth setup command is advertised for this provider.');\n }\n lines.push('', 'In the TUI, /login <provider> runs OAuth directly when supported.');\n lines.push('Stored credentials can be inspected with /logout and removed with /logout <provider>.');\n return lines.join('\\n');\n }\n\n const oauthProviders = getSortedProviders().filter(providerSupportsOAuth);\n const lines = ['Login', '', 'OAuth providers:'];\n if (oauthProviders.length === 0) {\n lines.push(' none detected');\n } else {\n for (const nextProvider of oauthProviders) {\n lines.push(` ${nextProvider} — ${getProviderDisplayName(nextProvider)}`);\n }\n }\n lines.push(\n '',\n 'Use /login <provider> to start OAuth directly when supported.',\n 'API keys: xopc auth set <provider> <key>',\n 'Stored credentials: /logout',\n );\n return lines.join('\\n');\n}\n\nexport function formatTuiChangelogInfo(markdown: string, sourcePath?: string): string {\n const trimmed = markdown.trim();\n if (!trimmed) {\n return 'What\\'s New\\n\\nNo changelog entries found.';\n }\n\n const lines = trimmed.split(/\\r?\\n/);\n const firstVersionIndex = lines.findIndex((line) => /^##\\s+/.test(line));\n const body = firstVersionIndex >= 0 ? lines.slice(firstVersionIndex).join('\\n').trim() : trimmed;\n const suffix = sourcePath ? `\\n\\nSource: ${sourcePath}` : '';\n return `What's New\\n\\n${body}${suffix}`;\n}\n\nexport function loadTuiChangelogInfo(): string {\n const candidates = [\n join(process.cwd(), 'CHANGELOG.md'),\n join(process.cwd(), 'CHANGELOG'),\n join(process.cwd(), 'docs', 'changelog.md'),\n ];\n const path = candidates.find((candidate) => existsSync(candidate));\n if (!path) {\n return formatTuiChangelogInfo('');\n }\n try {\n return formatTuiChangelogInfo(readFileSync(path, 'utf8'), path);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return `What's New\\n\\nFailed to read changelog: ${errorMessage}`;\n }\n}\n\nexport function formatTuiDebugInfo(params: {\n state: TuiState;\n terminal: { columns?: number; rows?: number };\n renderedLines: string[];\n logStats: unknown;\n}): string {\n const width = params.terminal.columns ?? 0;\n const height = params.terminal.rows ?? 0;\n return [\n `Debug output at ${new Date().toISOString()}`,\n `Terminal: ${width}x${height}`,\n `Total rendered lines: ${params.renderedLines.length}`,\n '',\n '=== TUI State ===',\n JSON.stringify(params.state, null, 2),\n '',\n '=== Runtime Log Stats ===',\n JSON.stringify(params.logStats, null, 2),\n '',\n '=== Rendered lines with visible widths ===',\n ...params.renderedLines.map((line, index) => `[${index}] (w=${visibleWidth(line)}) ${JSON.stringify(line)}`),\n '',\n ].join('\\n');\n}\n\nexport function writeTuiDebugInfo(deps: TuiDebugDeps): string {\n const debugPath = join(getLogDir(), 'xopc-tui-debug.log');\n const terminal = (deps.tui as unknown as { terminal?: { columns?: number; rows?: number } }).terminal ?? {};\n const width = terminal.columns ?? 100;\n const renderedLines =\n typeof (deps.tui as unknown as { render?: (width: number) => string[] }).render === 'function'\n ? (deps.tui as unknown as { render: (width: number) => string[] }).render(width)\n : [];\n const content = formatTuiDebugInfo({\n state: deps.state,\n terminal,\n renderedLines,\n logStats: getRuntimeLogStats(),\n });\n mkdirSync(dirname(debugPath), { recursive: true });\n writeFileSync(debugPath, content, 'utf8');\n return debugPath;\n}\n\nexport function formatTuiModelsInfo(models: TuiModelChoice[]): string {\n if (models.length === 0) {\n return 'Models\\n\\nNo models available.';\n }\n const lines = ['Models', '', ...models.map((model) => ` ${formatModelChoice(model)}`)];\n return lines.join('\\n');\n}\n\nexport function formatTuiSessionListInfo(\n sessions: TuiSessionItem[],\n options: { currentSessionKey?: string; limit?: number } = {},\n): string {\n if (sessions.length === 0) {\n return 'Sessions\\n\\nNo sessions found.';\n }\n const limit = options.limit ?? 20;\n const visible = sessions.slice(0, limit);\n const lines = ['Sessions', ''];\n for (const session of visible) {\n const current = session.key === options.currentSessionKey ? '* ' : ' ';\n const label = session.displayName?.trim() || session.key;\n const description = formatSessionPickerDescription(session, { showKey: Boolean(session.displayName) });\n lines.push(`${current}${label}${description ? ` — ${description}` : ''}`);\n }\n if (sessions.length > visible.length) {\n lines.push('', `Showing ${visible.length} of ${sessions.length} sessions. Use /resume to search.`);\n }\n return lines.join('\\n');\n}\n\nfunction sessionTreeGroup(session: TuiSessionItem): { agentId: string; root: string; leaf: string } {\n const parsed = parseAgentSessionKey(session.key);\n const agentId = parsed?.agentId ?? 'unknown';\n const rest = parsed?.rest ?? session.key;\n const parts = rest.split(':').filter(Boolean);\n const root = parts[0] ?? rest;\n const leaf = parts.length > 1 ? parts.slice(1).join(':') : rest;\n return { agentId, root, leaf };\n}\n\nexport function formatTuiSessionTreeInfo(\n sessions: TuiSessionItem[],\n options: { currentSessionKey?: string; limitPerGroup?: number } = {},\n): string {\n if (sessions.length === 0) {\n return 'Session Tree\\n\\nNo sessions found.';\n }\n const limitPerGroup = options.limitPerGroup ?? 8;\n const byKey = new Map(sessions.map((session) => [session.key, session]));\n const groups = new Map<string, TuiSessionItem[]>();\n for (const session of sessions) {\n const group = sessionTreeGroup(session);\n const key = `${group.agentId}:${group.root}`;\n const list = groups.get(key) ?? [];\n list.push(session);\n groups.set(key, list);\n }\n\n const lines = ['Session Tree', ''];\n const sortedGroups = [...groups.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [groupKey, groupSessions] of sortedGroups) {\n const [agentId, ...rootParts] = groupKey.split(':');\n lines.push(`${agentId}/${rootParts.join(':')}`);\n const sorted = [...groupSessions].sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n const visible = sorted.slice(0, limitPerGroup);\n for (const session of visible) {\n const current = session.key === options.currentSessionKey ? '*' : ' ';\n const group = sessionTreeGroup(session);\n const label = session.displayName?.trim() || group.leaf;\n const description = formatSessionPickerDescription(session, {\n showKey: Boolean(session.displayName),\n });\n lines.push(` ${current} ${label}${description ? ` — ${description}` : ''}`);\n if (session.forkedFromSessionKey) {\n const source = byKey.get(session.forkedFromSessionKey);\n const sourceLabel = source?.displayName?.trim() || session.forkedFromSessionKey;\n lines.push(` forked from ${sourceLabel}`);\n }\n }\n if (sorted.length > visible.length) {\n lines.push(` ... ${sorted.length - visible.length} more`);\n }\n }\n lines.push('', 'Use /resume to search and open a session.');\n return lines.join('\\n');\n}\n\nexport function formatTuiTranscriptTreeInfo(\n entries: TuiTranscriptTreeEntry[],\n options: { limit?: number; allEntries?: TuiTranscriptTreeEntry[] } = {},\n): string {\n if (entries.length === 0) {\n return 'Transcript Tree\\n\\nNo transcript entries found.';\n }\n const limit = options.limit ?? 80;\n const visible = entries.slice(0, limit);\n const prefixes = transcriptTreeInfoPrefixes(visible, options.allEntries ?? entries);\n const lines = ['Transcript Tree', ''];\n for (const entry of visible) {\n const prefix = prefixes.get(entry.id) ?? (entry.depth === 0 ? '-' : ' └─');\n const activeMarker = entry.isOnActivePath || entry.isCurrentLeaf ? '• ' : '';\n const turn = entry.turn > 0 ? `#${entry.turn} ` : '';\n const userLabel = entry.userLabel ? `[${entry.userLabel}] ` : '';\n lines.push(`${prefix} ${activeMarker}${turn}${userLabel}${formatTuiTranscriptTreeEntryDisplayText(entry)}`);\n }\n if (entries.length > visible.length) {\n lines.push('', `Showing ${visible.length} of ${entries.length} entries.`);\n }\n lines.push('', 'Interactive /tree supports search, filters, folds, labels, and fork selection.');\n return lines.join('\\n');\n}\n\nfunction transcriptTreeInfoPrefixes(\n entries: TuiTranscriptTreeEntry[],\n allEntries: TuiTranscriptTreeEntry[] = entries,\n): Map<string, string> {\n const byId = new Map(allEntries.map((entry) => [entry.id, entry]));\n const visibleIds = new Set(entries.map((entry) => entry.id));\n const parentByEntryId = new Map<string, string | null>();\n const childrenByParentId = new Map<string | null, string[]>();\n\n const nearestVisibleParent = (entry: TuiTranscriptTreeEntry, index: number): string | null => {\n let parentId = entry.parentId;\n while (parentId) {\n if (visibleIds.has(parentId)) return parentId;\n parentId = byId.get(parentId)?.parentId;\n }\n if (entry.depth > 0) {\n for (let i = index - 1; i >= 0; i -= 1) {\n const candidate = entries[i];\n if (candidate && candidate.depth < entry.depth) return candidate.id;\n }\n }\n return null;\n };\n\n for (const [index, entry] of entries.entries()) {\n const parentId = nearestVisibleParent(entry, index);\n parentByEntryId.set(entry.id, parentId);\n const children = childrenByParentId.get(parentId) ?? [];\n children.push(entry.id);\n childrenByParentId.set(parentId, children);\n }\n\n const prefixes = new Map<string, string>();\n for (const entry of entries) {\n const visibleParentId = parentByEntryId.get(entry.id) ?? null;\n if (visibleParentId === null) {\n prefixes.set(entry.id, '-');\n continue;\n }\n\n const ancestors: string[] = [];\n let parentId: string | null | undefined = visibleParentId;\n while (parentId) {\n ancestors.unshift(parentId);\n parentId = parentByEntryId.get(parentId) ?? null;\n }\n\n let prefix = ' ';\n for (const ancestor of ancestors.slice(1)) {\n prefix += hasTranscriptTreeInfoFollowingSibling(\n ancestor,\n parentByEntryId.get(ancestor) ?? null,\n childrenByParentId,\n )\n ? '│ '\n : ' ';\n }\n prefix += hasTranscriptTreeInfoFollowingSibling(entry.id, visibleParentId, childrenByParentId)\n ? '├─'\n : '└─';\n prefixes.set(entry.id, prefix);\n }\n return prefixes;\n}\n\nfunction hasTranscriptTreeInfoFollowingSibling(\n entryId: string,\n parentId: string | null,\n childrenByParentId: Map<string | null, string[]>,\n): boolean {\n const siblings = childrenByParentId.get(parentId) ?? [];\n return siblings.indexOf(entryId) < siblings.length - 1;\n}\n\nexport function formatTuiWorkflowsInfo(entries: CatalogEntry[]): string {\n if (entries.length === 0) {\n return 'Workflows\\n\\nNo workflows found.';\n }\n const lines = ['Workflows', ''];\n for (const entry of entries) {\n const tags = entry.tags?.length ? ` [${entry.tags.join(', ')}]` : '';\n lines.push(` ${entry.name} (${entry.source})${tags}`);\n if (entry.description) {\n lines.push(` ${entry.description}`);\n }\n }\n lines.push('', 'Run a workflow with /<name>, or inspect one with /workflow view <name>.');\n return lines.join('\\n');\n}\n\nexport function formatTuiWorkflowDetail(name: string): string {\n const catalog = createWorkflowCatalog();\n const loaded = catalog.load(name);\n const meta = loaded.meta;\n const lines = [\n `Workflow: ${loaded.name}`,\n '',\n `Source: ${loaded.source}${loaded.path ? ` (${loaded.path})` : ''}`,\n `Description: ${meta.description}`,\n ];\n if (meta.whenToUse) {\n lines.push(`When to use: ${meta.whenToUse}`);\n }\n if (meta.tags?.length) {\n lines.push(`Tags: ${meta.tags.join(', ')}`);\n }\n if (meta.estimatedAgents) {\n lines.push(`Agents: ${meta.estimatedAgents.min}-${meta.estimatedAgents.max}`);\n }\n lines.push('', 'Script:', loaded.script.trim());\n return lines.join('\\n');\n}\n\nfunction formatTuiSessionStatsBlock(stats?: TuiSessionStats): string[] {\n if (!stats) return [];\n return [\n '',\n 'Messages',\n `User: ${formatNumber(stats.userMessages)}`,\n `Assistant: ${formatNumber(stats.assistantMessages)}`,\n `Tool Calls: ${formatNumber(stats.toolCalls)}`,\n `Tool Results: ${formatNumber(stats.toolResults)}`,\n `Context Rows: ${formatNumber(stats.contextRows)}`,\n `Total Rows: ${formatNumber(stats.totalMessages)}`,\n '',\n 'Token Usage',\n `Input: ${formatNumber(stats.tokens.input)}`,\n `Output: ${formatNumber(stats.tokens.output)}`,\n `Cache Read: ${formatNumber(stats.tokens.cacheRead)}`,\n `Cache Write: ${formatNumber(stats.tokens.cacheWrite)}`,\n `Total: ${formatNumber(stats.tokens.total)}`,\n ];\n}\n\nexport function formatTuiSessionInfo(state: TuiState, stats?: TuiSessionStats): string {\n const parsedKey = parseAgentSessionKey(state.currentSessionKey);\n const tokenEstimate = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens;\n const contextPercent =\n state.sessionInfo.contextUsagePercent ??\n computeContextUsagePercent(tokenEstimate, state.sessionInfo.contextWindow);\n const contextLabel =\n formatContextUsageLabel(contextPercent, state.sessionInfo.contextWindow) ?? '-';\n const connectionLabel = state.isConnected ? 'connected' : 'disconnected';\n\n return [\n 'Session Info',\n '',\n `Name: ${formatMaybe(state.sessionInfo.displayName)}`,\n `Key: ${state.currentSessionKey}`,\n `Agent: ${formatMaybe(parsedKey?.agentId)}`,\n `Connection: ${connectionLabel} (${formatMaybe(state.connectionStatus)})`,\n `Activity: ${formatMaybe(state.activityStatus)}`,\n `Model: ${formatModelLabel(state)}`,\n `Thinking: ${formatMaybe(state.sessionInfo.thinkingLevel)}`,\n `Reasoning: ${formatMaybe(state.sessionInfo.reasoningLevel)}`,\n `Verbose: ${formatMaybe(state.sessionInfo.verboseLevel)}`,\n `Tokens: ${formatNumber(tokenEstimate)}`,\n `Context: ${contextLabel}`,\n `Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`,\n `Thinking Display: ${state.showThinking ? 'on' : 'off'}`,\n `Queue: ${state.messageFollowUpQueue.length}`,\n `Steering Queue: ${state.steeringQueue.length}`,\n ...formatTuiSessionStatsBlock(stats),\n ].join('\\n');\n}\n\nexport function formatTuiUsageInfo(state: TuiState, stats?: TuiSessionStats): string {\n const tokenEstimate = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens;\n const contextPercent =\n state.sessionInfo.contextUsagePercent ??\n computeContextUsagePercent(tokenEstimate, state.sessionInfo.contextWindow);\n const contextLabel =\n formatContextUsageLabel(contextPercent, state.sessionInfo.contextWindow) ?? '-';\n\n return [\n 'Usage',\n '',\n `Estimated Tokens: ${formatNumber(tokenEstimate)}`,\n `Context Window: ${formatNumber(state.sessionInfo.contextWindow)}`,\n `Context Usage: ${contextLabel}`,\n `Model: ${formatModelLabel(state)}`,\n ...(stats\n ? [\n '',\n 'Transcript Tokens',\n `Input: ${formatNumber(stats.tokens.input)}`,\n `Output: ${formatNumber(stats.tokens.output)}`,\n `Cache Read: ${formatNumber(stats.tokens.cacheRead)}`,\n `Cache Write: ${formatNumber(stats.tokens.cacheWrite)}`,\n `Total: ${formatNumber(stats.tokens.total)}`,\n '',\n 'Transcript Rows',\n `User: ${formatNumber(stats.userMessages)}`,\n `Assistant: ${formatNumber(stats.assistantMessages)}`,\n `Tool Calls: ${formatNumber(stats.toolCalls)}`,\n `Tool Results: ${formatNumber(stats.toolResults)}`,\n `Context Rows: ${formatNumber(stats.contextRows)}`,\n `Total Rows: ${formatNumber(stats.totalMessages)}`,\n ]\n : []),\n ].join('\\n');\n}\n\nexport function formatTuiCompactionResult(result: TuiCompactionResult): string {\n if (!result.compacted) {\n return result.summary ?? 'Nothing to compact';\n }\n const before = formatNumber(result.tokensBefore);\n const after = formatNumber(result.tokensAfter);\n const summary = result.transcriptSummary?.trim();\n const lines = [\n '[compaction]',\n '',\n `Tokens: ${before} -> ${after}`,\n ];\n if (summary) {\n lines.push('', summary);\n } else if (result.summary) {\n lines.push('', result.summary);\n }\n return lines.join('\\n');\n}\n\nexport function formatTuiContextInfo(state: TuiState): string {\n const tokenEstimate = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens;\n const contextPercent =\n state.sessionInfo.contextUsagePercent ??\n computeContextUsagePercent(tokenEstimate, state.sessionInfo.contextWindow);\n const contextLabel =\n formatContextUsageLabel(contextPercent, state.sessionInfo.contextWindow) ?? '-';\n const remaining =\n tokenEstimate != null && state.sessionInfo.contextWindow != null\n ? Math.max(0, state.sessionInfo.contextWindow - tokenEstimate)\n : null;\n\n return [\n 'Context',\n '',\n `Used: ${formatNumber(tokenEstimate)}`,\n `Window: ${formatNumber(state.sessionInfo.contextWindow)}`,\n `Remaining: ${formatNumber(remaining)}`,\n `Usage: ${contextLabel}`,\n ].join('\\n');\n}\n\nexport function formatTuiConfigInfo(state: TuiState): string {\n const scopedModels =\n state.scopedModelRefs == null\n ? 'all'\n : state.scopedModelRefs.length === 0\n ? 'none'\n : state.scopedModelRefs.join(', ');\n return [\n 'Config',\n '',\n `Session: ${state.currentSessionKey}`,\n `Model: ${formatModelLabel(state)}`,\n `Thinking: ${formatMaybe(state.sessionInfo.thinkingLevel)}`,\n `Reasoning: ${formatMaybe(state.sessionInfo.reasoningLevel)}`,\n `Verbose: ${formatMaybe(state.sessionInfo.verboseLevel)}`,\n `Workspace: ${formatMaybe(state.sessionInfo.effectiveWorkspacePath)}`,\n `Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`,\n `Thinking Display: ${state.showThinking ? 'on' : 'off'}`,\n `Scoped Models: ${scopedModels}`,\n ].join('\\n');\n}\n\ntype TuiTrustProvenance = {\n extensionId: string;\n source: string;\n installMethod?: string;\n};\n\nfunction extensionSecurityConfig(config: Config): {\n checkPermissions: boolean;\n allowUntrusted: boolean;\n allow: string[];\n trackProvenance: boolean;\n allowPromptInjection: boolean;\n} {\n const raw = (config.extensions as Record<string, unknown> | undefined)?.security;\n const sec = raw && typeof raw === 'object' ? raw as Record<string, unknown> : {};\n return {\n checkPermissions: sec.checkPermissions !== false,\n allowUntrusted: sec.allowUntrusted === true,\n allow: Array.isArray(sec.allow) ? sec.allow.filter((id): id is string => typeof id === 'string') : [],\n trackProvenance: sec.trackProvenance !== false,\n allowPromptInjection: sec.allowPromptInjection === true,\n };\n}\n\nexport function formatTuiTrustInfo(\n config: Config,\n options: {\n configPath?: string;\n provenance?: TuiTrustProvenance[];\n cwd?: string;\n projectTrustStorePath?: string;\n projectTrustEntry?: ProjectTrustStoreEntry | null;\n projectTrustSessionDecision?: boolean | null;\n hasProjectResources?: boolean;\n } = {},\n): string {\n const security = extensionSecurityConfig(config);\n const enabled = Array.isArray((config.extensions as Record<string, unknown> | undefined)?.enabled)\n ? ((config.extensions as Record<string, unknown>).enabled as unknown[])\n .filter((id): id is string => typeof id === 'string')\n : [];\n const disabled = Array.isArray((config.extensions as Record<string, unknown> | undefined)?.disabled)\n ? ((config.extensions as Record<string, unknown>).disabled as unknown[])\n .filter((id): id is string => typeof id === 'string')\n : [];\n const provenance = options.provenance ?? [];\n const projectTrustEntry = options.projectTrustEntry ?? null;\n const projectTrustStatus =\n options.projectTrustSessionDecision !== null && options.projectTrustSessionDecision !== undefined\n ? `${options.projectTrustSessionDecision ? 'trusted' : 'not trusted'} (this session)`\n : projectTrustEntry\n ? `${projectTrustEntry.decision ? 'trusted' : 'not trusted'} from ${projectTrustEntry.path}`\n : 'not saved';\n const lines = [\n 'Extension Trust',\n '',\n 'Project trust gates project-local xopc resources and extension UI context.',\n '',\n `Project: ${options.cwd ?? 'unknown'}`,\n `Project Resources: ${options.hasProjectResources === undefined ? 'unknown' : options.hasProjectResources ? 'detected' : 'none detected'}`,\n `Project Trust: ${projectTrustStatus}`,\n `Trust Store: ${options.projectTrustStorePath ?? '(default)'}`,\n '',\n `Config: ${options.configPath ?? resolveConfigPath()}`,\n `Permission Checks: ${security.checkPermissions ? 'on' : 'off'}`,\n `Allow Untrusted: ${security.allowUntrusted ? 'yes' : 'no'}`,\n `Prompt Injection Hooks: ${security.allowPromptInjection ? 'allowed' : 'blocked'}`,\n `Track Provenance: ${security.trackProvenance ? 'on' : 'off'}`,\n `Allowlist: ${security.allow.length ? security.allow.join(', ') : '(empty)'}`,\n `Enabled: ${enabled.length ? enabled.join(', ') : '(activation rules/defaults)'}`,\n `Disabled: ${disabled.length ? disabled.join(', ') : '(none)'}`,\n ];\n\n if (provenance.length > 0) {\n lines.push('', 'Loaded Extensions:');\n for (const item of provenance.slice(0, 20)) {\n const method = item.installMethod ? `, ${item.installMethod}` : '';\n lines.push(` ${item.extensionId} — ${item.source}${method}`);\n }\n if (provenance.length > 20) {\n lines.push(` ... ${provenance.length - 20} more`);\n }\n }\n\n lines.push(\n '',\n 'Use /trust to change project trust for this folder or its parent.',\n 'To trust specific extensions, add their ids to extensions.security.allow and run /reload.',\n 'To audit installed extensions, run: xopc extensions audit',\n );\n return lines.join('\\n');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tui-command-formatters.js","names":[],"sources":["../../../src/tui/tui-command-formatters.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport { visibleWidth } from '@earendil-works/pi-tui';\n\nimport type {\n TuiCompactionResult,\n TuiExportFormat,\n TuiModelChoice,\n TuiShareAudience,\n TuiShareMode,\n TuiShareRequest,\n TuiShareResult,\n TuiSessionStats,\n TuiSessionItem,\n TuiTranscriptTreeEntry,\n} from './tui-backend.js';\nimport { computeContextUsagePercent, formatContextUsageLabel } from './tui-context-usage.js';\nimport type { TuiState } from './tui-types.js';\nimport { formatSessionPickerDescription } from './tui-session-format.js';\nimport { formatTuiTranscriptTreeEntryDisplayText } from './tui-transcript-tree.js';\nimport { createWorkflowCatalog, type CatalogEntry } from '../agent/workflow/catalog.js';\nimport { normalizeVerboseLevel, type VerboseLevel } from '../agent/transcript/thinking-types.js';\nimport type { AuthProfileEntry } from '../auth/profiles/index.js';\nimport type { Config } from '../config/schema.js';\nimport { resolveConfigPath } from '../config/index.js';\nimport type { ProjectTrustStoreEntry } from '../project-trust/trust-store.js';\nimport {\n getProviderDisplayName,\n getSortedProviders,\n providerSupportsApiKey,\n providerSupportsOAuth,\n} from '../providers/index.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport { getLogDir, getRuntimeLogStats } from '../utils/logger.js';\n\nexport interface TuiExportRequest {\n format: TuiExportFormat;\n outputPath?: string;\n}\n\nexport interface TuiImportRequest {\n inputPath?: string;\n targetKey?: string;\n}\n\nexport type TuiDebugDeps = {\n state: TuiState;\n tui: unknown;\n};\n\nconst SHARE_AUDIENCES = new Set<TuiShareAudience>(['friend', 'colleague', 'public']);\nconst SHARE_MODES = new Set<TuiShareMode>(['auto', 'force-file', 'force-site', 'force-zip']);\n\nfunction formatMaybe(value: string | undefined | null): string {\n const trimmed = value?.trim();\n return trimmed ? trimmed : '-';\n}\n\nfunction formatNumber(value: number | undefined | null): string {\n return value == null ? '-' : value.toLocaleString();\n}\n\nexport function formatModelLabel(state: TuiState): string {\n const provider = state.sessionInfo.modelProvider?.trim();\n const model = state.sessionInfo.model?.trim();\n if (provider && model) {\n return `${provider}/${model}`;\n }\n return formatMaybe(model ?? provider);\n}\n\nexport function nextVerboseLevel(current: string | undefined | null): VerboseLevel {\n const normalized = normalizeVerboseLevel(current);\n if (normalized === 'off') return 'on';\n if (normalized === 'on') return 'full';\n return 'off';\n}\n\nfunction splitCommandArgs(input: string): string[] {\n const tokens: string[] = [];\n const re = /\"([^\"]*)\"|'([^']*)'|(\\S+)/g;\n for (const match of input.matchAll(re)) {\n tokens.push(match[1] ?? match[2] ?? match[3] ?? '');\n }\n return tokens;\n}\n\nfunction normalizeExportFormat(raw: string | undefined): TuiExportFormat | undefined {\n const value = raw?.trim().toLowerCase();\n if (value === 'json' || value === 'markdown' || value === 'md' || value === 'html') {\n return value === 'md' ? 'markdown' : value;\n }\n return undefined;\n}\n\nfunction inferExportFormatFromPath(path: string | undefined): TuiExportFormat | undefined {\n const lower = path?.trim().toLowerCase();\n if (!lower) return undefined;\n if (lower.endsWith('.json')) return 'json';\n if (lower.endsWith('.md') || lower.endsWith('.markdown')) return 'markdown';\n if (lower.endsWith('.html') || lower.endsWith('.htm')) return 'html';\n return undefined;\n}\n\nexport function parseTuiExportRequest(args: string): TuiExportRequest {\n const tokens = splitCommandArgs(args.trim());\n const first = tokens[0];\n const explicitFormat = normalizeExportFormat(first);\n if (explicitFormat) {\n const outputPath = tokens[1];\n return { format: explicitFormat, outputPath };\n }\n const outputPath = first;\n return {\n format: inferExportFormatFromPath(outputPath) ?? 'html',\n outputPath,\n };\n}\n\nexport function parseTuiImportRequest(args: string): TuiImportRequest {\n const tokens = splitCommandArgs(args.trim());\n return {\n inputPath: tokens[0],\n targetKey: tokens[1],\n };\n}\n\nexport function parseTuiShareRequest(args: string): TuiShareRequest | null {\n const tokens = splitCommandArgs(args.trim());\n const path = tokens.shift();\n if (!path) return null;\n\n const request: TuiShareRequest = { path };\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n const lower = token.toLowerCase();\n const next = tokens[i + 1];\n\n if (lower === '--friend' || lower === '--colleague' || lower === '--public') {\n request.audience = lower.slice(2) as TuiShareAudience;\n continue;\n }\n if (SHARE_AUDIENCES.has(lower as TuiShareAudience)) {\n request.audience = lower as TuiShareAudience;\n continue;\n }\n if (lower === '--file') {\n request.mode = 'force-file';\n continue;\n }\n if (lower === '--site') {\n request.mode = 'force-site';\n continue;\n }\n if (lower === '--zip') {\n request.mode = 'force-zip';\n continue;\n }\n if (SHARE_MODES.has(lower as TuiShareMode)) {\n request.mode = lower as TuiShareMode;\n continue;\n }\n if ((lower === '--title' || lower === '-t') && next) {\n request.title = next;\n i += 1;\n continue;\n }\n if ((lower === '--description' || lower === '--desc' || lower === '-d') && next) {\n request.description = next;\n i += 1;\n continue;\n }\n }\n return request;\n}\n\nexport function formatTuiShareResult(result: TuiShareResult): string {\n const lines = [\n 'Share',\n '',\n `Kind: ${result.kind}`,\n `URL: ${result.shareUrl}`,\n ];\n if (result.title?.trim()) lines.push(`Title: ${result.title.trim()}`);\n if (result.expiresAt?.trim()) lines.push(`Expires: ${result.expiresAt.trim()}`);\n if (result.maxViews != null) lines.push(`Max Views: ${formatNumber(result.maxViews)}`);\n if (result.reachability?.trim()) {\n lines.push(`Reachability: ${result.reachability.trim()}`);\n }\n if (result.reachabilityHint?.trim()) {\n lines.push(`Hint: ${result.reachabilityHint.trim()}`);\n }\n if (result.thumbnailUrl?.trim()) {\n lines.push(`Thumbnail: ${result.thumbnailUrl.trim()}`);\n }\n if (result.routingReason?.trim()) {\n lines.push(`Routing: ${result.routingReason.trim()}`);\n }\n if (result.routingHint?.trim()) {\n lines.push(`Routing Hint: ${result.routingHint.trim()}`);\n }\n return lines.join('\\n');\n}\n\nfunction formatModelChoice(choice: TuiModelChoice): string {\n const ref = `${choice.provider}/${choice.id}`;\n const name = choice.name?.trim();\n const suffix = name && name !== choice.id ? ` — ${name}` : '';\n return `${ref}${suffix}`;\n}\n\nfunction formatAuthProfileExpires(expires: number | undefined): string {\n if (!expires) return '';\n const date = new Date(expires);\n if (Number.isNaN(date.getTime())) return '';\n return `, expires ${date.toISOString()}`;\n}\n\nfunction formatAuthProfileLine(profile: AuthProfileEntry): string {\n const email = profile.email?.trim() ? `, ${profile.email.trim()}` : '';\n const key = profile.hasKey ? 'has credential' : 'empty credential';\n return ` ${profile.provider} — ${profile.profileId} (${profile.type}, ${key}${email}${formatAuthProfileExpires(profile.expires)})`;\n}\n\nexport function formatTuiStoredAuthProfilesInfo(\n profiles: AuthProfileEntry[],\n options: { authStorePath?: string } = {},\n): string {\n if (profiles.length === 0) {\n return [\n 'Auth Profiles',\n '',\n 'No stored auth profiles found.',\n 'Environment variables and config credentials are unchanged by /logout.',\n ].join('\\n');\n }\n\n const sorted = [...profiles].sort((a, b) => {\n const byProvider = a.provider.localeCompare(b.provider);\n return byProvider || a.profileId.localeCompare(b.profileId);\n });\n const lines = ['Auth Profiles', '', ...sorted.map(formatAuthProfileLine)];\n lines.push('', 'Use /logout <provider> to remove stored profiles for one provider.');\n lines.push('Environment variables and config credentials are unchanged.');\n if (options.authStorePath) {\n lines.push(`Store: ${options.authStorePath}`);\n }\n return lines.join('\\n');\n}\n\nexport function formatTuiLoginInfo(provider?: string): string {\n const trimmedProvider = provider?.trim();\n if (trimmedProvider) {\n const displayName = getProviderDisplayName(trimmedProvider);\n const lines = ['Login', '', `${trimmedProvider} — ${displayName}`, ''];\n if (providerSupportsOAuth(trimmedProvider)) {\n lines.push(`OAuth: /login ${trimmedProvider} (or xopc auth login ${trimmedProvider})`);\n }\n if (providerSupportsApiKey(trimmedProvider)) {\n lines.push(`API key: xopc auth set ${trimmedProvider} <key>`);\n }\n if (!providerSupportsOAuth(trimmedProvider) && !providerSupportsApiKey(trimmedProvider)) {\n lines.push('No direct xopc auth setup command is advertised for this provider.');\n }\n lines.push('', 'In the TUI, /login <provider> runs OAuth directly when supported.');\n lines.push('Stored credentials can be inspected with /logout and removed with /logout <provider>.');\n return lines.join('\\n');\n }\n\n const oauthProviders = getSortedProviders().filter(providerSupportsOAuth);\n const lines = ['Login', '', 'OAuth providers:'];\n if (oauthProviders.length === 0) {\n lines.push(' none detected');\n } else {\n for (const nextProvider of oauthProviders) {\n lines.push(` ${nextProvider} — ${getProviderDisplayName(nextProvider)}`);\n }\n }\n lines.push(\n '',\n 'Use /login <provider> to start OAuth directly when supported.',\n 'API keys: xopc auth set <provider> <key>',\n 'Stored credentials: /logout',\n );\n return lines.join('\\n');\n}\n\nexport function formatTuiChangelogInfo(markdown: string, sourcePath?: string): string {\n const trimmed = markdown.trim();\n if (!trimmed) {\n return 'What\\'s New\\n\\nNo changelog entries found.';\n }\n\n const lines = trimmed.split(/\\r?\\n/);\n const firstVersionIndex = lines.findIndex((line) => /^##\\s+/.test(line));\n const body = firstVersionIndex >= 0 ? lines.slice(firstVersionIndex).join('\\n').trim() : trimmed;\n const suffix = sourcePath ? `\\n\\nSource: ${sourcePath}` : '';\n return `What's New\\n\\n${body}${suffix}`;\n}\n\nexport function loadTuiChangelogInfo(): string {\n const candidates = [\n join(process.cwd(), 'CHANGELOG.md'),\n join(process.cwd(), 'CHANGELOG'),\n join(process.cwd(), 'docs', 'changelog.md'),\n ];\n const path = candidates.find((candidate) => existsSync(candidate));\n if (!path) {\n return formatTuiChangelogInfo('');\n }\n try {\n return formatTuiChangelogInfo(readFileSync(path, 'utf8'), path);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return `What's New\\n\\nFailed to read changelog: ${errorMessage}`;\n }\n}\n\nexport function formatTuiDebugInfo(params: {\n state: TuiState;\n terminal: { columns?: number; rows?: number };\n renderedLines: string[];\n logStats: unknown;\n}): string {\n const width = params.terminal.columns ?? 0;\n const height = params.terminal.rows ?? 0;\n return [\n `Debug output at ${new Date().toISOString()}`,\n `Terminal: ${width}x${height}`,\n `Total rendered lines: ${params.renderedLines.length}`,\n '',\n '=== TUI State ===',\n JSON.stringify(params.state, null, 2),\n '',\n '=== Runtime Log Stats ===',\n JSON.stringify(params.logStats, null, 2),\n '',\n '=== Rendered lines with visible widths ===',\n ...params.renderedLines.map((line, index) => `[${index}] (w=${visibleWidth(line)}) ${JSON.stringify(line)}`),\n '',\n ].join('\\n');\n}\n\nexport function writeTuiDebugInfo(deps: TuiDebugDeps): string {\n const debugPath = join(getLogDir(), 'xopc-tui-debug.log');\n const terminal = (deps.tui as unknown as { terminal?: { columns?: number; rows?: number } }).terminal ?? {};\n const width = terminal.columns ?? 100;\n const renderedLines =\n typeof (deps.tui as unknown as { render?: (width: number) => string[] }).render === 'function'\n ? (deps.tui as unknown as { render: (width: number) => string[] }).render(width)\n : [];\n const content = formatTuiDebugInfo({\n state: deps.state,\n terminal,\n renderedLines,\n logStats: getRuntimeLogStats(),\n });\n mkdirSync(dirname(debugPath), { recursive: true });\n writeFileSync(debugPath, content, 'utf8');\n return debugPath;\n}\n\nexport function formatTuiModelsInfo(models: TuiModelChoice[]): string {\n if (models.length === 0) {\n return 'Models\\n\\nNo models available.';\n }\n const lines = ['Models', '', ...models.map((model) => ` ${formatModelChoice(model)}`)];\n return lines.join('\\n');\n}\n\nexport function formatTuiSessionListInfo(\n sessions: TuiSessionItem[],\n options: { currentSessionKey?: string; limit?: number } = {},\n): string {\n if (sessions.length === 0) {\n return 'Sessions\\n\\nNo sessions found.';\n }\n const limit = options.limit ?? 20;\n const visible = sessions.slice(0, limit);\n const lines = ['Sessions', ''];\n for (const session of visible) {\n const current = session.key === options.currentSessionKey ? '* ' : ' ';\n const label = session.displayName?.trim() || session.key;\n const description = formatSessionPickerDescription(session, { showKey: Boolean(session.displayName) });\n lines.push(`${current}${label}${description ? ` — ${description}` : ''}`);\n }\n if (sessions.length > visible.length) {\n lines.push('', `Showing ${visible.length} of ${sessions.length} sessions. Use /resume to search.`);\n }\n return lines.join('\\n');\n}\n\nfunction sessionTreeGroup(session: TuiSessionItem): { agentId: string; root: string; leaf: string } {\n const parsed = parseAgentSessionKey(session.key);\n const agentId = parsed?.agentId ?? 'unknown';\n const rest = parsed?.rest ?? session.key;\n const parts = rest.split(':').filter(Boolean);\n const root = parts[0] ?? rest;\n const leaf = parts.length > 1 ? parts.slice(1).join(':') : rest;\n return { agentId, root, leaf };\n}\n\nexport function formatTuiSessionTreeInfo(\n sessions: TuiSessionItem[],\n options: { currentSessionKey?: string; limitPerGroup?: number } = {},\n): string {\n if (sessions.length === 0) {\n return 'Session Tree\\n\\nNo sessions found.';\n }\n const limitPerGroup = options.limitPerGroup ?? 8;\n const byKey = new Map(sessions.map((session) => [session.key, session]));\n const groups = new Map<string, TuiSessionItem[]>();\n for (const session of sessions) {\n const group = sessionTreeGroup(session);\n const key = `${group.agentId}:${group.root}`;\n const list = groups.get(key) ?? [];\n list.push(session);\n groups.set(key, list);\n }\n\n const lines = ['Session Tree', ''];\n const sortedGroups = [...groups.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [groupKey, groupSessions] of sortedGroups) {\n const [agentId, ...rootParts] = groupKey.split(':');\n lines.push(`${agentId}/${rootParts.join(':')}`);\n const sorted = [...groupSessions].sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n const visible = sorted.slice(0, limitPerGroup);\n for (const session of visible) {\n const current = session.key === options.currentSessionKey ? '*' : ' ';\n const group = sessionTreeGroup(session);\n const label = session.displayName?.trim() || group.leaf;\n const description = formatSessionPickerDescription(session, {\n showKey: Boolean(session.displayName),\n });\n lines.push(` ${current} ${label}${description ? ` — ${description}` : ''}`);\n if (session.forkedFromSessionKey) {\n const source = byKey.get(session.forkedFromSessionKey);\n const sourceLabel = source?.displayName?.trim() || session.forkedFromSessionKey;\n lines.push(` forked from ${sourceLabel}`);\n }\n }\n if (sorted.length > visible.length) {\n lines.push(` ... ${sorted.length - visible.length} more`);\n }\n }\n lines.push('', 'Use /resume to search and open a session.');\n return lines.join('\\n');\n}\n\nexport function formatTuiTranscriptTreeInfo(\n entries: TuiTranscriptTreeEntry[],\n options: { limit?: number; allEntries?: TuiTranscriptTreeEntry[] } = {},\n): string {\n if (entries.length === 0) {\n return 'Transcript Tree\\n\\nNo transcript entries found.';\n }\n const limit = options.limit ?? 80;\n const visible = entries.slice(0, limit);\n const prefixes = transcriptTreeInfoPrefixes(visible, options.allEntries ?? entries);\n const lines = ['Transcript Tree', ''];\n for (const entry of visible) {\n const prefix = prefixes.get(entry.id) ?? (entry.depth === 0 ? '-' : ' └─');\n const activeMarker = entry.isOnActivePath || entry.isCurrentLeaf ? '• ' : '';\n const turn = entry.turn > 0 ? `#${entry.turn} ` : '';\n const userLabel = entry.userLabel ? `[${entry.userLabel}] ` : '';\n lines.push(`${prefix} ${activeMarker}${turn}${userLabel}${formatTuiTranscriptTreeEntryDisplayText(entry)}`);\n }\n if (entries.length > visible.length) {\n lines.push('', `Showing ${visible.length} of ${entries.length} entries.`);\n }\n lines.push('', 'Interactive /tree supports search, filters, folds, labels, and fork selection.');\n return lines.join('\\n');\n}\n\nfunction transcriptTreeInfoPrefixes(\n entries: TuiTranscriptTreeEntry[],\n allEntries: TuiTranscriptTreeEntry[] = entries,\n): Map<string, string> {\n const byId = new Map(allEntries.map((entry) => [entry.id, entry]));\n const visibleIds = new Set(entries.map((entry) => entry.id));\n const parentByEntryId = new Map<string, string | null>();\n const childrenByParentId = new Map<string | null, string[]>();\n\n const nearestVisibleParent = (entry: TuiTranscriptTreeEntry, index: number): string | null => {\n let parentId = entry.parentId;\n while (parentId) {\n if (visibleIds.has(parentId)) return parentId;\n parentId = byId.get(parentId)?.parentId;\n }\n if (entry.depth > 0) {\n for (let i = index - 1; i >= 0; i -= 1) {\n const candidate = entries[i];\n if (candidate && candidate.depth < entry.depth) return candidate.id;\n }\n }\n return null;\n };\n\n for (const [index, entry] of entries.entries()) {\n const parentId = nearestVisibleParent(entry, index);\n parentByEntryId.set(entry.id, parentId);\n const children = childrenByParentId.get(parentId) ?? [];\n children.push(entry.id);\n childrenByParentId.set(parentId, children);\n }\n\n const prefixes = new Map<string, string>();\n for (const entry of entries) {\n const visibleParentId = parentByEntryId.get(entry.id) ?? null;\n if (visibleParentId === null) {\n prefixes.set(entry.id, '-');\n continue;\n }\n\n const ancestors: string[] = [];\n let parentId: string | null | undefined = visibleParentId;\n while (parentId) {\n ancestors.unshift(parentId);\n parentId = parentByEntryId.get(parentId) ?? null;\n }\n\n let prefix = ' ';\n for (const ancestor of ancestors.slice(1)) {\n prefix += hasTranscriptTreeInfoFollowingSibling(\n ancestor,\n parentByEntryId.get(ancestor) ?? null,\n childrenByParentId,\n )\n ? '│ '\n : ' ';\n }\n prefix += hasTranscriptTreeInfoFollowingSibling(entry.id, visibleParentId, childrenByParentId)\n ? '├─'\n : '└─';\n prefixes.set(entry.id, prefix);\n }\n return prefixes;\n}\n\nfunction hasTranscriptTreeInfoFollowingSibling(\n entryId: string,\n parentId: string | null,\n childrenByParentId: Map<string | null, string[]>,\n): boolean {\n const siblings = childrenByParentId.get(parentId) ?? [];\n return siblings.indexOf(entryId) < siblings.length - 1;\n}\n\nexport function formatTuiWorkflowsInfo(entries: CatalogEntry[]): string {\n if (entries.length === 0) {\n return 'Workflows\\n\\nNo workflows found.';\n }\n const lines = ['Workflows', ''];\n for (const entry of entries) {\n const tags = entry.tags?.length ? ` [${entry.tags.join(', ')}]` : '';\n lines.push(` ${entry.name} (${entry.source})${tags}`);\n if (entry.description) {\n lines.push(` ${entry.description}`);\n }\n }\n lines.push('', 'Run a workflow with /<name>, or inspect one with /workflow view <name>.');\n return lines.join('\\n');\n}\n\nexport function formatTuiWorkflowDetail(name: string): string {\n const catalog = createWorkflowCatalog();\n const loaded = catalog.load(name);\n const lines = [\n `Workflow: ${loaded.name}`,\n '',\n `Source: ${loaded.metadata.source}`,\n `Description: ${loaded.description}`,\n `Revision: ${loaded.revision}`,\n ];\n if (loaded.metadata.whenToUse) {\n lines.push(`When to use: ${loaded.metadata.whenToUse}`);\n }\n if (loaded.metadata.tags.length) {\n lines.push(`Tags: ${loaded.metadata.tags.join(', ')}`);\n }\n if (loaded.metadata.estimatedAgents) {\n lines.push(`Agents: ${loaded.metadata.estimatedAgents.min}-${loaded.metadata.estimatedAgents.max}`);\n }\n lines.push('', 'Flow:', loaded.graph.nodes.map((node) => `- ${node.title} (${node.kind})`).join('\\n'));\n return lines.join('\\n');\n}\n\nfunction formatTuiSessionStatsBlock(stats?: TuiSessionStats): string[] {\n if (!stats) return [];\n return [\n '',\n 'Messages',\n `User: ${formatNumber(stats.userMessages)}`,\n `Assistant: ${formatNumber(stats.assistantMessages)}`,\n `Tool Calls: ${formatNumber(stats.toolCalls)}`,\n `Tool Results: ${formatNumber(stats.toolResults)}`,\n `Context Rows: ${formatNumber(stats.contextRows)}`,\n `Total Rows: ${formatNumber(stats.totalMessages)}`,\n '',\n 'Token Usage',\n `Input: ${formatNumber(stats.tokens.input)}`,\n `Output: ${formatNumber(stats.tokens.output)}`,\n `Cache Read: ${formatNumber(stats.tokens.cacheRead)}`,\n `Cache Write: ${formatNumber(stats.tokens.cacheWrite)}`,\n `Total: ${formatNumber(stats.tokens.total)}`,\n ];\n}\n\nexport function formatTuiSessionInfo(state: TuiState, stats?: TuiSessionStats): string {\n const parsedKey = parseAgentSessionKey(state.currentSessionKey);\n const tokenEstimate = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens;\n const contextPercent =\n state.sessionInfo.contextUsagePercent ??\n computeContextUsagePercent(tokenEstimate, state.sessionInfo.contextWindow);\n const contextLabel =\n formatContextUsageLabel(contextPercent, state.sessionInfo.contextWindow) ?? '-';\n const connectionLabel = state.isConnected ? 'connected' : 'disconnected';\n\n return [\n 'Session Info',\n '',\n `Name: ${formatMaybe(state.sessionInfo.displayName)}`,\n `Key: ${state.currentSessionKey}`,\n `Agent: ${formatMaybe(parsedKey?.agentId)}`,\n `Connection: ${connectionLabel} (${formatMaybe(state.connectionStatus)})`,\n `Activity: ${formatMaybe(state.activityStatus)}`,\n `Model: ${formatModelLabel(state)}`,\n `Thinking: ${formatMaybe(state.sessionInfo.thinkingLevel)}`,\n `Reasoning: ${formatMaybe(state.sessionInfo.reasoningLevel)}`,\n `Verbose: ${formatMaybe(state.sessionInfo.verboseLevel)}`,\n `Tokens: ${formatNumber(tokenEstimate)}`,\n `Context: ${contextLabel}`,\n `Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`,\n `Thinking Display: ${state.showThinking ? 'on' : 'off'}`,\n `Queue: ${state.messageFollowUpQueue.length}`,\n `Steering Queue: ${state.steeringQueue.length}`,\n ...formatTuiSessionStatsBlock(stats),\n ].join('\\n');\n}\n\nexport function formatTuiUsageInfo(state: TuiState, stats?: TuiSessionStats): string {\n const tokenEstimate = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens;\n const contextPercent =\n state.sessionInfo.contextUsagePercent ??\n computeContextUsagePercent(tokenEstimate, state.sessionInfo.contextWindow);\n const contextLabel =\n formatContextUsageLabel(contextPercent, state.sessionInfo.contextWindow) ?? '-';\n\n return [\n 'Usage',\n '',\n `Estimated Tokens: ${formatNumber(tokenEstimate)}`,\n `Context Window: ${formatNumber(state.sessionInfo.contextWindow)}`,\n `Context Usage: ${contextLabel}`,\n `Model: ${formatModelLabel(state)}`,\n ...(stats\n ? [\n '',\n 'Transcript Tokens',\n `Input: ${formatNumber(stats.tokens.input)}`,\n `Output: ${formatNumber(stats.tokens.output)}`,\n `Cache Read: ${formatNumber(stats.tokens.cacheRead)}`,\n `Cache Write: ${formatNumber(stats.tokens.cacheWrite)}`,\n `Total: ${formatNumber(stats.tokens.total)}`,\n '',\n 'Transcript Rows',\n `User: ${formatNumber(stats.userMessages)}`,\n `Assistant: ${formatNumber(stats.assistantMessages)}`,\n `Tool Calls: ${formatNumber(stats.toolCalls)}`,\n `Tool Results: ${formatNumber(stats.toolResults)}`,\n `Context Rows: ${formatNumber(stats.contextRows)}`,\n `Total Rows: ${formatNumber(stats.totalMessages)}`,\n ]\n : []),\n ].join('\\n');\n}\n\nexport function formatTuiCompactionResult(result: TuiCompactionResult): string {\n if (!result.compacted) {\n return result.summary ?? 'Nothing to compact';\n }\n const before = formatNumber(result.tokensBefore);\n const after = formatNumber(result.tokensAfter);\n const summary = result.transcriptSummary?.trim();\n const lines = [\n '[compaction]',\n '',\n `Tokens: ${before} -> ${after}`,\n ];\n if (summary) {\n lines.push('', summary);\n } else if (result.summary) {\n lines.push('', result.summary);\n }\n return lines.join('\\n');\n}\n\nexport function formatTuiContextInfo(state: TuiState): string {\n const tokenEstimate = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens;\n const contextPercent =\n state.sessionInfo.contextUsagePercent ??\n computeContextUsagePercent(tokenEstimate, state.sessionInfo.contextWindow);\n const contextLabel =\n formatContextUsageLabel(contextPercent, state.sessionInfo.contextWindow) ?? '-';\n const remaining =\n tokenEstimate != null && state.sessionInfo.contextWindow != null\n ? Math.max(0, state.sessionInfo.contextWindow - tokenEstimate)\n : null;\n\n return [\n 'Context',\n '',\n `Used: ${formatNumber(tokenEstimate)}`,\n `Window: ${formatNumber(state.sessionInfo.contextWindow)}`,\n `Remaining: ${formatNumber(remaining)}`,\n `Usage: ${contextLabel}`,\n ].join('\\n');\n}\n\nexport function formatTuiConfigInfo(state: TuiState): string {\n const scopedModels =\n state.scopedModelRefs == null\n ? 'all'\n : state.scopedModelRefs.length === 0\n ? 'none'\n : state.scopedModelRefs.join(', ');\n return [\n 'Config',\n '',\n `Session: ${state.currentSessionKey}`,\n `Model: ${formatModelLabel(state)}`,\n `Thinking: ${formatMaybe(state.sessionInfo.thinkingLevel)}`,\n `Reasoning: ${formatMaybe(state.sessionInfo.reasoningLevel)}`,\n `Verbose: ${formatMaybe(state.sessionInfo.verboseLevel)}`,\n `Workspace: ${formatMaybe(state.sessionInfo.effectiveWorkspacePath)}`,\n `Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`,\n `Thinking Display: ${state.showThinking ? 'on' : 'off'}`,\n `Scoped Models: ${scopedModels}`,\n ].join('\\n');\n}\n\ntype TuiTrustProvenance = {\n extensionId: string;\n source: string;\n installMethod?: string;\n};\n\nfunction extensionSecurityConfig(config: Config): {\n checkPermissions: boolean;\n allowUntrusted: boolean;\n allow: string[];\n trackProvenance: boolean;\n allowPromptInjection: boolean;\n} {\n const raw = (config.extensions as Record<string, unknown> | undefined)?.security;\n const sec = raw && typeof raw === 'object' ? raw as Record<string, unknown> : {};\n return {\n checkPermissions: sec.checkPermissions !== false,\n allowUntrusted: sec.allowUntrusted === true,\n allow: Array.isArray(sec.allow) ? sec.allow.filter((id): id is string => typeof id === 'string') : [],\n trackProvenance: sec.trackProvenance !== false,\n allowPromptInjection: sec.allowPromptInjection === true,\n };\n}\n\nexport function formatTuiTrustInfo(\n config: Config,\n options: {\n configPath?: string;\n provenance?: TuiTrustProvenance[];\n cwd?: string;\n projectTrustStorePath?: string;\n projectTrustEntry?: ProjectTrustStoreEntry | null;\n projectTrustSessionDecision?: boolean | null;\n hasProjectResources?: boolean;\n } = {},\n): string {\n const security = extensionSecurityConfig(config);\n const enabled = Array.isArray((config.extensions as Record<string, unknown> | undefined)?.enabled)\n ? ((config.extensions as Record<string, unknown>).enabled as unknown[])\n .filter((id): id is string => typeof id === 'string')\n : [];\n const disabled = Array.isArray((config.extensions as Record<string, unknown> | undefined)?.disabled)\n ? ((config.extensions as Record<string, unknown>).disabled as unknown[])\n .filter((id): id is string => typeof id === 'string')\n : [];\n const provenance = options.provenance ?? [];\n const projectTrustEntry = options.projectTrustEntry ?? null;\n const projectTrustStatus =\n options.projectTrustSessionDecision !== null && options.projectTrustSessionDecision !== undefined\n ? `${options.projectTrustSessionDecision ? 'trusted' : 'not trusted'} (this session)`\n : projectTrustEntry\n ? `${projectTrustEntry.decision ? 'trusted' : 'not trusted'} from ${projectTrustEntry.path}`\n : 'not saved';\n const lines = [\n 'Extension Trust',\n '',\n 'Project trust gates project-local xopc resources and extension UI context.',\n '',\n `Project: ${options.cwd ?? 'unknown'}`,\n `Project Resources: ${options.hasProjectResources === undefined ? 'unknown' : options.hasProjectResources ? 'detected' : 'none detected'}`,\n `Project Trust: ${projectTrustStatus}`,\n `Trust Store: ${options.projectTrustStorePath ?? '(default)'}`,\n '',\n `Config: ${options.configPath ?? resolveConfigPath()}`,\n `Permission Checks: ${security.checkPermissions ? 'on' : 'off'}`,\n `Allow Untrusted: ${security.allowUntrusted ? 'yes' : 'no'}`,\n `Prompt Injection Hooks: ${security.allowPromptInjection ? 'allowed' : 'blocked'}`,\n `Track Provenance: ${security.trackProvenance ? 'on' : 'off'}`,\n `Allowlist: ${security.allow.length ? security.allow.join(', ') : '(empty)'}`,\n `Enabled: ${enabled.length ? enabled.join(', ') : '(activation rules/defaults)'}`,\n `Disabled: ${disabled.length ? disabled.join(', ') : '(none)'}`,\n ];\n\n if (provenance.length > 0) {\n lines.push('', 'Loaded Extensions:');\n for (const item of provenance.slice(0, 20)) {\n const method = item.installMethod ? `, ${item.installMethod}` : '';\n lines.push(` ${item.extensionId} — ${item.source}${method}`);\n }\n if (provenance.length > 20) {\n lines.push(` ... ${provenance.length - 20} more`);\n }\n }\n\n lines.push(\n '',\n 'Use /trust to change project trust for this folder or its parent.',\n 'To trust specific extensions, add their ids to extensions.security.allow and run /reload.',\n 'To audit installed extensions, run: xopc extensions audit',\n );\n return lines.join('\\n');\n}\n"],"mappings":"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"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { closeXopcDatabase, isXopcDatabaseOpen, openXopcDatabase } from "../storage/sqlite/connection.js";
|
|
2
1
|
import { parseAgentSessionKey } from "../routing/session-key-utils.js";
|
|
3
2
|
import { init_agent_session_key, isValidAgentId, normalizeAgentId } from "../routing/agent-session-key.js";
|
|
4
|
-
import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
|
|
5
|
-
import "../storage/sqlite/index.js";
|
|
6
3
|
import { resolveConfigPath } from "../config/paths.js";
|
|
7
4
|
import { loadConfig } from "../config/loader.js";
|
|
8
5
|
import { init_providers, providerSupportsOAuth } from "../providers/index.js";
|
|
6
|
+
import { closeXopcDatabase, isXopcDatabaseOpen, openXopcDatabase } from "../storage/sqlite/connection.js";
|
|
9
7
|
import { GoalService } from "../goals/goal-service.js";
|
|
10
8
|
import "../goals/index.js";
|
|
11
|
-
import {
|
|
9
|
+
import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
|
|
10
|
+
import "../storage/sqlite/index.js";
|
|
12
11
|
import { ProjectService } from "../projects/project-service.js";
|
|
13
12
|
import { isValidProjectAgentId, normalizeProjectAgentId } from "../projects/project-agent.js";
|
|
14
13
|
import { inferSuggestedProjectDefaultAgentId } from "../projects/project-agent-suggestion.js";
|
|
15
14
|
import "../projects/index.js";
|
|
15
|
+
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
16
16
|
import { normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel } from "../agent/transcript/thinking-types.js";
|
|
17
17
|
import { provenanceTracker } from "../extensions/security.js";
|
|
18
18
|
import "../config/index.js";
|
|
@@ -2,8 +2,8 @@ import { resolveStateDir } from "../config/paths-state.js";
|
|
|
2
2
|
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
3
3
|
import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir, resolveUserProfilePath } from "../config/paths.js";
|
|
4
4
|
import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
|
|
5
|
-
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
6
5
|
import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
|
|
6
|
+
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
7
7
|
import { loadSkills } from "../agent/skills/index.js";
|
|
8
8
|
import { listConnectorInstances } from "../connectors/instances.js";
|
|
9
9
|
import { getWorkspacePath } from "../config/workspace-path-helpers.js";
|
package/dist/src/tui/tui.js
CHANGED
|
@@ -56,8 +56,8 @@ import { createTuiExtensionRuntime } from "./extension-host/runtime.js";
|
|
|
56
56
|
import { tmpdir } from "node:os";
|
|
57
57
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
58
58
|
import { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
59
|
-
import { spawnSync } from "node:child_process";
|
|
60
59
|
import { randomUUID } from "node:crypto";
|
|
60
|
+
import { spawnSync } from "node:child_process";
|
|
61
61
|
import { Container, Loader, ProcessTerminal, TUI, setKeybindings } from "@earendil-works/pi-tui";
|
|
62
62
|
import { Buffer } from "node:buffer";
|
|
63
63
|
//#region src/tui/tui.ts
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MemoryRecord } from '../agent/memory/types.js';
|
|
2
|
+
export type PreparedUserContextImport = {
|
|
3
|
+
statement: string;
|
|
4
|
+
kind: MemoryRecord['kind'];
|
|
5
|
+
sensitivity: NonNullable<MemoryRecord['sensitivity']>;
|
|
6
|
+
durability: MemoryRecord['durability'];
|
|
7
|
+
canReference: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function prepareUserContextImport(candidates: unknown[], existingStatements: Iterable<string>): {
|
|
10
|
+
imports: PreparedUserContextImport[];
|
|
11
|
+
skippedCount: number;
|
|
12
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isUserContextMemoryKind } from "./projection.js";
|
|
2
|
+
//#region src/user-context/import.ts
|
|
3
|
+
function prepareUserContextImport(candidates, existingStatements) {
|
|
4
|
+
const known = new Set(Array.from(existingStatements, (statement) => statement.trim().toLocaleLowerCase()));
|
|
5
|
+
const imports = [];
|
|
6
|
+
let skippedCount = 0;
|
|
7
|
+
for (const candidate of candidates) {
|
|
8
|
+
if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) {
|
|
9
|
+
skippedCount += 1;
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const item = candidate;
|
|
13
|
+
const statement = typeof item.statement === "string" ? item.statement.trim() : "";
|
|
14
|
+
const normalized = statement.toLocaleLowerCase();
|
|
15
|
+
if (!statement || statement.length > 5e3 || known.has(normalized) || item.status === "archived" || item.status === "rejected") {
|
|
16
|
+
skippedCount += 1;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const kind = isUserContextMemoryKind(item.kind) ? item.kind : "preference";
|
|
20
|
+
const sensitivity = typeof item.sensitivity === "string" && [
|
|
21
|
+
"normal",
|
|
22
|
+
"personal",
|
|
23
|
+
"secret",
|
|
24
|
+
"regulated"
|
|
25
|
+
].includes(item.sensitivity) ? item.sensitivity : "normal";
|
|
26
|
+
const durability = typeof item.durability === "string" && [
|
|
27
|
+
"ephemeral",
|
|
28
|
+
"durable",
|
|
29
|
+
"recurring"
|
|
30
|
+
].includes(item.durability) ? item.durability : "durable";
|
|
31
|
+
known.add(normalized);
|
|
32
|
+
imports.push({
|
|
33
|
+
statement,
|
|
34
|
+
kind,
|
|
35
|
+
sensitivity,
|
|
36
|
+
durability,
|
|
37
|
+
canReference: item.canReference !== false
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
imports,
|
|
42
|
+
skippedCount
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { prepareUserContextImport };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","names":[],"sources":["../../../src/user-context/import.ts"],"sourcesContent":["import type { MemoryRecord } from '../agent/memory/types.js';\nimport { isUserContextMemoryKind } from './projection.js';\n\nexport type PreparedUserContextImport = {\n statement: string;\n kind: MemoryRecord['kind'];\n sensitivity: NonNullable<MemoryRecord['sensitivity']>;\n durability: MemoryRecord['durability'];\n canReference: boolean;\n};\n\nexport function prepareUserContextImport(\n candidates: unknown[],\n existingStatements: Iterable<string>,\n): { imports: PreparedUserContextImport[]; skippedCount: number } {\n const known = new Set(Array.from(existingStatements, (statement) => statement.trim().toLocaleLowerCase()));\n const imports: PreparedUserContextImport[] = [];\n let skippedCount = 0;\n\n for (const candidate of candidates) {\n if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n skippedCount += 1;\n continue;\n }\n const item = candidate as Record<string, unknown>;\n const statement = typeof item.statement === 'string' ? item.statement.trim() : '';\n const normalized = statement.toLocaleLowerCase();\n if (\n !statement\n || statement.length > 5_000\n || known.has(normalized)\n || item.status === 'archived'\n || item.status === 'rejected'\n ) {\n skippedCount += 1;\n continue;\n }\n const kind = isUserContextMemoryKind(item.kind) ? item.kind : 'preference';\n const sensitivity = typeof item.sensitivity === 'string'\n && ['normal', 'personal', 'secret', 'regulated'].includes(item.sensitivity)\n ? item.sensitivity as NonNullable<MemoryRecord['sensitivity']>\n : 'normal';\n const durability = typeof item.durability === 'string'\n && ['ephemeral', 'durable', 'recurring'].includes(item.durability)\n ? item.durability as MemoryRecord['durability']\n : 'durable';\n known.add(normalized);\n imports.push({ statement, kind, sensitivity, durability, canReference: item.canReference !== false });\n }\n\n return { imports, skippedCount };\n}\n"],"mappings":";;AAWA,SAAgB,yBACd,YACA,oBACgE;CAChE,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAK,qBAAqB,cAAc,UAAU,MAAM,CAAC,mBAAmB,CAAC,CAAC;CAC1G,MAAM,UAAuC,EAAE;CAC/C,IAAI,eAAe;AAEnB,MAAK,MAAM,aAAa,YAAY;AAClC,MAAI,CAAC,aAAa,OAAO,cAAc,YAAY,MAAM,QAAQ,UAAU,EAAE;AAC3E,mBAAgB;AAChB;;EAEF,MAAM,OAAO;EACb,MAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,UAAU,MAAM,GAAG;EAC/E,MAAM,aAAa,UAAU,mBAAmB;AAChD,MACE,CAAC,aACE,UAAU,SAAS,OACnB,MAAM,IAAI,WAAW,IACrB,KAAK,WAAW,cAChB,KAAK,WAAW,YACnB;AACA,mBAAgB;AAChB;;EAEF,MAAM,OAAO,wBAAwB,KAAK,KAAK,GAAG,KAAK,OAAO;EAC9D,MAAM,cAAc,OAAO,KAAK,gBAAgB,YAC3C;GAAC;GAAU;GAAY;GAAU;GAAY,CAAC,SAAS,KAAK,YAAY,GACzE,KAAK,cACL;EACJ,MAAM,aAAa,OAAO,KAAK,eAAe,YACzC;GAAC;GAAa;GAAW;GAAY,CAAC,SAAS,KAAK,WAAW,GAChE,KAAK,aACL;AACJ,QAAM,IAAI,WAAW;AACrB,UAAQ,KAAK;GAAE;GAAW;GAAM;GAAa;GAAY,cAAc,KAAK,iBAAiB;GAAO,CAAC;;AAGvG,QAAO;EAAE;EAAS;EAAc"}
|