@xopcai/xopc 0.0.95 → 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-CKe2LMnz.js → agents-DmIuSaOE.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-Mi9mMIZ1.js → apps-page-DFcHBxLw.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BrdyC101.js → channels-settings-DDUf55C5.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-D55Bu0nn.js → channels-status-swr-BxF-_nzD.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-CPpx2l-E.js → cron-api-DylQtnb_.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-Bx2jB0YN.js → cron-page-BO0d9Pf-.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-D_AiG_Kg.js → dist-BskF0qDS.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-6ieHsxRE.js → extension-debug-page-BcZdTdjJ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B8nywHRO.js → extension-page-D2iuDa1D.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DrskdEIV.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--9ooY8Xl.js → field-primitives-2PekrGZF.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DUZ_W1w-.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-Dj9FuxCm.js → index-Db9fd_X4.js} +74 -74
- package/dist/gateway/static/root/assets/{logs-page-CaXqhpKf.js → logs-page-B3I1a26m.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-DYzym2B0.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-B-vSi2dR.js → note-time-CjUGtqKr.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-BkhWdGiT.js → notes-page-BB8-I0Of.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-53YFokoe.js → sessions-page-BcH-1K9i.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-BaZmaklx.js → settings-advanced-gate-Czn8nnjN.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-DIJPKpTR.js → settings-form-section-ZZWDwgVe.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-Dvb230FF.js → settings-page-BX8c_zrN.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-CRyjTAG6.js → share-preview-page-Ch3_6Qah.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-C5ZJbfAe.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-lMYoWhqo.js → utils-uTYKh54l.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-Dda2pcUU.js → voice-api-key-field-BIAYHRs-.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-KIladUrU.js → workflow-page.utils-BbWhqD36.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-BTis4Z7Y.js → workflows-page-D4RIF7E1.js} +1 -1
- 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/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/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 +2 -2
- package/dist/gateway/static/root/assets/index-Bj_l8QDp.css +0 -1
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-scope.js","names":[],"sources":["../../../src/agent/agent-scope.ts"],"sourcesContent":["/**\n * Agent path and list resolution (config is the single source of truth).\n */\n\nimport fs from 'node:fs';\nimport { basename, join, relative, resolve, isAbsolute } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport { resolveDefaultAgentWorkspaceDir } from '../config/workspace-defaults.js';\n\nexport const DEFAULT_AGENT_ID = 'main';\n\nconst VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\n/** Normalized id segment safe for directory names under `agents/<id>/`. */\nexport const STRICT_AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;\n\nconst WINDOWS_RESERVED_AGENT_IDS = new Set<string>([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nfunction normalizeLowercaseStringOrEmpty(s: string): string {\n return s.trim().toLowerCase();\n}\n\n/** Path-safe agent id. */\nexport function normalizeAgentId(value: string | undefined | null): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return DEFAULT_AGENT_ID;\n }\n const normalized = normalizeLowercaseStringOrEmpty(trimmed);\n if (VALID_ID_RE.test(trimmed)) {\n return normalized;\n }\n return (\n normalized\n .replace(INVALID_CHARS_RE, '-')\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '')\n .slice(0, 64) || DEFAULT_AGENT_ID\n );\n}\n\n/**\n * Validate agent id for new agents (folder-safe path segment).\n * When `explicitId` is set, it must already match {@link STRICT_AGENT_ID_RE} (case-insensitive input, stored lowercase).\n * When omitted, id is derived from `displayNameForDerivation` via {@link normalizeAgentId}.\n */\nexport function validateAgentIdForNewAgent(\n explicitId: string | undefined | null,\n displayNameForDerivation: string,\n): { ok: true; agentId: string } | { ok: false; error: string } {\n const explicit = explicitId?.trim();\n if (explicit) {\n const id = explicit.toLowerCase();\n if (!STRICT_AGENT_ID_RE.test(id)) {\n return {\n ok: false,\n error:\n 'Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.',\n };\n }\n if (id === DEFAULT_AGENT_ID) {\n return { ok: false, error: `\"${DEFAULT_AGENT_ID}\" is reserved` };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(id)) {\n return { ok: false, error: `Agent id \"${id}\" is reserved (Windows device name).` };\n }\n return { ok: true, agentId: id };\n }\n\n const agentId = normalizeAgentId(displayNameForDerivation.trim());\n if (agentId === DEFAULT_AGENT_ID) {\n return {\n ok: false,\n error:\n 'Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(agentId)) {\n return {\n ok: false,\n error: `That display name resolves to \"${agentId}\", which is reserved. Use a different display name or set an explicit Agent id.`,\n };\n }\n if (!STRICT_AGENT_ID_RE.test(agentId)) {\n return {\n ok: false,\n error:\n 'Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n return { ok: true, agentId };\n}\n\n/** Expand `~` and resolve to an absolute path. */\nexport function resolveUserPath(raw: string): string {\n const expanded = expandWorkspacePathString(raw.trim());\n return resolve(expanded);\n}\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport function listAgentEntries(cfg: Config): AgentEntry[] {\n const list = cfg.agents?.list;\n if (!Array.isArray(list)) {\n return [];\n }\n return list.filter((e): e is AgentEntry => Boolean(e && typeof e === 'object'));\n}\n\nexport function resolveDefaultAgentId(cfg: Config): string {\n const explicit = cfg.agents?.default?.trim();\n if (explicit) {\n return normalizeAgentId(explicit);\n }\n const agents = listAgentEntries(cfg);\n if (agents.length === 0) {\n return DEFAULT_AGENT_ID;\n }\n const defaults = agents.filter((a) => a?.default === true);\n const chosen = (defaults[0] ?? agents[0])?.id?.trim();\n return chosen ? normalizeAgentId(chosen) : DEFAULT_AGENT_ID;\n}\n\nfunction resolveAgentEntry(cfg: Config, agentId: string): AgentEntry | undefined {\n const id = normalizeAgentId(agentId);\n return listAgentEntries(cfg).find((e) => normalizeAgentId(e.id) === id);\n}\n\n/**\n * Markdown workspace root for an agent.\n */\nexport function resolveAgentWorkspaceDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.workspace?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const defaultAgentId = resolveDefaultAgentId(cfg);\n const fallback = cfg.agents?.defaults?.workspace?.trim();\n if (fallback) {\n return join(resolveUserPath(fallback), id);\n }\n if (id === defaultAgentId) {\n return resolveDefaultAgentWorkspaceDir(process.env);\n }\n const stateDir = resolveStateDir(process.env);\n return join(stateDir, `workspace-${id}`);\n}\n\n/**\n * Internal agent state dir: credentials, `agent.json`, pid, inbox (`…/agent/`).\n */\nexport function resolveAgentDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.agentDir?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const root = resolveStateDir(process.env);\n return join(root, 'agents', id, 'agent');\n}\n\n/** Parent of `sessions/` and `agent/`: `<stateDir>/agents/<id>/`. */\nexport function resolveAgentHomeDir(cfg: Config, agentId: string): string {\n return join(resolveStateDir(process.env), 'agents', normalizeAgentId(agentId));\n}\n\n/** Profile Markdown + gateway avatar files: `<stateDir>/agents/<id>/profile/`. */\nexport function resolveAgentProfileDir(cfg: Config, agentId: string): string {\n return join(resolveAgentHomeDir(cfg, agentId), 'profile');\n}\n\n/** Resolved path for a single profile Markdown basename (e.g. `SOUL.md`). */\nexport function resolveAgentProfileMarkdownPath(cfg: Config, agentId: string, filename: string): string {\n const base = basename(filename.trim().replace(/\\\\/g, '/'));\n return join(resolveAgentProfileDir(cfg, agentId), base);\n}\n\nexport function resolveSessionsDir(cfg: Config, agentId: string): string {\n return join(resolveAgentHomeDir(cfg, agentId), 'sessions');\n}\n\nfunction normalizePathForComparison(input: string): string {\n const resolved = resolve(resolveUserPath(input));\n let normalized = resolved;\n try {\n normalized = fs.realpathSync.native(resolved);\n } catch {\n // Keep lexical path for non-existent directories.\n }\n if (process.platform === 'win32') {\n return normalized.toLowerCase();\n }\n return normalized;\n}\n\nfunction isPathWithinRoot(candidatePath: string, rootPath: string): boolean {\n const rel = relative(rootPath, candidatePath);\n return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));\n}\n\n/** Agent ids whose workspace root contains `workspacePath` (longest match first). */\nexport function resolveAgentIdsByWorkspacePath(cfg: Config, workspacePath: string): string[] {\n const normalizedWorkspacePath = normalizePathForComparison(workspacePath);\n const entries = listAgentEntries(cfg);\n const matches: Array<{ id: string; workspaceDir: string; order: number }> = [];\n\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index]!;\n const id = normalizeAgentId(entry.id);\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, id));\n if (!isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n continue;\n }\n matches.push({ id, workspaceDir, order: index });\n }\n\n const defaultId = resolveDefaultAgentId(cfg);\n if (!entries.some((e) => normalizeAgentId(e.id) === defaultId)) {\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, defaultId));\n if (isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n matches.push({ id: defaultId, workspaceDir, order: entries.length });\n }\n }\n\n matches.sort((left, right) => {\n const workspaceLengthDelta = right.workspaceDir.length - left.workspaceDir.length;\n if (workspaceLengthDelta !== 0) {\n return workspaceLengthDelta;\n }\n return left.order - right.order;\n });\n\n return matches.map((entry) => entry.id);\n}\n\n/** Best-matching agent id for cwd, or `undefined` when no workspace contains the path. */\nexport function resolveAgentIdByWorkspacePath(\n cfg: Config,\n workspacePath: string,\n): string | undefined {\n return resolveAgentIdsByWorkspacePath(cfg, workspacePath)[0];\n}\n\n/**\n * Find the agent id whose resolved markdown workspace matches `resolvedWorkspacePath`.\n * Falls back to {@link resolveDefaultAgentId} when no list entry matches.\n */\nexport function resolveAgentIdForWorkspacePath(cfg: Config, resolvedWorkspacePath: string): string {\n return (\n resolveAgentIdByWorkspacePath(cfg, resolvedWorkspacePath) ??\n resolveDefaultAgentId(cfg)\n );\n}\n\nexport function getDefaultWorkspacePath(cfg: Config): string {\n return resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-scope.js","names":[],"sources":["../../../src/agent/agent-scope.ts"],"sourcesContent":["/**\n * Agent path and list resolution (config is the single source of truth).\n */\n\nimport fs from 'node:fs';\nimport { basename, join, relative, resolve, isAbsolute } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport { resolveDefaultAgentWorkspaceDir } from '../config/workspace-defaults.js';\n\nexport const DEFAULT_AGENT_ID = 'main';\n\nconst VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\n/** Normalized id segment safe for directory names under `agents/<id>/`. */\nexport const STRICT_AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;\n\nconst WINDOWS_RESERVED_AGENT_IDS = new Set<string>([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nfunction normalizeLowercaseStringOrEmpty(s: string): string {\n return s.trim().toLowerCase();\n}\n\n/** Path-safe agent id. */\nexport function normalizeAgentId(value: string | undefined | null): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return DEFAULT_AGENT_ID;\n }\n const normalized = normalizeLowercaseStringOrEmpty(trimmed);\n if (VALID_ID_RE.test(trimmed)) {\n return normalized;\n }\n return (\n normalized\n .replace(INVALID_CHARS_RE, '-')\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '')\n .slice(0, 64) || DEFAULT_AGENT_ID\n );\n}\n\n/**\n * Validate agent id for new agents (folder-safe path segment).\n * When `explicitId` is set, it must already match {@link STRICT_AGENT_ID_RE} (case-insensitive input, stored lowercase).\n * When omitted, id is derived from `displayNameForDerivation` via {@link normalizeAgentId}.\n */\nexport function validateAgentIdForNewAgent(\n explicitId: string | undefined | null,\n displayNameForDerivation: string,\n): { ok: true; agentId: string } | { ok: false; error: string } {\n const explicit = explicitId?.trim();\n if (explicit) {\n const id = explicit.toLowerCase();\n if (!STRICT_AGENT_ID_RE.test(id)) {\n return {\n ok: false,\n error:\n 'Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.',\n };\n }\n if (id === DEFAULT_AGENT_ID) {\n return { ok: false, error: `\"${DEFAULT_AGENT_ID}\" is reserved` };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(id)) {\n return { ok: false, error: `Agent id \"${id}\" is reserved (Windows device name).` };\n }\n return { ok: true, agentId: id };\n }\n\n const agentId = normalizeAgentId(displayNameForDerivation.trim());\n if (agentId === DEFAULT_AGENT_ID) {\n return {\n ok: false,\n error:\n 'Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(agentId)) {\n return {\n ok: false,\n error: `That display name resolves to \"${agentId}\", which is reserved. Use a different display name or set an explicit Agent id.`,\n };\n }\n if (!STRICT_AGENT_ID_RE.test(agentId)) {\n return {\n ok: false,\n error:\n 'Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n return { ok: true, agentId };\n}\n\n/** Expand `~` and resolve to an absolute path. */\nexport function resolveUserPath(raw: string): string {\n const expanded = expandWorkspacePathString(raw.trim());\n return resolve(expanded);\n}\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport function listAgentEntries(cfg: Config): AgentEntry[] {\n const list = cfg.agents?.list;\n if (!Array.isArray(list)) {\n return [];\n }\n return list.filter((e): e is AgentEntry => Boolean(e && typeof e === 'object'));\n}\n\nexport function resolveDefaultAgentId(cfg: Config): string {\n const explicit = cfg.agents?.default?.trim();\n if (explicit) {\n return normalizeAgentId(explicit);\n }\n const agents = listAgentEntries(cfg);\n if (agents.length === 0) {\n return DEFAULT_AGENT_ID;\n }\n const defaults = agents.filter((a) => a?.default === true);\n const chosen = (defaults[0] ?? agents[0])?.id?.trim();\n return chosen ? normalizeAgentId(chosen) : DEFAULT_AGENT_ID;\n}\n\nfunction resolveAgentEntry(cfg: Config, agentId: string): AgentEntry | undefined {\n const id = normalizeAgentId(agentId);\n return listAgentEntries(cfg).find((e) => normalizeAgentId(e.id) === id);\n}\n\n/**\n * Markdown workspace root for an agent.\n */\nexport function resolveAgentWorkspaceDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.workspace?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const defaultAgentId = resolveDefaultAgentId(cfg);\n const fallback = cfg.agents?.defaults?.workspace?.trim();\n if (fallback) {\n return join(resolveUserPath(fallback), id);\n }\n if (id === defaultAgentId) {\n return resolveDefaultAgentWorkspaceDir(process.env);\n }\n const stateDir = resolveStateDir(process.env);\n return join(stateDir, `workspace-${id}`);\n}\n\n/**\n * Internal agent state dir: credentials, `agent.json`, pid, inbox (`…/agent/`).\n */\nexport function resolveAgentDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.agentDir?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const root = resolveStateDir(process.env);\n return join(root, 'agents', id, 'agent');\n}\n\n/** Parent of `sessions/` and `agent/`: `<stateDir>/agents/<id>/`. */\nexport function resolveAgentHomeDir(cfg: Config, agentId: string): string {\n return join(resolveStateDir(process.env), 'agents', normalizeAgentId(agentId));\n}\n\n/** Profile Markdown + gateway avatar files: `<stateDir>/agents/<id>/profile/`. */\nexport function resolveAgentProfileDir(cfg: Config, agentId: string): string {\n return join(resolveAgentHomeDir(cfg, agentId), 'profile');\n}\n\n/** Resolved path for a single profile Markdown basename (e.g. `SOUL.md`). */\nexport function resolveAgentProfileMarkdownPath(cfg: Config, agentId: string, filename: string): string {\n const base = basename(filename.trim().replace(/\\\\/g, '/'));\n return join(resolveAgentProfileDir(cfg, agentId), base);\n}\n\nfunction normalizePathForComparison(input: string): string {\n const resolved = resolve(resolveUserPath(input));\n let normalized = resolved;\n try {\n normalized = fs.realpathSync.native(resolved);\n } catch {\n // Keep lexical path for non-existent directories.\n }\n if (process.platform === 'win32') {\n return normalized.toLowerCase();\n }\n return normalized;\n}\n\nfunction isPathWithinRoot(candidatePath: string, rootPath: string): boolean {\n const rel = relative(rootPath, candidatePath);\n return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));\n}\n\n/** Agent ids whose workspace root contains `workspacePath` (longest match first). */\nexport function resolveAgentIdsByWorkspacePath(cfg: Config, workspacePath: string): string[] {\n const normalizedWorkspacePath = normalizePathForComparison(workspacePath);\n const entries = listAgentEntries(cfg);\n const matches: Array<{ id: string; workspaceDir: string; order: number }> = [];\n\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index]!;\n const id = normalizeAgentId(entry.id);\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, id));\n if (!isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n continue;\n }\n matches.push({ id, workspaceDir, order: index });\n }\n\n const defaultId = resolveDefaultAgentId(cfg);\n if (!entries.some((e) => normalizeAgentId(e.id) === defaultId)) {\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, defaultId));\n if (isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n matches.push({ id: defaultId, workspaceDir, order: entries.length });\n }\n }\n\n matches.sort((left, right) => {\n const workspaceLengthDelta = right.workspaceDir.length - left.workspaceDir.length;\n if (workspaceLengthDelta !== 0) {\n return workspaceLengthDelta;\n }\n return left.order - right.order;\n });\n\n return matches.map((entry) => entry.id);\n}\n\n/** Best-matching agent id for cwd, or `undefined` when no workspace contains the path. */\nexport function resolveAgentIdByWorkspacePath(\n cfg: Config,\n workspacePath: string,\n): string | undefined {\n return resolveAgentIdsByWorkspacePath(cfg, workspacePath)[0];\n}\n\n/**\n * Find the agent id whose resolved markdown workspace matches `resolvedWorkspacePath`.\n * Falls back to {@link resolveDefaultAgentId} when no list entry matches.\n */\nexport function resolveAgentIdForWorkspacePath(cfg: Config, resolvedWorkspacePath: string): string {\n return (\n resolveAgentIdByWorkspacePath(cfg, resolvedWorkspacePath) ??\n resolveDefaultAgentId(cfg)\n );\n}\n\nexport function getDefaultWorkspacePath(cfg: Config): string {\n return resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg));\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { WorkspaceBootstrapFile } from './types.js';
|
|
2
|
+
export declare function wasBootstrapContextInjected(sessionKey: string): boolean;
|
|
3
|
+
export declare function markBootstrapContextInjected(sessionKey: string): void;
|
|
2
4
|
export declare function getOrLoadBootstrapFiles(params: {
|
|
3
5
|
profileDir: string;
|
|
6
|
+
workspaceStatePath: string;
|
|
4
7
|
sessionKey: string;
|
|
5
8
|
}): Promise<WorkspaceBootstrapFile[]>;
|
|
6
9
|
export declare function clearBootstrapSnapshot(sessionKey: string): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { loadProfileBootstrapFiles } from "./load-bootstrap-files.js";
|
|
2
2
|
//#region src/agent/bootstrap/bootstrap-cache.ts
|
|
3
3
|
const cache = /* @__PURE__ */ new Map();
|
|
4
|
+
const bootstrapContextInjected = /* @__PURE__ */ new Set();
|
|
4
5
|
function bootstrapFilesEqual(previous, next) {
|
|
5
6
|
if (previous.length !== next.length) return false;
|
|
6
7
|
return previous.every((file, index) => {
|
|
@@ -8,23 +9,32 @@ function bootstrapFilesEqual(previous, next) {
|
|
|
8
9
|
return updated !== void 0 && file.name === updated.name && file.path === updated.path && file.content === updated.content && file.missing === updated.missing;
|
|
9
10
|
});
|
|
10
11
|
}
|
|
12
|
+
function wasBootstrapContextInjected(sessionKey) {
|
|
13
|
+
return bootstrapContextInjected.has(sessionKey);
|
|
14
|
+
}
|
|
15
|
+
function markBootstrapContextInjected(sessionKey) {
|
|
16
|
+
bootstrapContextInjected.add(sessionKey);
|
|
17
|
+
}
|
|
11
18
|
async function getOrLoadBootstrapFiles(params) {
|
|
12
19
|
const existing = cache.get(params.sessionKey);
|
|
13
|
-
const files = loadProfileBootstrapFiles(params.profileDir);
|
|
14
|
-
if (existing && existing.profileDir === params.profileDir && bootstrapFilesEqual(existing.files, files)) return existing.files;
|
|
20
|
+
const files = loadProfileBootstrapFiles(params.profileDir, params.workspaceStatePath);
|
|
21
|
+
if (existing && existing.profileDir === params.profileDir && existing.workspaceStatePath === params.workspaceStatePath && bootstrapFilesEqual(existing.files, files)) return existing.files;
|
|
15
22
|
cache.set(params.sessionKey, {
|
|
16
23
|
profileDir: params.profileDir,
|
|
24
|
+
workspaceStatePath: params.workspaceStatePath,
|
|
17
25
|
files
|
|
18
26
|
});
|
|
19
27
|
return files;
|
|
20
28
|
}
|
|
21
29
|
function clearBootstrapSnapshot(sessionKey) {
|
|
22
30
|
cache.delete(sessionKey);
|
|
31
|
+
bootstrapContextInjected.delete(sessionKey);
|
|
23
32
|
}
|
|
24
33
|
function clearAllBootstrapSnapshots() {
|
|
25
34
|
cache.clear();
|
|
35
|
+
bootstrapContextInjected.clear();
|
|
26
36
|
}
|
|
27
37
|
//#endregion
|
|
28
|
-
export { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles };
|
|
38
|
+
export { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles, markBootstrapContextInjected, wasBootstrapContextInjected };
|
|
29
39
|
|
|
30
40
|
//# sourceMappingURL=bootstrap-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-cache.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-cache.ts"],"sourcesContent":["import { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { WorkspaceBootstrapFile } from './types.js';\n\ntype BootstrapSnapshot = {\n profileDir: string;\n files: WorkspaceBootstrapFile[];\n};\n\nconst cache = new Map<string, BootstrapSnapshot>();\n\nfunction bootstrapFilesEqual(\n previous: WorkspaceBootstrapFile[],\n next: WorkspaceBootstrapFile[],\n): boolean {\n if (previous.length !== next.length) {\n return false;\n }\n return previous.every((file, index) => {\n const updated = next[index];\n return (\n updated !== undefined &&\n file.name === updated.name &&\n file.path === updated.path &&\n file.content === updated.content &&\n file.missing === updated.missing\n );\n });\n}\n\nexport async function getOrLoadBootstrapFiles(params: {\n profileDir: string;\n sessionKey: string;\n}): Promise<WorkspaceBootstrapFile[]> {\n const existing = cache.get(params.sessionKey);\n const files = loadProfileBootstrapFiles(params.profileDir);\n if (\n existing &&\n existing.profileDir === params.profileDir &&\n bootstrapFilesEqual(existing.files, files)\n ) {\n return existing.files;\n }\n cache.set(params.sessionKey, {
|
|
1
|
+
{"version":3,"file":"bootstrap-cache.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-cache.ts"],"sourcesContent":["import { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { WorkspaceBootstrapFile } from './types.js';\n\ntype BootstrapSnapshot = {\n profileDir: string;\n workspaceStatePath: string;\n files: WorkspaceBootstrapFile[];\n};\n\nconst cache = new Map<string, BootstrapSnapshot>();\nconst bootstrapContextInjected = new Set<string>();\n\nfunction bootstrapFilesEqual(\n previous: WorkspaceBootstrapFile[],\n next: WorkspaceBootstrapFile[],\n): boolean {\n if (previous.length !== next.length) {\n return false;\n }\n return previous.every((file, index) => {\n const updated = next[index];\n return (\n updated !== undefined &&\n file.name === updated.name &&\n file.path === updated.path &&\n file.content === updated.content &&\n file.missing === updated.missing\n );\n });\n}\n\nexport function wasBootstrapContextInjected(sessionKey: string): boolean {\n return bootstrapContextInjected.has(sessionKey);\n}\n\nexport function markBootstrapContextInjected(sessionKey: string): void {\n bootstrapContextInjected.add(sessionKey);\n}\n\nexport async function getOrLoadBootstrapFiles(params: {\n profileDir: string;\n workspaceStatePath: string;\n sessionKey: string;\n}): Promise<WorkspaceBootstrapFile[]> {\n const existing = cache.get(params.sessionKey);\n const files = loadProfileBootstrapFiles(params.profileDir, params.workspaceStatePath);\n if (\n existing &&\n existing.profileDir === params.profileDir &&\n existing.workspaceStatePath === params.workspaceStatePath &&\n bootstrapFilesEqual(existing.files, files)\n ) {\n return existing.files;\n }\n cache.set(params.sessionKey, {\n profileDir: params.profileDir,\n workspaceStatePath: params.workspaceStatePath,\n files,\n });\n return files;\n}\n\nexport function clearBootstrapSnapshot(sessionKey: string): void {\n cache.delete(sessionKey);\n bootstrapContextInjected.delete(sessionKey);\n}\n\nexport function clearAllBootstrapSnapshots(): void {\n cache.clear();\n bootstrapContextInjected.clear();\n}\n"],"mappings":";;AASA,MAAM,wBAAQ,IAAI,KAAgC;AAClD,MAAM,2CAA2B,IAAI,KAAa;AAElD,SAAS,oBACP,UACA,MACS;AACT,KAAI,SAAS,WAAW,KAAK,OAC3B,QAAO;AAET,QAAO,SAAS,OAAO,MAAM,UAAU;EACrC,MAAM,UAAU,KAAK;AACrB,SACE,YAAY,KAAA,KACZ,KAAK,SAAS,QAAQ,QACtB,KAAK,SAAS,QAAQ,QACtB,KAAK,YAAY,QAAQ,WACzB,KAAK,YAAY,QAAQ;GAE3B;;AAGJ,SAAgB,4BAA4B,YAA6B;AACvE,QAAO,yBAAyB,IAAI,WAAW;;AAGjD,SAAgB,6BAA6B,YAA0B;AACrE,0BAAyB,IAAI,WAAW;;AAG1C,eAAsB,wBAAwB,QAIR;CACpC,MAAM,WAAW,MAAM,IAAI,OAAO,WAAW;CAC7C,MAAM,QAAQ,0BAA0B,OAAO,YAAY,OAAO,mBAAmB;AACrF,KACE,YACA,SAAS,eAAe,OAAO,cAC/B,SAAS,uBAAuB,OAAO,sBACvC,oBAAoB,SAAS,OAAO,MAAM,CAE1C,QAAO,SAAS;AAElB,OAAM,IAAI,OAAO,YAAY;EAC3B,YAAY,OAAO;EACnB,oBAAoB,OAAO;EAC3B;EACD,CAAC;AACF,QAAO;;AAGT,SAAgB,uBAAuB,YAA0B;AAC/D,OAAM,OAAO,WAAW;AACxB,0BAAyB,OAAO,WAAW;;AAG7C,SAAgB,6BAAmC;AACjD,OAAM,OAAO;AACb,0BAAyB,OAAO"}
|
|
@@ -4,29 +4,35 @@ export { isProfileBootstrapPending } from './load-bootstrap-files.js';
|
|
|
4
4
|
export { clearAllBootstrapSnapshots, clearBootstrapSnapshot } from './bootstrap-cache.js';
|
|
5
5
|
export declare function resolveBootstrapFilesSync(params: {
|
|
6
6
|
profileDir: string;
|
|
7
|
+
workspaceStatePath: string;
|
|
7
8
|
sessionKey?: string;
|
|
8
9
|
excludeHeartbeat?: boolean;
|
|
9
10
|
}): WorkspaceBootstrapFile[];
|
|
10
11
|
export declare function resolveBootstrapFilesForRun(params: {
|
|
11
12
|
profileDir: string;
|
|
13
|
+
workspaceStatePath: string;
|
|
12
14
|
sessionKey?: string;
|
|
13
15
|
excludeHeartbeat?: boolean;
|
|
14
16
|
warn?: (message: string) => void;
|
|
15
17
|
}): Promise<WorkspaceBootstrapFile[]>;
|
|
16
18
|
export declare function resolveBootstrapContextSync(params: {
|
|
17
19
|
profileDir: string;
|
|
20
|
+
workspaceStatePath: string;
|
|
18
21
|
config?: Config;
|
|
19
22
|
sessionKey?: string;
|
|
20
23
|
excludeHeartbeat?: boolean;
|
|
24
|
+
contextInjection?: 'always' | 'continuation-skip' | 'never';
|
|
21
25
|
}): {
|
|
22
26
|
bootstrapFiles: WorkspaceBootstrapFile[];
|
|
23
27
|
contextFiles: EmbeddedContextFile[];
|
|
24
28
|
};
|
|
25
29
|
export declare function resolveBootstrapContextForRun(params: {
|
|
26
30
|
profileDir: string;
|
|
31
|
+
workspaceStatePath: string;
|
|
27
32
|
config?: Config;
|
|
28
33
|
sessionKey?: string;
|
|
29
34
|
excludeHeartbeat?: boolean;
|
|
35
|
+
contextInjection?: 'always' | 'continuation-skip' | 'never';
|
|
30
36
|
warn?: (message: string) => void;
|
|
31
37
|
}): Promise<{
|
|
32
38
|
bootstrapFiles: WorkspaceBootstrapFile[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_HEARTBEAT_FILENAME } from "../context/workspace.js";
|
|
2
2
|
import { isProfileBootstrapPending, loadProfileBootstrapFiles } from "./load-bootstrap-files.js";
|
|
3
|
-
import { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles } from "./bootstrap-cache.js";
|
|
3
|
+
import { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles, markBootstrapContextInjected, wasBootstrapContextInjected } from "./bootstrap-cache.js";
|
|
4
4
|
import { buildBootstrapContextFiles, resolveBootstrapMaxChars, resolveBootstrapTotalMaxChars } from "./bootstrap-context.js";
|
|
5
5
|
import { filterBootstrapFilesForSession } from "./filter-bootstrap-files.js";
|
|
6
6
|
//#region src/agent/bootstrap/bootstrap-files.ts
|
|
@@ -9,34 +9,57 @@ function filterHeartbeatBootstrapFile(files, exclude) {
|
|
|
9
9
|
return files.filter((file) => file.name !== DEFAULT_HEARTBEAT_FILENAME);
|
|
10
10
|
}
|
|
11
11
|
function resolveBootstrapFilesSync(params) {
|
|
12
|
-
return filterHeartbeatBootstrapFile(filterBootstrapFilesForSession(loadProfileBootstrapFiles(params.profileDir), params.sessionKey), params.excludeHeartbeat ?? false);
|
|
12
|
+
return filterHeartbeatBootstrapFile(filterBootstrapFilesForSession(loadProfileBootstrapFiles(params.profileDir, params.workspaceStatePath), params.sessionKey), params.excludeHeartbeat ?? false);
|
|
13
13
|
}
|
|
14
14
|
async function resolveBootstrapFilesForRun(params) {
|
|
15
15
|
const sessionKey = params.sessionKey;
|
|
16
16
|
return filterHeartbeatBootstrapFile(filterBootstrapFilesForSession(sessionKey ? await getOrLoadBootstrapFiles({
|
|
17
17
|
profileDir: params.profileDir,
|
|
18
|
+
workspaceStatePath: params.workspaceStatePath,
|
|
18
19
|
sessionKey
|
|
19
|
-
}) : loadProfileBootstrapFiles(params.profileDir), sessionKey), params.excludeHeartbeat ?? false);
|
|
20
|
+
}) : loadProfileBootstrapFiles(params.profileDir, params.workspaceStatePath), sessionKey), params.excludeHeartbeat ?? false);
|
|
20
21
|
}
|
|
21
22
|
function resolveBootstrapContextSync(params) {
|
|
23
|
+
const mode = params.contextInjection ?? "always";
|
|
24
|
+
if (mode === "never") return {
|
|
25
|
+
bootstrapFiles: [],
|
|
26
|
+
contextFiles: []
|
|
27
|
+
};
|
|
28
|
+
if (mode === "continuation-skip" && params.sessionKey && wasBootstrapContextInjected(params.sessionKey)) return {
|
|
29
|
+
bootstrapFiles: [],
|
|
30
|
+
contextFiles: []
|
|
31
|
+
};
|
|
22
32
|
const bootstrapFiles = resolveBootstrapFilesSync(params);
|
|
33
|
+
const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {
|
|
34
|
+
maxChars: resolveBootstrapMaxChars(params.config),
|
|
35
|
+
totalMaxChars: resolveBootstrapTotalMaxChars(params.config)
|
|
36
|
+
});
|
|
37
|
+
if (mode === "continuation-skip" && params.sessionKey && contextFiles.length > 0) markBootstrapContextInjected(params.sessionKey);
|
|
23
38
|
return {
|
|
24
39
|
bootstrapFiles,
|
|
25
|
-
contextFiles
|
|
26
|
-
maxChars: resolveBootstrapMaxChars(params.config),
|
|
27
|
-
totalMaxChars: resolveBootstrapTotalMaxChars(params.config)
|
|
28
|
-
})
|
|
40
|
+
contextFiles
|
|
29
41
|
};
|
|
30
42
|
}
|
|
31
43
|
async function resolveBootstrapContextForRun(params) {
|
|
44
|
+
const mode = params.contextInjection ?? "always";
|
|
45
|
+
if (mode === "never") return {
|
|
46
|
+
bootstrapFiles: [],
|
|
47
|
+
contextFiles: []
|
|
48
|
+
};
|
|
49
|
+
if (mode === "continuation-skip" && params.sessionKey && wasBootstrapContextInjected(params.sessionKey)) return {
|
|
50
|
+
bootstrapFiles: [],
|
|
51
|
+
contextFiles: []
|
|
52
|
+
};
|
|
32
53
|
const bootstrapFiles = await resolveBootstrapFilesForRun(params);
|
|
54
|
+
const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {
|
|
55
|
+
maxChars: resolveBootstrapMaxChars(params.config),
|
|
56
|
+
totalMaxChars: resolveBootstrapTotalMaxChars(params.config),
|
|
57
|
+
warn: params.warn
|
|
58
|
+
});
|
|
59
|
+
if (mode === "continuation-skip" && params.sessionKey && contextFiles.length > 0) markBootstrapContextInjected(params.sessionKey);
|
|
33
60
|
return {
|
|
34
61
|
bootstrapFiles,
|
|
35
|
-
contextFiles
|
|
36
|
-
maxChars: resolveBootstrapMaxChars(params.config),
|
|
37
|
-
totalMaxChars: resolveBootstrapTotalMaxChars(params.config),
|
|
38
|
-
warn: params.warn
|
|
39
|
-
})
|
|
62
|
+
contextFiles
|
|
40
63
|
};
|
|
41
64
|
}
|
|
42
65
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-files.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_HEARTBEAT_FILENAME } from '../context/workspace.js';\nimport {
|
|
1
|
+
{"version":3,"file":"bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-files.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_HEARTBEAT_FILENAME } from '../context/workspace.js';\nimport {\n getOrLoadBootstrapFiles,\n markBootstrapContextInjected,\n wasBootstrapContextInjected,\n} from './bootstrap-cache.js';\nimport {\n buildBootstrapContextFiles,\n resolveBootstrapMaxChars,\n resolveBootstrapTotalMaxChars,\n} from './bootstrap-context.js';\nimport { filterBootstrapFilesForSession } from './filter-bootstrap-files.js';\nimport { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';\n\nexport { isProfileBootstrapPending } from './load-bootstrap-files.js';\nexport { clearAllBootstrapSnapshots, clearBootstrapSnapshot } from './bootstrap-cache.js';\n\nfunction filterHeartbeatBootstrapFile(\n files: WorkspaceBootstrapFile[],\n exclude: boolean,\n): WorkspaceBootstrapFile[] {\n if (!exclude) {\n return files;\n }\n return files.filter((file) => file.name !== DEFAULT_HEARTBEAT_FILENAME);\n}\n\nexport function resolveBootstrapFilesSync(params: {\n profileDir: string;\n workspaceStatePath: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n}): WorkspaceBootstrapFile[] {\n const rawFiles = loadProfileBootstrapFiles(params.profileDir, params.workspaceStatePath);\n const filtered = filterBootstrapFilesForSession(rawFiles, params.sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport async function resolveBootstrapFilesForRun(params: {\n profileDir: string;\n workspaceStatePath: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n warn?: (message: string) => void;\n}): Promise<WorkspaceBootstrapFile[]> {\n const sessionKey = params.sessionKey;\n const rawFiles = sessionKey\n ? await getOrLoadBootstrapFiles({\n profileDir: params.profileDir,\n workspaceStatePath: params.workspaceStatePath,\n sessionKey,\n })\n : loadProfileBootstrapFiles(params.profileDir, params.workspaceStatePath);\n const filtered = filterBootstrapFilesForSession(rawFiles, sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport function resolveBootstrapContextSync(params: {\n profileDir: string;\n workspaceStatePath: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n}): {\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n} {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = resolveBootstrapFilesSync(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n\nexport async function resolveBootstrapContextForRun(params: {\n profileDir: string;\n workspaceStatePath: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n warn?: (message: string) => void;\n}): Promise<{\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n}> {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = await resolveBootstrapFilesForRun(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n warn: params.warn,\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n"],"mappings":";;;;;;AAmBA,SAAS,6BACP,OACA,SAC0B;AAC1B,KAAI,CAAC,QACH,QAAO;AAET,QAAO,MAAM,QAAQ,SAAS,KAAK,SAAS,2BAA2B;;AAGzE,SAAgB,0BAA0B,QAKb;AAG3B,QAAO,6BADU,+BADA,0BAA0B,OAAO,YAAY,OAAO,mBACb,EAAE,OAAO,WACrB,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,eAAsB,4BAA4B,QAMZ;CACpC,MAAM,aAAa,OAAO;AAS1B,QAAO,6BADU,+BAPA,aACb,MAAM,wBAAwB;EAC5B,YAAY,OAAO;EACnB,oBAAoB,OAAO;EAC3B;EACD,CAAC,GACF,0BAA0B,OAAO,YAAY,OAAO,mBAAmB,EACjB,WACd,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,SAAgB,4BAA4B,QAU1C;CACA,MAAM,OAAO,OAAO,oBAAoB;AACxC,KAAI,SAAS,QACX,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;AAEjD,KACE,SAAS,uBACT,OAAO,cACP,4BAA4B,OAAO,WAAW,CAE9C,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;CAEjD,MAAM,iBAAiB,0BAA0B,OAAO;CACxD,MAAM,eAAe,2BAA2B,gBAAgB;EAC9D,UAAU,yBAAyB,OAAO,OAAO;EACjD,eAAe,8BAA8B,OAAO,OAAO;EAC5D,CAAC;AACF,KAAI,SAAS,uBAAuB,OAAO,cAAc,aAAa,SAAS,EAC7E,8BAA6B,OAAO,WAAW;AAEjD,QAAO;EAAE;EAAgB;EAAc;;AAGzC,eAAsB,8BAA8B,QAWjD;CACD,MAAM,OAAO,OAAO,oBAAoB;AACxC,KAAI,SAAS,QACX,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;AAEjD,KACE,SAAS,uBACT,OAAO,cACP,4BAA4B,OAAO,WAAW,CAE9C,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;CAEjD,MAAM,iBAAiB,MAAM,4BAA4B,OAAO;CAChE,MAAM,eAAe,2BAA2B,gBAAgB;EAC9D,UAAU,yBAAyB,OAAO,OAAO;EACjD,eAAe,8BAA8B,OAAO,OAAO;EAC3D,MAAM,OAAO;EACd,CAAC;AACF,KAAI,SAAS,uBAAuB,OAAO,cAAc,aAAa,SAAS,EAC7E,8BAA6B,OAAO,WAAW;AAEjD,QAAO;EAAE;EAAgB;EAAc"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { WorkspaceBootstrapFile } from './types.js';
|
|
2
|
-
export declare function isProfileBootstrapPending(profileDir: string): boolean;
|
|
2
|
+
export declare function isProfileBootstrapPending(profileDir: string, workspaceStatePath: string): boolean;
|
|
3
3
|
/**
|
|
4
4
|
* Load bootstrap profile Markdown from `agents/<id>/profile/`.
|
|
5
5
|
* MEMORY.md and BOOTSTRAP.md are omitted when absent; other slots emit missing markers.
|
|
6
|
+
*
|
|
7
|
+
* BOOTSTRAP.md is also filtered out when `setupCompletedAt` is set in the workspace state,
|
|
8
|
+
* to prevent re-injection of the bootstrap script after setup is done.
|
|
6
9
|
*/
|
|
7
|
-
export declare function loadProfileBootstrapFiles(profileDir: string): WorkspaceBootstrapFile[];
|
|
10
|
+
export declare function loadProfileBootstrapFiles(profileDir: string, workspaceStatePath: string): WorkspaceBootstrapFile[];
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
|
|
2
2
|
import { DEFAULT_AGENTS_FILENAME, DEFAULT_HEARTBEAT_FILENAME, DEFAULT_IDENTITY_FILENAME, DEFAULT_MEMORY_FILENAME, DEFAULT_SOUL_FILENAME, DEFAULT_TOOLS_FILENAME, DEFAULT_USER_FILENAME, stripFrontMatter } from "../context/workspace.js";
|
|
3
|
-
import {
|
|
3
|
+
import { isWorkspaceSetupCompleted, syncBootstrapSetupCompletion } from "../context/workspace-state.js";
|
|
4
4
|
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
5
6
|
//#region src/agent/bootstrap/load-bootstrap-files.ts
|
|
6
7
|
init_paths();
|
|
7
8
|
const BOOTSTRAP_LOAD_ORDER = [
|
|
@@ -22,18 +23,26 @@ function readProfileFile(filePath) {
|
|
|
22
23
|
return null;
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
|
-
function isProfileBootstrapPending(profileDir) {
|
|
26
|
+
function isProfileBootstrapPending(profileDir, workspaceStatePath) {
|
|
27
|
+
syncBootstrapSetupCompletion(workspaceStatePath, profileDir);
|
|
28
|
+
if (isWorkspaceSetupCompleted(workspaceStatePath)) return false;
|
|
26
29
|
return existsSync(join(profileDir, WORKSPACE_FILES.BOOTSTRAP));
|
|
27
30
|
}
|
|
28
31
|
/**
|
|
29
32
|
* Load bootstrap profile Markdown from `agents/<id>/profile/`.
|
|
30
33
|
* MEMORY.md and BOOTSTRAP.md are omitted when absent; other slots emit missing markers.
|
|
34
|
+
*
|
|
35
|
+
* BOOTSTRAP.md is also filtered out when `setupCompletedAt` is set in the workspace state,
|
|
36
|
+
* to prevent re-injection of the bootstrap script after setup is done.
|
|
31
37
|
*/
|
|
32
|
-
function loadProfileBootstrapFiles(profileDir) {
|
|
38
|
+
function loadProfileBootstrapFiles(profileDir, workspaceStatePath) {
|
|
39
|
+
syncBootstrapSetupCompletion(workspaceStatePath, profileDir);
|
|
33
40
|
const resolvedDir = resolve(profileDir);
|
|
34
41
|
const result = [];
|
|
42
|
+
const setupCompleted = isWorkspaceSetupCompleted(workspaceStatePath);
|
|
35
43
|
for (const name of BOOTSTRAP_LOAD_ORDER) {
|
|
36
44
|
const filePath = join(resolvedDir, name);
|
|
45
|
+
if (name === WORKSPACE_FILES.BOOTSTRAP && setupCompleted) continue;
|
|
37
46
|
if (name === "MEMORY.md" || name === WORKSPACE_FILES.BOOTSTRAP) {
|
|
38
47
|
const content = readProfileFile(filePath);
|
|
39
48
|
if (content === null) continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/load-bootstrap-files.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { stripFrontMatter } from '../context/workspace.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_USER_FILENAME,\n} from '../context/workspace.js';\nimport type { BootstrapFileName, WorkspaceBootstrapFile } from './types.js';\n\nconst BOOTSTRAP_LOAD_ORDER: BootstrapFileName[] = [\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_USER_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n WORKSPACE_FILES.BOOTSTRAP,\n DEFAULT_MEMORY_FILENAME,\n];\n\nfunction readProfileFile(filePath: string): string | null {\n if (!existsSync(filePath)) {\n return null;\n }\n try {\n return stripFrontMatter(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function isProfileBootstrapPending(profileDir: string): boolean {\n return existsSync(join(profileDir, WORKSPACE_FILES.BOOTSTRAP));\n}\n\n/**\n * Load bootstrap profile Markdown from `agents/<id>/profile/`.\n * MEMORY.md and BOOTSTRAP.md are omitted when absent; other slots emit missing markers.\n */\nexport function loadProfileBootstrapFiles(profileDir: string): WorkspaceBootstrapFile[] {\n const resolvedDir = resolve(profileDir);\n const result: WorkspaceBootstrapFile[] = [];\n\n for (const name of BOOTSTRAP_LOAD_ORDER) {\n const filePath = join(resolvedDir, name);\n\n if (name === DEFAULT_MEMORY_FILENAME || name === WORKSPACE_FILES.BOOTSTRAP) {\n const content = readProfileFile(filePath);\n if (content === null) {\n continue;\n }\n result.push({ name, path: filePath, content, missing: false });\n continue;\n }\n\n const content = readProfileFile(filePath);\n if (content !== null) {\n result.push({ name, path: filePath, content, missing: false });\n } else {\n result.push({ name, path: filePath, missing: true });\n }\n }\n\n return result;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"load-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/load-bootstrap-files.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { stripFrontMatter } from '../context/workspace.js';\nimport {\n isWorkspaceSetupCompleted,\n syncBootstrapSetupCompletion,\n} from '../context/workspace-state.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_USER_FILENAME,\n} from '../context/workspace.js';\nimport type { BootstrapFileName, WorkspaceBootstrapFile } from './types.js';\n\nconst BOOTSTRAP_LOAD_ORDER: BootstrapFileName[] = [\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_USER_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n WORKSPACE_FILES.BOOTSTRAP,\n DEFAULT_MEMORY_FILENAME,\n];\n\nfunction readProfileFile(filePath: string): string | null {\n if (!existsSync(filePath)) {\n return null;\n }\n try {\n return stripFrontMatter(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function isProfileBootstrapPending(profileDir: string, workspaceStatePath: string): boolean {\n syncBootstrapSetupCompletion(workspaceStatePath, profileDir);\n if (isWorkspaceSetupCompleted(workspaceStatePath)) {\n return false;\n }\n return existsSync(join(profileDir, WORKSPACE_FILES.BOOTSTRAP));\n}\n\n/**\n * Load bootstrap profile Markdown from `agents/<id>/profile/`.\n * MEMORY.md and BOOTSTRAP.md are omitted when absent; other slots emit missing markers.\n *\n * BOOTSTRAP.md is also filtered out when `setupCompletedAt` is set in the workspace state,\n * to prevent re-injection of the bootstrap script after setup is done.\n */\nexport function loadProfileBootstrapFiles(\n profileDir: string,\n workspaceStatePath: string,\n): WorkspaceBootstrapFile[] {\n syncBootstrapSetupCompletion(workspaceStatePath, profileDir);\n const resolvedDir = resolve(profileDir);\n const result: WorkspaceBootstrapFile[] = [];\n const setupCompleted = isWorkspaceSetupCompleted(workspaceStatePath);\n\n for (const name of BOOTSTRAP_LOAD_ORDER) {\n const filePath = join(resolvedDir, name);\n\n // Skip BOOTSTRAP.md entirely when setup is already completed\n if (name === WORKSPACE_FILES.BOOTSTRAP && setupCompleted) {\n continue;\n }\n\n if (name === DEFAULT_MEMORY_FILENAME || name === WORKSPACE_FILES.BOOTSTRAP) {\n const content = readProfileFile(filePath);\n if (content === null) {\n continue;\n }\n result.push({ name, path: filePath, content, missing: false });\n continue;\n }\n\n const content = readProfileFile(filePath);\n if (content !== null) {\n result.push({ name, path: filePath, content, missing: false });\n } else {\n result.push({ name, path: filePath, missing: true });\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;;YAGwD;AAiBxD,MAAM,uBAA4C;CAChD;CACA;CACA;CACA;CACA;CACA;CACA,gBAAgB;CAChB;CACD;AAED,SAAS,gBAAgB,UAAiC;AACxD,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;AAET,KAAI;AACF,SAAO,iBAAiB,aAAa,UAAU,QAAQ,CAAC;SAClD;AACN,SAAO;;;AAIX,SAAgB,0BAA0B,YAAoB,oBAAqC;AACjG,8BAA6B,oBAAoB,WAAW;AAC5D,KAAI,0BAA0B,mBAAmB,CAC/C,QAAO;AAET,QAAO,WAAW,KAAK,YAAY,gBAAgB,UAAU,CAAC;;;;;;;;;AAUhE,SAAgB,0BACd,YACA,oBAC0B;AAC1B,8BAA6B,oBAAoB,WAAW;CAC5D,MAAM,cAAc,QAAQ,WAAW;CACvC,MAAM,SAAmC,EAAE;CAC3C,MAAM,iBAAiB,0BAA0B,mBAAmB;AAEpE,MAAK,MAAM,QAAQ,sBAAsB;EACvC,MAAM,WAAW,KAAK,aAAa,KAAK;AAGxC,MAAI,SAAS,gBAAgB,aAAa,eACxC;AAGF,MAAI,SAAA,eAAoC,SAAS,gBAAgB,WAAW;GAC1E,MAAM,UAAU,gBAAgB,SAAS;AACzC,OAAI,YAAY,KACd;AAEF,UAAO,KAAK;IAAE;IAAM,MAAM;IAAU;IAAS,SAAS;IAAO,CAAC;AAC9D;;EAGF,MAAM,UAAU,gBAAgB,SAAS;AACzC,MAAI,YAAY,KACd,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU;GAAS,SAAS;GAAO,CAAC;MAE9D,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU,SAAS;GAAM,CAAC;;AAIxD,QAAO"}
|
|
@@ -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';
|