@xopcai/xopc 0.0.125 → 0.0.126
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 +56 -102
- package/README.zh-CN.md +51 -98
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BKDKICZV.js → agent-avatar-dicebear-C70vgt60.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DRYVahI-.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-DI4BqHKW.js → app-management-settings-panel-D9-HW6cy.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-6_ie3NQ4.js → appearance-settings-BHlahIDL.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-kUHEJ1HK.js → archive-plugin-B-aoIt0w.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Dm-9prpU.js → attachment-load-BD0G0FD5.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-OTxQTPnC.js → automation-suggestion-card-iJRVI7aZ.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DllA_jQ0.js → binary-plugins-B0mNlVSz.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Cm6CWNj1.js → block-editor-CJY9Lu5G.js} +6 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-VJ89b6I2.js → capability-presets-api-Bgc8ag55.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-BaPj8wC2.js → capability-presets-settings-panel-B1nIi0TC.js} +1 -1
- package/dist/gateway/static/root/assets/{channel-recipient-api-B5PwBEUx.js → channel-recipient-api-0sauApoC.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +2 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-DySMzOF6.js → directory-picker-path-field-CiEc4KmY.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-D_AjSnV_.js → dreaming-settings-4bvpk5wr.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-BaM0FpW7.js → extension-debug-page-BbyczVZ3.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DuZWVOGA.js → extension-page-DLN1I3DR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DarVtbmJ.js → extension-settings-page-D9VGHmYJ.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-NFKfkqrd.js → fetch-5V96dUz3.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-CFEm9rgy.js → gateway-config-api-BtIzObwp.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-BMk2S5td.js → gateway-settings-KFsGGDhg.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Dtwh_yGg.js → gateway-startup-retry-DEMad2wt.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-BKP7ylcG.js → goal-create-dialog-4PcF6Sh6.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-DTWZNA_Y.js → goals-config-api-CVN7-pdM.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-CTmA3hWK.js → goals-page-CUdgJuDn.js} +2 -2
- package/dist/gateway/static/root/assets/{goals-settings-Bhct0ZT-.js → goals-settings-IYCH3-Pi.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-C-UxSU4a.js → heartbeat-settings-Cf_a2Bmz.js} +1 -1
- package/dist/gateway/static/root/assets/index-CA2tR2vm.js +256 -0
- package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DCjy2y4d.js → keyboard-shortcuts-settings-lKTg6St7.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-BaqxP-GQ.js → markdown-split-Bv4k6iGJ.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DQ_EXloK.js → media-plugins-Bbi8g3N8.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C22hxE1N.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +2 -0
- package/dist/gateway/static/root/assets/{page-tabs-EIZhLppK.js → page-tabs-Cp395RYD.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-r_uB4Epr.js → preview-open-alternatives-DqV5OM4m.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-B132Uf-2.js → save-bar-controls-BItmzAzI.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-B5qshALm.js → schedule-field-BQ8IjjCn.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CvLmkdS9.js → schema-form-BRpD6x3d.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-pRlvqsAf.js → settings-collapsible-section-BKSPQM4R.js} +1 -1
- package/dist/gateway/static/root/assets/settings-form-section-BmyfthNQ.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-Bls5tfbH.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-v6-IOp8t.js → share-preview-page-DbYZNAPb.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-HUU2FFjM.js → system-settings-panel-DKDAojWM.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-AH160QHh.js → typed-models-lib-BCCV4Kkp.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-BXzDmjCQ.js → use-channel-catalog-NBqg3iFY.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-DxwnQvQ3.js → user-profile-settings-panel-suQ2x-LB.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-i5POEtqd.js → utils-DPGVr3tS.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +1 -0
- package/dist/gateway/static/root/assets/{work-item-detail-page-CD6FL_Rs.js → work-item-detail-page-BrCZpAWh.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-ClVVMgN-.js → workflow-run-setup-panel-BTkRVNAh.js} +2 -2
- package/dist/gateway/static/root/assets/{workflow-start-dialog-Dv4ZA1T0.js → workflow-start-dialog-DAImVtdO.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/activity/context.d.ts +11 -0
- package/dist/src/activity/context.js +36 -0
- package/dist/src/activity/context.js.map +1 -0
- package/dist/src/activity/emitter.d.ts +6 -0
- package/dist/src/activity/emitter.js +43 -0
- package/dist/src/activity/emitter.js.map +1 -0
- package/dist/src/activity/index.d.ts +3 -0
- package/dist/src/activity/index.js +3 -0
- package/dist/src/activity/service.d.ts +12 -0
- package/dist/src/activity/service.js +59 -0
- package/dist/src/activity/service.js.map +1 -0
- package/dist/src/activity/types.d.ts +109 -0
- package/dist/src/activity/types.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +7 -0
- package/dist/src/agent/agent-manager.js +7 -4
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/service.js +6 -3
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +7 -0
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/tool-manuals/index.js +15 -6
- package/dist/src/agent/tool-manuals/index.js.map +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
- package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
- package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
- package/dist/src/agent/tools/factory.d.ts +7 -0
- package/dist/src/agent/tools/factory.js +9 -0
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.js +2 -2
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
- package/dist/src/agent/tools/xopc-use-tool.js +636 -0
- package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
- package/dist/src/agent-manifest/schema.d.ts +27 -27
- package/dist/src/automations/api/routes.js +1 -1
- package/dist/src/automations/domain/validation.d.ts +55 -55
- package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +3 -3
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/goal.js +3 -3
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +4 -4
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +14 -14
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +60 -60
- package/dist/src/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/middleware/log-context.js +8 -1
- package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
- package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
- package/dist/src/gateway/hono/routes/activity.js +72 -0
- package/dist/src/gateway/hono/routes/activity.js.map +1 -0
- package/dist/src/gateway/hono/routes/goals.js +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.js +2 -2
- package/dist/src/gateway/hono/routes/projects.js +65 -15
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +101 -2
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +10 -0
- package/dist/src/gateway/service/sessions-api.js +31 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.js +12 -9
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-store.js +1 -1
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +65 -6
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.d.ts +2 -1
- package/dist/src/projects/project-service.js +59 -2
- package/dist/src/projects/project-service.js.map +1 -1
- package/dist/src/projects/project-store.d.ts +2 -1
- package/dist/src/projects/project-store.js +43 -0
- package/dist/src/projects/project-store.js.map +1 -1
- package/dist/src/projects/types.d.ts +10 -0
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.js +1 -1
- package/dist/src/session/client-history.d.ts +3 -0
- package/dist/src/session/client-history.js +24 -9
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/session/types.d.ts +4 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
- package/dist/src/storage/sqlite/activity-repository.js +208 -0
- package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +63 -0
- package/dist/src/storage/sqlite/session-repository.js +11 -0
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
- package/dist/src/tui/backends/embedded-backend.js +76 -7
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.js +16 -3
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/components/chat-log.d.ts +23 -3
- package/dist/src/tui/components/chat-log.js +68 -9
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.js +9 -5
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +16 -0
- package/dist/src/tui/tui-command-formatters.js +2 -2
- package/dist/src/tui/tui-commands.d.ts +9 -0
- package/dist/src/tui/tui-commands.js +95 -6
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
- package/dist/src/tui/tui-picker-overlay.js +36 -1
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +13 -0
- package/dist/src/tui/tui-run-state.js +11 -0
- package/dist/src/tui/tui-run-state.js.map +1 -1
- package/dist/src/tui/tui-run-status-format.d.ts +3 -0
- package/dist/src/tui/tui-run-status-format.js +33 -0
- package/dist/src/tui/tui-run-status-format.js.map +1 -0
- package/dist/src/tui/tui-session-actions.d.ts +5 -0
- package/dist/src/tui/tui-session-actions.js +24 -0
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
- package/dist/src/tui/tui-timeline-picker.js +81 -0
- package/dist/src/tui/tui-timeline-picker.js.map +1 -0
- package/dist/src/tui/tui-timeline.d.ts +15 -0
- package/dist/src/tui/tui-timeline.js +65 -0
- package/dist/src/tui/tui-timeline.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +1 -0
- package/dist/src/tui/tui-types.js +1 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +31 -25
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger/stats.d.ts +3 -3
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/work-items/agent-context.d.ts +5 -1
- package/dist/src/work-items/agent-context.js +39 -3
- package/dist/src/work-items/agent-context.js.map +1 -1
- package/dist/src/work-items/work-item-service.d.ts +2 -0
- package/dist/src/work-items/work-item-service.js +97 -0
- package/dist/src/work-items/work-item-service.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/package.json +5 -5
- package/dist/gateway/static/root/assets/agents-BnTB7-c5.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-B6bG65SW.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-1lVbo0dS.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-CzDBlOK0.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-Df4m7p1k.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BMTphmHS.js +0 -2
- package/dist/gateway/static/root/assets/goal-detail-page-C2cTxf71.js +0 -1
- package/dist/gateway/static/root/assets/index-BNHDd2j1.css +0 -1
- package/dist/gateway/static/root/assets/index-BPXLPMuY.js +0 -193
- package/dist/gateway/static/root/assets/logs-page-CGc3_CQU.js +0 -2
- package/dist/gateway/static/root/assets/messages-CjuIJcZl.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-Drz4UQMb.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CY1ylng1.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-X7IaD--t.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-DE5adRBE.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-CuOb1k6F.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BOxNrUVA.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CY0IQcGW.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4NBNVCB.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-BBYUDLVd.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DaO7zYZM.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout-D8g9PAek.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Bks0CLLT.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CEZsKm9r.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-oTkHbb9W.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DigsbZ6K.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-CEJklEgb.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-OLQiUpoW.js +0 -18
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SessionTimelineItem } from '../session/transcript-outline.js';
|
|
2
|
+
export interface TuiTimelineTurn {
|
|
3
|
+
id: string;
|
|
4
|
+
turn: number;
|
|
5
|
+
displayIndex: number;
|
|
6
|
+
rowNumber?: number;
|
|
7
|
+
preview: string;
|
|
8
|
+
timestamp?: number;
|
|
9
|
+
toolCount: number;
|
|
10
|
+
running: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildTuiTimelineTurns(items: readonly SessionTimelineItem[]): TuiTimelineTurn[];
|
|
13
|
+
export declare function findTimelineTurnByNumber(turns: readonly TuiTimelineTurn[], turnNumber: number): TuiTimelineTurn | undefined;
|
|
14
|
+
export declare function findNearestTimelineTurnByDisplayIndex(turns: readonly TuiTimelineTurn[], displayIndex: number): TuiTimelineTurn | undefined;
|
|
15
|
+
export declare function formatTimelineToolSummary(toolCount: number): string;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//#region src/tui/tui-timeline.ts
|
|
2
|
+
function compactText(text, max = 72) {
|
|
3
|
+
const normalized = text.replace(/\s+/g, " ").trim();
|
|
4
|
+
if (normalized.length <= max) return normalized;
|
|
5
|
+
return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;
|
|
6
|
+
}
|
|
7
|
+
function buildTuiTimelineTurns(items) {
|
|
8
|
+
const turns = [];
|
|
9
|
+
let current = null;
|
|
10
|
+
let currentToolKeys = /* @__PURE__ */ new Set();
|
|
11
|
+
let lastDisplayIndex = 0;
|
|
12
|
+
for (const item of items) {
|
|
13
|
+
if (typeof item.displayIndex === "number" && Number.isFinite(item.displayIndex)) lastDisplayIndex = item.displayIndex;
|
|
14
|
+
if (item.kind === "turn" && item.role === "user") {
|
|
15
|
+
const turn = item.turn || turns.length + 1;
|
|
16
|
+
current = {
|
|
17
|
+
id: item.id,
|
|
18
|
+
turn,
|
|
19
|
+
displayIndex: item.displayIndex ?? lastDisplayIndex,
|
|
20
|
+
preview: compactText(item.preview || item.title || "Message"),
|
|
21
|
+
toolCount: 0,
|
|
22
|
+
running: false,
|
|
23
|
+
...item.rowNumber !== void 0 ? { rowNumber: item.rowNumber } : {},
|
|
24
|
+
...item.timestamp !== void 0 ? { timestamp: item.timestamp } : {}
|
|
25
|
+
};
|
|
26
|
+
turns.push(current);
|
|
27
|
+
currentToolKeys = /* @__PURE__ */ new Set();
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (!current) continue;
|
|
31
|
+
if (item.kind === "tool" || item.kind === "file" || item.kind === "command") {
|
|
32
|
+
const key = `${item.id}:${item.meta?.toolName ?? item.title ?? item.kind}`;
|
|
33
|
+
if (currentToolKeys.has(key)) {
|
|
34
|
+
current.running ||= item.status === "running";
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
currentToolKeys.add(key);
|
|
38
|
+
current.toolCount += 1;
|
|
39
|
+
current.running ||= item.status === "running";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return turns;
|
|
43
|
+
}
|
|
44
|
+
function findTimelineTurnByNumber(turns, turnNumber) {
|
|
45
|
+
return turns.find((turn) => turn.turn === turnNumber);
|
|
46
|
+
}
|
|
47
|
+
function findNearestTimelineTurnByDisplayIndex(turns, displayIndex) {
|
|
48
|
+
let selected = turns[0];
|
|
49
|
+
for (const turn of turns) {
|
|
50
|
+
if (turn.displayIndex <= displayIndex) {
|
|
51
|
+
selected = turn;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
return selected;
|
|
57
|
+
}
|
|
58
|
+
function formatTimelineToolSummary(toolCount) {
|
|
59
|
+
if (toolCount <= 0) return "0 tools";
|
|
60
|
+
return `${toolCount} tool${toolCount === 1 ? "" : "s"}`;
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { buildTuiTimelineTurns, findNearestTimelineTurnByDisplayIndex, findTimelineTurnByNumber, formatTimelineToolSummary };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=tui-timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-timeline.js","names":[],"sources":["../../../src/tui/tui-timeline.ts"],"sourcesContent":["import type { SessionTimelineItem } from '../session/transcript-outline.js';\n\nexport interface TuiTimelineTurn {\n id: string;\n turn: number;\n displayIndex: number;\n rowNumber?: number;\n preview: string;\n timestamp?: number;\n toolCount: number;\n running: boolean;\n}\n\nfunction compactText(text: string, max = 72): string {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= max) return normalized;\n return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;\n}\n\nexport function buildTuiTimelineTurns(items: readonly SessionTimelineItem[]): TuiTimelineTurn[] {\n const turns: TuiTimelineTurn[] = [];\n let current: TuiTimelineTurn | null = null;\n let currentToolKeys = new Set<string>();\n let lastDisplayIndex = 0;\n\n for (const item of items) {\n if (typeof item.displayIndex === 'number' && Number.isFinite(item.displayIndex)) {\n lastDisplayIndex = item.displayIndex;\n }\n\n if (item.kind === 'turn' && item.role === 'user') {\n const turn = item.turn || turns.length + 1;\n current = {\n id: item.id,\n turn,\n displayIndex: item.displayIndex ?? lastDisplayIndex,\n preview: compactText(item.preview || item.title || 'Message'),\n toolCount: 0,\n running: false,\n ...(item.rowNumber !== undefined ? { rowNumber: item.rowNumber } : {}),\n ...(item.timestamp !== undefined ? { timestamp: item.timestamp } : {}),\n };\n turns.push(current);\n currentToolKeys = new Set();\n continue;\n }\n\n if (!current) continue;\n\n if (item.kind === 'tool' || item.kind === 'file' || item.kind === 'command') {\n const key = `${item.id}:${item.meta?.toolName ?? item.title ?? item.kind}`;\n if (currentToolKeys.has(key)) {\n current.running ||= item.status === 'running';\n continue;\n }\n currentToolKeys.add(key);\n current.toolCount += 1;\n current.running ||= item.status === 'running';\n }\n }\n\n return turns;\n}\n\nexport function findTimelineTurnByNumber(\n turns: readonly TuiTimelineTurn[],\n turnNumber: number,\n): TuiTimelineTurn | undefined {\n return turns.find((turn) => turn.turn === turnNumber);\n}\n\nexport function findNearestTimelineTurnByDisplayIndex(\n turns: readonly TuiTimelineTurn[],\n displayIndex: number,\n): TuiTimelineTurn | undefined {\n let selected = turns[0];\n for (const turn of turns) {\n if (turn.displayIndex <= displayIndex) {\n selected = turn;\n continue;\n }\n break;\n }\n return selected;\n}\n\nexport function formatTimelineToolSummary(toolCount: number): string {\n if (toolCount <= 0) return '0 tools';\n return `${toolCount} tool${toolCount === 1 ? '' : 's'}`;\n}\n"],"mappings":";AAaA,SAAS,YAAY,MAAc,MAAM,IAAY;CACnD,MAAM,aAAa,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACnD,KAAI,WAAW,UAAU,IAAK,QAAO;AACrC,QAAO,GAAG,WAAW,MAAM,GAAG,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC;;AAGhE,SAAgB,sBAAsB,OAA0D;CAC9F,MAAM,QAA2B,EAAE;CACnC,IAAI,UAAkC;CACtC,IAAI,kCAAkB,IAAI,KAAa;CACvC,IAAI,mBAAmB;AAEvB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,OAAO,KAAK,iBAAiB,YAAY,OAAO,SAAS,KAAK,aAAa,CAC7E,oBAAmB,KAAK;AAG1B,MAAI,KAAK,SAAS,UAAU,KAAK,SAAS,QAAQ;GAChD,MAAM,OAAO,KAAK,QAAQ,MAAM,SAAS;AACzC,aAAU;IACR,IAAI,KAAK;IACT;IACA,cAAc,KAAK,gBAAgB;IACnC,SAAS,YAAY,KAAK,WAAW,KAAK,SAAS,UAAU;IAC7D,WAAW;IACX,SAAS;IACT,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;IACrE,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;IACtE;AACD,SAAM,KAAK,QAAQ;AACnB,qCAAkB,IAAI,KAAK;AAC3B;;AAGF,MAAI,CAAC,QAAS;AAEd,MAAI,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,WAAW;GAC3E,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,KAAK,MAAM,YAAY,KAAK,SAAS,KAAK;AACpE,OAAI,gBAAgB,IAAI,IAAI,EAAE;AAC5B,YAAQ,YAAY,KAAK,WAAW;AACpC;;AAEF,mBAAgB,IAAI,IAAI;AACxB,WAAQ,aAAa;AACrB,WAAQ,YAAY,KAAK,WAAW;;;AAIxC,QAAO;;AAGT,SAAgB,yBACd,OACA,YAC6B;AAC7B,QAAO,MAAM,MAAM,SAAS,KAAK,SAAS,WAAW;;AAGvD,SAAgB,sCACd,OACA,cAC6B;CAC7B,IAAI,WAAW,MAAM;AACrB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,KAAK,gBAAgB,cAAc;AACrC,cAAW;AACX;;AAEF;;AAEF,QAAO;;AAGT,SAAgB,0BAA0B,WAA2B;AACnE,KAAI,aAAa,EAAG,QAAO;AAC3B,QAAO,GAAG,UAAU,OAAO,cAAc,IAAI,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-types.js","names":[],"sources":["../../../src/tui/tui-types.ts"],"sourcesContent":["/** TUI configuration options passed from CLI. */\nexport interface TuiOptions {\n /** Connect to a running gateway instead of embedded mode. */\n url?: string;\n /** Gateway bearer token. */\n token?: string;\n /** Session key to resume. */\n session?: string;\n /** Agent id for a fresh TUI session. */\n agentId?: string;\n /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\n /** Workspace directory for the new TUI session. */\n workdir?: string;\n /** Use the launch directory as the new TUI session workspace when no workdir is set. */\n useStartupCwd?: boolean;\n /** Run in embedded (local) mode — no gateway required. */\n local?: boolean;\n /** Theme id: `auto`, `dark`, `light`, or custom name under `~/.xopc/themes/`. */\n theme?: string;\n}\n\nexport type TuiExitReason = 'exit' | 'signal';\n\nexport interface TuiResult {\n exitReason: TuiExitReason;\n}\n\n/** Parsed SSE event from the stream. */\nexport interface ParsedSSEEvent {\n event: string;\n data: string;\n id?: string;\n}\n\n/** Activity status for the TUI status bar. */\nexport type ActivityStatus =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'running'\n | 'compacting'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport type TuiEventSource = 'agent-response' | 'agent-resume' | 'broadcast' | 'embedded' | 'unknown';\n\nexport type TuiRunPhase =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'tool'\n | 'progress'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport interface TuiRunStatus {\n phase: TuiRunPhase;\n runId: string | null;\n directStreamRunId: string | null;\n lastCompletedRunId: string | null;\n source: TuiEventSource;\n lastEvent: string | null;\n lastActivityAt: number | null;\n stalledAt: number | null;\n recoveredAt: number | null;\n}\n\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n reasoningLevel?: string;\n verboseLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n contextWindow?: number | null;\n contextUsagePercent?: number | null;\n displayName?: string;\n effectiveWorkspacePath?: string;\n workingDirectoryLocked?: boolean;\n}\n\n/** Mutable state bag for the TUI runtime. */\nexport interface TuiState {\n currentSessionKey: string;\n activeRunId: string | null;\n isConnected: boolean;\n activityStatus: ActivityStatus;\n runStatus: TuiRunStatus;\n connectionStatus: string;\n sessionInfo: SessionInfo;\n autoMessageSent: boolean;\n historyLoaded: boolean;\n toolsExpanded: boolean;\n showThinking: boolean;\n /** Last Ctrl+C timestamp for double-press exit (see `resolveCtrlCAction`). */\n lastCtrlCAt: number;\n exitRequested: boolean;\n /** Queued via Alt+Enter while a run is active; flushed FIFO when the run ends. */\n messageFollowUpQueue: string[];\n /** Queued Enter-while-busy steering messages after the first in-flight steer. */\n steeringQueue: string[];\n /** Ctrl+P cycle filter; `null` = all models from catalog. */\n scopedModelRefs: string[] | null;\n /** Last Escape timestamp for double-press actions. */\n lastEscapeAt: number;\n /** Human-readable progress from SSE `progress` events. */\n progressMessage: string | null;\n /** Session compaction in flight (local /compact handler). */\n isCompacting: boolean;\n /** Messages queued while compacting. */\n compactionQueue: string[];\n}\n\nexport function createInitialState(sessionKey: string): TuiState {\n return {\n currentSessionKey: sessionKey,\n activeRunId: null,\n isConnected: false,\n activityStatus: 'idle',\n runStatus: {\n phase: 'idle',\n runId: null,\n directStreamRunId: null,\n lastCompletedRunId: null,\n source: 'unknown',\n lastEvent: null,\n lastActivityAt: null,\n stalledAt: null,\n recoveredAt: null,\n },\n connectionStatus: 'connecting',\n sessionInfo: {},\n autoMessageSent: false,\n historyLoaded: false,\n toolsExpanded: false,\n showThinking: false,\n lastCtrlCAt: 0,\n exitRequested: false,\n messageFollowUpQueue: [],\n steeringQueue: [],\n scopedModelRefs: null,\n lastEscapeAt: 0,\n progressMessage: null,\n isCompacting: false,\n compactionQueue: [],\n };\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"file":"tui-types.js","names":[],"sources":["../../../src/tui/tui-types.ts"],"sourcesContent":["/** TUI configuration options passed from CLI. */\nexport interface TuiOptions {\n /** Connect to a running gateway instead of embedded mode. */\n url?: string;\n /** Gateway bearer token. */\n token?: string;\n /** Session key to resume. */\n session?: string;\n /** Agent id for a fresh TUI session. */\n agentId?: string;\n /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\n /** Workspace directory for the new TUI session. */\n workdir?: string;\n /** Use the launch directory as the new TUI session workspace when no workdir is set. */\n useStartupCwd?: boolean;\n /** Run in embedded (local) mode — no gateway required. */\n local?: boolean;\n /** Theme id: `auto`, `dark`, `light`, or custom name under `~/.xopc/themes/`. */\n theme?: string;\n}\n\nexport type TuiExitReason = 'exit' | 'signal';\n\nexport interface TuiResult {\n exitReason: TuiExitReason;\n}\n\n/** Parsed SSE event from the stream. */\nexport interface ParsedSSEEvent {\n event: string;\n data: string;\n id?: string;\n}\n\n/** Activity status for the TUI status bar. */\nexport type ActivityStatus =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'running'\n | 'compacting'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport type TuiEventSource = 'agent-response' | 'agent-resume' | 'broadcast' | 'embedded' | 'unknown';\n\nexport type TuiRunPhase =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'tool'\n | 'progress'\n | 'stalled'\n | 'recovering'\n | 'aborting';\n\nexport interface TuiRunStatus {\n phase: TuiRunPhase;\n runId: string | null;\n directStreamRunId: string | null;\n lastCompletedRunId: string | null;\n source: TuiEventSource;\n lastEvent: string | null;\n startedAt: number | null;\n lastActivityAt: number | null;\n stalledAt: number | null;\n recoveredAt: number | null;\n}\n\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n reasoningLevel?: string;\n verboseLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n contextWindow?: number | null;\n contextUsagePercent?: number | null;\n displayName?: string;\n effectiveWorkspacePath?: string;\n workingDirectoryLocked?: boolean;\n}\n\n/** Mutable state bag for the TUI runtime. */\nexport interface TuiState {\n currentSessionKey: string;\n activeRunId: string | null;\n isConnected: boolean;\n activityStatus: ActivityStatus;\n runStatus: TuiRunStatus;\n connectionStatus: string;\n sessionInfo: SessionInfo;\n autoMessageSent: boolean;\n historyLoaded: boolean;\n toolsExpanded: boolean;\n showThinking: boolean;\n /** Last Ctrl+C timestamp for double-press exit (see `resolveCtrlCAction`). */\n lastCtrlCAt: number;\n exitRequested: boolean;\n /** Queued via Alt+Enter while a run is active; flushed FIFO when the run ends. */\n messageFollowUpQueue: string[];\n /** Queued Enter-while-busy steering messages after the first in-flight steer. */\n steeringQueue: string[];\n /** Ctrl+P cycle filter; `null` = all models from catalog. */\n scopedModelRefs: string[] | null;\n /** Last Escape timestamp for double-press actions. */\n lastEscapeAt: number;\n /** Human-readable progress from SSE `progress` events. */\n progressMessage: string | null;\n /** Session compaction in flight (local /compact handler). */\n isCompacting: boolean;\n /** Messages queued while compacting. */\n compactionQueue: string[];\n}\n\nexport function createInitialState(sessionKey: string): TuiState {\n return {\n currentSessionKey: sessionKey,\n activeRunId: null,\n isConnected: false,\n activityStatus: 'idle',\n runStatus: {\n phase: 'idle',\n runId: null,\n directStreamRunId: null,\n lastCompletedRunId: null,\n source: 'unknown',\n lastEvent: null,\n startedAt: null,\n lastActivityAt: null,\n stalledAt: null,\n recoveredAt: null,\n },\n connectionStatus: 'connecting',\n sessionInfo: {},\n autoMessageSent: false,\n historyLoaded: false,\n toolsExpanded: false,\n showThinking: false,\n lastCtrlCAt: 0,\n exitRequested: false,\n messageFollowUpQueue: [],\n steeringQueue: [],\n scopedModelRefs: null,\n lastEscapeAt: 0,\n progressMessage: null,\n isCompacting: false,\n compactionQueue: [],\n };\n}\n"],"mappings":";AA2HA,SAAgB,mBAAmB,YAA8B;AAC/D,QAAO;EACL,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,WAAW;GACT,OAAO;GACP,OAAO;GACP,mBAAmB;GACnB,oBAAoB;GACpB,QAAQ;GACR,WAAW;GACX,WAAW;GACX,gBAAgB;GAChB,WAAW;GACX,aAAa;GACd;EACD,kBAAkB;EAClB,aAAa,EAAE;EACf,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,cAAc;EACd,aAAa;EACb,eAAe;EACf,sBAAsB,EAAE;EACxB,eAAe,EAAE;EACjB,iBAAiB;EACjB,cAAc;EACd,iBAAiB;EACjB,cAAc;EACd,iBAAiB,EAAE;EACpB"}
|
package/dist/src/tui/tui.js
CHANGED
|
@@ -35,7 +35,8 @@ import { createLocalShellRunner } from "./tui-local-shell.js";
|
|
|
35
35
|
import { filterModelsForCycle, loadScopedModelRefs, saveScopedModelRefs } from "./tui-scoped-models.js";
|
|
36
36
|
import { openModelPickerOverlay } from "./tui-model-picker.js";
|
|
37
37
|
import { runTuiOAuthLogin } from "./tui-oauth-login.js";
|
|
38
|
-
import { openAgentPickerOverlay, openProjectTrustOverlay, openReviewLauncherOverlay, openScopedModelsOverlay, openSessionPickerOverlay, openSessionTreeOverlay, openSettingsOverlay, openThinkingSelectorOverlay, openTranscriptTreeOverlay, openUserMessageForkOverlay } from "./tui-picker-overlay.js";
|
|
38
|
+
import { openAgentPickerOverlay, openProjectTrustOverlay, openReviewLauncherOverlay, openScopedModelsOverlay, openSessionPickerOverlay, openSessionTreeOverlay, openSettingsOverlay, openThinkingSelectorOverlay, openTimelineOverlay, openTranscriptTreeOverlay, openUserMessageForkOverlay } from "./tui-picker-overlay.js";
|
|
39
|
+
import { formatActiveRunStatus, formatRunDuration } from "./tui-run-status-format.js";
|
|
39
40
|
import { formatBusyResponseHint, formatSteerUnavailableHint, formatSuspendUnsupportedHint } from "./tui-runtime-hints.js";
|
|
40
41
|
import { createSessionActions } from "./tui-session-actions.js";
|
|
41
42
|
import { TuiSessionSnapshot } from "./tui-session-snapshot.js";
|
|
@@ -55,8 +56,8 @@ import { createTuiExtensionRuntime } from "./extension-host/runtime.js";
|
|
|
55
56
|
import { tmpdir } from "node:os";
|
|
56
57
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
57
58
|
import { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
58
|
-
import { randomUUID } from "node:crypto";
|
|
59
59
|
import { spawnSync } from "node:child_process";
|
|
60
|
+
import { randomUUID } from "node:crypto";
|
|
60
61
|
import { Container, Loader, ProcessTerminal, TUI, setKeybindings } from "@earendil-works/pi-tui";
|
|
61
62
|
import { Buffer } from "node:buffer";
|
|
62
63
|
//#region src/tui/tui.ts
|
|
@@ -265,6 +266,7 @@ async function runTui(opts) {
|
|
|
265
266
|
const statusContainer = new Container();
|
|
266
267
|
const bottomBar = new TuiBottomBar(() => state, () => opts.thinking, () => formatKeyIds(keybindings, "app.message.dequeue", { capitalize: true }));
|
|
267
268
|
const chatLog = new ChatLog(keybindings);
|
|
269
|
+
chatLog.setViewportRowsProvider(() => Math.max(8, tui.terminal.rows - 8));
|
|
268
270
|
let startupResources;
|
|
269
271
|
let startupCardShown = false;
|
|
270
272
|
chatLog.setShowThinking(state.showThinking);
|
|
@@ -844,7 +846,9 @@ async function runTui(opts) {
|
|
|
844
846
|
"streaming",
|
|
845
847
|
"running",
|
|
846
848
|
"compacting",
|
|
847
|
-
"
|
|
849
|
+
"stalled",
|
|
850
|
+
"recovering",
|
|
851
|
+
"aborting"
|
|
848
852
|
]);
|
|
849
853
|
const syncTerminalProgress = () => {
|
|
850
854
|
if (!tuiSettings.showTerminalProgress) {
|
|
@@ -860,14 +864,10 @@ async function runTui(opts) {
|
|
|
860
864
|
if (state.activeRunId && state.runStatus.lastActivityAt == null) state.runStatus = {
|
|
861
865
|
...state.runStatus,
|
|
862
866
|
runId: state.activeRunId,
|
|
867
|
+
startedAt: state.runStatus.startedAt ?? lastStreamActivityAt,
|
|
863
868
|
lastActivityAt: lastStreamActivityAt
|
|
864
869
|
};
|
|
865
870
|
};
|
|
866
|
-
const formatElapsed = (startMs) => {
|
|
867
|
-
const totalSeconds = Math.max(0, Math.floor((Date.now() - startMs) / 1e3));
|
|
868
|
-
if (totalSeconds < 60) return `${totalSeconds}s`;
|
|
869
|
-
return `${Math.floor(totalSeconds / 60)}m ${totalSeconds % 60}s`;
|
|
870
|
-
};
|
|
871
871
|
const renderStatus = () => {
|
|
872
872
|
const isBusy = busyStates.has(state.activityStatus);
|
|
873
873
|
if (isBusy && extensionWorkingVisible) {
|
|
@@ -877,15 +877,15 @@ async function runTui(opts) {
|
|
|
877
877
|
statusLoader = new Loader(tui, (spinner) => theme.accent(spinner), (text) => theme.bold(theme.accentSoft(text)), "", extensionWorkingIndicator);
|
|
878
878
|
statusContainer.addChild(statusLoader);
|
|
879
879
|
}
|
|
880
|
-
const
|
|
881
|
-
|
|
882
|
-
|
|
880
|
+
const renderLoaderMessage = () => {
|
|
881
|
+
const activeRunStatus = formatActiveRunStatus(state);
|
|
882
|
+
if (activeRunStatus) return activeRunStatus;
|
|
883
|
+
const elapsed = formatRunDuration(Date.now() - statusStartedAt);
|
|
884
|
+
return `${state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus} (${elapsed})`;
|
|
885
|
+
};
|
|
886
|
+
statusLoader.setMessage(`xopc • ${renderLoaderMessage()} | ${state.connectionStatus}`);
|
|
883
887
|
if (!elapsedTimerId) elapsedTimerId = setInterval(() => {
|
|
884
|
-
if (statusStartedAt && statusLoader) {
|
|
885
|
-
const el = formatElapsed(statusStartedAt);
|
|
886
|
-
const message = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;
|
|
887
|
-
statusLoader.setMessage(`${message} • ${el} | ${state.connectionStatus}`);
|
|
888
|
-
}
|
|
888
|
+
if (statusStartedAt && statusLoader) statusLoader.setMessage(`xopc • ${renderLoaderMessage()} | ${state.connectionStatus}`);
|
|
889
889
|
}, 1e3);
|
|
890
890
|
} else {
|
|
891
891
|
if (!isBusy) {
|
|
@@ -955,7 +955,7 @@ async function runTui(opts) {
|
|
|
955
955
|
process.exit(0);
|
|
956
956
|
});
|
|
957
957
|
};
|
|
958
|
-
const { refreshSessionInfo, loadHistory: loadSessionHistory, setSession, abortActive, resetCurrentSession, clearChatForSessionSwitch } = createSessionActions({
|
|
958
|
+
const { refreshSessionInfo, loadHistory: loadSessionHistory, loadHistoryWindow, setSession, abortActive, resetCurrentSession, clearChatForSessionSwitch } = createSessionActions({
|
|
959
959
|
client,
|
|
960
960
|
chatLog,
|
|
961
961
|
tui,
|
|
@@ -1035,7 +1035,7 @@ async function runTui(opts) {
|
|
|
1035
1035
|
if (streamRecoveryPromise) return streamRecoveryPromise;
|
|
1036
1036
|
const runId = state.activeRunId;
|
|
1037
1037
|
markRunRecovering(state, Date.now());
|
|
1038
|
-
state.progressMessage = "
|
|
1038
|
+
state.progressMessage = "Reconnecting output";
|
|
1039
1039
|
setActivityStatus("recovering");
|
|
1040
1040
|
streamRecoveryPromise = (async () => {
|
|
1041
1041
|
try {
|
|
@@ -1049,20 +1049,19 @@ async function runTui(opts) {
|
|
|
1049
1049
|
runId
|
|
1050
1050
|
});
|
|
1051
1051
|
if (resumed.ok) {
|
|
1052
|
-
state.progressMessage = "
|
|
1052
|
+
state.progressMessage = "Reconnecting output";
|
|
1053
1053
|
setActivityStatus("recovering");
|
|
1054
|
-
chatLog.addSystem(theme.dim(`Reattached to active run after ${reason}.`));
|
|
1055
1054
|
} else {
|
|
1056
1055
|
markRunRecoveryComplete(state, Date.now());
|
|
1057
|
-
state.progressMessage = "
|
|
1056
|
+
state.progressMessage = "Output stale";
|
|
1058
1057
|
setActivityStatus("stalled");
|
|
1059
|
-
chatLog.addSystem(theme.dim(`
|
|
1058
|
+
chatLog.addSystem(theme.dim(`Output connection is stale. The task may still be running, but xopc could not reattach to live output: ${resumed.reason ?? "run relay unavailable"}. Press Escape or /abort to stop it.`));
|
|
1060
1059
|
}
|
|
1061
1060
|
} else {
|
|
1062
1061
|
markRunRecoveryComplete(state, Date.now());
|
|
1063
|
-
state.progressMessage = "
|
|
1062
|
+
state.progressMessage = "Output stale";
|
|
1064
1063
|
setActivityStatus("stalled");
|
|
1065
|
-
chatLog.addSystem(theme.dim(
|
|
1064
|
+
chatLog.addSystem(theme.dim("Output connection is stale. The task may still be running. Press Escape or /abort to stop it."));
|
|
1066
1065
|
}
|
|
1067
1066
|
}
|
|
1068
1067
|
} catch (error) {
|
|
@@ -1432,6 +1431,7 @@ async function runTui(opts) {
|
|
|
1432
1431
|
sendSteeringToActiveRun(text);
|
|
1433
1432
|
};
|
|
1434
1433
|
const sendMessage = (text) => {
|
|
1434
|
+
chatLog.jumpToLatest();
|
|
1435
1435
|
if (state.activeRunId && pendingImageAttachments.length > 0) {
|
|
1436
1436
|
chatLog.addSystem(theme.dim("Image attachments cannot be steered into an active run. Wait for this reply to finish, then send."));
|
|
1437
1437
|
tui.requestRender();
|
|
@@ -1582,6 +1582,7 @@ async function runTui(opts) {
|
|
|
1582
1582
|
openReviewLauncher: () => {},
|
|
1583
1583
|
openSessionPicker: () => {},
|
|
1584
1584
|
openSessionTree: () => {},
|
|
1585
|
+
openTimeline: (_initialSearch) => {},
|
|
1585
1586
|
openTranscriptTree: () => {},
|
|
1586
1587
|
openUserMessageFork: () => {},
|
|
1587
1588
|
openScopedModels: () => {},
|
|
@@ -1654,6 +1655,9 @@ async function runTui(opts) {
|
|
|
1654
1655
|
getSessionStats: () => client.getSessionStats(state.currentSessionKey),
|
|
1655
1656
|
getStartupResources: () => startupResources,
|
|
1656
1657
|
loadTranscriptTree: () => client.loadTranscriptTree(state.currentSessionKey),
|
|
1658
|
+
loadTimeline: () => client.loadTimeline(state.currentSessionKey),
|
|
1659
|
+
loadHistoryWindow,
|
|
1660
|
+
loadSessionHistory: () => loadSessionHistory(),
|
|
1657
1661
|
exportSession: exportCurrentSession,
|
|
1658
1662
|
importSession: importSessionExport,
|
|
1659
1663
|
createShare: createShareLink,
|
|
@@ -1827,6 +1831,7 @@ async function runTui(opts) {
|
|
|
1827
1831
|
switchAgentSession,
|
|
1828
1832
|
clearChatForSessionSwitch,
|
|
1829
1833
|
loadSessionHistory,
|
|
1834
|
+
loadHistoryWindow,
|
|
1830
1835
|
setEditorText: (text) => editor.setText(text),
|
|
1831
1836
|
setModelChoices,
|
|
1832
1837
|
getScopedModelRefs: () => state.scopedModelRefs,
|
|
@@ -1852,6 +1857,7 @@ async function runTui(opts) {
|
|
|
1852
1857
|
uiOverlays.openReviewLauncher = () => void openReviewLauncherOverlay(pickerSvc);
|
|
1853
1858
|
uiOverlays.openSessionPicker = () => void openSessionPickerOverlay(pickerSvc);
|
|
1854
1859
|
uiOverlays.openSessionTree = () => void openSessionTreeOverlay(pickerSvc);
|
|
1860
|
+
uiOverlays.openTimeline = (initialSearch) => void openTimelineOverlay(pickerSvc, initialSearch);
|
|
1855
1861
|
uiOverlays.openTranscriptTree = () => void openTranscriptTreeOverlay(pickerSvc);
|
|
1856
1862
|
uiOverlays.openUserMessageFork = () => void openUserMessageForkOverlay(pickerSvc);
|
|
1857
1863
|
uiOverlays.openScopedModels = () => void openScopedModelsOverlay(pickerSvc);
|
|
@@ -1959,7 +1965,7 @@ async function runTui(opts) {
|
|
|
1959
1965
|
const now = Date.now();
|
|
1960
1966
|
if (!isActiveRunStreamStale(state, now, 3e4)) return;
|
|
1961
1967
|
if (!markActiveRunStalled(state, now)) return;
|
|
1962
|
-
|
|
1968
|
+
state.progressMessage = "Reconnecting output";
|
|
1963
1969
|
setActivityStatus("stalled");
|
|
1964
1970
|
recoverActiveRunFromHistory("stream watchdog");
|
|
1965
1971
|
tui.requestRender();
|