@xopcai/xopc 0.0.142 → 0.0.143
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/telegram/xopc.extension.json +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-DiME9u_P.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DUfdNQqk.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-B-Qk6cGr.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-Di6EEbQX.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-ZaOZDH2I.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-BTFhjWfg.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-BU-pVZiZ.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.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-BbVsdD_I.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-B8QqVy3I.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet---yzVxVR.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-ByaKTTq4.js} +1 -1
- package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.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-CxicF50_.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.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-VcoyuZGN.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-CwcHRdC0.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
- package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
- package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-LT6qB-ua.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-Dw-yE2-y.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-D9NNNUgE.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
- package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-D4hkWVt_.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-CIckv0uy.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-B0b42kB2.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-BtjEkczK.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-Bf0bk3i6.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-DL4P0sAj.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-CyGlrInB.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-D85fBBuI.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CwEuYrHX.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-m9JVQ73F.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
- package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils--BO6xT3u.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.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-DSTMz_mO.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-B35lJzvm.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.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 +9 -6
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +8 -0
- 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/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 +5 -4
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +4 -1
- 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/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/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 +9 -3
- package/dist/src/agent/service.js.map +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/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 +3 -16
- package/dist/src/agent/tools/workflow-tool.js.map +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-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 +13 -1
- 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/browser/providers/browser-ext-install.d.ts +11 -1
- package/dist/src/browser/providers/browser-ext-install.js +39 -14
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/capabilities/store-connector.d.ts +0 -1
- package/dist/src/capabilities/store-connector.js +3 -5
- package/dist/src/capabilities/store-connector.js.map +1 -1
- 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/cli/commands/doctor/checks/database-schema.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 +42 -36
- 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 +3 -2
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- 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/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/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/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/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 +14 -1
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +103 -2
- 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/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 +7 -1
- 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/types.d.ts +24 -0
- 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/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/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 +7 -7
- package/dist/src/tui/tui-command-formatters.js.map +1 -1
- package/dist/src/tui/tui-commands.js +1 -1
- package/dist/src/tui/tui-startup-resources.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/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 +4 -8
- 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/package.json +4 -3
- 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/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
|
@@ -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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"}
|
|
@@ -8,11 +8,11 @@ import { loadConfig } from "../config/loader.js";
|
|
|
8
8
|
import { init_providers, providerSupportsOAuth } from "../providers/index.js";
|
|
9
9
|
import { GoalService } from "../goals/goal-service.js";
|
|
10
10
|
import "../goals/index.js";
|
|
11
|
-
import { createWorkflowCatalog } from "../agent/workflow/catalog.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";
|
|
@@ -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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
export type UserProfileFields = {
|
|
3
|
+
callName: string;
|
|
4
|
+
pronouns: string;
|
|
5
|
+
timezone: string;
|
|
6
|
+
notes: string;
|
|
7
|
+
};
|
|
8
|
+
export type UserProfileSuggestion = {
|
|
9
|
+
id: string;
|
|
10
|
+
value: string;
|
|
11
|
+
source: 'gateway_os';
|
|
12
|
+
confidence: 'medium';
|
|
13
|
+
};
|
|
14
|
+
export type UserProfilePromptState = {
|
|
15
|
+
state: 'active' | 'snoozed';
|
|
16
|
+
suggestionHash?: string;
|
|
17
|
+
snoozedUntil?: string;
|
|
18
|
+
updatedAt?: string;
|
|
19
|
+
};
|
|
20
|
+
export type UserProfileSetup = {
|
|
21
|
+
missing: Array<keyof UserProfileFields>;
|
|
22
|
+
shouldPrompt: boolean;
|
|
23
|
+
state: 'complete' | 'active' | 'snoozed';
|
|
24
|
+
callNameSuggestion?: UserProfileSuggestion;
|
|
25
|
+
snoozedUntil?: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function parseUserProfileMarkdown(content: string): UserProfileFields;
|
|
28
|
+
export declare function serializeUserProfileMarkdown(profile: UserProfileFields): string;
|
|
29
|
+
export declare function patchUserProfileMarkdown(content: string, patch: Partial<UserProfileFields>): string;
|
|
30
|
+
export declare function normalizeGatewayUserName(raw: string): string | undefined;
|
|
31
|
+
export declare function detectGatewayCallNameSuggestion(config: Config): UserProfileSuggestion | undefined;
|
|
32
|
+
export declare function buildUserProfileSetup(input: {
|
|
33
|
+
profile: UserProfileFields;
|
|
34
|
+
promptState: UserProfilePromptState;
|
|
35
|
+
config: Config;
|
|
36
|
+
now?: Date;
|
|
37
|
+
}): UserProfileSetup;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import * as os$1 from "node:os";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
//#region src/user-context/profile.ts
|
|
4
|
+
const EMPTY_PROFILE = {
|
|
5
|
+
callName: "",
|
|
6
|
+
pronouns: "",
|
|
7
|
+
timezone: "",
|
|
8
|
+
notes: ""
|
|
9
|
+
};
|
|
10
|
+
const TECHNICAL_USER_NAMES = new Set([
|
|
11
|
+
"admin",
|
|
12
|
+
"administrator",
|
|
13
|
+
"app",
|
|
14
|
+
"daemon",
|
|
15
|
+
"defaultuser0",
|
|
16
|
+
"guest",
|
|
17
|
+
"nobody",
|
|
18
|
+
"node",
|
|
19
|
+
"owner",
|
|
20
|
+
"root",
|
|
21
|
+
"runner",
|
|
22
|
+
"service",
|
|
23
|
+
"system",
|
|
24
|
+
"ubuntu",
|
|
25
|
+
"user",
|
|
26
|
+
"wdagutilityaccount",
|
|
27
|
+
"www-data",
|
|
28
|
+
"xopc"
|
|
29
|
+
]);
|
|
30
|
+
function markdownField(line) {
|
|
31
|
+
const match = line.match(/^[-*]\s+\*\*(.+?):\*\*\s*(.*)$/i);
|
|
32
|
+
if (!match) return void 0;
|
|
33
|
+
return {
|
|
34
|
+
label: match[1].trim().toLowerCase(),
|
|
35
|
+
value: match[2].trim()
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function contextSection(lines) {
|
|
39
|
+
const heading = lines.findIndex((line) => /^##\s+Context\s*$/i.test(line.trim()));
|
|
40
|
+
if (heading < 0) return void 0;
|
|
41
|
+
const nextHeadingOffset = lines.slice(heading + 1).findIndex((line) => /^##\s+/.test(line.trim()));
|
|
42
|
+
return {
|
|
43
|
+
start: heading,
|
|
44
|
+
end: nextHeadingOffset < 0 ? lines.length : heading + 1 + nextHeadingOffset
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function parseUserProfileMarkdown(content) {
|
|
48
|
+
if (!content.trim()) return { ...EMPTY_PROFILE };
|
|
49
|
+
const profile = { ...EMPTY_PROFILE };
|
|
50
|
+
let nameFallback = "";
|
|
51
|
+
let preferredName = "";
|
|
52
|
+
const lines = content.replace(/\r\n/g, "\n").split("\n");
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
const field = markdownField(line);
|
|
55
|
+
if (!field) continue;
|
|
56
|
+
if (field.label === "name") nameFallback = field.value;
|
|
57
|
+
if (field.label === "what to call them") preferredName = field.value;
|
|
58
|
+
if (field.label === "pronouns") profile.pronouns = field.value;
|
|
59
|
+
if (field.label === "timezone") profile.timezone = field.value;
|
|
60
|
+
if (field.label === "notes") profile.notes = field.value;
|
|
61
|
+
}
|
|
62
|
+
profile.callName = preferredName || nameFallback;
|
|
63
|
+
const context = contextSection(lines);
|
|
64
|
+
if (context && !profile.notes) profile.notes = lines.slice(context.start + 1, context.end).join("\n").replace(/^_\(.*?\)_\s*$/gm, "").replace(/^---\s*$/gm, "").trim();
|
|
65
|
+
return profile;
|
|
66
|
+
}
|
|
67
|
+
function serializeUserProfileMarkdown(profile) {
|
|
68
|
+
const lines = [
|
|
69
|
+
"# PROFILE.md - About You",
|
|
70
|
+
"",
|
|
71
|
+
`- **Name:** ${profile.callName.trim()}`,
|
|
72
|
+
`- **Pronouns:** ${profile.pronouns.trim()}`,
|
|
73
|
+
`- **Timezone:** ${profile.timezone.trim()}`,
|
|
74
|
+
""
|
|
75
|
+
];
|
|
76
|
+
if (profile.notes.trim()) lines.push("## Context", "", profile.notes.trim(), "");
|
|
77
|
+
return lines.join("\n");
|
|
78
|
+
}
|
|
79
|
+
function patchSimpleField(lines, labels, insertLabel, value, updateEveryMatch = false) {
|
|
80
|
+
const matches = lines.flatMap((line, index) => {
|
|
81
|
+
const field = markdownField(line);
|
|
82
|
+
return field && labels.includes(field.label) ? [index] : [];
|
|
83
|
+
});
|
|
84
|
+
const targets = updateEveryMatch ? matches : matches.slice(-1);
|
|
85
|
+
if (targets.length > 0) {
|
|
86
|
+
for (const index of targets) lines[index] = `- **${lines[index].match(/^[-*]\s+\*\*(.+?):\*\*/i)?.[1] ?? insertLabel}:** ${value}`;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const insertAt = contextSection(lines)?.start ?? lines.length;
|
|
90
|
+
lines.splice(insertAt, 0, `- **${insertLabel}:** ${value}`, "");
|
|
91
|
+
}
|
|
92
|
+
function patchUserProfileMarkdown(content, patch) {
|
|
93
|
+
if (!content.trim()) return serializeUserProfileMarkdown({
|
|
94
|
+
...EMPTY_PROFILE,
|
|
95
|
+
...patch
|
|
96
|
+
});
|
|
97
|
+
const lines = content.replace(/\r\n/g, "\n").split("\n");
|
|
98
|
+
if (patch.callName !== void 0) {
|
|
99
|
+
const hasPreferred = lines.some((line) => markdownField(line)?.label === "what to call them");
|
|
100
|
+
patchSimpleField(lines, hasPreferred ? ["what to call them"] : ["name"], hasPreferred ? "What to call them" : "Name", patch.callName.trim(), patch.callName.trim().length === 0);
|
|
101
|
+
if (patch.callName.trim().length === 0 && hasPreferred) patchSimpleField(lines, ["name"], "Name", "", true);
|
|
102
|
+
}
|
|
103
|
+
if (patch.pronouns !== void 0) patchSimpleField(lines, ["pronouns"], "Pronouns", patch.pronouns.trim());
|
|
104
|
+
if (patch.timezone !== void 0) patchSimpleField(lines, ["timezone"], "Timezone", patch.timezone.trim());
|
|
105
|
+
if (patch.notes !== void 0) {
|
|
106
|
+
const context = contextSection(lines);
|
|
107
|
+
const replacement = patch.notes.trim() ? [
|
|
108
|
+
"## Context",
|
|
109
|
+
"",
|
|
110
|
+
patch.notes.trim(),
|
|
111
|
+
""
|
|
112
|
+
] : [];
|
|
113
|
+
if (context) lines.splice(context.start, context.end - context.start, ...replacement);
|
|
114
|
+
else if (replacement.length > 0) lines.push("", ...replacement);
|
|
115
|
+
}
|
|
116
|
+
return lines.join("\n").replace(/\n{4,}/g, "\n\n\n").trimEnd() + "\n";
|
|
117
|
+
}
|
|
118
|
+
function normalizeGatewayUserName(raw) {
|
|
119
|
+
const account = raw.trim().split(/[\\/]/).at(-1)?.split("@")[0]?.trim() ?? "";
|
|
120
|
+
if (!account || account.length < 2 || account.length > 40) return void 0;
|
|
121
|
+
const normalizedKey = account.toLowerCase();
|
|
122
|
+
if (TECHNICAL_USER_NAMES.has(normalizedKey) || account.endsWith("$")) return void 0;
|
|
123
|
+
if (/^\d+$/.test(account) || /^[0-9a-f]{8,}$/i.test(account)) return void 0;
|
|
124
|
+
if ([...account].filter((character) => /\d/.test(character)).length / account.length > .35) return void 0;
|
|
125
|
+
const friendly = account.replace(/[._-]+/g, " ").replace(/\s+/g, " ").trim();
|
|
126
|
+
if (!friendly) return void 0;
|
|
127
|
+
return friendly.replace(/\b[a-z]/g, (character) => character.toUpperCase());
|
|
128
|
+
}
|
|
129
|
+
function detectGatewayCallNameSuggestion(config) {
|
|
130
|
+
if (config.gateway?.auth?.mode === "trusted-proxy") return void 0;
|
|
131
|
+
try {
|
|
132
|
+
const value = normalizeGatewayUserName(os$1.userInfo().username);
|
|
133
|
+
if (!value) return void 0;
|
|
134
|
+
return {
|
|
135
|
+
id: createHash("sha256").update(`gateway_os:${value}`).digest("hex").slice(0, 16),
|
|
136
|
+
value,
|
|
137
|
+
source: "gateway_os",
|
|
138
|
+
confidence: "medium"
|
|
139
|
+
};
|
|
140
|
+
} catch {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function buildUserProfileSetup(input) {
|
|
145
|
+
const missing = Object.keys(input.profile).filter((field) => !input.profile[field].trim());
|
|
146
|
+
if (!missing.includes("callName")) return {
|
|
147
|
+
missing,
|
|
148
|
+
shouldPrompt: false,
|
|
149
|
+
state: "complete"
|
|
150
|
+
};
|
|
151
|
+
const now = input.now ?? /* @__PURE__ */ new Date();
|
|
152
|
+
const snoozed = input.promptState.state === "snoozed" && Boolean(input.promptState.snoozedUntil) && Date.parse(input.promptState.snoozedUntil) > now.getTime();
|
|
153
|
+
const suggestion = detectGatewayCallNameSuggestion(input.config);
|
|
154
|
+
return {
|
|
155
|
+
missing,
|
|
156
|
+
shouldPrompt: !snoozed,
|
|
157
|
+
state: snoozed ? "snoozed" : "active",
|
|
158
|
+
callNameSuggestion: suggestion,
|
|
159
|
+
snoozedUntil: snoozed ? input.promptState.snoozedUntil : void 0
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
163
|
+
export { buildUserProfileSetup, detectGatewayCallNameSuggestion, normalizeGatewayUserName, parseUserProfileMarkdown, patchUserProfileMarkdown, serializeUserProfileMarkdown };
|
|
164
|
+
|
|
165
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","names":["os"],"sources":["../../../src/user-context/profile.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport * as os from 'node:os';\n\nimport type { Config } from '../config/schema.js';\n\nexport type UserProfileFields = {\n callName: string;\n pronouns: string;\n timezone: string;\n notes: string;\n};\n\nexport type UserProfileSuggestion = {\n id: string;\n value: string;\n source: 'gateway_os';\n confidence: 'medium';\n};\n\nexport type UserProfilePromptState = {\n state: 'active' | 'snoozed';\n suggestionHash?: string;\n snoozedUntil?: string;\n updatedAt?: string;\n};\n\nexport type UserProfileSetup = {\n missing: Array<keyof UserProfileFields>;\n shouldPrompt: boolean;\n state: 'complete' | 'active' | 'snoozed';\n callNameSuggestion?: UserProfileSuggestion;\n snoozedUntil?: string;\n};\n\nconst EMPTY_PROFILE: UserProfileFields = {\n callName: '',\n pronouns: '',\n timezone: '',\n notes: '',\n};\n\nconst TECHNICAL_USER_NAMES = new Set([\n 'admin',\n 'administrator',\n 'app',\n 'daemon',\n 'defaultuser0',\n 'guest',\n 'nobody',\n 'node',\n 'owner',\n 'root',\n 'runner',\n 'service',\n 'system',\n 'ubuntu',\n 'user',\n 'wdagutilityaccount',\n 'www-data',\n 'xopc',\n]);\n\nfunction markdownField(line: string): { label: string; value: string } | undefined {\n const match = line.match(/^[-*]\\s+\\*\\*(.+?):\\*\\*\\s*(.*)$/i);\n if (!match) return undefined;\n return { label: match[1]!.trim().toLowerCase(), value: match[2]!.trim() };\n}\n\nfunction contextSection(lines: string[]): { start: number; end: number } | undefined {\n const heading = lines.findIndex((line) => /^##\\s+Context\\s*$/i.test(line.trim()));\n if (heading < 0) return undefined;\n const nextHeadingOffset = lines.slice(heading + 1).findIndex((line) => /^##\\s+/.test(line.trim()));\n return {\n start: heading,\n end: nextHeadingOffset < 0 ? lines.length : heading + 1 + nextHeadingOffset,\n };\n}\n\nexport function parseUserProfileMarkdown(content: string): UserProfileFields {\n if (!content.trim()) return { ...EMPTY_PROFILE };\n const profile = { ...EMPTY_PROFILE };\n let nameFallback = '';\n let preferredName = '';\n const lines = content.replace(/\\r\\n/g, '\\n').split('\\n');\n for (const line of lines) {\n const field = markdownField(line);\n if (!field) continue;\n if (field.label === 'name') nameFallback = field.value;\n if (field.label === 'what to call them') preferredName = field.value;\n if (field.label === 'pronouns') profile.pronouns = field.value;\n if (field.label === 'timezone') profile.timezone = field.value;\n if (field.label === 'notes') profile.notes = field.value;\n }\n profile.callName = preferredName || nameFallback;\n const context = contextSection(lines);\n if (context && !profile.notes) {\n profile.notes = lines\n .slice(context.start + 1, context.end)\n .join('\\n')\n .replace(/^_\\(.*?\\)_\\s*$/gm, '')\n .replace(/^---\\s*$/gm, '')\n .trim();\n }\n return profile;\n}\n\nexport function serializeUserProfileMarkdown(profile: UserProfileFields): string {\n const lines = [\n '# PROFILE.md - About You',\n '',\n `- **Name:** ${profile.callName.trim()}`,\n `- **Pronouns:** ${profile.pronouns.trim()}`,\n `- **Timezone:** ${profile.timezone.trim()}`,\n '',\n ];\n if (profile.notes.trim()) lines.push('## Context', '', profile.notes.trim(), '');\n return lines.join('\\n');\n}\n\nfunction patchSimpleField(\n lines: string[],\n labels: string[],\n insertLabel: string,\n value: string,\n updateEveryMatch = false,\n): void {\n const matches = lines.flatMap((line, index) => {\n const field = markdownField(line);\n return field && labels.includes(field.label) ? [index] : [];\n });\n const targets = updateEveryMatch ? matches : matches.slice(-1);\n if (targets.length > 0) {\n for (const index of targets) {\n const label = lines[index]!.match(/^[-*]\\s+\\*\\*(.+?):\\*\\*/i)?.[1] ?? insertLabel;\n lines[index] = `- **${label}:** ${value}`;\n }\n return;\n }\n const context = contextSection(lines);\n const insertAt = context?.start ?? lines.length;\n lines.splice(insertAt, 0, `- **${insertLabel}:** ${value}`, '');\n}\n\nexport function patchUserProfileMarkdown(\n content: string,\n patch: Partial<UserProfileFields>,\n): string {\n if (!content.trim()) return serializeUserProfileMarkdown({ ...EMPTY_PROFILE, ...patch });\n const lines = content.replace(/\\r\\n/g, '\\n').split('\\n');\n if (patch.callName !== undefined) {\n const hasPreferred = lines.some((line) => markdownField(line)?.label === 'what to call them');\n patchSimpleField(\n lines,\n hasPreferred ? ['what to call them'] : ['name'],\n hasPreferred ? 'What to call them' : 'Name',\n patch.callName.trim(),\n patch.callName.trim().length === 0,\n );\n if (patch.callName.trim().length === 0 && hasPreferred) {\n patchSimpleField(lines, ['name'], 'Name', '', true);\n }\n }\n if (patch.pronouns !== undefined) {\n patchSimpleField(lines, ['pronouns'], 'Pronouns', patch.pronouns.trim());\n }\n if (patch.timezone !== undefined) {\n patchSimpleField(lines, ['timezone'], 'Timezone', patch.timezone.trim());\n }\n if (patch.notes !== undefined) {\n const context = contextSection(lines);\n const replacement = patch.notes.trim() ? ['## Context', '', patch.notes.trim(), ''] : [];\n if (context) lines.splice(context.start, context.end - context.start, ...replacement);\n else if (replacement.length > 0) lines.push('', ...replacement);\n }\n return lines.join('\\n').replace(/\\n{4,}/g, '\\n\\n\\n').trimEnd() + '\\n';\n}\n\nexport function normalizeGatewayUserName(raw: string): string | undefined {\n const account = raw.trim().split(/[\\\\/]/).at(-1)?.split('@')[0]?.trim() ?? '';\n if (!account || account.length < 2 || account.length > 40) return undefined;\n const normalizedKey = account.toLowerCase();\n if (TECHNICAL_USER_NAMES.has(normalizedKey) || account.endsWith('$')) return undefined;\n if (/^\\d+$/.test(account) || /^[0-9a-f]{8,}$/i.test(account)) return undefined;\n const digits = [...account].filter((character) => /\\d/.test(character)).length;\n if (digits / account.length > 0.35) return undefined;\n const friendly = account.replace(/[._-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n if (!friendly) return undefined;\n return friendly.replace(/\\b[a-z]/g, (character) => character.toUpperCase());\n}\n\nexport function detectGatewayCallNameSuggestion(config: Config): UserProfileSuggestion | undefined {\n if (config.gateway?.auth?.mode === 'trusted-proxy') return undefined;\n try {\n const value = normalizeGatewayUserName(os.userInfo().username);\n if (!value) return undefined;\n const id = createHash('sha256').update(`gateway_os:${value}`).digest('hex').slice(0, 16);\n return { id, value, source: 'gateway_os', confidence: 'medium' };\n } catch {\n return undefined;\n }\n}\n\nexport function buildUserProfileSetup(input: {\n profile: UserProfileFields;\n promptState: UserProfilePromptState;\n config: Config;\n now?: Date;\n}): UserProfileSetup {\n const missing = (Object.keys(input.profile) as Array<keyof UserProfileFields>)\n .filter((field) => !input.profile[field].trim());\n if (!missing.includes('callName')) return { missing, shouldPrompt: false, state: 'complete' };\n const now = input.now ?? new Date();\n const snoozed = input.promptState.state === 'snoozed'\n && Boolean(input.promptState.snoozedUntil)\n && Date.parse(input.promptState.snoozedUntil!) > now.getTime();\n const suggestion = detectGatewayCallNameSuggestion(input.config);\n return {\n missing,\n shouldPrompt: !snoozed,\n state: snoozed ? 'snoozed' : 'active',\n callNameSuggestion: suggestion,\n snoozedUntil: snoozed ? input.promptState.snoozedUntil : undefined,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { MemoryKind, MemoryRecord } from '../agent/memory/types.js';
|
|
2
|
+
import type { ConnectorDefinition, ConnectorInstance } from '../connectors/types.js';
|
|
3
|
+
export type UserContextFacet = 'basics' | 'collaboration' | 'boundaries' | 'priorities' | 'people' | 'current';
|
|
4
|
+
export type UserContextOrigin = 'told_by_you' | 'observed' | 'inferred' | 'connected_source';
|
|
5
|
+
export declare function isUserContextRecord(record: MemoryRecord): boolean;
|
|
6
|
+
export declare function isUserContextMemoryKind(value: unknown): value is MemoryKind;
|
|
7
|
+
export declare function facetForMemoryKind(kind: MemoryKind): UserContextFacet;
|
|
8
|
+
export declare function originForMemoryRecord(record: MemoryRecord): UserContextOrigin;
|
|
9
|
+
export declare function projectUserContextRecord(record: MemoryRecord): {
|
|
10
|
+
id: string;
|
|
11
|
+
statement: string;
|
|
12
|
+
facet: UserContextFacet;
|
|
13
|
+
kind: MemoryKind;
|
|
14
|
+
status: import("../agent/memory/types.js").MemoryStatus;
|
|
15
|
+
origin: UserContextOrigin;
|
|
16
|
+
sourceName: string;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
sensitivity: import("../agent/memory/types.js").MemorySensitivity;
|
|
19
|
+
explicitness: import("../agent/memory/types.js").MemoryExplicitness;
|
|
20
|
+
durability: import("../agent/memory/types.js").MemoryDurability;
|
|
21
|
+
canReference: boolean;
|
|
22
|
+
stability: import("../agent/memory/lifecycle.js").MemoryStabilityBand;
|
|
23
|
+
stabilityScore: number;
|
|
24
|
+
reviewAt: string;
|
|
25
|
+
reviewDue: boolean;
|
|
26
|
+
evidenceCount: number;
|
|
27
|
+
sourcePath: string;
|
|
28
|
+
latestEvidenceAt: string;
|
|
29
|
+
};
|
|
30
|
+
export declare function isPersonalContextConnector(definition: ConnectorDefinition): boolean;
|
|
31
|
+
export declare function recordsDerivedFromPersonalContextSource(records: MemoryRecord[], agentId: string, connectorId: string): MemoryRecord[];
|
|
32
|
+
export declare function projectPersonalContextSources(definitions: ConnectorDefinition[], instances: ConnectorInstance[], records?: MemoryRecord[]): {
|
|
33
|
+
id: string;
|
|
34
|
+
displayName: string;
|
|
35
|
+
description: string;
|
|
36
|
+
category: import("../connectors/types.js").ConnectorCategory;
|
|
37
|
+
capabilities: ("context" | "tools" | "events" | "memory_source")[];
|
|
38
|
+
access: {
|
|
39
|
+
context: boolean;
|
|
40
|
+
memory: boolean;
|
|
41
|
+
read: boolean;
|
|
42
|
+
write: boolean;
|
|
43
|
+
};
|
|
44
|
+
permissionDetails: string[];
|
|
45
|
+
installed: boolean;
|
|
46
|
+
enabled: boolean;
|
|
47
|
+
status: string;
|
|
48
|
+
instanceId: string;
|
|
49
|
+
lastConnectedAt: string;
|
|
50
|
+
lastHealthCheckAt: string;
|
|
51
|
+
lastHealthStatus: import("../connectors/types.js").ConnectorHealthStatus;
|
|
52
|
+
lastActivityAt: string;
|
|
53
|
+
derivedUnderstandingCount: number;
|
|
54
|
+
}[];
|