@pellux/goodvibes-sdk 0.38.0 → 1.1.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 +4468 -916
- 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 +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/orchestrator-runner.d.ts +16 -3
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +20 -6
- package/dist/platform/agents/orchestrator.d.ts +42 -10
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +68 -20
- 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 +88 -3
- package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -1
- package/dist/platform/agents/turn-knowledge-injection.js +147 -30
- 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 +24 -1
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +161 -35
- 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-branching.d.ts +66 -0
- package/dist/platform/companion/companion-chat-branching.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-branching.js +142 -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 +91 -23
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +195 -223
- 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 +113 -4
- package/dist/platform/companion/companion-chat-turn-execution.d.ts +61 -0
- package/dist/platform/companion/companion-chat-turn-execution.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-turn-execution.js +107 -0
- package/dist/platform/companion/companion-chat-types.d.ts +67 -0
- package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
- 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 +9 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +21 -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-domain-runtime.d.ts +8 -0
- package/dist/platform/config/schema-domain-runtime.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-runtime.js +32 -0
- package/dist/platform/config/schema-types.d.ts +21 -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 +8 -1
- package/dist/platform/control-plane/index.d.ts.map +1 -1
- package/dist/platform/control-plane/index.js +8 -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 +176 -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-push.d.ts +30 -0
- package/dist/platform/control-plane/method-catalog-push.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-push.js +80 -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-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-runtime.js +83 -1
- 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 +34 -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 +37 -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 +100 -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/push.d.ts +26 -0
- package/dist/platform/control-plane/routes/push.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/push.js +104 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts +31 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.js +16 -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/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 +1 -0
- package/dist/platform/core/index.d.ts.map +1 -1
- package/dist/platform/core/index.js +1 -0
- package/dist/platform/core/orchestrator-runtime.d.ts +23 -3
- 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 +13 -6
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +29 -22
- package/dist/platform/core/orchestrator.d.ts +16 -10
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +23 -8
- 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 +39 -0
- package/dist/platform/core/plan-proposal.d.ts.map +1 -1
- 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 +69 -0
- package/dist/platform/daemon/boot.d.ts.map +1 -0
- package/dist/platform/daemon/boot.js +61 -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 +15 -6
- package/dist/platform/daemon/facade.d.ts.map +1 -1
- package/dist/platform/daemon/facade.js +48 -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 +2 -1
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +42 -40
- 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/http/webui-serving.d.ts +68 -0
- package/dist/platform/daemon/http/webui-serving.d.ts.map +1 -0
- package/dist/platform/daemon/http/webui-serving.js +230 -0
- 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 +1 -1
- 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 +2 -2
- package/dist/platform/orchestration/cancellation.d.ts +2 -2
- package/dist/platform/orchestration/controller-compat.d.ts +16 -3
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -1
- package/dist/platform/orchestration/controller-compat.js +18 -4
- package/dist/platform/orchestration/dirty-guard.js +1 -1
- package/dist/platform/orchestration/engine.d.ts +26 -1
- package/dist/platform/orchestration/engine.d.ts.map +1 -1
- package/dist/platform/orchestration/engine.js +229 -25
- package/dist/platform/orchestration/index.d.ts +6 -4
- package/dist/platform/orchestration/index.d.ts.map +1 -1
- package/dist/platform/orchestration/index.js +3 -2
- package/dist/platform/orchestration/persistence.d.ts.map +1 -1
- package/dist/platform/orchestration/persistence.js +6 -3
- package/dist/platform/orchestration/phase-runner.d.ts +33 -6
- package/dist/platform/orchestration/phase-runner.d.ts.map +1 -1
- package/dist/platform/orchestration/phase-runner.js +98 -25
- 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 +20 -1
- package/dist/platform/orchestration/scheduler.d.ts.map +1 -1
- package/dist/platform/orchestration/scheduler.js +16 -0
- package/dist/platform/orchestration/types.d.ts +289 -4
- package/dist/platform/orchestration/types.d.ts.map +1 -1
- package/dist/platform/orchestration/types.js +32 -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/push/delivery.d.ts +48 -0
- package/dist/platform/push/delivery.d.ts.map +1 -0
- package/dist/platform/push/delivery.js +117 -0
- package/dist/platform/push/encryption.d.ts +41 -0
- package/dist/platform/push/encryption.d.ts.map +1 -0
- package/dist/platform/push/encryption.js +82 -0
- package/dist/platform/push/index.d.ts +17 -0
- package/dist/platform/push/index.d.ts.map +1 -0
- package/dist/platform/push/index.js +10 -0
- package/dist/platform/push/service.d.ts +75 -0
- package/dist/platform/push/service.d.ts.map +1 -0
- package/dist/platform/push/service.js +95 -0
- package/dist/platform/push/subscription-store.d.ts +50 -0
- package/dist/platform/push/subscription-store.d.ts.map +1 -0
- package/dist/platform/push/subscription-store.js +123 -0
- package/dist/platform/push/types.d.ts +68 -0
- package/dist/platform/push/types.d.ts.map +1 -0
- package/dist/platform/push/types.js +13 -0
- package/dist/platform/push/vapid.d.ts +54 -0
- package/dist/platform/push/vapid.d.ts.map +1 -0
- package/dist/platform/push/vapid.js +113 -0
- 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/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 +39 -1
- package/dist/platform/runtime/fleet/adapters/agent.d.ts +2 -2
- package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/agent.js +4 -4
- package/dist/platform/runtime/fleet/adapters/automation.d.ts +1 -1
- package/dist/platform/runtime/fleet/adapters/automation.js +1 -1
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts +1 -1
- package/dist/platform/runtime/fleet/adapters/code-index.js +1 -1
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +40 -18
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/orchestration.js +138 -34
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts +4 -4
- package/dist/platform/runtime/fleet/adapters/schedule.js +4 -4
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts +3 -4
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/trigger.js +3 -4
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +13 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/wrfc.js +49 -2
- package/dist/platform/runtime/fleet/registry.d.ts +7 -7
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/registry.js +41 -7
- package/dist/platform/runtime/fleet/types.d.ts +9 -9
- package/dist/platform/runtime/fleet/types.d.ts.map +1 -1
- package/dist/platform/runtime/memory-spine/client.d.ts +127 -0
- package/dist/platform/runtime/memory-spine/client.d.ts.map +1 -0
- package/dist/platform/runtime/memory-spine/client.js +113 -0
- package/dist/platform/runtime/memory-spine/index.d.ts +11 -0
- package/dist/platform/runtime/memory-spine/index.d.ts.map +1 -0
- package/dist/platform/runtime/memory-spine/index.js +10 -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/services.d.ts +11 -9
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +24 -9
- 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.js +1 -1
- package/dist/platform/state/code-index-db.d.ts +1 -1
- 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.map +1 -1
- package/dist/platform/state/code-index-store.js +11 -3
- package/dist/platform/state/index.d.ts +8 -0
- package/dist/platform/state/index.d.ts.map +1 -1
- package/dist/platform/state/index.js +4 -0
- package/dist/platform/state/memory-recall-contract.d.ts +118 -0
- package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
- package/dist/platform/state/memory-recall-contract.js +170 -0
- package/dist/platform/state/memory-registry.d.ts +8 -0
- package/dist/platform/state/memory-registry.d.ts.map +1 -1
- package/dist/platform/state/memory-registry.js +10 -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.map +1 -1
- package/dist/platform/state/memory-vector-store.js +14 -3
- 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 +1 -1
- package/dist/platform/state/sqlite-vec-loader.js +1 -1
- 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 +22 -10
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +13 -7
- 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 +27 -10
- package/dist/platform/tools/exec/schema.d.ts +2 -2
- 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 +1 -1
- 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 +1 -1
- package/dist/platform/tools/registry.js +1 -1
- 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 +1 -1
- package/dist/platform/utils/request-body.d.ts.map +1 -1
- package/dist/platform/utils/request-body.js +50 -5
- package/dist/platform/version.js +1 -1
- package/package.json +25 -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,12 +19,16 @@
|
|
|
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 { activeMessages, applyEditBranch, planRegenerate, } from './companion-chat-branching.js';
|
|
28
|
+
import { executeCompanionToolCalls, runToolExhaustionFinalizer, } from './companion-chat-turn-execution.js';
|
|
29
|
+
import { planCompanionSweep } from './companion-chat-gc.js';
|
|
30
|
+
import { CompanionBrokerSync } from './companion-chat-broker-sync.js';
|
|
26
31
|
import { CompanionChatRateLimiter } from './companion-chat-rate-limiter.js';
|
|
27
|
-
import { executeToolCalls as executeOrchestratorToolCalls } from '../core/orchestrator-tool-runtime.js';
|
|
28
32
|
import { appendGoodVibesRuntimeAwarenessPrompt } from '../tools/goodvibes-runtime/index.js';
|
|
29
33
|
import { summarizeError } from '../utils/error-display.js';
|
|
30
34
|
import { logger } from '../utils/logger.js';
|
|
@@ -33,6 +37,7 @@ import { logger } from '../utils/logger.js';
|
|
|
33
37
|
// ---------------------------------------------------------------------------
|
|
34
38
|
const DEFAULT_IDLE_ACTIVE_MS = 30 * 60 * 1_000; // 30 minutes with messages
|
|
35
39
|
const DEFAULT_IDLE_EMPTY_MS = 5 * 60 * 1_000; // 5 minutes empty session
|
|
40
|
+
const DEFAULT_CLOSED_MEMORY_GRACE_MS = 5 * 60 * 1_000; // evict closed bodies from RAM after 5 min
|
|
36
41
|
const GC_INTERVAL_MS = 60 * 1_000; // sweep every minute
|
|
37
42
|
const MAX_TOOL_ROUNDS_PER_TURN = 8;
|
|
38
43
|
const TOOL_EXHAUSTION_FINALIZER_PROMPT = [
|
|
@@ -42,16 +47,6 @@ const TOOL_EXHAUSTION_FINALIZER_PROMPT = [
|
|
|
42
47
|
'If the available tool results are insufficient, say what is missing and ask one short follow-up '
|
|
43
48
|
+ 'question.',
|
|
44
49
|
].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
50
|
function assertCompleteProviderModelRoute(input) {
|
|
56
51
|
if ((input.model !== undefined) === (input.provider !== undefined))
|
|
57
52
|
return;
|
|
@@ -73,6 +68,10 @@ export class CompanionChatManager {
|
|
|
73
68
|
rateLimiter;
|
|
74
69
|
idleActiveMs;
|
|
75
70
|
idleEmptyMs;
|
|
71
|
+
closedMemoryGraceMs;
|
|
72
|
+
closedRetentionMs;
|
|
73
|
+
/** Live mirror of sessions into the shared broker store (S1 item D). */
|
|
74
|
+
_brokerSync;
|
|
76
75
|
gcTimer = null;
|
|
77
76
|
/** Tracks whether the async init() has completed. */
|
|
78
77
|
initCompleted = false;
|
|
@@ -93,13 +92,17 @@ export class CompanionChatManager {
|
|
|
93
92
|
this.artifactStore = config.artifactStore ?? null;
|
|
94
93
|
this.idleActiveMs = config.idleActiveMs ?? DEFAULT_IDLE_ACTIVE_MS;
|
|
95
94
|
this.idleEmptyMs = config.idleEmptyMs ?? DEFAULT_IDLE_EMPTY_MS;
|
|
95
|
+
this.closedMemoryGraceMs = config.closedSessionMemoryGraceMs ?? DEFAULT_CLOSED_MEMORY_GRACE_MS;
|
|
96
|
+
this.closedRetentionMs = config.closedSessionRetentionMs;
|
|
97
|
+
this._brokerSync = new CompanionBrokerSync(config.sessionBroker ?? null);
|
|
96
98
|
// Persistence
|
|
97
99
|
// Default is false — most callers (tests, downstream consumers) get the
|
|
98
100
|
// safe no-write default. The daemon opts into persistence explicitly via
|
|
99
|
-
// persist: true in facade-composition.
|
|
101
|
+
// persist: true in facade-composition. When sessionsDir is omitted, derive
|
|
102
|
+
// the root from the INJECTED home so an isolated-home daemon stays inside it.
|
|
100
103
|
const persist = config.persist === true;
|
|
101
104
|
this.persistence = persist
|
|
102
|
-
? new CompanionChatPersistence(config.sessionsDir ?? defaultSessionsDir())
|
|
105
|
+
? new CompanionChatPersistence(config.sessionsDir ?? defaultSessionsDir(config.homeDirectory))
|
|
103
106
|
: null;
|
|
104
107
|
// Rate limiter
|
|
105
108
|
this.rateLimiter =
|
|
@@ -130,18 +133,18 @@ export class CompanionChatManager {
|
|
|
130
133
|
const stored = await this.persistence.loadAll();
|
|
131
134
|
for (const { meta, messages } of stored) {
|
|
132
135
|
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
136
|
const conversation = new ConversationManager();
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
137
|
+
// Closed-skip fix: closed sessions load in a lightweight terminal state
|
|
138
|
+
// (meta + messages retained, listable/importable; no history replay). GC
|
|
139
|
+
// (_gcSweep) remains the sole deletion authority.
|
|
140
|
+
if (meta.status !== 'closed') {
|
|
141
|
+
for (const msg of normalizedMessages) {
|
|
142
|
+
if (msg.role === 'user') {
|
|
143
|
+
conversation.addUserMessage(buildReplayUserContent(msg));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
conversation.addAssistantMessage(msg.content);
|
|
147
|
+
}
|
|
145
148
|
}
|
|
146
149
|
}
|
|
147
150
|
this.sessions.set(meta.id, {
|
|
@@ -185,6 +188,9 @@ export class CompanionChatManager {
|
|
|
185
188
|
subscriberClientId: null,
|
|
186
189
|
});
|
|
187
190
|
this._persist(id);
|
|
191
|
+
// Live spine: mirror the new session into the shared broker at write time so
|
|
192
|
+
// /api/sessions reflects it same-process (no restart). Best-effort.
|
|
193
|
+
this._brokerSync.track(meta.id, () => this._brokerSync.registerSession(meta));
|
|
188
194
|
return meta;
|
|
189
195
|
}
|
|
190
196
|
getSession(sessionId) {
|
|
@@ -226,7 +232,7 @@ export class CompanionChatManager {
|
|
|
226
232
|
throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
|
|
227
233
|
}
|
|
228
234
|
if (session.meta.status === 'closed') {
|
|
229
|
-
throw Object.assign(new Error(
|
|
235
|
+
throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
|
|
230
236
|
}
|
|
231
237
|
const patch = { updatedAt: Date.now() };
|
|
232
238
|
if (input.title !== undefined)
|
|
@@ -239,6 +245,9 @@ export class CompanionChatManager {
|
|
|
239
245
|
patch.systemPrompt = input.systemPrompt;
|
|
240
246
|
const updated = this._updateMeta(session, patch);
|
|
241
247
|
this._persist(sessionId);
|
|
248
|
+
// Heartbeat the broker record (advances participant.lastSeenAt). Title is
|
|
249
|
+
// never overwritten by this path (broker treats register as a heartbeat).
|
|
250
|
+
this._brokerSync.track(updated.id, () => this._brokerSync.registerSession(updated));
|
|
242
251
|
return updated;
|
|
243
252
|
}
|
|
244
253
|
/**
|
|
@@ -267,8 +276,37 @@ export class CompanionChatManager {
|
|
|
267
276
|
const now = Date.now();
|
|
268
277
|
const updated = this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
|
|
269
278
|
this._persist(sessionId);
|
|
279
|
+
// Live spine: flip the shared broker record to closed at write time.
|
|
280
|
+
this._brokerSync.track(sessionId, () => this._brokerSync.closeSession(sessionId));
|
|
270
281
|
return updated;
|
|
271
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* Permanently delete a session (see CHANGELOG 1.0.0: `delete` is now a genuine removal,
|
|
285
|
+
* distinct from `closeSession` above). Aborts any in-flight turn, removes
|
|
286
|
+
* the on-disk record file, and drops the in-memory entry — reusing
|
|
287
|
+
* {@link _hardRemove}, the SAME primitive the GC 'delete-persistent' sweep
|
|
288
|
+
* action uses, so there is exactly one removal code path.
|
|
289
|
+
*
|
|
290
|
+
* Requires the session to already be closed: deleting a still-active
|
|
291
|
+
* session throws `{ code: 'SESSION_ACTIVE', status: 409 }` (the caller must
|
|
292
|
+
* close it first, mirroring the SESSION_CLOSED-throw convention elsewhere
|
|
293
|
+
* in this file). An unknown OR already-deleted id throws
|
|
294
|
+
* `{ code: 'SESSION_NOT_FOUND', status: 404 }` — delete is not a 200-noop.
|
|
295
|
+
*/
|
|
296
|
+
async deleteSession(sessionId) {
|
|
297
|
+
const session = this.sessions.get(sessionId);
|
|
298
|
+
if (!session) {
|
|
299
|
+
throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
|
|
300
|
+
}
|
|
301
|
+
if (session.meta.status !== 'closed') {
|
|
302
|
+
throw Object.assign(new Error('Session is active — close it, then delete.'), { code: 'SESSION_ACTIVE', status: 409 });
|
|
303
|
+
}
|
|
304
|
+
session.abortController.abort();
|
|
305
|
+
await this._hardRemove(sessionId);
|
|
306
|
+
// Live spine: drop the mirrored shared broker record entirely (not just closed).
|
|
307
|
+
this._brokerSync.track(sessionId, () => this._brokerSync.deleteSession(sessionId));
|
|
308
|
+
return { sessionId, deleted: true };
|
|
309
|
+
}
|
|
272
310
|
/**
|
|
273
311
|
* Post a user message and start an async LLM turn. Returns the messageId.
|
|
274
312
|
*
|
|
@@ -318,11 +356,11 @@ export class CompanionChatManager {
|
|
|
318
356
|
throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
|
|
319
357
|
}
|
|
320
358
|
if (session.meta.status === 'closed') {
|
|
321
|
-
throw Object.assign(new Error(
|
|
359
|
+
throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
|
|
322
360
|
}
|
|
323
361
|
// Rate-limit check (throws GoodVibesSdkError on violation)
|
|
324
362
|
this.rateLimiter?.check(sessionId, clientId);
|
|
325
|
-
const attachments =
|
|
363
|
+
const attachments = resolveAttachments(options.attachments ?? [], this.artifactStore);
|
|
326
364
|
if (!content.trim() && attachments.length === 0) {
|
|
327
365
|
throw Object.assign(new Error('content or attachments are required'), { code: 'INVALID_INPUT', status: 400 });
|
|
328
366
|
}
|
|
@@ -338,7 +376,7 @@ export class CompanionChatManager {
|
|
|
338
376
|
createdAt: now,
|
|
339
377
|
};
|
|
340
378
|
session.messages.push(userMsg);
|
|
341
|
-
session.conversation.addUserMessage(await
|
|
379
|
+
session.conversation.addUserMessage(await buildProviderUserContent(content, attachments, this.artifactStore));
|
|
342
380
|
session.lastActivityAt = now;
|
|
343
381
|
this._updateMeta(session, {
|
|
344
382
|
messageCount: session.messages.length,
|
|
@@ -357,106 +395,6 @@ export class CompanionChatManager {
|
|
|
357
395
|
});
|
|
358
396
|
return messageId;
|
|
359
397
|
}
|
|
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
398
|
dispose() {
|
|
461
399
|
if (this.gcTimer) {
|
|
462
400
|
clearInterval(this.gcTimer);
|
|
@@ -563,11 +501,11 @@ export class CompanionChatManager {
|
|
|
563
501
|
completed = true;
|
|
564
502
|
break;
|
|
565
503
|
}
|
|
566
|
-
const toolResults = await this.
|
|
504
|
+
const toolResults = await executeCompanionToolCalls({ toolRegistry: this.toolRegistry, permissionManager: this.permissionManager, hookDispatcher: this.hookDispatcher, runtimeBus: this.runtimeBus }, toolCalls, publish, sessionId, turnId);
|
|
567
505
|
session.conversation.addToolResults(toolResults);
|
|
568
506
|
}
|
|
569
507
|
if (!completed && !abortSignal.aborted) {
|
|
570
|
-
const finalResponse = await this.
|
|
508
|
+
const finalResponse = await runToolExhaustionFinalizer({ provider: this.provider, finalizerPrompt: TOOL_EXHAUSTION_FINALIZER_PROMPT }, session, abortSignal, turnId, publish);
|
|
571
509
|
if (finalResponse.trim()) {
|
|
572
510
|
assistantContent += finalResponse;
|
|
573
511
|
session.conversation.addAssistantMessage(finalResponse);
|
|
@@ -623,113 +561,120 @@ export class CompanionChatManager {
|
|
|
623
561
|
}
|
|
624
562
|
}
|
|
625
563
|
}
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
}
|
|
645
|
-
case 'error':
|
|
646
|
-
throw new Error(chunk.error ?? 'Provider streaming error');
|
|
647
|
-
case 'tool_call':
|
|
648
|
-
case 'tool_result':
|
|
649
|
-
case 'done':
|
|
650
|
-
break;
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
return finalContent;
|
|
564
|
+
// ---------------------------------------------------------------------------
|
|
565
|
+
// Regenerate + edit-and-branch (honest lineage — see companion-chat-branching.ts)
|
|
566
|
+
// ---------------------------------------------------------------------------
|
|
567
|
+
/**
|
|
568
|
+
* Regenerate an assistant response: supersede the target assistant message (an
|
|
569
|
+
* explicit id, or the latest response) and everything after it — retained as
|
|
570
|
+
* history, never deleted — then re-run a fresh turn from the preceding user
|
|
571
|
+
* message. Refuses a closed (409 SESSION_CLOSED) or unknown (404
|
|
572
|
+
* SESSION_NOT_FOUND) session; honest code when there is nothing to regenerate.
|
|
573
|
+
*/
|
|
574
|
+
regenerateMessage(sessionId, input = {}) {
|
|
575
|
+
const session = this._requireOpenSession(sessionId);
|
|
576
|
+
this.rateLimiter?.check(sessionId, '');
|
|
577
|
+
const now = Date.now();
|
|
578
|
+
const plan = planRegenerate(session, input.messageId, now);
|
|
579
|
+
this._commitBranchAndRun(session, sessionId, plan.anchorUserMessageId, now);
|
|
580
|
+
const { regeneratedFrom, supersededMessageIds } = plan;
|
|
581
|
+
return { sessionId, regeneratedFrom, supersededMessageIds, turnStarted: true };
|
|
654
582
|
}
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
return toolResult;
|
|
676
|
-
});
|
|
583
|
+
/**
|
|
584
|
+
* Edit a user message and branch from it: supersede the target user message and
|
|
585
|
+
* everything after it (retained history), append a new user message carrying
|
|
586
|
+
* `revisionOf` back to the original, and run a fresh turn. Same closed/unknown
|
|
587
|
+
* refusals as {@link regenerateMessage}.
|
|
588
|
+
*/
|
|
589
|
+
editMessage(sessionId, input) {
|
|
590
|
+
const session = this._requireOpenSession(sessionId);
|
|
591
|
+
this.rateLimiter?.check(sessionId, '');
|
|
592
|
+
const now = Date.now();
|
|
593
|
+
const plan = applyEditBranch(session, sessionId, input, this.artifactStore, now);
|
|
594
|
+
this._commitBranchAndRun(session, sessionId, plan.newMessageId, now);
|
|
595
|
+
const { editedFrom, newMessageId, supersededMessageIds } = plan;
|
|
596
|
+
return { sessionId, editedFrom, messageId: newMessageId, supersededMessageIds, turnStarted: true };
|
|
597
|
+
}
|
|
598
|
+
/** Look up an active (open) session or throw the closed/not-found machine codes. */
|
|
599
|
+
_requireOpenSession(sessionId) {
|
|
600
|
+
const session = this.sessions.get(sessionId);
|
|
601
|
+
if (!session) {
|
|
602
|
+
throw Object.assign(new Error(`Session not found: ${sessionId}`), { code: 'SESSION_NOT_FOUND', status: 404 });
|
|
677
603
|
}
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
permissionManager: this.permissionManager,
|
|
681
|
-
hookDispatcher: this.hookDispatcher,
|
|
682
|
-
runtimeBus: this.runtimeBus,
|
|
683
|
-
sessionId,
|
|
684
|
-
emitterContext: (id) => ({
|
|
685
|
-
sessionId,
|
|
686
|
-
traceId: `${sessionId}:${id}`,
|
|
687
|
-
source: 'companion-chat',
|
|
688
|
-
}),
|
|
689
|
-
}, turnId, toolCalls);
|
|
690
|
-
for (const [index, toolResult] of results.entries()) {
|
|
691
|
-
const call = toolCalls[index];
|
|
692
|
-
if (!call)
|
|
693
|
-
continue;
|
|
694
|
-
publish({
|
|
695
|
-
type: 'turn.tool_result',
|
|
696
|
-
sessionId,
|
|
697
|
-
turnId,
|
|
698
|
-
toolCallId: call.id,
|
|
699
|
-
toolName: call.name,
|
|
700
|
-
result: toolResult.output ?? toolResult.error ?? null,
|
|
701
|
-
isError: !toolResult.success,
|
|
702
|
-
});
|
|
604
|
+
if (session.meta.status === 'closed') {
|
|
605
|
+
throw Object.assign(new Error('Session is closed'), { code: SDKErrorCodes.SESSION_CLOSED, status: 409 });
|
|
703
606
|
}
|
|
704
|
-
return
|
|
607
|
+
return session;
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Shared tail of regenerate/edit: rebuild the LLM-facing conversation from the
|
|
611
|
+
* ACTIVE (non-superseded) chain (mirroring init()'s replay so the next turn
|
|
612
|
+
* sees only the live branch), persist, and fire the new turn.
|
|
613
|
+
*/
|
|
614
|
+
_commitBranchAndRun(session, sessionId, anchorUserMessageId, now) {
|
|
615
|
+
const conversation = new ConversationManager();
|
|
616
|
+
for (const msg of activeMessages(session.messages)) {
|
|
617
|
+
if (msg.role === 'user')
|
|
618
|
+
conversation.addUserMessage(buildReplayUserContent(msg));
|
|
619
|
+
else
|
|
620
|
+
conversation.addAssistantMessage(msg.content);
|
|
621
|
+
}
|
|
622
|
+
session.conversation = conversation;
|
|
623
|
+
this._updateMeta(session, { messageCount: session.messages.length, updatedAt: now });
|
|
624
|
+
this._persist(sessionId);
|
|
625
|
+
void this._runTurn(session, anchorUserMessageId).catch((error) => {
|
|
626
|
+
logger.warn('[companion-chat] branch turn execution failed', { sessionId, error: summarizeError(error) });
|
|
627
|
+
});
|
|
705
628
|
}
|
|
706
629
|
// ---------------------------------------------------------------------------
|
|
707
630
|
// GC sweep
|
|
708
631
|
// ---------------------------------------------------------------------------
|
|
632
|
+
/**
|
|
633
|
+
* Periodic GC sweep. Deletion authority is SPLIT (charter: closed sessions are
|
|
634
|
+
* HISTORY): close-idle closes an idle active session; evict-memory drops a
|
|
635
|
+
* long-closed session's in-memory handles (meta + on-disk copy kept);
|
|
636
|
+
* delete-persistent removes the file ONLY under an explicit finite retention
|
|
637
|
+
* window (default retains indefinitely — see {@link planCompanionSweep}).
|
|
638
|
+
*/
|
|
709
639
|
_gcSweep() {
|
|
710
640
|
const now = Date.now();
|
|
711
641
|
for (const [id, session] of this.sessions) {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
642
|
+
const action = planCompanionSweep({
|
|
643
|
+
status: session.meta.status,
|
|
644
|
+
closedAt: session.meta.closedAt,
|
|
645
|
+
lastActivityAt: session.lastActivityAt,
|
|
646
|
+
hasMessagesInMemory: !session.messagesEvicted && session.messages.length > 0,
|
|
647
|
+
isEmpty: session.messages.length === 0,
|
|
648
|
+
}, {
|
|
649
|
+
now,
|
|
650
|
+
idleActiveMs: this.idleActiveMs,
|
|
651
|
+
idleEmptyMs: this.idleEmptyMs,
|
|
652
|
+
closedMemoryGraceMs: this.closedMemoryGraceMs,
|
|
653
|
+
closedRetentionMs: this.closedRetentionMs,
|
|
654
|
+
});
|
|
655
|
+
switch (action.kind) {
|
|
656
|
+
case 'close-idle':
|
|
657
|
+
session.abortController.abort();
|
|
658
|
+
this._updateMeta(session, { status: 'closed', closedAt: now, updatedAt: now });
|
|
659
|
+
this._persist(id);
|
|
660
|
+
this._brokerSync.track(id, () => this._brokerSync.closeSession(id));
|
|
661
|
+
break;
|
|
662
|
+
case 'evict-memory':
|
|
663
|
+
// Free heavy handles; keep meta (listable) and the persisted file.
|
|
664
|
+
session.messages = [];
|
|
665
|
+
session.conversation = new ConversationManager();
|
|
666
|
+
session.messagesEvicted = true;
|
|
667
|
+
break;
|
|
668
|
+
case 'delete-persistent':
|
|
669
|
+
void this._hardRemove(id).catch((error) => {
|
|
716
670
|
logger.warn('[companion-chat] session delete failed', {
|
|
717
671
|
sessionId: id,
|
|
718
672
|
error: summarizeError(error),
|
|
719
673
|
});
|
|
720
674
|
});
|
|
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);
|
|
675
|
+
break;
|
|
676
|
+
case 'retain':
|
|
677
|
+
break;
|
|
733
678
|
}
|
|
734
679
|
}
|
|
735
680
|
}
|
|
@@ -738,6 +683,33 @@ export class CompanionChatManager {
|
|
|
738
683
|
session.meta = updated;
|
|
739
684
|
return updated;
|
|
740
685
|
}
|
|
686
|
+
// ---------------------------------------------------------------------------
|
|
687
|
+
// Live shared-broker registration (S1 item D) — see companion-chat-broker-sync.ts
|
|
688
|
+
// ---------------------------------------------------------------------------
|
|
689
|
+
/**
|
|
690
|
+
* Await all in-flight best-effort broker-sync operations. The daemon's
|
|
691
|
+
* companion HTTP routes call this before responding so `/api/sessions`
|
|
692
|
+
* reflects the change synchronously; tests use it to make the mirror
|
|
693
|
+
* deterministic. A no-op when no broker bridge is configured.
|
|
694
|
+
*/
|
|
695
|
+
async flushBrokerSync() {
|
|
696
|
+
await this._brokerSync.flush();
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Hard-remove a session's persisted file and in-memory record. The ONE
|
|
700
|
+
* removal code path — shared by {@link deleteSession} and the GC
|
|
701
|
+
* 'delete-persistent' action. Never fork this. Order matters:
|
|
702
|
+
* drop the map entry, drain any in-flight {@link _persist} save for this
|
|
703
|
+
* id, THEN unlink — else a save mid-write from {@link closeSession} can
|
|
704
|
+
* resurrect the file post-unlink.
|
|
705
|
+
*/
|
|
706
|
+
async _hardRemove(sessionId) {
|
|
707
|
+
this.sessions.delete(sessionId);
|
|
708
|
+
const pendingSave = this._pendingSaves.get(sessionId);
|
|
709
|
+
if (pendingSave)
|
|
710
|
+
await pendingSave.catch(() => { });
|
|
711
|
+
await this.persistence?.delete(sessionId);
|
|
712
|
+
}
|
|
741
713
|
/**
|
|
742
714
|
* Schedule a persistence save for the given session.
|
|
743
715
|
* 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;AAYH,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,CAmE1B;AAgPD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMlF"}
|