@xopcai/xopc 0.0.94 → 0.0.96
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.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 +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agents-OqhbJkMf.js → agents-DmIuSaOE.js} +3 -3
- package/dist/gateway/static/root/assets/{apps-page-OHXW9XP8.js → apps-page-DFcHBxLw.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-4N2R-jof.js → channels-settings-DDUf55C5.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-Bv6f9kDq.js → channels-status-swr-BxF-_nzD.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-BtaQaHJq.js → cron-api-DylQtnb_.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-Dah32HJK.js → cron-page-BO0d9Pf-.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-BJfD9Qvs.js → dist-BskF0qDS.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DnYuMzmH.js → extension-debug-page-BcZdTdjJ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CJfc-6XV.js → extension-page-D2iuDa1D.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BxdfYQMG.js → extension-settings-page-BKpQCgLc.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-B0aeeY0q.js → fetch-CtNDpjij.js} +1 -1
- package/dist/gateway/static/root/assets/{field-primitives-DOLHwowi.js → field-primitives-2PekrGZF.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-Bj2INAf5.js → heartbeat-config-api-D3D7SW8A.js} +1 -1
- package/dist/gateway/static/root/assets/index-BvEhL9RQ.css +1 -0
- package/dist/gateway/static/root/assets/{index-DuQ1XPoA.js → index-Db9fd_X4.js} +74 -74
- package/dist/gateway/static/root/assets/{logs-page-AsOgLNJE.js → logs-page-B3I1a26m.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-24J4mVP-.js → note-detail-page-BOizhtJ8.js} +54 -53
- package/dist/gateway/static/root/assets/{note-detail-page-B91pLkEI.css → note-detail-page-D4ZIVQbk.css} +1 -1
- package/dist/gateway/static/root/assets/{note-time-JBszYV3s.js → note-time-CjUGtqKr.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-BB8-I0Of.js +1 -0
- package/dist/gateway/static/root/assets/{sessions-page-DX9huWsA.js → sessions-page-BcH-1K9i.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-DWvhsTuz.js → settings-advanced-gate-Czn8nnjN.js} +2 -2
- package/dist/gateway/static/root/assets/{settings-form-section-CxMjaMiy.js → settings-form-section-ZZWDwgVe.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-BX8c_zrN.js +3 -0
- package/dist/gateway/static/root/assets/share-preview-page-Ch3_6Qah.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page-CGKGKfwe.js → skills-page-WO0bbJ54.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-Cg_SuBw0.js → theme-store-XxRFRZDX.js} +1 -1
- package/dist/gateway/static/root/assets/url-6zpynn1R.js +3 -0
- package/dist/gateway/static/root/assets/{utils-BmlcxR2j.js → utils-uTYKh54l.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-DaGm2N4J.js → voice-api-key-field-BIAYHRs-.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-D0vsIGHD.js → workflow-page.utils-BbWhqD36.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-BFCrD3nw.js → workflows-page-D4RIF7E1.js} +2 -2
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +15 -9
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.d.ts +0 -1
- package/dist/src/agent/agent-scope.js +2 -5
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +3 -0
- package/dist/src/agent/bootstrap/bootstrap-cache.js +13 -3
- package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-files.d.ts +6 -0
- package/dist/src/agent/bootstrap/bootstrap-files.js +35 -12
- package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +5 -2
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +12 -3
- package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +8 -4
- package/dist/src/agent/context/workspace-seed.js.map +1 -1
- package/dist/src/agent/context/workspace-state.d.ts +52 -0
- package/dist/src/agent/context/workspace-state.js +101 -0
- package/dist/src/agent/context/workspace-state.js.map +1 -0
- package/dist/src/agent/embedded/index.d.ts +2 -2
- package/dist/src/agent/embedded/index.js +3 -3
- package/dist/src/agent/embedded/run-turn.js +0 -3
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-manager-init.d.ts +0 -17
- package/dist/src/agent/embedded/session-manager-init.js +1 -36
- package/dist/src/agent/embedded/session-manager-init.js.map +1 -1
- package/dist/src/agent/embedded/session-runner.d.ts +3 -12
- package/dist/src/agent/embedded/session-runner.js +12 -26
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +2 -4
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/embedded/sqlite-hydrating-session-manager.d.ts +10 -0
- package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js +34 -0
- package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js.map +1 -0
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.js +8 -15
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
- 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/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.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/prompt/memory/index.d.ts +1 -0
- package/dist/src/agent/prompt/memory/index.js +34 -80
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/build-direct-message-content.js +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js +8 -17
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +14 -23
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.js +7 -11
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +3 -3
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/index.d.ts +0 -1
- package/dist/src/agent/tools/index.js +1 -2
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/session-search-tool.d.ts +0 -1
- package/dist/src/agent/tools/session-search-tool.js +11 -6
- package/dist/src/agent/tools/session-search-tool.js.map +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +4 -4
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/attachments/inbound-persist.js +1 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +32 -95
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-dev.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/logs.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +5 -7
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/commands/agents.config.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +7 -8
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.d.ts +3 -0
- package/dist/src/config/paths-state.js +7 -3
- package/dist/src/config/paths-state.js.map +1 -1
- package/dist/src/config/paths.d.ts +5 -35
- package/dist/src/config/paths.js +6 -50
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/schema.d.ts +15 -0
- package/dist/src/config/schema.js +11 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/cron/execution-types.d.ts +42 -0
- package/dist/src/cron/executor.js +2 -2
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/cron/run-log-store.d.ts +4 -8
- package/dist/src/cron/run-log-store.js +26 -78
- package/dist/src/cron/run-log-store.js.map +1 -1
- package/dist/src/cron/service.d.ts +3 -3
- package/dist/src/cron/service.js +2 -2
- package/dist/src/cron/service.js.map +1 -1
- package/dist/src/cron/types.d.ts +1 -42
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/loader.js +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/agents-admin.js +8 -3
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/file-path-classifier.d.ts +0 -1
- package/dist/src/gateway/file-path-classifier.js +2 -8
- package/dist/src/gateway/file-path-classifier.js.map +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +2 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/agent-runner.js +2 -2
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service.js +5 -1
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/session-reset-service.d.ts +1 -1
- package/dist/src/gateway/session-reset-service.js +1 -1
- package/dist/src/gateway/session-reset-service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/node-sqlite.d.ts +1 -0
- package/dist/src/infra/node-sqlite.js +17 -0
- package/dist/src/infra/node-sqlite.js.map +1 -0
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +2 -2
- package/dist/src/infra/sqlite-errors.d.ts +1 -0
- package/dist/src/infra/sqlite-errors.js +77 -0
- package/dist/src/infra/sqlite-errors.js.map +1 -0
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/unhandled-rejections.d.ts +1 -0
- package/dist/src/infra/unhandled-rejections.js +25 -0
- package/dist/src/infra/unhandled-rejections.js.map +1 -0
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/warning-filter.d.ts +7 -0
- package/dist/src/infra/warning-filter.js +59 -0
- package/dist/src/infra/warning-filter.js.map +1 -0
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/notes/store.d.ts +3 -9
- package/dist/src/notes/store.js +22 -196
- package/dist/src/notes/store.js.map +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/config-store.d.ts +6 -75
- package/dist/src/session/config-store.js +38 -144
- package/dist/src/session/config-store.js.map +1 -1
- package/dist/src/session/config-types.d.ts +15 -0
- package/dist/src/session/config-types.js +1 -0
- package/dist/src/session/index.d.ts +1 -3
- package/dist/src/session/index.js +3 -5
- package/dist/src/session/init-session-turn.d.ts +0 -6
- package/dist/src/session/init-session-turn.js +18 -18
- package/dist/src/session/init-session-turn.js.map +1 -1
- package/dist/src/session/lifecycle-timestamps.d.ts +5 -2
- package/dist/src/session/lifecycle-timestamps.js.map +1 -1
- package/dist/src/session/{parity/load-jsonl-entries.js → load-jsonl-entries.js} +1 -1
- package/dist/src/session/load-jsonl-entries.js.map +1 -0
- package/dist/src/session/manager.d.ts +5 -3
- package/dist/src/session/manager.js +1 -5
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/resolve-session.d.ts +3 -6
- package/dist/src/session/resolve-session.js +26 -31
- package/dist/src/session/resolve-session.js.map +1 -1
- package/dist/src/session/session-context-for-llm.js +5 -1
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/session-id.js +12 -0
- package/dist/src/session/session-id.js.map +1 -0
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/session-workspace.d.ts +1 -1
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/store.d.ts +14 -63
- package/dist/src/session/store.js +172 -847
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/stored-rows-to-file-entries.d.ts +11 -0
- package/dist/src/session/stored-rows-to-file-entries.js +95 -0
- package/dist/src/session/stored-rows-to-file-entries.js.map +1 -0
- package/dist/src/session/transcript-events.d.ts +1 -2
- package/dist/src/session/transcript-events.js +5 -12
- package/dist/src/session/transcript-events.js.map +1 -1
- package/dist/src/session/transcript-format.d.ts +1 -1
- package/dist/src/session/transcript-format.js.map +1 -1
- package/dist/src/session/transcript-stats.d.ts +1 -0
- package/dist/src/session/transcript-stats.js +10 -0
- package/dist/src/session/transcript-stats.js.map +1 -0
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/config-repository.d.ts +6 -0
- package/dist/src/storage/sqlite/config-repository.js +56 -0
- package/dist/src/storage/sqlite/config-repository.js.map +1 -0
- package/dist/src/storage/sqlite/connection.d.ts +38 -0
- package/dist/src/storage/sqlite/connection.js +258 -0
- package/dist/src/storage/sqlite/connection.js.map +1 -0
- package/dist/src/storage/sqlite/cron-run-repository.d.ts +5 -0
- package/dist/src/storage/sqlite/cron-run-repository.js +97 -0
- package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -0
- package/dist/src/storage/sqlite/fts.d.ts +2 -0
- package/dist/src/storage/sqlite/fts.js +11 -0
- package/dist/src/storage/sqlite/fts.js.map +1 -0
- package/dist/src/storage/sqlite/index.d.ts +12 -0
- package/dist/src/storage/sqlite/index.js +13 -0
- package/dist/src/storage/sqlite/memory-index-repository.d.ts +18 -0
- package/dist/src/storage/sqlite/memory-index-repository.js +132 -0
- package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -0
- package/dist/src/storage/sqlite/notes-repository.d.ts +11 -0
- package/dist/src/storage/sqlite/notes-repository.js +191 -0
- package/dist/src/storage/sqlite/notes-repository.js.map +1 -0
- package/dist/src/storage/sqlite/paths.d.ts +1 -0
- package/dist/src/storage/sqlite/paths.js +7 -0
- package/dist/src/storage/sqlite/paths.js.map +1 -0
- package/dist/src/storage/sqlite/row-mappers.d.ts +82 -0
- package/dist/src/storage/sqlite/row-mappers.js +164 -0
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -0
- package/dist/src/storage/sqlite/schema.d.ts +5 -0
- package/dist/src/storage/sqlite/schema.js +43 -0
- package/dist/src/storage/sqlite/schema.js.map +1 -0
- package/dist/src/storage/sqlite/schema.sql +195 -0
- package/dist/src/storage/sqlite/session-metadata.d.ts +8 -0
- package/dist/src/storage/sqlite/session-metadata.js +83 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -0
- package/dist/src/storage/sqlite/session-repository.d.ts +29 -0
- package/dist/src/storage/sqlite/session-repository.js +268 -0
- package/dist/src/storage/sqlite/session-repository.js.map +1 -0
- package/dist/src/storage/sqlite/transaction.d.ts +11 -0
- package/dist/src/storage/sqlite/transaction.js +115 -0
- package/dist/src/storage/sqlite/transaction.js.map +1 -0
- package/dist/src/storage/sqlite/transcript-repository.d.ts +34 -0
- package/dist/src/storage/sqlite/transcript-repository.js +241 -0
- package/dist/src/storage/sqlite/transcript-repository.js.map +1 -0
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui.js +3 -3
- package/dist/src/tunnel/frpc-binary.js +3 -3
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/service/workflow-session-bridge.js +41 -64
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/index-Bj_l8QDp.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-BApAirFB.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-4VmUTzQs.js +0 -3
- package/dist/gateway/static/root/assets/share-preview-page-IX0TJvRd.js +0 -2
- package/dist/gateway/static/root/assets/url-BHHmdJYc.js +0 -3
- package/dist/src/agent/embedded/session-manager-cache.d.ts +0 -19
- package/dist/src/agent/embedded/session-manager-cache.js +0 -48
- package/dist/src/agent/embedded/session-manager-cache.js.map +0 -1
- package/dist/src/session/parity/artifacts.d.ts +0 -16
- package/dist/src/session/parity/artifacts.js +0 -80
- package/dist/src/session/parity/artifacts.js.map +0 -1
- package/dist/src/session/parity/jsonl-transcript-io.d.ts +0 -54
- package/dist/src/session/parity/jsonl-transcript-io.js +0 -236
- package/dist/src/session/parity/jsonl-transcript-io.js.map +0 -1
- package/dist/src/session/parity/load-jsonl-entries.js.map +0 -1
- package/dist/src/session/parity/session-id.js +0 -18
- package/dist/src/session/parity/session-id.js.map +0 -1
- package/dist/src/session/parity/sessions-json-cache.d.ts +0 -14
- package/dist/src/session/parity/sessions-json-cache.js +0 -98
- package/dist/src/session/parity/sessions-json-cache.js.map +0 -1
- package/dist/src/session/parity/sessions-json-file-read.d.ts +0 -6
- package/dist/src/session/parity/sessions-json-file-read.js +0 -19
- package/dist/src/session/parity/sessions-json-file-read.js.map +0 -1
- package/dist/src/session/parity/sessions-json-file.d.ts +0 -11
- package/dist/src/session/parity/sessions-json-file.js +0 -52
- package/dist/src/session/parity/sessions-json-file.js.map +0 -1
- package/dist/src/session/parity/sessions-json-patch.d.ts +0 -14
- package/dist/src/session/parity/sessions-json-patch.js +0 -40
- package/dist/src/session/parity/sessions-json-patch.js.map +0 -1
- package/dist/src/session/parity/transcript-file-lock.d.ts +0 -22
- package/dist/src/session/parity/transcript-file-lock.js +0 -142
- package/dist/src/session/parity/transcript-file-lock.js.map +0 -1
- package/dist/src/session/parity/transcript-pagination.d.ts +0 -29
- package/dist/src/session/parity/transcript-pagination.js +0 -132
- package/dist/src/session/parity/transcript-pagination.js.map +0 -1
- package/dist/src/session/parity/transcript-paths.d.ts +0 -13
- package/dist/src/session/parity/transcript-paths.js +0 -64
- package/dist/src/session/parity/transcript-paths.js.map +0 -1
- package/dist/src/session/parity/xopc-session-disk-entry.d.ts +0 -22
- package/dist/src/session/search-index-cache.d.ts +0 -6
- package/dist/src/session/search-index-cache.js +0 -44
- package/dist/src/session/search-index-cache.js.map +0 -1
- package/dist/src/session/search-index.d.ts +0 -20
- package/dist/src/session/search-index.js +0 -124
- package/dist/src/session/search-index.js.map +0 -1
- /package/dist/src/{session/parity/xopc-session-disk-entry.js → cron/execution-types.js} +0 -0
- /package/dist/src/session/{parity/load-jsonl-entries.d.ts → load-jsonl-entries.d.ts} +0 -0
- /package/dist/src/session/{parity/session-id.d.ts → session-id.d.ts} +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { DEFAULT_AGENT_ID, init_agent_scope, resolveAgentProfileDir, resolveAgentWorkspaceDir } from "../agent-scope.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { DEFAULT_AGENT_ID, init_agent_scope, resolveAgentProfileDir, resolveAgentWorkspaceDir } from "../agent-scope.js";
|
|
4
4
|
import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
|
|
5
5
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from "./workspace.js";
|
|
6
|
-
import {
|
|
6
|
+
import { markBootstrapSeeded, resolveWorkspaceStatePathForMarkdownWorkspace } from "./workspace-state.js";
|
|
7
7
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
-
import {
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { execFileSync } from "node:child_process";
|
|
10
11
|
//#region src/agent/context/workspace-seed.ts
|
|
11
12
|
/**
|
|
12
13
|
* Seed profile Markdown files into `agents/<agentId>/profile/` (and optionally `git init` the Markdown workspace).
|
|
@@ -80,7 +81,10 @@ function seedAgentProfileMarkdownFiles(profileDir, markdownWorkspaceDir, options
|
|
|
80
81
|
log.warn({ name }, "Missing workspace template file; skip seeding");
|
|
81
82
|
continue;
|
|
82
83
|
}
|
|
83
|
-
if (writeFileIfMissing(targetPath, name === WORKSPACE_FILES.IDENTITY ? personalizeIdentityTemplate(tpl, options?.displayName) : tpl))
|
|
84
|
+
if (writeFileIfMissing(targetPath, name === WORKSPACE_FILES.IDENTITY ? personalizeIdentityTemplate(tpl, options?.displayName) : tpl)) {
|
|
85
|
+
seeded++;
|
|
86
|
+
if (name === WORKSPACE_FILES.BOOTSTRAP) markBootstrapSeeded(resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir));
|
|
87
|
+
}
|
|
84
88
|
}
|
|
85
89
|
if (seeded > 0) log.info({
|
|
86
90
|
profileDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-seed.js","names":[],"sources":["../../../../src/agent/context/workspace-seed.ts"],"sourcesContent":["/**\n * Seed profile Markdown files into `agents/<agentId>/profile/` (and optionally `git init` the Markdown workspace).\n * Resolution order per file: `XOPC_TEMPLATE_PATH` or repo `docs/reference/templates`, then bundled `./workspace-templates/`.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { Config } from '../../config/schema.js';\nimport { DEFAULT_AGENT_ID, resolveAgentProfileDir, resolveAgentWorkspaceDir } from '../agent-scope.js';\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from './workspace.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('WorkspaceSeed');\n\n/** Marker in bundled/reference `IDENTITY.md` templates; replaced on agent creation when a display name is known. */\nexport const IDENTITY_NAME_PLACEHOLDER = '_(pick something you like)_';\n\nexport type SeedWorkspaceProfileMarkdownOptions = {\n /** Fills the **Name** line in `IDENTITY.md` when the template still contains the placeholder. */\n displayName?: string;\n};\n\n/** Files to copy when seeding a new agent (includes `BOOTSTRAP.md`, not part of system-prompt load order). */\nconst SEED_FILENAMES: readonly string[] = [...AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, WORKSPACE_FILES.BOOTSTRAP];\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction resolveBundledTemplatesDir(): string {\n return join(__dirname, 'workspace-templates');\n}\n\n/** Walk ancestors for `docs/reference/templates` (dev checkout or local install with docs). */\nfunction resolveDocsTemplatesDirFromWalk(): string | null {\n let dir = __dirname;\n for (let i = 0; i < 12; i++) {\n const candidate = join(dir, 'docs', 'reference', 'templates');\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** Same convention as CLI `templates.ts`: env override, then docs tree, else null. */\nfunction resolvePrimaryTemplatesBaseDir(): string | null {\n const envPath = process.env.XOPC_TEMPLATE_PATH?.trim();\n if (envPath && existsSync(envPath)) {\n return envPath;\n }\n return resolveDocsTemplatesDirFromWalk();\n}\n\nfunction readTemplate(name: string): string | null {\n const primary = resolvePrimaryTemplatesBaseDir();\n if (primary) {\n const p = join(primary, name);\n if (existsSync(p)) {\n return readFileSync(p, 'utf-8');\n }\n }\n const bundled = join(resolveBundledTemplatesDir(), name);\n if (existsSync(bundled)) {\n return readFileSync(bundled, 'utf-8');\n }\n return null;\n}\n\nfunction writeFileIfMissing(targetPath: string, content: string): boolean {\n if (existsSync(targetPath)) {\n return false;\n }\n writeFileSync(targetPath, content, 'utf-8');\n return true;\n}\n\nfunction personalizeIdentityTemplate(content: string, displayName?: string): string {\n const n = displayName?.trim();\n if (!n || !content.includes(IDENTITY_NAME_PLACEHOLDER)) {\n return content;\n }\n return content.replaceAll(IDENTITY_NAME_PLACEHOLDER, n);\n}\n\n/**\n * Seed profile Markdown into `profileDir` (`agents/<id>/profile/`).\n * When `markdownWorkspaceDir` is set, runs `git init` on a brand-new Markdown workspace only (never under `profile/`).\n * Does not overwrite existing files.\n */\nexport function seedAgentProfileMarkdownFiles(\n profileDir: string,\n markdownWorkspaceDir: string,\n options?: SeedWorkspaceProfileMarkdownOptions,\n): void {\n const wsPreExisted = existsSync(markdownWorkspaceDir);\n mkdirSync(profileDir, { recursive: true });\n mkdirSync(markdownWorkspaceDir, { recursive: true });\n\n const isBrandNewWorkspace = !wsPreExisted;\n\n let seeded = 0;\n for (const name of SEED_FILENAMES) {\n const targetPath = join(profileDir, name);\n const tpl = readTemplate(name);\n if (!tpl) {\n log.warn({ name }, 'Missing workspace template file; skip seeding');\n continue;\n }\n const body =\n name === WORKSPACE_FILES.IDENTITY ? personalizeIdentityTemplate(tpl, options?.displayName) : tpl;\n if (writeFileIfMissing(targetPath, body)) {\n seeded++;\n }\n }\n\n if (seeded > 0) {\n log.info({ profileDir, seeded }, 'Seeded profile Markdown files');\n }\n\n ensureGitRepo(markdownWorkspaceDir, isBrandNewWorkspace);\n}\n\n/** Attempt `git init` on a brand-new Markdown workspace; silently skip on failure. */\nfunction ensureGitRepo(markdownWorkspaceDir: string, isBrandNew: boolean): void {\n if (!isBrandNew) {\n return;\n }\n if (existsSync(join(markdownWorkspaceDir, '.git'))) {\n return;\n }\n try {\n execFileSync('git', ['init'], { cwd: markdownWorkspaceDir, stdio: 'ignore', timeout: 5_000 });\n log.info({ markdownWorkspaceDir }, 'Initialized git repo in Markdown workspace');\n } catch {\n log.debug({ markdownWorkspaceDir }, 'git init skipped (git not available or failed)');\n }\n}\n\n/**\n * Ensure default (`main`) agent has reference profile Markdown templates (missing files only).\n */\nexport function seedMainAgentProfileMarkdown(cfg: Config): void {\n seedAgentProfileMarkdownFiles(\n resolveAgentProfileDir(cfg, DEFAULT_AGENT_ID),\n resolveAgentWorkspaceDir(cfg, DEFAULT_AGENT_ID),\n );\n}
|
|
1
|
+
{"version":3,"file":"workspace-seed.js","names":[],"sources":["../../../../src/agent/context/workspace-seed.ts"],"sourcesContent":["/**\n * Seed profile Markdown files into `agents/<agentId>/profile/` (and optionally `git init` the Markdown workspace).\n * Resolution order per file: `XOPC_TEMPLATE_PATH` or repo `docs/reference/templates`, then bundled `./workspace-templates/`.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { Config } from '../../config/schema.js';\nimport { DEFAULT_AGENT_ID, resolveAgentProfileDir, resolveAgentWorkspaceDir } from '../agent-scope.js';\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from './workspace.js';\nimport { createLogger } from '../../utils/logger.js';\nimport {\n markBootstrapSeeded,\n resolveWorkspaceStatePathForMarkdownWorkspace,\n} from './workspace-state.js';\n\nconst log = createLogger('WorkspaceSeed');\n\n/** Marker in bundled/reference `IDENTITY.md` templates; replaced on agent creation when a display name is known. */\nexport const IDENTITY_NAME_PLACEHOLDER = '_(pick something you like)_';\n\nexport type SeedWorkspaceProfileMarkdownOptions = {\n /** Fills the **Name** line in `IDENTITY.md` when the template still contains the placeholder. */\n displayName?: string;\n};\n\n/** Files to copy when seeding a new agent (includes `BOOTSTRAP.md`, not part of system-prompt load order). */\nconst SEED_FILENAMES: readonly string[] = [...AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, WORKSPACE_FILES.BOOTSTRAP];\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction resolveBundledTemplatesDir(): string {\n return join(__dirname, 'workspace-templates');\n}\n\n/** Walk ancestors for `docs/reference/templates` (dev checkout or local install with docs). */\nfunction resolveDocsTemplatesDirFromWalk(): string | null {\n let dir = __dirname;\n for (let i = 0; i < 12; i++) {\n const candidate = join(dir, 'docs', 'reference', 'templates');\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** Same convention as CLI `templates.ts`: env override, then docs tree, else null. */\nfunction resolvePrimaryTemplatesBaseDir(): string | null {\n const envPath = process.env.XOPC_TEMPLATE_PATH?.trim();\n if (envPath && existsSync(envPath)) {\n return envPath;\n }\n return resolveDocsTemplatesDirFromWalk();\n}\n\nfunction readTemplate(name: string): string | null {\n const primary = resolvePrimaryTemplatesBaseDir();\n if (primary) {\n const p = join(primary, name);\n if (existsSync(p)) {\n return readFileSync(p, 'utf-8');\n }\n }\n const bundled = join(resolveBundledTemplatesDir(), name);\n if (existsSync(bundled)) {\n return readFileSync(bundled, 'utf-8');\n }\n return null;\n}\n\nfunction writeFileIfMissing(targetPath: string, content: string): boolean {\n if (existsSync(targetPath)) {\n return false;\n }\n writeFileSync(targetPath, content, 'utf-8');\n return true;\n}\n\nfunction personalizeIdentityTemplate(content: string, displayName?: string): string {\n const n = displayName?.trim();\n if (!n || !content.includes(IDENTITY_NAME_PLACEHOLDER)) {\n return content;\n }\n return content.replaceAll(IDENTITY_NAME_PLACEHOLDER, n);\n}\n\n/**\n * Seed profile Markdown into `profileDir` (`agents/<id>/profile/`).\n * When `markdownWorkspaceDir` is set, runs `git init` on a brand-new Markdown workspace only (never under `profile/`).\n * Does not overwrite existing files.\n */\nexport function seedAgentProfileMarkdownFiles(\n profileDir: string,\n markdownWorkspaceDir: string,\n options?: SeedWorkspaceProfileMarkdownOptions,\n): void {\n const wsPreExisted = existsSync(markdownWorkspaceDir);\n mkdirSync(profileDir, { recursive: true });\n mkdirSync(markdownWorkspaceDir, { recursive: true });\n\n const isBrandNewWorkspace = !wsPreExisted;\n\n let seeded = 0;\n for (const name of SEED_FILENAMES) {\n const targetPath = join(profileDir, name);\n const tpl = readTemplate(name);\n if (!tpl) {\n log.warn({ name }, 'Missing workspace template file; skip seeding');\n continue;\n }\n const body =\n name === WORKSPACE_FILES.IDENTITY ? personalizeIdentityTemplate(tpl, options?.displayName) : tpl;\n if (writeFileIfMissing(targetPath, body)) {\n seeded++;\n // Track bootstrap seeding in workspace state\n if (name === WORKSPACE_FILES.BOOTSTRAP) {\n markBootstrapSeeded(resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir));\n }\n }\n }\n\n if (seeded > 0) {\n log.info({ profileDir, seeded }, 'Seeded profile Markdown files');\n }\n\n ensureGitRepo(markdownWorkspaceDir, isBrandNewWorkspace);\n}\n\n/** Attempt `git init` on a brand-new Markdown workspace; silently skip on failure. */\nfunction ensureGitRepo(markdownWorkspaceDir: string, isBrandNew: boolean): void {\n if (!isBrandNew) {\n return;\n }\n if (existsSync(join(markdownWorkspaceDir, '.git'))) {\n return;\n }\n try {\n execFileSync('git', ['init'], { cwd: markdownWorkspaceDir, stdio: 'ignore', timeout: 5_000 });\n log.info({ markdownWorkspaceDir }, 'Initialized git repo in Markdown workspace');\n } catch {\n log.debug({ markdownWorkspaceDir }, 'git init skipped (git not available or failed)');\n }\n}\n\n/**\n * Ensure default (`main`) agent has reference profile Markdown templates (missing files only).\n */\nexport function seedMainAgentProfileMarkdown(cfg: Config): void {\n seedAgentProfileMarkdownFiles(\n resolveAgentProfileDir(cfg, DEFAULT_AGENT_ID),\n resolveAgentWorkspaceDir(cfg, DEFAULT_AGENT_ID),\n );\n}"],"mappings":";;;;;;;;;;;;;;;kBAWuG;YAC/C;aAEH;AAMrD,MAAM,MAAM,aAAa,gBAAgB;;AAGzC,MAAa,4BAA4B;;AAQzC,MAAM,iBAAoC,CAAC,GAAG,qCAAqC,gBAAgB,UAAU;AAE7G,MAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAEzD,SAAS,6BAAqC;AAC5C,QAAO,KAAK,WAAW,sBAAsB;;;AAI/C,SAAS,kCAAiD;CACxD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,YAAY,KAAK,KAAK,QAAQ,aAAa,YAAY;AAC7D,MAAI,WAAW,UAAU,CACvB,QAAO;EAET,MAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,WAAW,IAAK;AACpB,QAAM;;AAER,QAAO;;;AAIT,SAAS,iCAAgD;CACvD,MAAM,UAAU,QAAQ,IAAI,oBAAoB,MAAM;AACtD,KAAI,WAAW,WAAW,QAAQ,CAChC,QAAO;AAET,QAAO,iCAAiC;;AAG1C,SAAS,aAAa,MAA6B;CACjD,MAAM,UAAU,gCAAgC;AAChD,KAAI,SAAS;EACX,MAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,MAAI,WAAW,EAAE,CACf,QAAO,aAAa,GAAG,QAAQ;;CAGnC,MAAM,UAAU,KAAK,4BAA4B,EAAE,KAAK;AACxD,KAAI,WAAW,QAAQ,CACrB,QAAO,aAAa,SAAS,QAAQ;AAEvC,QAAO;;AAGT,SAAS,mBAAmB,YAAoB,SAA0B;AACxE,KAAI,WAAW,WAAW,CACxB,QAAO;AAET,eAAc,YAAY,SAAS,QAAQ;AAC3C,QAAO;;AAGT,SAAS,4BAA4B,SAAiB,aAA8B;CAClF,MAAM,IAAI,aAAa,MAAM;AAC7B,KAAI,CAAC,KAAK,CAAC,QAAQ,SAAA,8BAAmC,CACpD,QAAO;AAET,QAAO,QAAQ,WAAW,2BAA2B,EAAE;;;;;;;AAQzD,SAAgB,8BACd,YACA,sBACA,SACM;CACN,MAAM,eAAe,WAAW,qBAAqB;AACrD,WAAU,YAAY,EAAE,WAAW,MAAM,CAAC;AAC1C,WAAU,sBAAsB,EAAE,WAAW,MAAM,CAAC;CAEpD,MAAM,sBAAsB,CAAC;CAE7B,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,aAAa,KAAK,YAAY,KAAK;EACzC,MAAM,MAAM,aAAa,KAAK;AAC9B,MAAI,CAAC,KAAK;AACR,OAAI,KAAK,EAAE,MAAM,EAAE,gDAAgD;AACnE;;AAIF,MAAI,mBAAmB,YADrB,SAAS,gBAAgB,WAAW,4BAA4B,KAAK,SAAS,YAAY,GAAG,IACvD,EAAE;AACxC;AAEA,OAAI,SAAS,gBAAgB,UAC3B,qBAAoB,8CAA8C,qBAAqB,CAAC;;;AAK9F,KAAI,SAAS,EACX,KAAI,KAAK;EAAE;EAAY;EAAQ,EAAE,gCAAgC;AAGnE,eAAc,sBAAsB,oBAAoB;;;AAI1D,SAAS,cAAc,sBAA8B,YAA2B;AAC9E,KAAI,CAAC,WACH;AAEF,KAAI,WAAW,KAAK,sBAAsB,OAAO,CAAC,CAChD;AAEF,KAAI;AACF,eAAa,OAAO,CAAC,OAAO,EAAE;GAAE,KAAK;GAAsB,OAAO;GAAU,SAAS;GAAO,CAAC;AAC7F,MAAI,KAAK,EAAE,sBAAsB,EAAE,6CAA6C;SAC1E;AACN,MAAI,MAAM,EAAE,sBAAsB,EAAE,iDAAiD;;;;;;AAOzF,SAAgB,6BAA6B,KAAmB;AAC9D,+BACE,uBAAuB,KAAK,iBAAiB,EAC7C,yBAAyB,KAAK,iBAAiB,CAChD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace bootstrap state machine — OpenClaw-aligned.
|
|
3
|
+
*
|
|
4
|
+
* Tracks BOOTSTRAP.md lifecycle in `<markdownWorkspace>/.xopc/workspace.json`
|
|
5
|
+
* (same path as `resolveWorkspaceStatePath` / `xopc init`).
|
|
6
|
+
*
|
|
7
|
+
* Motivation: BOOTSTRAP.md instructs the agent to delete itself after setup,
|
|
8
|
+
* but that is unreliable (LLM-dependent). This module provides a runtime-level
|
|
9
|
+
* state machine so the system can track whether bootstrap was completed
|
|
10
|
+
* regardless of whether the agent actually deleted the file.
|
|
11
|
+
*/
|
|
12
|
+
import type { Config } from '../../config/schema.js';
|
|
13
|
+
import { resolveWorkspaceStatePath } from '../../config/paths.js';
|
|
14
|
+
export { resolveWorkspaceStatePath };
|
|
15
|
+
export interface WorkspaceSetupState {
|
|
16
|
+
version: number;
|
|
17
|
+
/** Set by `xopc init` for the agent id owning this workspace. */
|
|
18
|
+
agentId?: string;
|
|
19
|
+
/** ISO timestamp when profile Markdown was first seeded (init / agents add). */
|
|
20
|
+
profileMarkdownSeededAt?: string;
|
|
21
|
+
/** ISO timestamp when BOOTSTRAP.md was first seeded into the profile. */
|
|
22
|
+
bootstrapSeededAt?: string;
|
|
23
|
+
/** ISO timestamp when bootstrap setup was completed (BOOTSTRAP.md workflow finished). */
|
|
24
|
+
setupCompletedAt?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Resolve workspace state path when only the Markdown workspace root is known. */
|
|
27
|
+
export declare function resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir: string): string;
|
|
28
|
+
/** Resolve workspace state path from config + agent id. */
|
|
29
|
+
export declare function resolveAgentWorkspaceStatePath(config: Config, agentId: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Check whether the workspace bootstrap setup has been completed.
|
|
32
|
+
* Returns true when `setupCompletedAt` is set in the state file.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isWorkspaceSetupCompleted(statePath: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Check whether BOOTSTRAP.md is still pending (seeded but not completed).
|
|
37
|
+
* Works even if the file was already deleted by the agent — the state file is authoritative.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isWorkspaceBootstrapPending(statePath: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* When BOOTSTRAP.md was seeded but the file is now gone, treat setup as completed.
|
|
42
|
+
* Idempotent; safe to call before loading bootstrap files or listing profile files.
|
|
43
|
+
*/
|
|
44
|
+
export declare function syncBootstrapSetupCompletion(statePath: string, profileDir: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Mark BOOTSTRAP.md as seeded (call when workspace-seed.ts writes the file).
|
|
47
|
+
*/
|
|
48
|
+
export declare function markBootstrapSeeded(statePath: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Mark bootstrap setup as completed.
|
|
51
|
+
*/
|
|
52
|
+
export declare function markSetupCompleted(statePath: string): void;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { FILENAMES, WORKSPACE_FILES, init_paths, resolveWorkspaceStatePath } from "../../config/paths.js";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
//#region src/agent/context/workspace-state.ts
|
|
5
|
+
/**
|
|
6
|
+
* Workspace bootstrap state machine — OpenClaw-aligned.
|
|
7
|
+
*
|
|
8
|
+
* Tracks BOOTSTRAP.md lifecycle in `<markdownWorkspace>/.xopc/workspace.json`
|
|
9
|
+
* (same path as `resolveWorkspaceStatePath` / `xopc init`).
|
|
10
|
+
*
|
|
11
|
+
* Motivation: BOOTSTRAP.md instructs the agent to delete itself after setup,
|
|
12
|
+
* but that is unreliable (LLM-dependent). This module provides a runtime-level
|
|
13
|
+
* state machine so the system can track whether bootstrap was completed
|
|
14
|
+
* regardless of whether the agent actually deleted the file.
|
|
15
|
+
*/
|
|
16
|
+
init_paths();
|
|
17
|
+
const WORKSPACE_STATE_VERSION = 1;
|
|
18
|
+
function parseWorkspaceState(raw) {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(raw);
|
|
21
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
22
|
+
return {
|
|
23
|
+
version: WORKSPACE_STATE_VERSION,
|
|
24
|
+
agentId: typeof parsed.agentId === "string" ? parsed.agentId : void 0,
|
|
25
|
+
profileMarkdownSeededAt: typeof parsed.profileMarkdownSeededAt === "string" ? parsed.profileMarkdownSeededAt : void 0,
|
|
26
|
+
bootstrapSeededAt: typeof parsed.bootstrapSeededAt === "string" ? parsed.bootstrapSeededAt : void 0,
|
|
27
|
+
setupCompletedAt: typeof parsed.setupCompletedAt === "string" ? parsed.setupCompletedAt : void 0
|
|
28
|
+
};
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function readWorkspaceState(statePath) {
|
|
34
|
+
try {
|
|
35
|
+
return parseWorkspaceState(readFileSync(statePath, "utf-8")) ?? { version: WORKSPACE_STATE_VERSION };
|
|
36
|
+
} catch (err) {
|
|
37
|
+
if (err.code !== "ENOENT") throw err;
|
|
38
|
+
return { version: WORKSPACE_STATE_VERSION };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function writeWorkspaceState(statePath, patch) {
|
|
42
|
+
const merged = {
|
|
43
|
+
...readWorkspaceState(statePath),
|
|
44
|
+
...patch,
|
|
45
|
+
version: WORKSPACE_STATE_VERSION
|
|
46
|
+
};
|
|
47
|
+
mkdirSync(dirname(statePath), { recursive: true });
|
|
48
|
+
writeFileSync(statePath, `${JSON.stringify(merged, null, 2)}\n`, "utf-8");
|
|
49
|
+
}
|
|
50
|
+
/** Resolve workspace state path when only the Markdown workspace root is known. */
|
|
51
|
+
function resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir) {
|
|
52
|
+
return join(markdownWorkspaceDir, ".xopc", FILENAMES.WORKSPACE_STATE);
|
|
53
|
+
}
|
|
54
|
+
/** Resolve workspace state path from config + agent id. */
|
|
55
|
+
function resolveAgentWorkspaceStatePath(config, agentId) {
|
|
56
|
+
return resolveWorkspaceStatePath(config, agentId);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check whether the workspace bootstrap setup has been completed.
|
|
60
|
+
* Returns true when `setupCompletedAt` is set in the state file.
|
|
61
|
+
*/
|
|
62
|
+
function isWorkspaceSetupCompleted(statePath) {
|
|
63
|
+
const state = readWorkspaceState(statePath);
|
|
64
|
+
return typeof state.setupCompletedAt === "string" && state.setupCompletedAt.trim().length > 0;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check whether BOOTSTRAP.md is still pending (seeded but not completed).
|
|
68
|
+
* Works even if the file was already deleted by the agent — the state file is authoritative.
|
|
69
|
+
*/
|
|
70
|
+
function isWorkspaceBootstrapPending(statePath) {
|
|
71
|
+
const state = readWorkspaceState(statePath);
|
|
72
|
+
if (typeof state.setupCompletedAt === "string" && state.setupCompletedAt.trim().length > 0) return false;
|
|
73
|
+
return typeof state.bootstrapSeededAt === "string";
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* When BOOTSTRAP.md was seeded but the file is now gone, treat setup as completed.
|
|
77
|
+
* Idempotent; safe to call before loading bootstrap files or listing profile files.
|
|
78
|
+
*/
|
|
79
|
+
function syncBootstrapSetupCompletion(statePath, profileDir) {
|
|
80
|
+
if (isWorkspaceSetupCompleted(statePath)) return;
|
|
81
|
+
if (existsSync(join(profileDir, WORKSPACE_FILES.BOOTSTRAP))) return;
|
|
82
|
+
if (!readWorkspaceState(statePath).bootstrapSeededAt) return;
|
|
83
|
+
markSetupCompleted(statePath);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Mark BOOTSTRAP.md as seeded (call when workspace-seed.ts writes the file).
|
|
87
|
+
*/
|
|
88
|
+
function markBootstrapSeeded(statePath) {
|
|
89
|
+
if (readWorkspaceState(statePath).bootstrapSeededAt) return;
|
|
90
|
+
writeWorkspaceState(statePath, { bootstrapSeededAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Mark bootstrap setup as completed.
|
|
94
|
+
*/
|
|
95
|
+
function markSetupCompleted(statePath) {
|
|
96
|
+
writeWorkspaceState(statePath, { setupCompletedAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
export { isWorkspaceBootstrapPending, isWorkspaceSetupCompleted, markBootstrapSeeded, markSetupCompleted, resolveAgentWorkspaceStatePath, resolveWorkspaceStatePath, resolveWorkspaceStatePathForMarkdownWorkspace, syncBootstrapSetupCompletion };
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=workspace-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-state.js","names":[],"sources":["../../../../src/agent/context/workspace-state.ts"],"sourcesContent":["/**\n * Workspace bootstrap state machine — OpenClaw-aligned.\n *\n * Tracks BOOTSTRAP.md lifecycle in `<markdownWorkspace>/.xopc/workspace.json`\n * (same path as `resolveWorkspaceStatePath` / `xopc init`).\n *\n * Motivation: BOOTSTRAP.md instructs the agent to delete itself after setup,\n * but that is unreliable (LLM-dependent). This module provides a runtime-level\n * state machine so the system can track whether bootstrap was completed\n * regardless of whether the agent actually deleted the file.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { FILENAMES, WORKSPACE_FILES, resolveWorkspaceStatePath } from '../../config/paths.js';\n\nexport { resolveWorkspaceStatePath };\n\nconst WORKSPACE_STATE_VERSION = 1;\n\nexport interface WorkspaceSetupState {\n version: number;\n /** Set by `xopc init` for the agent id owning this workspace. */\n agentId?: string;\n /** ISO timestamp when profile Markdown was first seeded (init / agents add). */\n profileMarkdownSeededAt?: string;\n /** ISO timestamp when BOOTSTRAP.md was first seeded into the profile. */\n bootstrapSeededAt?: string;\n /** ISO timestamp when bootstrap setup was completed (BOOTSTRAP.md workflow finished). */\n setupCompletedAt?: string;\n}\n\nfunction parseWorkspaceState(raw: string): WorkspaceSetupState | null {\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (!parsed || typeof parsed !== 'object') {\n return null;\n }\n return {\n version: WORKSPACE_STATE_VERSION,\n agentId: typeof parsed.agentId === 'string' ? parsed.agentId : undefined,\n profileMarkdownSeededAt:\n typeof parsed.profileMarkdownSeededAt === 'string' ? parsed.profileMarkdownSeededAt : undefined,\n bootstrapSeededAt:\n typeof parsed.bootstrapSeededAt === 'string' ? parsed.bootstrapSeededAt : undefined,\n setupCompletedAt: typeof parsed.setupCompletedAt === 'string' ? parsed.setupCompletedAt : undefined,\n };\n } catch {\n return null;\n }\n}\n\nfunction readWorkspaceState(statePath: string): WorkspaceSetupState {\n try {\n const raw = readFileSync(statePath, 'utf-8');\n return parseWorkspaceState(raw) ?? { version: WORKSPACE_STATE_VERSION };\n } catch (err: unknown) {\n const code = (err as { code?: string }).code;\n if (code !== 'ENOENT') {\n throw err;\n }\n return { version: WORKSPACE_STATE_VERSION };\n }\n}\n\nfunction writeWorkspaceState(statePath: string, patch: Partial<WorkspaceSetupState>): void {\n const merged = { ...readWorkspaceState(statePath), ...patch, version: WORKSPACE_STATE_VERSION };\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, `${JSON.stringify(merged, null, 2)}\\n`, 'utf-8');\n}\n\n/** Resolve workspace state path when only the Markdown workspace root is known. */\nexport function resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir: string): string {\n return join(markdownWorkspaceDir, '.xopc', FILENAMES.WORKSPACE_STATE);\n}\n\n/** Resolve workspace state path from config + agent id. */\nexport function resolveAgentWorkspaceStatePath(config: Config, agentId: string): string {\n return resolveWorkspaceStatePath(config, agentId);\n}\n\n/**\n * Check whether the workspace bootstrap setup has been completed.\n * Returns true when `setupCompletedAt` is set in the state file.\n */\nexport function isWorkspaceSetupCompleted(statePath: string): boolean {\n const state = readWorkspaceState(statePath);\n return typeof state.setupCompletedAt === 'string' && state.setupCompletedAt.trim().length > 0;\n}\n\n/**\n * Check whether BOOTSTRAP.md is still pending (seeded but not completed).\n * Works even if the file was already deleted by the agent — the state file is authoritative.\n */\nexport function isWorkspaceBootstrapPending(statePath: string): boolean {\n const state = readWorkspaceState(statePath);\n if (typeof state.setupCompletedAt === 'string' && state.setupCompletedAt.trim().length > 0) {\n return false;\n }\n return typeof state.bootstrapSeededAt === 'string';\n}\n\n/**\n * When BOOTSTRAP.md was seeded but the file is now gone, treat setup as completed.\n * Idempotent; safe to call before loading bootstrap files or listing profile files.\n */\nexport function syncBootstrapSetupCompletion(statePath: string, profileDir: string): void {\n if (isWorkspaceSetupCompleted(statePath)) {\n return;\n }\n if (existsSync(join(profileDir, WORKSPACE_FILES.BOOTSTRAP))) {\n return;\n }\n const state = readWorkspaceState(statePath);\n if (!state.bootstrapSeededAt) {\n return;\n }\n markSetupCompleted(statePath);\n}\n\n/**\n * Mark BOOTSTRAP.md as seeded (call when workspace-seed.ts writes the file).\n */\nexport function markBootstrapSeeded(statePath: string): void {\n const state = readWorkspaceState(statePath);\n if (state.bootstrapSeededAt) {\n return;\n }\n writeWorkspaceState(statePath, { bootstrapSeededAt: new Date().toISOString() });\n}\n\n/**\n * Mark bootstrap setup as completed.\n */\nexport function markSetupCompleted(statePath: string): void {\n writeWorkspaceState(statePath, { setupCompletedAt: new Date().toISOString() });\n}\n"],"mappings":";;;;;;;;;;;;;;;YAgB8F;AAI9F,MAAM,0BAA0B;AAchC,SAAS,oBAAoB,KAAyC;AACpE,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,CAAC,UAAU,OAAO,WAAW,SAC/B,QAAO;AAET,SAAO;GACL,SAAS;GACT,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAA;GAC/D,yBACE,OAAO,OAAO,4BAA4B,WAAW,OAAO,0BAA0B,KAAA;GACxF,mBACE,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB,KAAA;GAC5E,kBAAkB,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAAmB,KAAA;GAC3F;SACK;AACN,SAAO;;;AAIX,SAAS,mBAAmB,WAAwC;AAClE,KAAI;AAEF,SAAO,oBADK,aAAa,WAAW,QACN,CAAC,IAAI,EAAE,SAAS,yBAAyB;UAChE,KAAc;AAErB,MADc,IAA0B,SAC3B,SACX,OAAM;AAER,SAAO,EAAE,SAAS,yBAAyB;;;AAI/C,SAAS,oBAAoB,WAAmB,OAA2C;CACzF,MAAM,SAAS;EAAE,GAAG,mBAAmB,UAAU;EAAE,GAAG;EAAO,SAAS;EAAyB;AAC/F,WAAU,QAAQ,UAAU,EAAE,EAAE,WAAW,MAAM,CAAC;AAClD,eAAc,WAAW,GAAG,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC,KAAK,QAAQ;;;AAI3E,SAAgB,8CAA8C,sBAAsC;AAClG,QAAO,KAAK,sBAAsB,SAAS,UAAU,gBAAgB;;;AAIvE,SAAgB,+BAA+B,QAAgB,SAAyB;AACtF,QAAO,0BAA0B,QAAQ,QAAQ;;;;;;AAOnD,SAAgB,0BAA0B,WAA4B;CACpE,MAAM,QAAQ,mBAAmB,UAAU;AAC3C,QAAO,OAAO,MAAM,qBAAqB,YAAY,MAAM,iBAAiB,MAAM,CAAC,SAAS;;;;;;AAO9F,SAAgB,4BAA4B,WAA4B;CACtE,MAAM,QAAQ,mBAAmB,UAAU;AAC3C,KAAI,OAAO,MAAM,qBAAqB,YAAY,MAAM,iBAAiB,MAAM,CAAC,SAAS,EACvF,QAAO;AAET,QAAO,OAAO,MAAM,sBAAsB;;;;;;AAO5C,SAAgB,6BAA6B,WAAmB,YAA0B;AACxF,KAAI,0BAA0B,UAAU,CACtC;AAEF,KAAI,WAAW,KAAK,YAAY,gBAAgB,UAAU,CAAC,CACzD;AAGF,KAAI,CADU,mBAAmB,UACvB,CAAC,kBACT;AAEF,oBAAmB,UAAU;;;;;AAM/B,SAAgB,oBAAoB,WAAyB;AAE3D,KADc,mBAAmB,UACxB,CAAC,kBACR;AAEF,qBAAoB,WAAW,EAAE,oCAAmB,IAAI,MAAM,EAAC,aAAa,EAAE,CAAC;;;;;AAMjF,SAAgB,mBAAmB,WAAyB;AAC1D,qBAAoB,WAAW,EAAE,mCAAkB,IAAI,MAAM,EAAC,aAAa,EAAE,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { PiTranscriptManager, CURRENT_SESSION_VERSION } from './pi-transcript.js';
|
|
2
2
|
export type { SessionManager as PiTranscriptManagerType } from './pi-transcript.js';
|
|
3
3
|
export { installSessionToolResultGuard, guardSessionManager, getRawSessionAppendMessage, type GuardedPiTranscriptManager, type ToolResultGuardOptions, } from './session-tool-result-guard.js';
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
4
|
+
export { repairAssistantUsageInSessionManager } from './session-manager-init.js';
|
|
5
|
+
export { openSqliteHydratingSessionManager } from './sqlite-hydrating-session-manager.js';
|
|
6
6
|
export { acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs, } from './session-runner.js';
|
|
7
7
|
export { DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, resolveLiveToolResultMaxChars, truncateToolResultMessage, } from './tool-result-truncation.js';
|
|
8
8
|
export { runXopcEmbeddedTurn, abortEmbeddedRun, queueEmbeddedSteer } from './run-turn.js';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, resolveLiveToolResultMaxChars, truncateToolResultMessage } from "./tool-result-truncation.js";
|
|
2
2
|
import { getRawSessionAppendMessage, guardSessionManager, installSessionToolResultGuard } from "./session-tool-result-guard.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { repairAssistantUsageInSessionManager } from "./session-manager-init.js";
|
|
4
|
+
import { openSqliteHydratingSessionManager } from "./sqlite-hydrating-session-manager.js";
|
|
5
5
|
import { acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs } from "./session-runner.js";
|
|
6
6
|
import { abortEmbeddedRun, getEmbeddedRunBySessionKey, queueEmbeddedSteer, registerEmbeddedRun } from "./runs.js";
|
|
7
7
|
import { runXopcEmbeddedTurn } from "./run-turn.js";
|
|
8
8
|
import { runEmbeddedTurnForSession } from "./run-for-session.js";
|
|
9
9
|
import { CURRENT_SESSION_VERSION, PiTranscriptManager } from "./pi-transcript.js";
|
|
10
|
-
export { CURRENT_SESSION_VERSION, DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, PiTranscriptManager, abortEmbeddedRun, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedRunBySessionKey, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, getRawSessionAppendMessage, guardSessionManager, installSessionToolResultGuard, isEmbeddedSessionRunnerEnabled,
|
|
10
|
+
export { CURRENT_SESSION_VERSION, DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, PiTranscriptManager, abortEmbeddedRun, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedRunBySessionKey, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, getRawSessionAppendMessage, guardSessionManager, installSessionToolResultGuard, isEmbeddedSessionRunnerEnabled, openSqliteHydratingSessionManager, queueEmbeddedSteer, registerEmbeddedRun, repairAssistantUsageInSessionManager, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs, resolveLiveToolResultMaxChars, runEmbeddedTurnForSession, runXopcEmbeddedTurn, truncateToolResultMessage };
|
|
@@ -82,9 +82,6 @@ async function runXopcEmbeddedTurn(params) {
|
|
|
82
82
|
runner = await acquireEmbeddedSessionRunner({
|
|
83
83
|
sessionKey,
|
|
84
84
|
sessionId: transcript.sessionId,
|
|
85
|
-
sessionFile: transcript.sessionFile,
|
|
86
|
-
sessionsDir: transcript.sessionsDir,
|
|
87
|
-
hadSessionFile: transcript.hadSessionFile,
|
|
88
85
|
workspaceDir,
|
|
89
86
|
model: resolvedModel,
|
|
90
87
|
modelRef: params.modelRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-turn.js","names":[],"sources":["../../../../src/agent/embedded/run-turn.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ImageContent, Model, Api } from '@earendil-works/pi-ai';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { registerEmbeddedRun, unregisterEmbeddedRun } from './runs.js';\nimport { subscribeEmbeddedSessionEvents, lastAssistantPlainText } from './subscribe-session.js';\nimport type { RunXopcEmbeddedTurnParams, RunXopcEmbeddedTurnResult } from './types.js';\nimport {\n getAssistantTurnErrorMessage,\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n maybeRetryTurnAfterTransientLlmFailure,\n} from '../orchestration/llm-turn-retry.js';\nimport { runAgentTurnWithTimeout, resolveAgentTurnTimeoutMs } from '../orchestration/run-agent-turn-with-timeout.js';\nimport { detectToolLoops, type RecentToolCall } from '../orchestration/loop-guard.js';\nimport {\n acquireEmbeddedSessionRunner,\n resolveEmbeddedTranscriptInputs,\n} from './session-runner.js';\nimport { wrapStreamFnForXopcExtensions } from './xopc-stream-bridge.js';\n\nconst log = createLogger('EmbeddedRun');\nconst LOG_PREVIEW_MAX_CHARS = 300;\n\nfunction truncateForLog(value: string, maxChars = LOG_PREVIEW_MAX_CHARS): string {\n return value.length > maxChars ? `${value.slice(0, maxChars)}…` : value;\n}\n\nfunction extractTextFromContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n return content\n .filter((block): block is { type: string; text: string } => {\n return !!block && typeof block === 'object' && (block as { type?: string }).type === 'text';\n })\n .map((block) => block.text)\n .join('');\n}\n\nfunction extractRecentToolCalls(messages: readonly { role?: string; content?: unknown }[]): RecentToolCall[] {\n const calls: RecentToolCall[] = [];\n for (const message of messages) {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) continue;\n for (const block of message.content) {\n if (block && typeof block === 'object' && (block as { type?: string }).type === 'toolCall') {\n const toolCall = block as { name: string; arguments: unknown };\n calls.push({ name: toolCall.name, params: toolCall.arguments });\n }\n }\n }\n return calls;\n}\n\nfunction getLastUserMessagePreview(messages: readonly { role?: string; content?: unknown }[]): string | undefined {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex--) {\n const message = messages[messageIndex];\n if (message?.role !== 'user') {\n continue;\n }\n const text = extractTextFromContent(message.content).trim();\n return text ? truncateForLog(text) : undefined;\n }\n return undefined;\n}\n\nfunction requireEmbeddedModel(model: Model<Api> | undefined, modelRef: string): Model<Api> {\n if (!model?.id || !model?.provider) {\n throw new Error(`Invalid model for embedded run: ${modelRef}`);\n }\n return model;\n}\n\nfunction userMessageToPromptText(message: AgentMessage): string {\n const content = (message as { content?: unknown }).content;\n if (typeof content === 'string') {\n return content;\n }\n if (Array.isArray(content)) {\n return content\n .filter((block): block is { type: 'text'; text: string } => {\n return !!block && typeof block === 'object' && (block as { type?: string }).type === 'text';\n })\n .map((block) => block.text)\n .join('');\n }\n return '';\n}\n\nfunction userMessageToPromptImages(message: AgentMessage): ImageContent[] {\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n return [];\n }\n\n const images: ImageContent[] = [];\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n const typedBlock = block as { type?: string; data?: unknown; mimeType?: unknown };\n if (typedBlock.type !== 'image' || typeof typedBlock.data !== 'string' || typedBlock.data.length === 0) {\n continue;\n }\n images.push({\n type: 'image',\n data: typedBlock.data,\n mimeType: typeof typedBlock.mimeType === 'string' ? typedBlock.mimeType : 'image/png',\n });\n }\n return images;\n}\n\nexport async function runXopcEmbeddedTurn(params: RunXopcEmbeddedTurnParams): Promise<RunXopcEmbeddedTurnResult> {\n const {\n sessionKey,\n runId,\n userMessage,\n model,\n tools,\n systemPrompt,\n thinkingLevel,\n workspaceDir,\n sessionStore,\n onEvent,\n } = params;\n\n const timeoutMs = params.timeoutMs || resolveAgentTurnTimeoutMs();\n const resolvedModel = requireEmbeddedModel(model, params.modelRef);\n const transcript = await resolveEmbeddedTranscriptInputs(sessionStore, sessionKey);\n\n let runner: Awaited<ReturnType<typeof acquireEmbeddedSessionRunner>> | undefined;\n let unsubscribe: (() => void) | undefined;\n\n try {\n runner = await acquireEmbeddedSessionRunner({\n sessionKey,\n sessionId: transcript.sessionId,\n sessionFile: transcript.sessionFile,\n sessionsDir: transcript.sessionsDir,\n hadSessionFile: transcript.hadSessionFile,\n workspaceDir,\n model: resolvedModel,\n modelRef: params.modelRef,\n tools,\n systemPrompt,\n thinkingLevel: thinkingLevel ?? 'medium',\n });\n\n const { session, reused } = runner;\n\n const streamFnWithXopcExtensions = wrapStreamFnForXopcExtensions(session.agent.streamFn);\n const loggingStreamFn: typeof session.agent.streamFn = (streamModel, context, options) => {\n const recentToolCalls = extractRecentToolCalls(context.messages);\n const loopGuard = detectToolLoops(recentToolCalls);\n\n let effectiveContext = context;\n if (loopGuard.injection || loopGuard.hiddenTools.size > 0) {\n const messages = loopGuard.injection\n ? [...context.messages, { role: 'user' as const, content: loopGuard.injection, timestamp: Date.now() }]\n : context.messages;\n\n const contextTools = loopGuard.hiddenTools.size > 0 && context.tools\n ? context.tools.filter((t) => !loopGuard.hiddenTools.has(t.name))\n : context.tools;\n\n effectiveContext = { ...context, messages, tools: contextTools };\n }\n\n log.debug(\n {\n sessionKey,\n runId,\n reusedRunner: reused,\n modelRef: `${streamModel.provider}/${streamModel.id}`,\n systemPromptLength: effectiveContext.systemPrompt?.length ?? 0,\n messageCount: effectiveContext.messages.length,\n toolCount: effectiveContext.tools?.length ?? 0,\n lastUserMessagePreview: getLastUserMessagePreview(effectiveContext.messages),\n loopWarningInjected: !!loopGuard.injection,\n hiddenToolCount: loopGuard.hiddenTools.size,\n },\n 'Sending messages to AI',\n );\n return streamFnWithXopcExtensions(streamModel, effectiveContext, options);\n };\n session.agent.streamFn = loggingStreamFn;\n\n if (onEvent) {\n unsubscribe = subscribeEmbeddedSessionEvents(session, onEvent);\n }\n\n const handle = {\n sessionKey,\n sessionId: transcript.sessionId,\n runId,\n session,\n abort: async () => {\n await session.abort();\n },\n };\n registerEmbeddedRun(handle);\n\n const abortListener = () => {\n void session.abort();\n };\n if (params.abortSignal) {\n if (params.abortSignal.aborted) {\n await session.abort();\n return { ok: false, errorMessage: 'aborted' };\n }\n params.abortSignal.addEventListener('abort', abortListener, { once: true });\n }\n\n try {\n await runAgentTurnWithTimeout(\n session.agent,\n async () => {\n const text = userMessageToPromptText(userMessage);\n const images = [...(params.images ?? []), ...userMessageToPromptImages(userMessage)];\n await session.prompt(text, images.length > 0 ? { images } : undefined);\n await session.agent.waitForIdle();\n await maybeRetryTurnAfterTransientLlmFailure(session.agent, { sessionKey, log });\n },\n timeoutMs,\n );\n\n if (isAssistantTurnAborted(session.agent)) {\n return { ok: true, lastAssistantText: lastAssistantPlainText(session) };\n }\n if (isAssistantTurnFailed(session.agent)) {\n return {\n ok: false,\n errorMessage: getAssistantTurnErrorMessage(session.agent) ?? 'Assistant turn failed',\n lastAssistantText: lastAssistantPlainText(session),\n };\n }\n\n return { ok: true, lastAssistantText: lastAssistantPlainText(session) };\n } finally {\n params.abortSignal?.removeEventListener('abort', abortListener);\n unregisterEmbeddedRun(handle);\n }\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ err, sessionKey, runId }, `Embedded run failed: ${em}`);\n onEvent?.({ type: 'error', content: em });\n return { ok: false, errorMessage: em };\n } finally {\n unsubscribe?.();\n try {\n runner?.piSm.flushPendingToolResults?.();\n } catch {\n /* ignore */\n }\n runner?.release();\n }\n}\n\nexport { abortEmbeddedRun, queueEmbeddedSteer } from './runs.js';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-turn.js","names":[],"sources":["../../../../src/agent/embedded/run-turn.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ImageContent, Model, Api } from '@earendil-works/pi-ai';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { registerEmbeddedRun, unregisterEmbeddedRun } from './runs.js';\nimport { subscribeEmbeddedSessionEvents, lastAssistantPlainText } from './subscribe-session.js';\nimport type { RunXopcEmbeddedTurnParams, RunXopcEmbeddedTurnResult } from './types.js';\nimport {\n getAssistantTurnErrorMessage,\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n maybeRetryTurnAfterTransientLlmFailure,\n} from '../orchestration/llm-turn-retry.js';\nimport { runAgentTurnWithTimeout, resolveAgentTurnTimeoutMs } from '../orchestration/run-agent-turn-with-timeout.js';\nimport { detectToolLoops, type RecentToolCall } from '../orchestration/loop-guard.js';\nimport {\n acquireEmbeddedSessionRunner,\n resolveEmbeddedTranscriptInputs,\n} from './session-runner.js';\nimport { wrapStreamFnForXopcExtensions } from './xopc-stream-bridge.js';\n\nconst log = createLogger('EmbeddedRun');\nconst LOG_PREVIEW_MAX_CHARS = 300;\n\nfunction truncateForLog(value: string, maxChars = LOG_PREVIEW_MAX_CHARS): string {\n return value.length > maxChars ? `${value.slice(0, maxChars)}…` : value;\n}\n\nfunction extractTextFromContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n return content\n .filter((block): block is { type: string; text: string } => {\n return !!block && typeof block === 'object' && (block as { type?: string }).type === 'text';\n })\n .map((block) => block.text)\n .join('');\n}\n\nfunction extractRecentToolCalls(messages: readonly { role?: string; content?: unknown }[]): RecentToolCall[] {\n const calls: RecentToolCall[] = [];\n for (const message of messages) {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) continue;\n for (const block of message.content) {\n if (block && typeof block === 'object' && (block as { type?: string }).type === 'toolCall') {\n const toolCall = block as { name: string; arguments: unknown };\n calls.push({ name: toolCall.name, params: toolCall.arguments });\n }\n }\n }\n return calls;\n}\n\nfunction getLastUserMessagePreview(messages: readonly { role?: string; content?: unknown }[]): string | undefined {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex--) {\n const message = messages[messageIndex];\n if (message?.role !== 'user') {\n continue;\n }\n const text = extractTextFromContent(message.content).trim();\n return text ? truncateForLog(text) : undefined;\n }\n return undefined;\n}\n\nfunction requireEmbeddedModel(model: Model<Api> | undefined, modelRef: string): Model<Api> {\n if (!model?.id || !model?.provider) {\n throw new Error(`Invalid model for embedded run: ${modelRef}`);\n }\n return model;\n}\n\nfunction userMessageToPromptText(message: AgentMessage): string {\n const content = (message as { content?: unknown }).content;\n if (typeof content === 'string') {\n return content;\n }\n if (Array.isArray(content)) {\n return content\n .filter((block): block is { type: 'text'; text: string } => {\n return !!block && typeof block === 'object' && (block as { type?: string }).type === 'text';\n })\n .map((block) => block.text)\n .join('');\n }\n return '';\n}\n\nfunction userMessageToPromptImages(message: AgentMessage): ImageContent[] {\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n return [];\n }\n\n const images: ImageContent[] = [];\n for (const block of content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n const typedBlock = block as { type?: string; data?: unknown; mimeType?: unknown };\n if (typedBlock.type !== 'image' || typeof typedBlock.data !== 'string' || typedBlock.data.length === 0) {\n continue;\n }\n images.push({\n type: 'image',\n data: typedBlock.data,\n mimeType: typeof typedBlock.mimeType === 'string' ? typedBlock.mimeType : 'image/png',\n });\n }\n return images;\n}\n\nexport async function runXopcEmbeddedTurn(params: RunXopcEmbeddedTurnParams): Promise<RunXopcEmbeddedTurnResult> {\n const {\n sessionKey,\n runId,\n userMessage,\n model,\n tools,\n systemPrompt,\n thinkingLevel,\n workspaceDir,\n sessionStore,\n onEvent,\n } = params;\n\n const timeoutMs = params.timeoutMs || resolveAgentTurnTimeoutMs();\n const resolvedModel = requireEmbeddedModel(model, params.modelRef);\n const transcript = await resolveEmbeddedTranscriptInputs(sessionStore, sessionKey);\n\n let runner: Awaited<ReturnType<typeof acquireEmbeddedSessionRunner>> | undefined;\n let unsubscribe: (() => void) | undefined;\n\n try {\n runner = await acquireEmbeddedSessionRunner({\n sessionKey,\n sessionId: transcript.sessionId,\n workspaceDir,\n model: resolvedModel,\n modelRef: params.modelRef,\n tools,\n systemPrompt,\n thinkingLevel: thinkingLevel ?? 'medium',\n });\n\n const { session, reused } = runner;\n\n const streamFnWithXopcExtensions = wrapStreamFnForXopcExtensions(session.agent.streamFn);\n const loggingStreamFn: typeof session.agent.streamFn = (streamModel, context, options) => {\n const recentToolCalls = extractRecentToolCalls(context.messages);\n const loopGuard = detectToolLoops(recentToolCalls);\n\n let effectiveContext = context;\n if (loopGuard.injection || loopGuard.hiddenTools.size > 0) {\n const messages = loopGuard.injection\n ? [...context.messages, { role: 'user' as const, content: loopGuard.injection, timestamp: Date.now() }]\n : context.messages;\n\n const contextTools = loopGuard.hiddenTools.size > 0 && context.tools\n ? context.tools.filter((t) => !loopGuard.hiddenTools.has(t.name))\n : context.tools;\n\n effectiveContext = { ...context, messages, tools: contextTools };\n }\n\n log.debug(\n {\n sessionKey,\n runId,\n reusedRunner: reused,\n modelRef: `${streamModel.provider}/${streamModel.id}`,\n systemPromptLength: effectiveContext.systemPrompt?.length ?? 0,\n messageCount: effectiveContext.messages.length,\n toolCount: effectiveContext.tools?.length ?? 0,\n lastUserMessagePreview: getLastUserMessagePreview(effectiveContext.messages),\n loopWarningInjected: !!loopGuard.injection,\n hiddenToolCount: loopGuard.hiddenTools.size,\n },\n 'Sending messages to AI',\n );\n return streamFnWithXopcExtensions(streamModel, effectiveContext, options);\n };\n session.agent.streamFn = loggingStreamFn;\n\n if (onEvent) {\n unsubscribe = subscribeEmbeddedSessionEvents(session, onEvent);\n }\n\n const handle = {\n sessionKey,\n sessionId: transcript.sessionId,\n runId,\n session,\n abort: async () => {\n await session.abort();\n },\n };\n registerEmbeddedRun(handle);\n\n const abortListener = () => {\n void session.abort();\n };\n if (params.abortSignal) {\n if (params.abortSignal.aborted) {\n await session.abort();\n return { ok: false, errorMessage: 'aborted' };\n }\n params.abortSignal.addEventListener('abort', abortListener, { once: true });\n }\n\n try {\n await runAgentTurnWithTimeout(\n session.agent,\n async () => {\n const text = userMessageToPromptText(userMessage);\n const images = [...(params.images ?? []), ...userMessageToPromptImages(userMessage)];\n await session.prompt(text, images.length > 0 ? { images } : undefined);\n await session.agent.waitForIdle();\n await maybeRetryTurnAfterTransientLlmFailure(session.agent, { sessionKey, log });\n },\n timeoutMs,\n );\n\n if (isAssistantTurnAborted(session.agent)) {\n return { ok: true, lastAssistantText: lastAssistantPlainText(session) };\n }\n if (isAssistantTurnFailed(session.agent)) {\n return {\n ok: false,\n errorMessage: getAssistantTurnErrorMessage(session.agent) ?? 'Assistant turn failed',\n lastAssistantText: lastAssistantPlainText(session),\n };\n }\n\n return { ok: true, lastAssistantText: lastAssistantPlainText(session) };\n } finally {\n params.abortSignal?.removeEventListener('abort', abortListener);\n unregisterEmbeddedRun(handle);\n }\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ err, sessionKey, runId }, `Embedded run failed: ${em}`);\n onEvent?.({ type: 'error', content: em });\n return { ok: false, errorMessage: em };\n } finally {\n unsubscribe?.();\n try {\n runner?.piSm.flushPendingToolResults?.();\n } catch {\n /* ignore */\n }\n runner?.release();\n }\n}\n\nexport { abortEmbeddedRun, queueEmbeddedSteer } from './runs.js';\n"],"mappings":"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"}
|
|
@@ -2,20 +2,3 @@
|
|
|
2
2
|
* Legacy xopc transcripts may omit `usage` on assistant rows; pi AgentSession crashes on turn end.
|
|
3
3
|
*/
|
|
4
4
|
export declare function repairAssistantUsageInSessionManager(sessionManager: unknown): void;
|
|
5
|
-
/**
|
|
6
|
-
* pi-coding-agent SessionManager persistence quirk:
|
|
7
|
-
* - If the file exists but has no assistant message, SessionManager marks itself `flushed=true`
|
|
8
|
-
* and will never persist the initial user message.
|
|
9
|
-
* - If the file doesn't exist yet, SessionManager builds a new session in memory and flushes
|
|
10
|
-
* header+user+assistant once the first assistant arrives (good).
|
|
11
|
-
*
|
|
12
|
-
* This normalizes the file/session state so the first user prompt is persisted before the first
|
|
13
|
-
* assistant entry, even for pre-created session files.
|
|
14
|
-
*/
|
|
15
|
-
export declare function prepareSessionManagerForRun(params: {
|
|
16
|
-
sessionManager: unknown;
|
|
17
|
-
sessionFile: string;
|
|
18
|
-
hadSessionFile: boolean;
|
|
19
|
-
sessionId: string;
|
|
20
|
-
cwd: string;
|
|
21
|
-
}): Promise<void>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
1
|
//#region src/agent/embedded/session-manager-init.ts
|
|
3
2
|
/** pi-coding-agent auto-compaction calls `calculateContextTokens(usage)` without a null check. */
|
|
4
3
|
const EMPTY_ASSISTANT_USAGE = {
|
|
@@ -45,41 +44,7 @@ function repairAssistantUsageInSessionManager(sessionManager) {
|
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
|
-
/**
|
|
49
|
-
* pi-coding-agent SessionManager persistence quirk:
|
|
50
|
-
* - If the file exists but has no assistant message, SessionManager marks itself `flushed=true`
|
|
51
|
-
* and will never persist the initial user message.
|
|
52
|
-
* - If the file doesn't exist yet, SessionManager builds a new session in memory and flushes
|
|
53
|
-
* header+user+assistant once the first assistant arrives (good).
|
|
54
|
-
*
|
|
55
|
-
* This normalizes the file/session state so the first user prompt is persisted before the first
|
|
56
|
-
* assistant entry, even for pre-created session files.
|
|
57
|
-
*/
|
|
58
|
-
async function prepareSessionManagerForRun(params) {
|
|
59
|
-
const sm = params.sessionManager;
|
|
60
|
-
const header = sm.fileEntries.find((e) => e.type === "session");
|
|
61
|
-
const hasAssistant = sm.fileEntries.some((e) => e.type === "message" && e.message?.role === "assistant");
|
|
62
|
-
if (!params.hadSessionFile && header) {
|
|
63
|
-
header.id = params.sessionId;
|
|
64
|
-
header.cwd = params.cwd;
|
|
65
|
-
sm.sessionId = params.sessionId;
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
if (params.hadSessionFile && header && !hasAssistant) {
|
|
69
|
-
try {
|
|
70
|
-
await fs.unlink(params.sessionFile);
|
|
71
|
-
} catch (err) {
|
|
72
|
-
if (err.code !== "ENOENT") throw err;
|
|
73
|
-
}
|
|
74
|
-
sm.fileEntries = [header];
|
|
75
|
-
sm.byId?.clear?.();
|
|
76
|
-
sm.labelsById?.clear?.();
|
|
77
|
-
sm.leafId = null;
|
|
78
|
-
sm.flushed = false;
|
|
79
|
-
}
|
|
80
|
-
repairAssistantUsageInSessionManager(sm);
|
|
81
|
-
}
|
|
82
47
|
//#endregion
|
|
83
|
-
export {
|
|
48
|
+
export { repairAssistantUsageInSessionManager };
|
|
84
49
|
|
|
85
50
|
//# sourceMappingURL=session-manager-init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager-init.js","names":[],"sources":["../../../../src/agent/embedded/session-manager-init.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"session-manager-init.js","names":[],"sources":["../../../../src/agent/embedded/session-manager-init.ts"],"sourcesContent":["type SessionHeaderEntry = { type: \"session\"; id?: string; cwd?: string };\ntype SessionMessageEntry = {\n type: \"message\";\n message?: {\n role?: string;\n stopReason?: string;\n usage?: Record<string, unknown>;\n };\n};\n\n/** pi-coding-agent auto-compaction calls `calculateContextTokens(usage)` without a null check. */\nconst EMPTY_ASSISTANT_USAGE = {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\n/**\n * Legacy xopc transcripts may omit `usage` on assistant rows; pi AgentSession crashes on turn end.\n */\nexport function repairAssistantUsageInSessionManager(sessionManager: unknown): void {\n const sm = sessionManager as { fileEntries?: Array<SessionHeaderEntry | SessionMessageEntry | { type: string }> };\n if (!Array.isArray(sm.fileEntries)) {\n return;\n }\n for (const entry of sm.fileEntries) {\n if (entry.type !== \"message\") {\n continue;\n }\n const msg = (entry as SessionMessageEntry).message;\n if (msg?.role !== \"assistant\") {\n continue;\n }\n if (msg.stopReason === \"aborted\" || msg.stopReason === \"error\") {\n continue;\n }\n if (!msg.usage || typeof msg.usage !== \"object\") {\n msg.usage = { ...EMPTY_ASSISTANT_USAGE };\n } else if (msg.usage.totalTokens === undefined) {\n const u = msg.usage;\n const input = typeof u.input === \"number\" ? u.input : 0;\n const output = typeof u.output === \"number\" ? u.output : 0;\n const cacheRead = typeof u.cacheRead === \"number\" ? u.cacheRead : 0;\n const cacheWrite = typeof u.cacheWrite === \"number\" ? u.cacheWrite : 0;\n msg.usage = {\n ...EMPTY_ASSISTANT_USAGE,\n ...u,\n input,\n output,\n cacheRead,\n cacheWrite,\n totalTokens: input + output + cacheRead + cacheWrite,\n };\n }\n }\n}\n"],"mappings":";;AAWA,MAAM,wBAAwB;CAC5B,OAAO;CACP,QAAQ;CACR,WAAW;CACX,YAAY;CACZ,aAAa;CACb,MAAM;EAAE,OAAO;EAAG,QAAQ;EAAG,WAAW;EAAG,YAAY;EAAG,OAAO;EAAG;CACrE;;;;AAKD,SAAgB,qCAAqC,gBAA+B;CAClF,MAAM,KAAK;AACX,KAAI,CAAC,MAAM,QAAQ,GAAG,YAAY,CAChC;AAEF,MAAK,MAAM,SAAS,GAAG,aAAa;AAClC,MAAI,MAAM,SAAS,UACjB;EAEF,MAAM,MAAO,MAA8B;AAC3C,MAAI,KAAK,SAAS,YAChB;AAEF,MAAI,IAAI,eAAe,aAAa,IAAI,eAAe,QACrD;AAEF,MAAI,CAAC,IAAI,SAAS,OAAO,IAAI,UAAU,SACrC,KAAI,QAAQ,EAAE,GAAG,uBAAuB;WAC/B,IAAI,MAAM,gBAAgB,KAAA,GAAW;GAC9C,MAAM,IAAI,IAAI;GACd,MAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;GACtD,MAAM,SAAS,OAAO,EAAE,WAAW,WAAW,EAAE,SAAS;GACzD,MAAM,YAAY,OAAO,EAAE,cAAc,WAAW,EAAE,YAAY;GAClE,MAAM,aAAa,OAAO,EAAE,eAAe,WAAW,EAAE,aAAa;AACrE,OAAI,QAAQ;IACV,GAAG;IACH,GAAG;IACH;IACA;IACA;IACA;IACA,aAAa,QAAQ,SAAS,YAAY;IAC3C"}
|
|
@@ -3,9 +3,8 @@ import type { ThinkingLevel } from '@earendil-works/pi-agent-core';
|
|
|
3
3
|
import { type AgentSession } from '@earendil-works/pi-coding-agent';
|
|
4
4
|
import type { Model, Api } from '@earendil-works/pi-ai';
|
|
5
5
|
import { type GuardedPiTranscriptManager } from './session-tool-result-guard.js';
|
|
6
|
-
import { type SessionManagerCache } from './session-manager-cache.js';
|
|
7
6
|
export type EmbeddedRunnerFingerprintInput = {
|
|
8
|
-
|
|
7
|
+
sessionId: string;
|
|
9
8
|
workspaceDir: string;
|
|
10
9
|
modelRef: string;
|
|
11
10
|
toolNames: readonly string[];
|
|
@@ -16,9 +15,6 @@ export declare function buildEmbeddedRunnerFingerprint(input: EmbeddedRunnerFing
|
|
|
16
15
|
export type AcquireEmbeddedSessionRunnerParams = {
|
|
17
16
|
sessionKey: string;
|
|
18
17
|
sessionId: string;
|
|
19
|
-
sessionFile: string;
|
|
20
|
-
sessionsDir: string;
|
|
21
|
-
hadSessionFile: boolean;
|
|
22
18
|
workspaceDir: string;
|
|
23
19
|
model: Model<Api>;
|
|
24
20
|
modelRef: string;
|
|
@@ -42,8 +38,6 @@ export interface EmbeddedSessionRunnerPoolStats {
|
|
|
42
38
|
export declare function isEmbeddedSessionRunnerEnabled(): boolean;
|
|
43
39
|
export declare function getEmbeddedSessionRunnerIdleTtlMs(): number;
|
|
44
40
|
export interface EmbeddedSessionRunnerPoolOptions {
|
|
45
|
-
/** File-exists cache shared with prewarmSessionFile callers. */
|
|
46
|
-
sessionManagerCache?: SessionManagerCache;
|
|
47
41
|
/** Override for the env-driven enable flag (testing). */
|
|
48
42
|
isEnabled?: () => boolean;
|
|
49
43
|
/** Override for the env-driven idle TTL (testing). */
|
|
@@ -56,7 +50,6 @@ export interface EmbeddedSessionRunnerPoolOptions {
|
|
|
56
50
|
*/
|
|
57
51
|
export declare class EmbeddedSessionRunnerPool {
|
|
58
52
|
private readonly pool;
|
|
59
|
-
private readonly cache;
|
|
60
53
|
private readonly isEnabledFn;
|
|
61
54
|
private readonly getIdleTtlMsFn;
|
|
62
55
|
private stats;
|
|
@@ -77,10 +70,8 @@ export declare function resetEmbeddedSessionRunnerForTest(): void;
|
|
|
77
70
|
export declare function evictEmbeddedSessionRunner(sessionKey: string, reason?: string): void;
|
|
78
71
|
export declare function evictAllEmbeddedSessionRunners(reason?: string): void;
|
|
79
72
|
export declare function acquireEmbeddedSessionRunner(params: AcquireEmbeddedSessionRunnerParams): Promise<AcquiredEmbeddedSessionRunner>;
|
|
80
|
-
/** Resolve
|
|
73
|
+
/** Resolve session identity used by embedded runner acquire and turn execution. */
|
|
81
74
|
export declare function resolveEmbeddedTranscriptInputs(sessionStore: import('../../session/store.js').SessionStore, sessionKey: string): Promise<{
|
|
82
75
|
sessionId: string;
|
|
83
|
-
|
|
84
|
-
sessionsDir: string;
|
|
85
|
-
hadSessionFile: boolean;
|
|
76
|
+
sessionKey: string;
|
|
86
77
|
}>;
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { guardSessionManager } from "./session-tool-result-guard.js";
|
|
4
|
-
import {
|
|
5
|
-
import { defaultSessionManagerCache } from "./session-manager-cache.js";
|
|
4
|
+
import { openSqliteHydratingSessionManager } from "./sqlite-hydrating-session-manager.js";
|
|
6
5
|
import { applyXopcProviderApiKey, createEmbeddedAuthStorage } from "./xopc-auth-storage.js";
|
|
7
6
|
import { wrapStreamFnForXopcExtensions } from "./xopc-stream-bridge.js";
|
|
8
7
|
import { xopcToolsToDefinitions } from "./xopc-tools-bridge.js";
|
|
9
8
|
import { applySystemPromptOverrideToSession } from "./system-prompt-override.js";
|
|
10
|
-
import {
|
|
11
|
-
import { DefaultResourceLoader, SessionManager, SettingsManager, createAgentSession, getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
import { DefaultResourceLoader, SettingsManager, createAgentSession, getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
12
10
|
//#region src/agent/embedded/session-runner.ts
|
|
13
11
|
init_logger();
|
|
14
12
|
const log = createLogger("EmbeddedSessionRunner");
|
|
@@ -17,7 +15,7 @@ function buildEmbeddedRunnerFingerprint(input) {
|
|
|
17
15
|
const tools = [...input.toolNames].sort().join("\0");
|
|
18
16
|
const promptMarker = `${input.systemPrompt.length}:${input.systemPrompt.slice(0, 128)}`;
|
|
19
17
|
return [
|
|
20
|
-
input.
|
|
18
|
+
input.sessionId,
|
|
21
19
|
input.workspaceDir,
|
|
22
20
|
input.modelRef,
|
|
23
21
|
tools,
|
|
@@ -48,7 +46,6 @@ function createEmbeddedSettingsManager(cwd) {
|
|
|
48
46
|
*/
|
|
49
47
|
var EmbeddedSessionRunnerPool = class {
|
|
50
48
|
pool = /* @__PURE__ */ new Map();
|
|
51
|
-
cache;
|
|
52
49
|
isEnabledFn;
|
|
53
50
|
getIdleTtlMsFn;
|
|
54
51
|
stats = {
|
|
@@ -58,7 +55,6 @@ var EmbeddedSessionRunnerPool = class {
|
|
|
58
55
|
evictions: 0
|
|
59
56
|
};
|
|
60
57
|
constructor(opts = {}) {
|
|
61
|
-
this.cache = opts.sessionManagerCache ?? defaultSessionManagerCache;
|
|
62
58
|
this.isEnabledFn = opts.isEnabled ?? isEmbeddedSessionRunnerEnabled;
|
|
63
59
|
this.getIdleTtlMsFn = opts.getIdleTtlMs ?? getEmbeddedSessionRunnerIdleTtlMs;
|
|
64
60
|
}
|
|
@@ -89,7 +85,7 @@ var EmbeddedSessionRunnerPool = class {
|
|
|
89
85
|
async acquire(params) {
|
|
90
86
|
this.stats.acquires += 1;
|
|
91
87
|
const fingerprint = buildEmbeddedRunnerFingerprint({
|
|
92
|
-
|
|
88
|
+
sessionId: params.sessionId,
|
|
93
89
|
workspaceDir: params.workspaceDir,
|
|
94
90
|
modelRef: params.modelRef,
|
|
95
91
|
toolNames: params.tools.map((t) => t.name),
|
|
@@ -157,19 +153,15 @@ var EmbeddedSessionRunnerPool = class {
|
|
|
157
153
|
}, "Embedded session runner evicted");
|
|
158
154
|
}
|
|
159
155
|
async createPooledRunner(params) {
|
|
160
|
-
const { sessionKey, sessionId,
|
|
161
|
-
await this.cache.prewarm(sessionFile);
|
|
156
|
+
const { sessionKey, sessionId, workspaceDir, model, thinkingLevel, tools, systemPrompt } = params;
|
|
162
157
|
const settingsManager = createEmbeddedSettingsManager(workspaceDir);
|
|
163
|
-
const piSm = guardSessionManager(
|
|
158
|
+
const piSm = guardSessionManager(openSqliteHydratingSessionManager({
|
|
164
159
|
sessionKey,
|
|
165
|
-
contextWindowTokens: model.contextWindow ?? 128e3
|
|
166
|
-
});
|
|
167
|
-
await prepareSessionManagerForRun({
|
|
168
|
-
sessionManager: piSm,
|
|
169
|
-
sessionFile,
|
|
170
|
-
hadSessionFile,
|
|
171
160
|
sessionId,
|
|
172
161
|
cwd: workspaceDir
|
|
162
|
+
}), {
|
|
163
|
+
sessionKey,
|
|
164
|
+
contextWindowTokens: model.contextWindow ?? 128e3
|
|
173
165
|
});
|
|
174
166
|
const toolDefs = xopcToolsToDefinitions(tools);
|
|
175
167
|
const toolNames = tools.map((t) => t.name);
|
|
@@ -200,7 +192,7 @@ var EmbeddedSessionRunnerPool = class {
|
|
|
200
192
|
return {
|
|
201
193
|
sessionKey,
|
|
202
194
|
fingerprint: buildEmbeddedRunnerFingerprint({
|
|
203
|
-
|
|
195
|
+
sessionId,
|
|
204
196
|
workspaceDir,
|
|
205
197
|
modelRef: params.modelRef,
|
|
206
198
|
toolNames,
|
|
@@ -232,15 +224,9 @@ function evictAllEmbeddedSessionRunners(reason = "dispose_all") {
|
|
|
232
224
|
function acquireEmbeddedSessionRunner(params) {
|
|
233
225
|
return defaultEmbeddedSessionRunnerPool.acquire(params);
|
|
234
226
|
}
|
|
235
|
-
/** Resolve
|
|
227
|
+
/** Resolve session identity used by embedded runner acquire and turn execution. */
|
|
236
228
|
async function resolveEmbeddedTranscriptInputs(sessionStore, sessionKey) {
|
|
237
|
-
|
|
238
|
-
return {
|
|
239
|
-
sessionId,
|
|
240
|
-
sessionFile,
|
|
241
|
-
sessionsDir,
|
|
242
|
-
hadSessionFile: existsSync(sessionFile)
|
|
243
|
-
};
|
|
229
|
+
return sessionStore.resolveTranscriptPath(sessionKey);
|
|
244
230
|
}
|
|
245
231
|
//#endregion
|
|
246
232
|
export { EmbeddedSessionRunnerPool, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, defaultEmbeddedSessionRunnerPool, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs };
|