@pellux/goodvibes-sdk 0.37.2 → 1.0.0
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/contracts/artifacts/operator-contract.json +3171 -929
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +4 -0
- package/dist/events/communication.d.ts +21 -1
- package/dist/events/communication.d.ts.map +1 -1
- package/dist/events/surfaces.d.ts +25 -3
- package/dist/events/surfaces.d.ts.map +1 -1
- package/dist/events/surfaces.js +22 -1
- package/dist/events/workflows.d.ts +7 -6
- package/dist/events/workflows.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.js +7 -0
- package/dist/platform/agents/index.d.ts +1 -0
- package/dist/platform/agents/index.d.ts.map +1 -1
- package/dist/platform/agents/index.js +1 -0
- package/dist/platform/agents/message-bus-core.d.ts +7 -0
- package/dist/platform/agents/message-bus-core.d.ts.map +1 -1
- package/dist/platform/agents/message-bus-core.js +2 -1
- package/dist/platform/agents/orchestrator-runner.d.ts +50 -1
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +172 -7
- package/dist/platform/agents/orchestrator.d.ts +78 -6
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +95 -18
- package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
- package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
- package/dist/platform/agents/planner-decomposition-runner.js +113 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts +192 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -0
- package/dist/platform/agents/turn-knowledge-injection.js +269 -0
- package/dist/platform/agents/worktree.d.ts +126 -8
- package/dist/platform/agents/worktree.d.ts.map +1 -1
- package/dist/platform/agents/worktree.js +240 -19
- package/dist/platform/agents/wrfc-controller.d.ts +46 -0
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +213 -32
- package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
- package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
- package/dist/platform/agents/wrfc-gates.d.ts +1 -1
- package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gates.js +7 -1
- package/dist/platform/agents/wrfc-types.d.ts +23 -3
- package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
- package/dist/platform/automation/types.d.ts +9 -1
- package/dist/platform/automation/types.d.ts.map +1 -1
- package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
- package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-api-shared.js +100 -0
- package/dist/platform/calendar/calendar-connector.d.ts +79 -0
- package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-connector.js +155 -0
- package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
- package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
- package/dist/platform/calendar/google-calendar-api.js +89 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
- package/dist/platform/calendar/http-fetch-adapter.js +25 -0
- package/dist/platform/calendar/ics-parser.d.ts +35 -0
- package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
- package/dist/platform/calendar/ics-parser.js +236 -0
- package/dist/platform/calendar/index.d.ts +41 -0
- package/dist/platform/calendar/index.d.ts.map +1 -0
- package/dist/platform/calendar/index.js +49 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
- package/dist/platform/calendar/merged-calendar-model.js +181 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
- package/dist/platform/calendar/microsoft-graph-api.js +95 -0
- package/dist/platform/calendar/oauth-flow.d.ts +62 -0
- package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-flow.js +305 -0
- package/dist/platform/calendar/oauth-providers.d.ts +43 -0
- package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-providers.js +120 -0
- package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
- package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-token-store.js +189 -0
- package/dist/platform/calendar/oauth-types.d.ts +274 -0
- package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-types.js +22 -0
- package/dist/platform/calendar/rrule.d.ts +39 -0
- package/dist/platform/calendar/rrule.d.ts.map +1 -0
- package/dist/platform/calendar/rrule.js +261 -0
- package/dist/platform/calendar/subscription-store.d.ts +118 -0
- package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
- package/dist/platform/calendar/subscription-store.js +293 -0
- package/dist/platform/calendar/types.d.ts +170 -0
- package/dist/platform/calendar/types.d.ts.map +1 -0
- package/dist/platform/calendar/types.js +21 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-attachments.js +121 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
- package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
- package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-gc.js +38 -0
- package/dist/platform/companion/companion-chat-manager.d.ts +67 -20
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +130 -144
- package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
- package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-persistence.js +10 -2
- package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
- package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-routes.js +37 -4
- package/dist/platform/config/credential-status.d.ts +28 -0
- package/dist/platform/config/credential-status.d.ts.map +1 -0
- package/dist/platform/config/credential-status.js +75 -0
- package/dist/platform/config/index.d.ts +25 -0
- package/dist/platform/config/index.d.ts.map +1 -1
- package/dist/platform/config/index.js +18 -0
- package/dist/platform/config/manager.d.ts +18 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +36 -2
- package/dist/platform/config/migrations.d.ts +48 -0
- package/dist/platform/config/migrations.d.ts.map +1 -0
- package/dist/platform/config/migrations.js +54 -0
- package/dist/platform/config/schema-domain-core.d.ts +10 -1
- package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-core.js +46 -3
- package/dist/platform/config/schema-types.d.ts +13 -7
- package/dist/platform/config/schema-types.d.ts.map +1 -1
- package/dist/platform/config/schema.d.ts.map +1 -1
- package/dist/platform/config/schema.js +2 -0
- package/dist/platform/control-plane/approval-broker.d.ts +11 -0
- package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/approval-broker.js +17 -1
- package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
- package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
- package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
- package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
- package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway-utils.js +30 -0
- package/dist/platform/control-plane/gateway.d.ts +12 -2
- package/dist/platform/control-plane/gateway.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway.js +27 -31
- package/dist/platform/control-plane/index.d.ts +6 -1
- package/dist/platform/control-plane/index.d.ts.map +1 -1
- package/dist/platform/control-plane/index.js +4 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
- package/dist/platform/control-plane/invoke-input-validation.js +163 -0
- package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-admin.js +12 -1
- package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
- package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
- package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-channels.js +32 -3
- package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-control-companion.js +133 -0
- package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
- package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control.js +4 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-email.js +21 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-events.js +74 -1
- package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
- package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
- package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
- package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.d.ts +9 -0
- package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.js +32 -3
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
- package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +29 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-runtime.js +57 -3
- package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
- package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
- package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract.js +8 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/checkpoints.js +166 -0
- package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
- package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/fleet.js +153 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
- package/dist/platform/control-plane/routes/index.d.ts +0 -6
- package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
- package/dist/platform/control-plane/routes/index.js +5 -5
- package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
- package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/invocation-params.js +9 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
- package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
- package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/session-search.js +113 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-gc.js +23 -6
- package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
- package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
- package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.js +34 -0
- package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
- package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-sessions.js +179 -5
- package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
- package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-state.js +67 -5
- package/dist/platform/control-plane/session-broker.d.ts +51 -38
- package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker.js +183 -75
- package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
- package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
- package/dist/platform/control-plane/session-store-importer.js +227 -0
- package/dist/platform/control-plane/session-types.d.ts +142 -7
- package/dist/platform/control-plane/session-types.d.ts.map +1 -1
- package/dist/platform/core/adaptive-planner.d.ts +50 -0
- package/dist/platform/core/adaptive-planner.d.ts.map +1 -1
- package/dist/platform/core/adaptive-planner.js +49 -0
- package/dist/platform/core/execution-plan.d.ts +43 -1
- package/dist/platform/core/execution-plan.d.ts.map +1 -1
- package/dist/platform/core/execution-plan.js +46 -10
- package/dist/platform/core/index.d.ts +2 -0
- package/dist/platform/core/index.d.ts.map +1 -1
- package/dist/platform/core/index.js +2 -0
- package/dist/platform/core/orchestrator-runtime.d.ts +31 -0
- package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
- package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
- package/dist/platform/core/orchestrator-turn-loop.d.ts +35 -1
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +121 -3
- package/dist/platform/core/orchestrator.d.ts +67 -0
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +89 -1
- package/dist/platform/core/plan-decomposition.d.ts +196 -0
- package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
- package/dist/platform/core/plan-decomposition.js +417 -0
- package/dist/platform/core/plan-proposal.d.ts +204 -0
- package/dist/platform/core/plan-proposal.d.ts.map +1 -0
- package/dist/platform/core/plan-proposal.js +296 -0
- package/dist/platform/core/wrfc-routing.d.ts +1 -0
- package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
- package/dist/platform/core/wrfc-routing.js +51 -1
- package/dist/platform/daemon/boot.d.ts +63 -0
- package/dist/platform/daemon/boot.d.ts.map +1 -0
- package/dist/platform/daemon/boot.js +60 -0
- package/dist/platform/daemon/cli.js +2 -1
- package/dist/platform/daemon/control-plane.d.ts.map +1 -1
- package/dist/platform/daemon/control-plane.js +50 -1
- package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/platform/daemon/facade-composition.js +6 -0
- package/dist/platform/daemon/facade.d.ts +18 -6
- package/dist/platform/daemon/facade.d.ts.map +1 -1
- package/dist/platform/daemon/facade.js +50 -43
- package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
- package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
- package/dist/platform/daemon/http/router-route-contexts.js +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
- package/dist/platform/daemon/http/router.d.ts +1 -1
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +7 -22
- package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
- package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
- package/dist/platform/daemon/index.d.ts +2 -0
- package/dist/platform/daemon/index.d.ts.map +1 -1
- package/dist/platform/daemon/index.js +1 -0
- package/dist/platform/daemon/service-manager.d.ts +16 -0
- package/dist/platform/daemon/service-manager.d.ts.map +1 -1
- package/dist/platform/daemon/service-manager.js +79 -15
- package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
- package/dist/platform/intelligence/tree-sitter/service.js +16 -2
- package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
- package/dist/platform/knowledge/browser-history/readers.js +15 -5
- package/dist/platform/knowledge/knowledge-api.d.ts +26 -0
- package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-api.js +11 -0
- package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
- package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
- package/dist/platform/knowledge/project-planning/service.js +77 -0
- package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
- package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
- package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
- package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
- package/dist/platform/orchestration/bookkeeping.js +91 -0
- package/dist/platform/orchestration/budget.d.ts +22 -0
- package/dist/platform/orchestration/budget.d.ts.map +1 -0
- package/dist/platform/orchestration/budget.js +35 -0
- package/dist/platform/orchestration/cancellation.d.ts +31 -0
- package/dist/platform/orchestration/cancellation.d.ts.map +1 -0
- package/dist/platform/orchestration/cancellation.js +25 -0
- package/dist/platform/orchestration/controller-compat.d.ts +46 -0
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -0
- package/dist/platform/orchestration/controller-compat.js +27 -0
- package/dist/platform/orchestration/dirty-guard.d.ts +32 -0
- package/dist/platform/orchestration/dirty-guard.d.ts.map +1 -0
- package/dist/platform/orchestration/dirty-guard.js +147 -0
- package/dist/platform/orchestration/engine.d.ts +82 -0
- package/dist/platform/orchestration/engine.d.ts.map +1 -0
- package/dist/platform/orchestration/engine.js +623 -0
- package/dist/platform/orchestration/index.d.ts +20 -0
- package/dist/platform/orchestration/index.d.ts.map +1 -0
- package/dist/platform/orchestration/index.js +11 -0
- package/dist/platform/orchestration/persistence.d.ts +24 -0
- package/dist/platform/orchestration/persistence.d.ts.map +1 -0
- package/dist/platform/orchestration/persistence.js +179 -0
- package/dist/platform/orchestration/phase-runner.d.ts +114 -0
- package/dist/platform/orchestration/phase-runner.d.ts.map +1 -0
- package/dist/platform/orchestration/phase-runner.js +347 -0
- package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
- package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
- package/dist/platform/orchestration/proposal-workstream.js +76 -0
- package/dist/platform/orchestration/scheduler.d.ts +64 -0
- package/dist/platform/orchestration/scheduler.d.ts.map +1 -0
- package/dist/platform/orchestration/scheduler.js +73 -0
- package/dist/platform/orchestration/types.d.ts +535 -0
- package/dist/platform/orchestration/types.d.ts.map +1 -0
- package/dist/platform/orchestration/types.js +47 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
- package/dist/platform/orchestration/worktree-isolation.js +248 -0
- package/dist/platform/presentation/glyphs.d.ts +91 -0
- package/dist/platform/presentation/glyphs.d.ts.map +1 -0
- package/dist/platform/presentation/glyphs.js +93 -0
- package/dist/platform/presentation/index.d.ts +28 -0
- package/dist/platform/presentation/index.d.ts.map +1 -0
- package/dist/platform/presentation/index.js +27 -0
- package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
- package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
- package/dist/platform/presentation/thinking-phrases.js +32 -0
- package/dist/platform/presentation/tones.d.ts +121 -0
- package/dist/platform/presentation/tones.d.ts.map +1 -0
- package/dist/platform/presentation/tones.js +145 -0
- package/dist/platform/presentation/waiting-wording.d.ts +54 -0
- package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
- package/dist/platform/presentation/waiting-wording.js +51 -0
- package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
- package/dist/platform/providers/runtime-snapshot.js +12 -2
- package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
- package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
- package/dist/platform/runtime/bootstrap-services.js +217 -50
- package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
- package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
- package/dist/platform/runtime/daemon-version-compat.js +75 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
- package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
- package/dist/platform/runtime/emitters/communication.d.ts +11 -0
- package/dist/platform/runtime/emitters/communication.d.ts.map +1 -1
- package/dist/platform/runtime/emitters/communication.js +9 -0
- package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
- package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.d.ts +13 -0
- package/dist/platform/runtime/events/index.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.js +13 -0
- package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
- package/dist/platform/runtime/feature-flags/flags.js +56 -1
- package/dist/platform/runtime/fleet/adapters/agent.d.ts +56 -0
- package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/agent.js +143 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts +30 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/automation.js +41 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/background-process.js +46 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts +21 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/code-index.js +44 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +69 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.js +329 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts +14 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/schedule.js +28 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/trigger.js +22 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts +13 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/watcher.js +47 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts +11 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/workflow.js +34 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +35 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.js +275 -0
- package/dist/platform/runtime/fleet/index.d.ts +10 -0
- package/dist/platform/runtime/fleet/index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/index.js +6 -0
- package/dist/platform/runtime/fleet/registry.d.ts +113 -0
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/registry.js +664 -0
- package/dist/platform/runtime/fleet/types.d.ts +199 -0
- package/dist/platform/runtime/fleet/types.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/types.js +2 -0
- package/dist/platform/runtime/operator-client.d.ts +20 -2
- package/dist/platform/runtime/operator-client.d.ts.map +1 -1
- package/dist/platform/runtime/operator-client.js +11 -1
- package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
- package/dist/platform/runtime/provider-accounts/registry.js +11 -1
- package/dist/platform/runtime/runtime-knowledge-api.d.ts +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.d.ts.map +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.js +1 -0
- package/dist/platform/runtime/services.d.ts +48 -0
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +95 -2
- package/dist/platform/runtime/session-spine/client.d.ts +234 -0
- package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/client.js +449 -0
- package/dist/platform/runtime/session-spine/index.d.ts +12 -0
- package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/index.js +11 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/union-cache.js +333 -0
- package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
- package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
- package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
- package/dist/platform/runtime/transports/http-types.d.ts +9 -2
- package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
- package/dist/platform/state/canonical-memory.d.ts +95 -0
- package/dist/platform/state/canonical-memory.d.ts.map +1 -0
- package/dist/platform/state/canonical-memory.js +155 -0
- package/dist/platform/state/code-index-chunking.d.ts +49 -0
- package/dist/platform/state/code-index-chunking.d.ts.map +1 -0
- package/dist/platform/state/code-index-chunking.js +111 -0
- package/dist/platform/state/code-index-db.d.ts +53 -0
- package/dist/platform/state/code-index-db.d.ts.map +1 -0
- package/dist/platform/state/code-index-db.js +101 -0
- package/dist/platform/state/code-index-reindex.d.ts +73 -0
- package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
- package/dist/platform/state/code-index-reindex.js +156 -0
- package/dist/platform/state/code-index-store.d.ts +175 -0
- package/dist/platform/state/code-index-store.d.ts.map +1 -0
- package/dist/platform/state/code-index-store.js +620 -0
- package/dist/platform/state/index.d.ts +12 -2
- package/dist/platform/state/index.d.ts.map +1 -1
- package/dist/platform/state/index.js +6 -1
- package/dist/platform/state/knowledge-injection.d.ts +23 -0
- package/dist/platform/state/knowledge-injection.d.ts.map +1 -1
- package/dist/platform/state/knowledge-injection.js +34 -19
- package/dist/platform/state/memory-recall-contract.d.ts +63 -0
- package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
- package/dist/platform/state/memory-recall-contract.js +94 -0
- package/dist/platform/state/memory-store.d.ts +2 -0
- package/dist/platform/state/memory-store.d.ts.map +1 -1
- package/dist/platform/state/memory-store.js +4 -0
- package/dist/platform/state/memory-vector-store.d.ts +1 -13
- package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
- package/dist/platform/state/memory-vector-store.js +18 -39
- package/dist/platform/state/sqlite-store.d.ts +2 -0
- package/dist/platform/state/sqlite-store.d.ts.map +1 -1
- package/dist/platform/state/sqlite-store.js +4 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts +25 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts.map +1 -0
- package/dist/platform/state/sqlite-vec-loader.js +43 -0
- package/dist/platform/state/vibe-projection.d.ts +67 -0
- package/dist/platform/state/vibe-projection.d.ts.map +1 -0
- package/dist/platform/state/vibe-projection.js +115 -0
- package/dist/platform/tools/agent/index.d.ts.map +1 -1
- package/dist/platform/tools/agent/index.js +8 -0
- package/dist/platform/tools/agent/manager.d.ts +140 -1
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +143 -1
- package/dist/platform/tools/agent/schema.d.ts +26 -0
- package/dist/platform/tools/agent/schema.d.ts.map +1 -1
- package/dist/platform/tools/agent/schema.js +2 -2
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
- package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
- package/dist/platform/tools/exec/runtime.d.ts +10 -0
- package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
- package/dist/platform/tools/exec/runtime.js +161 -49
- package/dist/platform/tools/exec/schema.d.ts +3 -1
- package/dist/platform/tools/exec/schema.d.ts.map +1 -1
- package/dist/platform/tools/exec/schema.js +2 -1
- package/dist/platform/tools/fetch/runtime.d.ts +7 -0
- package/dist/platform/tools/fetch/runtime.d.ts.map +1 -1
- package/dist/platform/tools/fetch/runtime.js +8 -6
- package/dist/platform/tools/index.d.ts +2 -0
- package/dist/platform/tools/index.d.ts.map +1 -1
- package/dist/platform/tools/index.js +2 -0
- package/dist/platform/tools/registry.d.ts +9 -3
- package/dist/platform/tools/registry.d.ts.map +1 -1
- package/dist/platform/tools/registry.js +9 -3
- package/dist/platform/tools/state/index.d.ts +9 -0
- package/dist/platform/tools/state/index.d.ts.map +1 -1
- package/dist/platform/tools/state/index.js +60 -3
- package/dist/platform/types/foundation-contract.d.ts +1 -1
- package/dist/platform/types/foundation-contract.d.ts.map +1 -1
- package/dist/platform/types/index.d.ts +1 -1
- package/dist/platform/types/index.d.ts.map +1 -1
- package/dist/platform/types/tools.d.ts +14 -1
- package/dist/platform/types/tools.d.ts.map +1 -1
- package/dist/platform/version.js +1 -1
- package/package.json +29 -9
- package/dist/platform/control-plane/routes/automation.d.ts +0 -3
- package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/automation.js +0 -63
- package/dist/platform/control-plane/routes/context.d.ts +0 -2
- package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/context.js +0 -1
- package/dist/platform/control-plane/routes/operator.d.ts +0 -8
- package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/operator.js +0 -415
- package/dist/platform/control-plane/routes/remote.d.ts +0 -3
- package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/remote.js +0 -35
- package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
- package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/sessions.js +0 -43
- package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
- package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/tasks.js +0 -22
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
* for that specific session — never the global TUI event feed.
|
|
20
20
|
* - A GC sweep closes sessions that have been idle beyond the TTL.
|
|
21
21
|
*/
|
|
22
|
-
import { Buffer } from 'node:buffer';
|
|
23
22
|
import type { ProviderMessage } from '../providers/interface.js';
|
|
24
|
-
import type { ArtifactDescriptor } from '../artifacts/index.js';
|
|
25
23
|
import type { CompanionChatMessageAttachmentInput, CompanionChatMessage, CompanionChatSession, CreateCompanionChatSessionInput, UpdateCompanionChatSessionInput } from './companion-chat-types.js';
|
|
24
|
+
import { type CompanionChatArtifactStore } from './companion-chat-attachments.js';
|
|
25
|
+
import type { CompanionSessionBrokerBridge } from './companion-chat-broker-bridge.js';
|
|
26
26
|
import type { CompanionChatRateLimiterOptions } from './companion-chat-rate-limiter.js';
|
|
27
27
|
import type { ToolRegistry } from '../tools/registry.js';
|
|
28
28
|
import type { ToolDefinition } from '../types/tools.js';
|
|
@@ -53,16 +53,7 @@ export interface CompanionLLMProvider {
|
|
|
53
53
|
type HookDispatcherLike = {
|
|
54
54
|
fire(event: HookEvent): Promise<HookResult>;
|
|
55
55
|
};
|
|
56
|
-
export
|
|
57
|
-
get(artifactId: string): ArtifactDescriptor | null;
|
|
58
|
-
readContent(artifactId: string): Promise<{
|
|
59
|
-
readonly record: {
|
|
60
|
-
readonly mimeType: string;
|
|
61
|
-
readonly filename?: string | undefined;
|
|
62
|
-
};
|
|
63
|
-
readonly buffer: ArrayBuffer | Uint8Array | Buffer;
|
|
64
|
-
}>;
|
|
65
|
-
}
|
|
56
|
+
export type { CompanionChatArtifactStore } from './companion-chat-attachments.js';
|
|
66
57
|
export interface CompanionChatEventPublisher {
|
|
67
58
|
publishEvent(event: string, payload: unknown, filter?: {
|
|
68
59
|
clientId?: string;
|
|
@@ -96,9 +87,28 @@ export interface CompanionChatManagerConfig {
|
|
|
96
87
|
readonly artifactStore?: CompanionChatArtifactStore | null | undefined;
|
|
97
88
|
/**
|
|
98
89
|
* Directory under which session JSON files are persisted.
|
|
99
|
-
* Default:
|
|
90
|
+
* Default: `<homeDirectory>/.goodvibes/companion-chat/sessions/` when
|
|
91
|
+
* `homeDirectory` is provided, else the OS home. Prefer passing this (or
|
|
92
|
+
* `homeDirectory`) explicitly so an isolated-home daemon never touches the
|
|
93
|
+
* real `~/.goodvibes`.
|
|
100
94
|
*/
|
|
101
95
|
readonly sessionsDir?: string | undefined;
|
|
96
|
+
/** Injected home dir; when `sessionsDir` is omitted, the persistence root is
|
|
97
|
+
* derived from THIS home (not the OS home) so an isolated-home daemon stays in. */
|
|
98
|
+
readonly homeDirectory?: string | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Optional bridge to the shared session broker. When supplied, companion
|
|
101
|
+
* sessions register INTO the broker at write time (create/close), so
|
|
102
|
+
* `/api/sessions` reflects companion activity immediately (same-process, no
|
|
103
|
+
* restart). The boot-time importer fold remains the reconciliation path.
|
|
104
|
+
*/
|
|
105
|
+
readonly sessionBroker?: CompanionSessionBrokerBridge | null | undefined;
|
|
106
|
+
/** Age (ms past closedAt) at which a CLOSED session's heavy in-memory handles
|
|
107
|
+
* are evicted while its meta stays listable (bounds resident memory). Default 5 min. */
|
|
108
|
+
readonly closedSessionMemoryGraceMs?: number | undefined;
|
|
109
|
+
/** Age (ms past closedAt) at which a CLOSED session's persisted file is PERMANENTLY
|
|
110
|
+
* deleted. Closed sessions are HISTORY: default `undefined` = retain indefinitely. */
|
|
111
|
+
readonly closedSessionRetentionMs?: number | undefined;
|
|
102
112
|
/**
|
|
103
113
|
* Pass `false` to disable disk persistence entirely (useful in tests).
|
|
104
114
|
* Default: true
|
|
@@ -126,6 +136,10 @@ export declare class CompanionChatManager {
|
|
|
126
136
|
private readonly rateLimiter;
|
|
127
137
|
private readonly idleActiveMs;
|
|
128
138
|
private readonly idleEmptyMs;
|
|
139
|
+
private readonly closedMemoryGraceMs;
|
|
140
|
+
private readonly closedRetentionMs;
|
|
141
|
+
/** Live mirror of sessions into the shared broker store (S1 item D). */
|
|
142
|
+
private readonly _brokerSync;
|
|
129
143
|
private gcTimer;
|
|
130
144
|
/** Tracks whether the async init() has completed. */
|
|
131
145
|
private initCompleted;
|
|
@@ -170,6 +184,23 @@ export declare class CompanionChatManager {
|
|
|
170
184
|
* snapshot, or null if not found.
|
|
171
185
|
*/
|
|
172
186
|
closeSession(sessionId: string): CompanionChatSession | null;
|
|
187
|
+
/**
|
|
188
|
+
* Permanently delete a session (W5-S1: `delete` is now a genuine removal,
|
|
189
|
+
* distinct from `closeSession` above). Aborts any in-flight turn, removes
|
|
190
|
+
* the on-disk record file, and drops the in-memory entry — reusing
|
|
191
|
+
* {@link _hardRemove}, the SAME primitive the GC 'delete-persistent' sweep
|
|
192
|
+
* action uses, so there is exactly one removal code path.
|
|
193
|
+
*
|
|
194
|
+
* Requires the session to already be closed: deleting a still-active
|
|
195
|
+
* session throws `{ code: 'SESSION_ACTIVE', status: 409 }` (the caller must
|
|
196
|
+
* close it first, mirroring the SESSION_CLOSED-throw convention elsewhere
|
|
197
|
+
* in this file). An unknown OR already-deleted id throws
|
|
198
|
+
* `{ code: 'SESSION_NOT_FOUND', status: 404 }` — delete is not a 200-noop.
|
|
199
|
+
*/
|
|
200
|
+
deleteSession(sessionId: string): Promise<{
|
|
201
|
+
readonly sessionId: string;
|
|
202
|
+
readonly deleted: true;
|
|
203
|
+
}>;
|
|
173
204
|
/**
|
|
174
205
|
* Post a user message and start an async LLM turn. Returns the messageId.
|
|
175
206
|
*
|
|
@@ -192,18 +223,35 @@ export declare class CompanionChatManager {
|
|
|
192
223
|
readonly attachments?: readonly CompanionChatMessageAttachmentInput[] | undefined;
|
|
193
224
|
}): Promise<CompanionChatReplyResult>;
|
|
194
225
|
private _postMessageInternal;
|
|
195
|
-
private resolveAttachments;
|
|
196
|
-
private formatAttachmentSummary;
|
|
197
|
-
private buildReplayUserContent;
|
|
198
|
-
private isInlineTextAttachment;
|
|
199
|
-
private isInlineImageAttachment;
|
|
200
|
-
private buildProviderUserContent;
|
|
201
226
|
dispose(): void;
|
|
202
227
|
private _runTurn;
|
|
203
228
|
private _finalizeAfterToolExhaustion;
|
|
204
229
|
private _executeToolCalls;
|
|
230
|
+
/**
|
|
231
|
+
* Periodic GC sweep. Deletion authority is SPLIT (charter: closed sessions are
|
|
232
|
+
* HISTORY): close-idle closes an idle active session; evict-memory drops a
|
|
233
|
+
* long-closed session's in-memory handles (meta + on-disk copy kept);
|
|
234
|
+
* delete-persistent removes the file ONLY under an explicit finite retention
|
|
235
|
+
* window (default retains indefinitely — see {@link planCompanionSweep}).
|
|
236
|
+
*/
|
|
205
237
|
_gcSweep(): void;
|
|
206
238
|
private _updateMeta;
|
|
239
|
+
/**
|
|
240
|
+
* Await all in-flight best-effort broker-sync operations. The daemon's
|
|
241
|
+
* companion HTTP routes call this before responding so `/api/sessions`
|
|
242
|
+
* reflects the change synchronously; tests use it to make the mirror
|
|
243
|
+
* deterministic. A no-op when no broker bridge is configured.
|
|
244
|
+
*/
|
|
245
|
+
flushBrokerSync(): Promise<void>;
|
|
246
|
+
/**
|
|
247
|
+
* Hard-remove a session's persisted file and in-memory record. The ONE
|
|
248
|
+
* removal code path — shared by {@link deleteSession} and the GC
|
|
249
|
+
* 'delete-persistent' action. Never fork this. Order matters (Wave-5 F1):
|
|
250
|
+
* drop the map entry, drain any in-flight {@link _persist} save for this
|
|
251
|
+
* id, THEN unlink — else a save mid-write from {@link closeSession} can
|
|
252
|
+
* resurrect the file post-unlink.
|
|
253
|
+
*/
|
|
254
|
+
private _hardRemove;
|
|
207
255
|
/**
|
|
208
256
|
* Schedule a persistence save for the given session.
|
|
209
257
|
* Saves are serialized per-session: each new save waits for the prior one to
|
|
@@ -214,5 +262,4 @@ export declare class CompanionChatManager {
|
|
|
214
262
|
private _doSave;
|
|
215
263
|
private resolvePendingReply;
|
|
216
264
|
}
|
|
217
|
-
export {};
|
|
218
265
|
//# sourceMappingURL=companion-chat-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companion-chat-manager.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"companion-chat-manager.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,10 +19,13 @@
|
|
|
19
19
|
* for that specific session — never the global TUI event feed.
|
|
20
20
|
* - A GC sweep closes sessions that have been idle beyond the TTL.
|
|
21
21
|
*/
|
|
22
|
-
import { Buffer } from 'node:buffer';
|
|
23
22
|
import { randomUUID } from 'node:crypto';
|
|
23
|
+
import { SDKErrorCodes } from '@pellux/goodvibes-errors';
|
|
24
24
|
import { ConversationManager } from '../core/conversation.js';
|
|
25
25
|
import { CompanionChatPersistence, defaultSessionsDir, } from './companion-chat-persistence.js';
|
|
26
|
+
import { buildProviderUserContent, buildReplayUserContent, resolveAttachments, } from './companion-chat-attachments.js';
|
|
27
|
+
import { planCompanionSweep } from './companion-chat-gc.js';
|
|
28
|
+
import { CompanionBrokerSync } from './companion-chat-broker-sync.js';
|
|
26
29
|
import { CompanionChatRateLimiter } from './companion-chat-rate-limiter.js';
|
|
27
30
|
import { executeToolCalls as executeOrchestratorToolCalls } from '../core/orchestrator-tool-runtime.js';
|
|
28
31
|
import { appendGoodVibesRuntimeAwarenessPrompt } from '../tools/goodvibes-runtime/index.js';
|
|
@@ -33,6 +36,7 @@ import { logger } from '../utils/logger.js';
|
|
|
33
36
|
// ---------------------------------------------------------------------------
|
|
34
37
|
const DEFAULT_IDLE_ACTIVE_MS = 30 * 60 * 1_000; // 30 minutes with messages
|
|
35
38
|
const DEFAULT_IDLE_EMPTY_MS = 5 * 60 * 1_000; // 5 minutes empty session
|
|
39
|
+
const DEFAULT_CLOSED_MEMORY_GRACE_MS = 5 * 60 * 1_000; // evict closed bodies from RAM after 5 min
|
|
36
40
|
const GC_INTERVAL_MS = 60 * 1_000; // sweep every minute
|
|
37
41
|
const MAX_TOOL_ROUNDS_PER_TURN = 8;
|
|
38
42
|
const TOOL_EXHAUSTION_FINALIZER_PROMPT = [
|
|
@@ -42,16 +46,6 @@ const TOOL_EXHAUSTION_FINALIZER_PROMPT = [
|
|
|
42
46
|
'If the available tool results are insufficient, say what is missing and ask one short follow-up '
|
|
43
47
|
+ 'question.',
|
|
44
48
|
].join(' ');
|
|
45
|
-
const MAX_ATTACHMENTS_PER_MESSAGE = 8;
|
|
46
|
-
const MAX_INLINE_IMAGE_ATTACHMENT_BYTES = 20 * 1024 * 1024;
|
|
47
|
-
const MAX_INLINE_TEXT_ATTACHMENT_BYTES = 200 * 1024;
|
|
48
|
-
function toNodeBuffer(buffer) {
|
|
49
|
-
if (Buffer.isBuffer(buffer))
|
|
50
|
-
return buffer;
|
|
51
|
-
if (buffer instanceof ArrayBuffer)
|
|
52
|
-
return Buffer.from(new Uint8Array(buffer));
|
|
53
|
-
return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
54
|
-
}
|
|
55
49
|
function assertCompleteProviderModelRoute(input) {
|
|
56
50
|
if ((input.model !== undefined) === (input.provider !== undefined))
|
|
57
51
|
return;
|
|
@@ -73,6 +67,10 @@ export class CompanionChatManager {
|
|
|
73
67
|
rateLimiter;
|
|
74
68
|
idleActiveMs;
|
|
75
69
|
idleEmptyMs;
|
|
70
|
+
closedMemoryGraceMs;
|
|
71
|
+
closedRetentionMs;
|
|
72
|
+
/** Live mirror of sessions into the shared broker store (S1 item D). */
|
|
73
|
+
_brokerSync;
|
|
76
74
|
gcTimer = null;
|
|
77
75
|
/** Tracks whether the async init() has completed. */
|
|
78
76
|
initCompleted = false;
|
|
@@ -93,13 +91,17 @@ export class CompanionChatManager {
|
|
|
93
91
|
this.artifactStore = config.artifactStore ?? null;
|
|
94
92
|
this.idleActiveMs = config.idleActiveMs ?? DEFAULT_IDLE_ACTIVE_MS;
|
|
95
93
|
this.idleEmptyMs = config.idleEmptyMs ?? DEFAULT_IDLE_EMPTY_MS;
|
|
94
|
+
this.closedMemoryGraceMs = config.closedSessionMemoryGraceMs ?? DEFAULT_CLOSED_MEMORY_GRACE_MS;
|
|
95
|
+
this.closedRetentionMs = config.closedSessionRetentionMs;
|
|
96
|
+
this._brokerSync = new CompanionBrokerSync(config.sessionBroker ?? null);
|
|
96
97
|
// Persistence
|
|
97
98
|
// Default is false — most callers (tests, downstream consumers) get the
|
|
98
99
|
// safe no-write default. The daemon opts into persistence explicitly via
|
|
99
|
-
// persist: true in facade-composition.
|
|
100
|
+
// persist: true in facade-composition. When sessionsDir is omitted, derive
|
|
101
|
+
// the root from the INJECTED home so an isolated-home daemon stays inside it.
|
|
100
102
|
const persist = config.persist === true;
|
|
101
103
|
this.persistence = persist
|
|
102
|
-
? new CompanionChatPersistence(config.sessionsDir ?? defaultSessionsDir())
|
|
104
|
+
? new CompanionChatPersistence(config.sessionsDir ?? defaultSessionsDir(config.homeDirectory))
|
|
103
105
|
: null;
|
|
104
106
|
// Rate limiter
|
|
105
107
|
this.rateLimiter =
|
|
@@ -130,18 +132,18 @@ export class CompanionChatManager {
|
|
|
130
132
|
const stored = await this.persistence.loadAll();
|
|
131
133
|
for (const { meta, messages } of stored) {
|
|
132
134
|
const normalizedMessages = messages.map((message) => this.normalizeMessage(message));
|
|
133
|
-
// Skip sessions that were already closed before the restart — they are
|
|
134
|
-
// in a terminal state and don't need to be in memory.
|
|
135
|
-
if (meta.status === 'closed')
|
|
136
|
-
continue;
|
|
137
135
|
const conversation = new ConversationManager();
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
136
|
+
// Closed-skip fix: closed sessions load in a lightweight terminal state
|
|
137
|
+
// (meta + messages retained, listable/importable; no history replay). GC
|
|
138
|
+
// (_gcSweep) remains the sole deletion authority.
|
|
139
|
+
if (meta.status !== 'closed') {
|
|
140
|
+
for (const msg of normalizedMessages) {
|
|
141
|
+
if (msg.role === 'user') {
|
|
142
|
+
conversation.addUserMessage(buildReplayUserContent(msg));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
conversation.addAssistantMessage(msg.content);
|
|
146
|
+
}
|
|
145
147
|
}
|
|
146
148
|
}
|
|
147
149
|
this.sessions.set(meta.id, {
|
|
@@ -185,6 +187,9 @@ export class CompanionChatManager {
|
|
|
185
187
|
subscriberClientId: null,
|
|
186
188
|
});
|
|
187
189
|
this._persist(id);
|
|
190
|
+
// Live spine: mirror the new session into the shared broker at write time so
|
|
191
|
+
// /api/sessions reflects it same-process (no restart). Best-effort.
|
|
192
|
+
this._brokerSync.track(meta.id, () => this._brokerSync.registerSession(meta));
|
|
188
193
|
return meta;
|
|
189
194
|
}
|
|
190
195
|
getSession(sessionId) {
|
|
@@ -226,7 +231,7 @@ export class CompanionChatManager {
|
|
|
226
231
|
throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
|
|
227
232
|
}
|
|
228
233
|
if (session.meta.status === 'closed') {
|
|
229
|
-
throw Object.assign(new Error(
|
|
234
|
+
throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
|
|
230
235
|
}
|
|
231
236
|
const patch = { updatedAt: Date.now() };
|
|
232
237
|
if (input.title !== undefined)
|
|
@@ -239,6 +244,9 @@ export class CompanionChatManager {
|
|
|
239
244
|
patch.systemPrompt = input.systemPrompt;
|
|
240
245
|
const updated = this._updateMeta(session, patch);
|
|
241
246
|
this._persist(sessionId);
|
|
247
|
+
// Heartbeat the broker record (advances participant.lastSeenAt). Title is
|
|
248
|
+
// never overwritten by this path (broker treats register as a heartbeat).
|
|
249
|
+
this._brokerSync.track(updated.id, () => this._brokerSync.registerSession(updated));
|
|
242
250
|
return updated;
|
|
243
251
|
}
|
|
244
252
|
/**
|
|
@@ -267,8 +275,37 @@ export class CompanionChatManager {
|
|
|
267
275
|
const now = Date.now();
|
|
268
276
|
const updated = this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
|
|
269
277
|
this._persist(sessionId);
|
|
278
|
+
// Live spine: flip the shared broker record to closed at write time.
|
|
279
|
+
this._brokerSync.track(sessionId, () => this._brokerSync.closeSession(sessionId));
|
|
270
280
|
return updated;
|
|
271
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* Permanently delete a session (W5-S1: `delete` is now a genuine removal,
|
|
284
|
+
* distinct from `closeSession` above). Aborts any in-flight turn, removes
|
|
285
|
+
* the on-disk record file, and drops the in-memory entry — reusing
|
|
286
|
+
* {@link _hardRemove}, the SAME primitive the GC 'delete-persistent' sweep
|
|
287
|
+
* action uses, so there is exactly one removal code path.
|
|
288
|
+
*
|
|
289
|
+
* Requires the session to already be closed: deleting a still-active
|
|
290
|
+
* session throws `{ code: 'SESSION_ACTIVE', status: 409 }` (the caller must
|
|
291
|
+
* close it first, mirroring the SESSION_CLOSED-throw convention elsewhere
|
|
292
|
+
* in this file). An unknown OR already-deleted id throws
|
|
293
|
+
* `{ code: 'SESSION_NOT_FOUND', status: 404 }` — delete is not a 200-noop.
|
|
294
|
+
*/
|
|
295
|
+
async deleteSession(sessionId) {
|
|
296
|
+
const session = this.sessions.get(sessionId);
|
|
297
|
+
if (!session) {
|
|
298
|
+
throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
|
|
299
|
+
}
|
|
300
|
+
if (session.meta.status !== 'closed') {
|
|
301
|
+
throw Object.assign(new Error('Session is active — close it, then delete.'), { code: 'SESSION_ACTIVE', status: 409 });
|
|
302
|
+
}
|
|
303
|
+
session.abortController.abort();
|
|
304
|
+
await this._hardRemove(sessionId);
|
|
305
|
+
// Live spine: drop the mirrored shared broker record entirely (not just closed).
|
|
306
|
+
this._brokerSync.track(sessionId, () => this._brokerSync.deleteSession(sessionId));
|
|
307
|
+
return { sessionId, deleted: true };
|
|
308
|
+
}
|
|
272
309
|
/**
|
|
273
310
|
* Post a user message and start an async LLM turn. Returns the messageId.
|
|
274
311
|
*
|
|
@@ -318,11 +355,11 @@ export class CompanionChatManager {
|
|
|
318
355
|
throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
|
|
319
356
|
}
|
|
320
357
|
if (session.meta.status === 'closed') {
|
|
321
|
-
throw Object.assign(new Error(
|
|
358
|
+
throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
|
|
322
359
|
}
|
|
323
360
|
// Rate-limit check (throws GoodVibesSdkError on violation)
|
|
324
361
|
this.rateLimiter?.check(sessionId, clientId);
|
|
325
|
-
const attachments =
|
|
362
|
+
const attachments = resolveAttachments(options.attachments ?? [], this.artifactStore);
|
|
326
363
|
if (!content.trim() && attachments.length === 0) {
|
|
327
364
|
throw Object.assign(new Error('content or attachments are required'), { code: 'INVALID_INPUT', status: 400 });
|
|
328
365
|
}
|
|
@@ -338,7 +375,7 @@ export class CompanionChatManager {
|
|
|
338
375
|
createdAt: now,
|
|
339
376
|
};
|
|
340
377
|
session.messages.push(userMsg);
|
|
341
|
-
session.conversation.addUserMessage(await
|
|
378
|
+
session.conversation.addUserMessage(await buildProviderUserContent(content, attachments, this.artifactStore));
|
|
342
379
|
session.lastActivityAt = now;
|
|
343
380
|
this._updateMeta(session, {
|
|
344
381
|
messageCount: session.messages.length,
|
|
@@ -357,106 +394,6 @@ export class CompanionChatManager {
|
|
|
357
394
|
});
|
|
358
395
|
return messageId;
|
|
359
396
|
}
|
|
360
|
-
resolveAttachments(inputs) {
|
|
361
|
-
if (inputs.length === 0)
|
|
362
|
-
return [];
|
|
363
|
-
if (inputs.length > MAX_ATTACHMENTS_PER_MESSAGE) {
|
|
364
|
-
throw Object.assign(new Error(`A companion chat message can include at most ${MAX_ATTACHMENTS_PER_MESSAGE} attachments.`), { code: 'TOO_MANY_ATTACHMENTS', status: 400 });
|
|
365
|
-
}
|
|
366
|
-
if (!this.artifactStore) {
|
|
367
|
-
throw Object.assign(new Error('Companion chat attachments require an artifact store.'), { code: 'ATTACHMENTS_UNAVAILABLE', status: 501 });
|
|
368
|
-
}
|
|
369
|
-
return inputs.map((input) => {
|
|
370
|
-
const artifactId = input.artifactId.trim();
|
|
371
|
-
if (!artifactId) {
|
|
372
|
-
throw Object.assign(new Error('Attachment artifactId is required.'), {
|
|
373
|
-
code: 'INVALID_ATTACHMENT',
|
|
374
|
-
status: 400,
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
const artifact = this.artifactStore.get(artifactId);
|
|
378
|
-
if (!artifact) {
|
|
379
|
-
throw Object.assign(new Error(`Unknown attachment artifact: ${artifactId}`), {
|
|
380
|
-
code: 'UNKNOWN_ARTIFACT',
|
|
381
|
-
status: 404,
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
return {
|
|
385
|
-
...artifact,
|
|
386
|
-
artifactId: artifact.id,
|
|
387
|
-
...(input.label?.trim() ? { label: input.label.trim() } : {}),
|
|
388
|
-
metadata: {
|
|
389
|
-
...artifact.metadata,
|
|
390
|
-
...(input.metadata ?? {}),
|
|
391
|
-
},
|
|
392
|
-
};
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
formatAttachmentSummary(attachments) {
|
|
396
|
-
if (attachments.length === 0)
|
|
397
|
-
return '';
|
|
398
|
-
const lines = attachments.map((attachment, index) => {
|
|
399
|
-
const name = attachment.label ?? attachment.filename ?? attachment.artifactId;
|
|
400
|
-
return `${index + 1}. ${name} (${attachment.mimeType}, ${attachment.sizeBytes} bytes, artifact ${attachment.artifactId})`;
|
|
401
|
-
});
|
|
402
|
-
return `\n\nAttached file${attachments.length === 1 ? '' : 's'}:\n${lines.join('\n')}`;
|
|
403
|
-
}
|
|
404
|
-
buildReplayUserContent(message) {
|
|
405
|
-
return `${message.content}${this.formatAttachmentSummary(message.attachments ?? [])}`;
|
|
406
|
-
}
|
|
407
|
-
isInlineTextAttachment(attachment) {
|
|
408
|
-
const lower = attachment.mimeType.toLowerCase();
|
|
409
|
-
return attachment.sizeBytes <= MAX_INLINE_TEXT_ATTACHMENT_BYTES
|
|
410
|
-
&& (lower.startsWith('text/')
|
|
411
|
-
|| lower === 'application/json'
|
|
412
|
-
|| lower === 'application/xml'
|
|
413
|
-
|| lower === 'application/yaml'
|
|
414
|
-
|| lower === 'text/csv');
|
|
415
|
-
}
|
|
416
|
-
isInlineImageAttachment(attachment) {
|
|
417
|
-
const lower = attachment.mimeType.toLowerCase();
|
|
418
|
-
return attachment.sizeBytes <= MAX_INLINE_IMAGE_ATTACHMENT_BYTES
|
|
419
|
-
&& (lower === 'image/png'
|
|
420
|
-
|| lower === 'image/jpeg'
|
|
421
|
-
|| lower === 'image/gif'
|
|
422
|
-
|| lower === 'image/webp');
|
|
423
|
-
}
|
|
424
|
-
async buildProviderUserContent(content, attachments) {
|
|
425
|
-
if (attachments.length === 0)
|
|
426
|
-
return content;
|
|
427
|
-
const textSections = [content.trim() ? content : 'Please review the attached file(s).'];
|
|
428
|
-
const imageParts = [];
|
|
429
|
-
for (const attachment of attachments) {
|
|
430
|
-
if (!this.artifactStore)
|
|
431
|
-
continue;
|
|
432
|
-
try {
|
|
433
|
-
if (this.isInlineTextAttachment(attachment)) {
|
|
434
|
-
const { buffer } = await this.artifactStore.readContent(attachment.artifactId);
|
|
435
|
-
const text = toNodeBuffer(buffer).toString('utf-8');
|
|
436
|
-
textSections.push(`\n\n--- Attachment: ${attachment.label ?? attachment.filename ?? attachment.artifactId} ---\n${text}`);
|
|
437
|
-
continue;
|
|
438
|
-
}
|
|
439
|
-
if (this.isInlineImageAttachment(attachment)) {
|
|
440
|
-
const { buffer } = await this.artifactStore.readContent(attachment.artifactId);
|
|
441
|
-
imageParts.push({
|
|
442
|
-
type: 'image',
|
|
443
|
-
mediaType: attachment.mimeType,
|
|
444
|
-
data: toNodeBuffer(buffer).toString('base64'),
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
catch (error) {
|
|
449
|
-
logger.warn('[companion-chat] failed to inline attachment for provider prompt', {
|
|
450
|
-
artifactId: attachment.artifactId,
|
|
451
|
-
error: summarizeError(error),
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
textSections.push(this.formatAttachmentSummary(attachments));
|
|
456
|
-
if (imageParts.length === 0)
|
|
457
|
-
return textSections.join('');
|
|
458
|
-
return [{ type: 'text', text: textSections.join('') }, ...imageParts];
|
|
459
|
-
}
|
|
460
397
|
dispose() {
|
|
461
398
|
if (this.gcTimer) {
|
|
462
399
|
clearInterval(this.gcTimer);
|
|
@@ -706,30 +643,52 @@ export class CompanionChatManager {
|
|
|
706
643
|
// ---------------------------------------------------------------------------
|
|
707
644
|
// GC sweep
|
|
708
645
|
// ---------------------------------------------------------------------------
|
|
646
|
+
/**
|
|
647
|
+
* Periodic GC sweep. Deletion authority is SPLIT (charter: closed sessions are
|
|
648
|
+
* HISTORY): close-idle closes an idle active session; evict-memory drops a
|
|
649
|
+
* long-closed session's in-memory handles (meta + on-disk copy kept);
|
|
650
|
+
* delete-persistent removes the file ONLY under an explicit finite retention
|
|
651
|
+
* window (default retains indefinitely — see {@link planCompanionSweep}).
|
|
652
|
+
*/
|
|
709
653
|
_gcSweep() {
|
|
710
654
|
const now = Date.now();
|
|
711
655
|
for (const [id, session] of this.sessions) {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
656
|
+
const action = planCompanionSweep({
|
|
657
|
+
status: session.meta.status,
|
|
658
|
+
closedAt: session.meta.closedAt,
|
|
659
|
+
lastActivityAt: session.lastActivityAt,
|
|
660
|
+
hasMessagesInMemory: !session.messagesEvicted && session.messages.length > 0,
|
|
661
|
+
isEmpty: session.messages.length === 0,
|
|
662
|
+
}, {
|
|
663
|
+
now,
|
|
664
|
+
idleActiveMs: this.idleActiveMs,
|
|
665
|
+
idleEmptyMs: this.idleEmptyMs,
|
|
666
|
+
closedMemoryGraceMs: this.closedMemoryGraceMs,
|
|
667
|
+
closedRetentionMs: this.closedRetentionMs,
|
|
668
|
+
});
|
|
669
|
+
switch (action.kind) {
|
|
670
|
+
case 'close-idle':
|
|
671
|
+
session.abortController.abort();
|
|
672
|
+
this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
|
|
673
|
+
this._persist(id);
|
|
674
|
+
this._brokerSync.track(id, () => this._brokerSync.closeSession(id));
|
|
675
|
+
break;
|
|
676
|
+
case 'evict-memory':
|
|
677
|
+
// Free heavy handles; keep meta (listable) and the persisted file.
|
|
678
|
+
session.messages = [];
|
|
679
|
+
session.conversation = new ConversationManager();
|
|
680
|
+
session.messagesEvicted = true;
|
|
681
|
+
break;
|
|
682
|
+
case 'delete-persistent':
|
|
683
|
+
void this._hardRemove(id).catch((error) => {
|
|
716
684
|
logger.warn('[companion-chat] session delete failed', {
|
|
717
685
|
sessionId: id,
|
|
718
686
|
error: summarizeError(error),
|
|
719
687
|
});
|
|
720
688
|
});
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
}
|
|
725
|
-
const idleMs = now - session.lastActivityAt;
|
|
726
|
-
const isEmpty = session.messages.length === 0;
|
|
727
|
-
const ttl = isEmpty ? this.idleEmptyMs : this.idleActiveMs;
|
|
728
|
-
if (idleMs >= ttl) {
|
|
729
|
-
// Close via GC
|
|
730
|
-
session.abortController.abort();
|
|
731
|
-
this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
|
|
732
|
-
this._persist(id);
|
|
689
|
+
break;
|
|
690
|
+
case 'retain':
|
|
691
|
+
break;
|
|
733
692
|
}
|
|
734
693
|
}
|
|
735
694
|
}
|
|
@@ -738,6 +697,33 @@ export class CompanionChatManager {
|
|
|
738
697
|
session.meta = updated;
|
|
739
698
|
return updated;
|
|
740
699
|
}
|
|
700
|
+
// ---------------------------------------------------------------------------
|
|
701
|
+
// Live shared-broker registration (S1 item D) — see companion-chat-broker-sync.ts
|
|
702
|
+
// ---------------------------------------------------------------------------
|
|
703
|
+
/**
|
|
704
|
+
* Await all in-flight best-effort broker-sync operations. The daemon's
|
|
705
|
+
* companion HTTP routes call this before responding so `/api/sessions`
|
|
706
|
+
* reflects the change synchronously; tests use it to make the mirror
|
|
707
|
+
* deterministic. A no-op when no broker bridge is configured.
|
|
708
|
+
*/
|
|
709
|
+
async flushBrokerSync() {
|
|
710
|
+
await this._brokerSync.flush();
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Hard-remove a session's persisted file and in-memory record. The ONE
|
|
714
|
+
* removal code path — shared by {@link deleteSession} and the GC
|
|
715
|
+
* 'delete-persistent' action. Never fork this. Order matters (Wave-5 F1):
|
|
716
|
+
* drop the map entry, drain any in-flight {@link _persist} save for this
|
|
717
|
+
* id, THEN unlink — else a save mid-write from {@link closeSession} can
|
|
718
|
+
* resurrect the file post-unlink.
|
|
719
|
+
*/
|
|
720
|
+
async _hardRemove(sessionId) {
|
|
721
|
+
this.sessions.delete(sessionId);
|
|
722
|
+
const pendingSave = this._pendingSaves.get(sessionId);
|
|
723
|
+
if (pendingSave)
|
|
724
|
+
await pendingSave.catch(() => { });
|
|
725
|
+
await this.persistence?.delete(sessionId);
|
|
726
|
+
}
|
|
741
727
|
/**
|
|
742
728
|
* Schedule a persistence save for the given session.
|
|
743
729
|
* Saves are serialized per-session: each new save waits for the prior one to
|
|
@@ -16,7 +16,15 @@ export interface PersistedChatSession {
|
|
|
16
16
|
readonly meta: CompanionChatSession;
|
|
17
17
|
readonly messages: CompanionChatMessage[];
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the companion-chat sessions directory.
|
|
21
|
+
*
|
|
22
|
+
* Pass the runtime's INJECTED home directory so an isolated-home daemon never
|
|
23
|
+
* reads or writes the real `~/.goodvibes/companion-chat` — the rest of the
|
|
24
|
+
* runtime resolves paths from the injected home, and this must agree. The
|
|
25
|
+
* OS `homedir()` is used only as a last resort when nothing is injected.
|
|
26
|
+
*/
|
|
27
|
+
export declare function defaultSessionsDir(homeDirectory?: string): string;
|
|
20
28
|
export declare class CompanionChatPersistence {
|
|
21
29
|
private readonly sessionsDir;
|
|
22
30
|
constructor(sessionsDir?: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companion-chat-persistence.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQ5F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAC3C;AAMD,wBAAgB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"companion-chat-persistence.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQ5F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAC3C;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAMD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,CAAC,EAAE,MAAM;IAIhC,4CAA4C;IAC5C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAIhB,0FAA0F;IACpF,OAAO,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAoChD,iFAAiF;IAC3E,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BxD,yGAAyG;IACnG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU/C"}
|
|
@@ -20,8 +20,16 @@ import { summarizeError } from '../utils/error-display.js';
|
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
21
|
// Default path
|
|
22
22
|
// ---------------------------------------------------------------------------
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the companion-chat sessions directory.
|
|
25
|
+
*
|
|
26
|
+
* Pass the runtime's INJECTED home directory so an isolated-home daemon never
|
|
27
|
+
* reads or writes the real `~/.goodvibes/companion-chat` — the rest of the
|
|
28
|
+
* runtime resolves paths from the injected home, and this must agree. The
|
|
29
|
+
* OS `homedir()` is used only as a last resort when nothing is injected.
|
|
30
|
+
*/
|
|
31
|
+
export function defaultSessionsDir(homeDirectory) {
|
|
32
|
+
return join(homeDirectory ?? homedir(), '.goodvibes', 'companion-chat', 'sessions');
|
|
25
33
|
}
|
|
26
34
|
// ---------------------------------------------------------------------------
|
|
27
35
|
// CompanionChatPersistence
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* POST /api/companion/chat/sessions
|
|
8
8
|
* GET /api/companion/chat/sessions/:sessionId
|
|
9
9
|
* PATCH /api/companion/chat/sessions/:sessionId
|
|
10
|
-
*
|
|
10
|
+
* POST /api/companion/chat/sessions/:sessionId/close (soft close — history preserved)
|
|
11
|
+
* DELETE /api/companion/chat/sessions/:sessionId (hard delete — record permanently removed)
|
|
11
12
|
* POST /api/companion/chat/sessions/:sessionId/messages
|
|
12
13
|
* GET /api/companion/chat/sessions/:sessionId/messages
|
|
13
14
|
* GET /api/companion/chat/sessions/:sessionId/events (SSE)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companion-chat-routes.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-routes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"companion-chat-routes.d.ts","sourceRoot":"","sources":["../../../src/platform/companion/companion-chat-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAMjF;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyD1B;AAgPD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMlF"}
|