@superblocksteam/vite-plugin-file-sync 2.0.129 → 2.0.130-next.1
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/ai-service/agent/middleware.d.ts.map +1 -1
- package/dist/ai-service/agent/middleware.js +51 -1
- package/dist/ai-service/agent/middleware.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +44 -4
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/subagents/coding/run-coding-subagent.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/coding/run-coding-subagent.js +25 -0
- package/dist/ai-service/agent/subagents/coding/run-coding-subagent.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +4 -3
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +22 -0
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +25 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +117 -11
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.js +22 -0
- package/dist/ai-service/agent/tools/build-manage-checklist.js.map +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts +291 -0
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.js +386 -0
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.js.map +1 -0
- package/dist/ai-service/agent/tools/databases/dev-database-tools.d.ts +17 -0
- package/dist/ai-service/agent/tools/databases/dev-database-tools.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/databases/dev-database-tools.js +19 -0
- package/dist/ai-service/agent/tools/databases/dev-database-tools.js.map +1 -0
- package/dist/ai-service/agent/tools/index.d.ts +0 -1
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +0 -1
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js +20 -9
- package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.d.ts +5 -1
- package/dist/ai-service/agent/tools/integrations/internal.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.js +2 -1
- package/dist/ai-service/agent/tools/integrations/internal.js.map +1 -1
- package/dist/ai-service/agent/tools/screenshot-selector.d.ts +22 -0
- package/dist/ai-service/agent/tools/screenshot-selector.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/screenshot-selector.js +158 -0
- package/dist/ai-service/agent/tools/screenshot-selector.js.map +1 -0
- package/dist/ai-service/agent/tools.d.ts +17 -0
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +65 -6
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +6 -1
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/cancel-task.d.ts +20 -0
- package/dist/ai-service/agent/tools2/tools/cancel-task.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/cancel-task.js +39 -0
- package/dist/ai-service/agent/tools2/tools/cancel-task.js.map +1 -0
- package/dist/ai-service/agent/tools2/tools/check-task.d.ts +37 -0
- package/dist/ai-service/agent/tools2/tools/check-task.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/check-task.js +53 -0
- package/dist/ai-service/agent/tools2/tools/check-task.js.map +1 -0
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +10 -0
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/git.d.ts +1 -1
- package/dist/ai-service/agent/tools2/tools/git.js +1 -1
- package/dist/ai-service/agent/tools2/tools/git.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.d.ts +6 -1
- package/dist/ai-service/agent/tools2/tools/grep.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.js +37 -13
- package/dist/ai-service/agent/tools2/tools/grep.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/index.d.ts +4 -0
- package/dist/ai-service/agent/tools2/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/index.js +8 -0
- package/dist/ai-service/agent/tools2/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/list-tasks.d.ts +21 -0
- package/dist/ai-service/agent/tools2/tools/list-tasks.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/list-tasks.js +35 -0
- package/dist/ai-service/agent/tools2/tools/list-tasks.js.map +1 -0
- package/dist/ai-service/agent/tools2/tools/wait-for-task.d.ts +46 -0
- package/dist/ai-service/agent/tools2/tools/wait-for-task.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/wait-for-task.js +83 -0
- package/dist/ai-service/agent/tools2/tools/wait-for-task.js.map +1 -0
- package/dist/ai-service/agent/tools2/types.d.ts +3 -0
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +37 -2
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts +22 -0
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts.map +1 -1
- package/dist/ai-service/app-interface/npm-package-lookup.js +88 -1
- package/dist/ai-service/app-interface/npm-package-lookup.js.map +1 -1
- package/dist/ai-service/app-interface/npm-registry.d.ts +7 -0
- package/dist/ai-service/app-interface/npm-registry.d.ts.map +1 -1
- package/dist/ai-service/app-interface/npm-registry.js +74 -4
- package/dist/ai-service/app-interface/npm-registry.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts +32 -1
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +86 -3
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/app-skills/manager.d.ts +4 -1
- package/dist/ai-service/app-skills/manager.d.ts.map +1 -1
- package/dist/ai-service/app-skills/manager.js +16 -1
- package/dist/ai-service/app-skills/manager.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +10 -0
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +55 -28
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/context-download.d.ts.map +1 -1
- package/dist/ai-service/context-download.js +50 -40
- package/dist/ai-service/context-download.js.map +1 -1
- package/dist/ai-service/dev-database-client.d.ts +27 -4
- package/dist/ai-service/dev-database-client.d.ts.map +1 -1
- package/dist/ai-service/dev-database-client.js +35 -1
- package/dist/ai-service/dev-database-client.js.map +1 -1
- package/dist/ai-service/dev-database-file-sync.d.ts +41 -0
- package/dist/ai-service/dev-database-file-sync.d.ts.map +1 -0
- package/dist/ai-service/dev-database-file-sync.js +29 -0
- package/dist/ai-service/dev-database-file-sync.js.map +1 -0
- package/dist/ai-service/features.d.ts +14 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +14 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +136 -5
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +748 -99
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +2 -0
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +4 -0
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/knowledge/knowledge-manager.d.ts +8 -10
- package/dist/ai-service/knowledge/knowledge-manager.d.ts.map +1 -1
- package/dist/ai-service/knowledge/knowledge-manager.js +135 -119
- package/dist/ai-service/knowledge/knowledge-manager.js.map +1 -1
- package/dist/ai-service/llm/chaos-fetch.d.ts.map +1 -1
- package/dist/ai-service/llm/chaos-fetch.js +7 -3
- package/dist/ai-service/llm/chaos-fetch.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +23 -7
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts +3 -0
- package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.js +9 -0
- package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts +2 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/server-side.js +6 -2
- package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context-management.d.ts +3 -9
- package/dist/ai-service/llm/context-v2/context-management.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context-management.js +3 -9
- package/dist/ai-service/llm/context-v2/context-management.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context-metrics.d.ts +23 -0
- package/dist/ai-service/llm/context-v2/context-metrics.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/context-metrics.js +144 -0
- package/dist/ai-service/llm/context-v2/context-metrics.js.map +1 -0
- package/dist/ai-service/llm/context-v2/context.d.ts +16 -1
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +138 -26
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts +26 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.d.ts +15 -1
- package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.js +97 -40
- package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/local.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/local.js +3 -0
- package/dist/ai-service/llm/context-v2/storage/local.js.map +1 -1
- package/dist/ai-service/llm/context-v2/types.d.ts +27 -0
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js +108 -23
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +21 -0
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +72 -12
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/stream/compaction-text-block.d.ts +14 -0
- package/dist/ai-service/llm/stream/compaction-text-block.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/compaction-text-block.js +29 -0
- package/dist/ai-service/llm/stream/compaction-text-block.js.map +1 -0
- package/dist/ai-service/llm/stream/idle-monitor.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/idle-monitor.js +12 -28
- package/dist/ai-service/llm/stream/idle-monitor.js.map +1 -1
- package/dist/ai-service/llm/stream/managed-stream.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/managed-stream.js +22 -0
- package/dist/ai-service/llm/stream/managed-stream.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.d.ts +4 -0
- package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.js +57 -5
- package/dist/ai-service/llm/stream/observers/context.js.map +1 -1
- package/dist/ai-service/policy-gate-step.d.ts +17 -0
- package/dist/ai-service/policy-gate-step.d.ts.map +1 -0
- package/dist/ai-service/policy-gate-step.js +52 -0
- package/dist/ai-service/policy-gate-step.js.map +1 -0
- package/dist/ai-service/quota-client.d.ts +28 -0
- package/dist/ai-service/quota-client.d.ts.map +1 -0
- package/dist/ai-service/quota-client.js +68 -0
- package/dist/ai-service/quota-client.js.map +1 -0
- package/dist/ai-service/security/index.d.ts +1 -1
- package/dist/ai-service/security/index.d.ts.map +1 -1
- package/dist/ai-service/security/index.js +1 -1
- package/dist/ai-service/security/index.js.map +1 -1
- package/dist/ai-service/security/safety-classifier.d.ts +9 -26
- package/dist/ai-service/security/safety-classifier.d.ts.map +1 -1
- package/dist/ai-service/security/safety-classifier.js +29 -44
- package/dist/ai-service/security/safety-classifier.js.map +1 -1
- package/dist/ai-service/skills/system/_registry.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/_registry.generated.js +2 -0
- package/dist/ai-service/skills/system/_registry.generated.js.map +1 -1
- package/dist/ai-service/skills/system/common-import-issues/skill.generated.d.ts +2 -0
- package/dist/ai-service/skills/system/common-import-issues/skill.generated.d.ts.map +1 -0
- package/dist/ai-service/skills/system/common-import-issues/skill.generated.js +93 -0
- package/dist/ai-service/skills/system/common-import-issues/skill.generated.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js +15 -0
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.js +7 -2
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +74 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +26 -7
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +223 -9
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.js +42 -6
- package/dist/ai-service/state-machine/handlers/idle.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +16 -6
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.js +9 -1
- package/dist/ai-service/state-machine/helpers/peer.js.map +1 -1
- package/dist/ai-service/tasks/access.d.ts +23 -0
- package/dist/ai-service/tasks/access.d.ts.map +1 -0
- package/dist/ai-service/tasks/access.js +26 -0
- package/dist/ai-service/tasks/access.js.map +1 -0
- package/dist/ai-service/tasks/factory.d.ts +92 -0
- package/dist/ai-service/tasks/factory.d.ts.map +1 -0
- package/dist/ai-service/tasks/factory.js +54 -0
- package/dist/ai-service/tasks/factory.js.map +1 -0
- package/dist/ai-service/tasks/index.d.ts +8 -0
- package/dist/ai-service/tasks/index.d.ts.map +1 -0
- package/dist/ai-service/tasks/index.js +7 -0
- package/dist/ai-service/tasks/index.js.map +1 -0
- package/dist/ai-service/tasks/peer-push.d.ts +78 -0
- package/dist/ai-service/tasks/peer-push.d.ts.map +1 -0
- package/dist/ai-service/tasks/peer-push.js +74 -0
- package/dist/ai-service/tasks/peer-push.js.map +1 -0
- package/dist/ai-service/tasks/poll-loop.d.ts +55 -0
- package/dist/ai-service/tasks/poll-loop.d.ts.map +1 -0
- package/dist/ai-service/tasks/poll-loop.js +73 -0
- package/dist/ai-service/tasks/poll-loop.js.map +1 -0
- package/dist/ai-service/tasks/task-store.d.ts +106 -0
- package/dist/ai-service/tasks/task-store.d.ts.map +1 -0
- package/dist/ai-service/tasks/task-store.js +292 -0
- package/dist/ai-service/tasks/task-store.js.map +1 -0
- package/dist/ai-service/tasks/test-utils.d.ts +23 -0
- package/dist/ai-service/tasks/test-utils.d.ts.map +1 -0
- package/dist/ai-service/tasks/test-utils.js +53 -0
- package/dist/ai-service/tasks/test-utils.js.map +1 -0
- package/dist/ai-service/tasks/types.d.ts +205 -0
- package/dist/ai-service/tasks/types.d.ts.map +1 -0
- package/dist/ai-service/tasks/types.js +24 -0
- package/dist/ai-service/tasks/types.js.map +1 -0
- package/dist/ai-service/template-renderer.d.ts.map +1 -1
- package/dist/ai-service/template-renderer.js +1 -0
- package/dist/ai-service/template-renderer.js.map +1 -1
- package/dist/ai-service/test-utils/metrics-harness.d.ts +32 -0
- package/dist/ai-service/test-utils/metrics-harness.d.ts.map +1 -0
- package/dist/ai-service/test-utils/metrics-harness.js +67 -0
- package/dist/ai-service/test-utils/metrics-harness.js.map +1 -0
- package/dist/ai-service/test-utils/tracer-harness.d.ts +8 -0
- package/dist/ai-service/test-utils/tracer-harness.d.ts.map +1 -0
- package/dist/ai-service/test-utils/tracer-harness.js +26 -0
- package/dist/ai-service/test-utils/tracer-harness.js.map +1 -0
- package/dist/ai-service/transform/lucide-dynamic-type-imports/transformer.d.ts +40 -0
- package/dist/ai-service/transform/lucide-dynamic-type-imports/transformer.d.ts.map +1 -0
- package/dist/ai-service/transform/lucide-dynamic-type-imports/transformer.js +118 -0
- package/dist/ai-service/transform/lucide-dynamic-type-imports/transformer.js.map +1 -0
- package/dist/ai-service/util/llm-config-utils.d.ts +2 -6
- package/dist/ai-service/util/llm-config-utils.d.ts.map +1 -1
- package/dist/ai-service/util/llm-config-utils.js +2 -7
- package/dist/ai-service/util/llm-config-utils.js.map +1 -1
- package/dist/ai-service/util/rpc-timeout.d.ts +17 -7
- package/dist/ai-service/util/rpc-timeout.d.ts.map +1 -1
- package/dist/ai-service/util/rpc-timeout.js +17 -7
- package/dist/ai-service/util/rpc-timeout.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +76 -6
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/inject-index-vite-plugin.d.ts.map +1 -1
- package/dist/inject-index-vite-plugin.js +4 -0
- package/dist/inject-index-vite-plugin.js.map +1 -1
- package/dist/migration/migration-routes.d.ts +14 -0
- package/dist/migration/migration-routes.d.ts.map +1 -1
- package/dist/migration/migration-routes.js +284 -5
- package/dist/migration/migration-routes.js.map +1 -1
- package/dist/migration/migration-session-reconcile.d.ts +23 -0
- package/dist/migration/migration-session-reconcile.d.ts.map +1 -0
- package/dist/migration/migration-session-reconcile.js +129 -0
- package/dist/migration/migration-session-reconcile.js.map +1 -0
- package/dist/migration/restructure.d.ts.map +1 -1
- package/dist/migration/restructure.js +2 -0
- package/dist/migration/restructure.js.map +1 -1
- package/dist/migration-templates/app-fullstack/css.d.ts +3 -0
- package/dist/migration-templates/app-fullstack/package.json +2 -2
- package/dist/npm/normalize-workspace-protocol-for-npm.d.ts +15 -0
- package/dist/npm/normalize-workspace-protocol-for-npm.d.ts.map +1 -0
- package/dist/npm/normalize-workspace-protocol-for-npm.js +36 -0
- package/dist/npm/normalize-workspace-protocol-for-npm.js.map +1 -0
- package/dist/npm/prepare-package-json-for-cloud-npm.d.ts +21 -0
- package/dist/npm/prepare-package-json-for-cloud-npm.d.ts.map +1 -0
- package/dist/npm/prepare-package-json-for-cloud-npm.js +44 -0
- package/dist/npm/prepare-package-json-for-cloud-npm.js.map +1 -0
- package/dist/npm/rewrite-platform-workspace-deps.d.ts +17 -0
- package/dist/npm/rewrite-platform-workspace-deps.d.ts.map +1 -0
- package/dist/npm/rewrite-platform-workspace-deps.js +37 -0
- package/dist/npm/rewrite-platform-workspace-deps.js.map +1 -0
- package/dist/plugin-options.d.ts +8 -0
- package/dist/plugin-options.d.ts.map +1 -1
- package/dist/plugin-options.js.map +1 -1
- package/dist/policy-gate-run-registry.d.ts +28 -0
- package/dist/policy-gate-run-registry.d.ts.map +1 -0
- package/dist/policy-gate-run-registry.js +40 -0
- package/dist/policy-gate-run-registry.js.map +1 -0
- package/dist/policy-gate-runner.d.ts +2 -0
- package/dist/policy-gate-runner.d.ts.map +1 -1
- package/dist/policy-gate-runner.js +14 -1
- package/dist/policy-gate-runner.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +55 -0
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/download.d.ts.map +1 -1
- package/dist/sync-service/download.js +6 -4
- package/dist/sync-service/download.js.map +1 -1
- package/dist/sync-service/draft-reconcile.d.ts +22 -0
- package/dist/sync-service/draft-reconcile.d.ts.map +1 -0
- package/dist/sync-service/draft-reconcile.js +24 -0
- package/dist/sync-service/draft-reconcile.js.map +1 -0
- package/dist/sync-service/index.d.ts +30 -5
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +59 -8
- package/dist/sync-service/index.js.map +1 -1
- package/package.json +10 -10
- package/dist/ai-service/agent/tools/databases/dev-database.d.ts +0 -103
- package/dist/ai-service/agent/tools/databases/dev-database.d.ts.map +0 -1
- package/dist/ai-service/agent/tools/databases/dev-database.js +0 -117
- package/dist/ai-service/agent/tools/databases/dev-database.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type TaskStatus, type TaskType } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Clock abstraction used by the poll loop. The real clock wraps
|
|
4
|
+
* `Date.now` and `setTimeout`; `test-utils.ts` provides a deterministic
|
|
5
|
+
* `FakeClock` for tests.
|
|
6
|
+
*/
|
|
7
|
+
export interface PollClock {
|
|
8
|
+
now: () => number;
|
|
9
|
+
sleep: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export interface RunPollLoopOptions<H, R> {
|
|
12
|
+
type: Pick<TaskType<unknown, H, R>, "poll" | "pollSchedule">;
|
|
13
|
+
handle: H;
|
|
14
|
+
signal: AbortSignal;
|
|
15
|
+
clock: PollClock;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the jitter delta (in ms) to add to the current scheduled
|
|
18
|
+
* wait. Receives the current backoff window so the perturbation
|
|
19
|
+
* scales proportionally (the production default is ±10% of the
|
|
20
|
+
* incoming wait). Tests pass `() => 0` for determinism; the
|
|
21
|
+
* argument is intentionally optional from the caller's perspective
|
|
22
|
+
* so existing zero-arg test fixtures keep type-checking.
|
|
23
|
+
*/
|
|
24
|
+
jitter: (currentWaitMs: number) => number;
|
|
25
|
+
/**
|
|
26
|
+
* Called exactly once per poll attempt — both with intermediate
|
|
27
|
+
* `running` updates and with the final terminal status.
|
|
28
|
+
*/
|
|
29
|
+
onStatus: (status: TaskStatus<R>) => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Single-task polling loop with exponential backoff and jitter.
|
|
33
|
+
*
|
|
34
|
+
* Sleeps `schedule.initialMs` (+ jitter) before the first poll, then
|
|
35
|
+
* doubles the wait by `schedule.factor` after each `running` reply, up
|
|
36
|
+
* to `schedule.maxMs`. Exits as soon as `signal` aborts or `poll` reports
|
|
37
|
+
* a non-running status. Poll exceptions are wrapped as a `failed`
|
|
38
|
+
* terminal status and reported through `onStatus`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runPollLoop<H, R>(opts: RunPollLoopOptions<H, R>): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Real-clock implementation for production. Honors abort by listening on
|
|
43
|
+
* the signal and rejecting the in-flight sleep early.
|
|
44
|
+
*/
|
|
45
|
+
export declare const realClock: PollClock;
|
|
46
|
+
/**
|
|
47
|
+
* Default jitter implementation — perturbs the next wait by ±10% so a
|
|
48
|
+
* fleet of identically-scheduled tasks doesn't all hammer the external
|
|
49
|
+
* system in lockstep. Designed to be assigned directly as the
|
|
50
|
+
* `TaskStoreOptions.jitter` callback (no curried wrapper); the previous
|
|
51
|
+
* `defaultJitter(0)` initialization captured a zero baseline that
|
|
52
|
+
* silently disabled jitter forever.
|
|
53
|
+
*/
|
|
54
|
+
export declare function defaultJitter(currentWaitMs: number): number;
|
|
55
|
+
//# sourceMappingURL=poll-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll-loop.d.ts","sourceRoot":"","sources":["../../../src/ai-service/tasks/poll-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB;;;;;;;OAOG;IACH,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACpC,IAAI,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,SAkBvB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { DEFAULT_POLL_SCHEDULE, } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Single-task polling loop with exponential backoff and jitter.
|
|
4
|
+
*
|
|
5
|
+
* Sleeps `schedule.initialMs` (+ jitter) before the first poll, then
|
|
6
|
+
* doubles the wait by `schedule.factor` after each `running` reply, up
|
|
7
|
+
* to `schedule.maxMs`. Exits as soon as `signal` aborts or `poll` reports
|
|
8
|
+
* a non-running status. Poll exceptions are wrapped as a `failed`
|
|
9
|
+
* terminal status and reported through `onStatus`.
|
|
10
|
+
*/
|
|
11
|
+
export async function runPollLoop(opts) {
|
|
12
|
+
const schedule = opts.type.pollSchedule ?? DEFAULT_POLL_SCHEDULE;
|
|
13
|
+
let wait = schedule.initialMs;
|
|
14
|
+
while (true) {
|
|
15
|
+
if (opts.signal.aborted)
|
|
16
|
+
return;
|
|
17
|
+
try {
|
|
18
|
+
await opts.clock.sleep(wait + opts.jitter(wait), opts.signal);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (opts.signal.aborted)
|
|
24
|
+
return;
|
|
25
|
+
let status;
|
|
26
|
+
try {
|
|
27
|
+
status = await opts.type.poll(opts.handle, opts.signal);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const message = err instanceof Error ? err.message : String(err ?? "unknown error");
|
|
31
|
+
opts.onStatus({ state: "failed", error: message });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
opts.onStatus(status);
|
|
35
|
+
if (status.state !== "running")
|
|
36
|
+
return;
|
|
37
|
+
wait = Math.min(schedule.maxMs, wait * schedule.factor);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Real-clock implementation for production. Honors abort by listening on
|
|
42
|
+
* the signal and rejecting the in-flight sleep early.
|
|
43
|
+
*/
|
|
44
|
+
export const realClock = {
|
|
45
|
+
now: () => Date.now(),
|
|
46
|
+
sleep: (ms, signal) => new Promise((resolve, reject) => {
|
|
47
|
+
if (signal?.aborted) {
|
|
48
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const t = setTimeout(() => {
|
|
52
|
+
signal?.removeEventListener("abort", onAbort);
|
|
53
|
+
resolve();
|
|
54
|
+
}, ms);
|
|
55
|
+
const onAbort = () => {
|
|
56
|
+
clearTimeout(t);
|
|
57
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
58
|
+
};
|
|
59
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Default jitter implementation — perturbs the next wait by ±10% so a
|
|
64
|
+
* fleet of identically-scheduled tasks doesn't all hammer the external
|
|
65
|
+
* system in lockstep. Designed to be assigned directly as the
|
|
66
|
+
* `TaskStoreOptions.jitter` callback (no curried wrapper); the previous
|
|
67
|
+
* `defaultJitter(0)` initialization captured a zero baseline that
|
|
68
|
+
* silently disabled jitter forever.
|
|
69
|
+
*/
|
|
70
|
+
export function defaultJitter(currentWaitMs) {
|
|
71
|
+
return (Math.random() * 0.2 - 0.1) * currentWaitMs;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=poll-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll-loop.js","sourceRoot":"","sources":["../../../src/ai-service/tasks/poll-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAItB,MAAM,YAAY,CAAC;AAiCpB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAA8B;IAE9B,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,qBAAqB,CAAC;IAClD,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC;IAE9B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAEhC,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO;QAEvC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACrB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CACpB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC;CACL,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,aAAqB;IACjD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { ToolExecutionOptions } from "ai";
|
|
2
|
+
import { type PollClock } from "./poll-loop.js";
|
|
3
|
+
import type { BackgroundTaskSummary, RunningTask, TaskStatus, TaskType } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Listener called whenever a task's state, message, result, or error
|
|
6
|
+
* changes. The same callback fires for the initial in-store snapshot
|
|
7
|
+
* after `start()` and for every poll update afterwards.
|
|
8
|
+
*
|
|
9
|
+
* Listeners must not throw — exceptions are caught and dropped.
|
|
10
|
+
*/
|
|
11
|
+
export type TaskStatusListener = (taskId: string, status: TaskStatus<unknown>, task: RunningTask) => void;
|
|
12
|
+
export interface TaskStoreOptions {
|
|
13
|
+
/** Clock used by all poll loops. Defaults to wall-clock + `setTimeout`. */
|
|
14
|
+
clock?: PollClock;
|
|
15
|
+
/**
|
|
16
|
+
* Jitter generator (see poll-loop). Defaults to `defaultJitter` —
|
|
17
|
+
* a ±10% perturbation of the current backoff window. Tests typically
|
|
18
|
+
* pass `() => 0` for determinism.
|
|
19
|
+
*/
|
|
20
|
+
jitter?: (currentWaitMs: number) => number;
|
|
21
|
+
/** ID generator (defaults to ULID). Injected for deterministic tests. */
|
|
22
|
+
generateId?: () => string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Per-session registry + lifecycle owner for background tasks.
|
|
26
|
+
*
|
|
27
|
+
* Owns:
|
|
28
|
+
* - The registered `TaskType` table (`register` / `getType`).
|
|
29
|
+
* - The in-memory `Map<taskId, RunningTask>` of live + recently-finished tasks.
|
|
30
|
+
* - One `AbortController` per task that drives the loop.
|
|
31
|
+
* - Status change subscribers (peer push, in-memory `waitFor`).
|
|
32
|
+
*
|
|
33
|
+
* Does NOT yet handle:
|
|
34
|
+
* - On-disk persistence — that lives in `persistence.ts` and wraps the store.
|
|
35
|
+
* - Peer push or `<background_tasks>` block — those subscribe to `onStatus`.
|
|
36
|
+
*
|
|
37
|
+
* Cancellation:
|
|
38
|
+
* - `cancel(taskId)` aborts the loop, calls `type.cancel?.()`, emits
|
|
39
|
+
* `{ state: "cancelled" }`. Errors from `type.cancel` are logged and
|
|
40
|
+
* swallowed so cancellation always succeeds locally.
|
|
41
|
+
* - `cancelAll()` cancels every currently-running task.
|
|
42
|
+
* - `dispose()` aborts all loops without changing task state — used on
|
|
43
|
+
* FSM teardown so a restart can rehydrate the same on-disk records.
|
|
44
|
+
*/
|
|
45
|
+
export declare class TaskStore {
|
|
46
|
+
private readonly clock;
|
|
47
|
+
private readonly jitter;
|
|
48
|
+
private readonly generateId;
|
|
49
|
+
private readonly types;
|
|
50
|
+
private readonly tasks;
|
|
51
|
+
private readonly controllers;
|
|
52
|
+
private readonly listeners;
|
|
53
|
+
private disposed;
|
|
54
|
+
constructor(options?: TaskStoreOptions);
|
|
55
|
+
register<I, H, R>(type: TaskType<I, H, R>): void;
|
|
56
|
+
getType(name: string): TaskType<unknown, unknown, unknown> | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Start a new task of the given type. Returns the generated `taskId`
|
|
59
|
+
* and the type's `initialStatus` (or `{ state: "running" }` if absent).
|
|
60
|
+
*
|
|
61
|
+
* `ownerUserId` is optional metadata that gets stored on the task so
|
|
62
|
+
* the LLM-facing read tools can filter cross-user access (see
|
|
63
|
+
* `isTaskAccessibleTo`). Pass the JWT-derived userId when authentic.
|
|
64
|
+
*/
|
|
65
|
+
start<I>(typeName: string, input: I, opts: ToolExecutionOptions, options?: {
|
|
66
|
+
ownerUserId?: string;
|
|
67
|
+
}): Promise<{
|
|
68
|
+
taskId: string;
|
|
69
|
+
initialStatus: TaskStatus<unknown>;
|
|
70
|
+
label?: string;
|
|
71
|
+
}>;
|
|
72
|
+
get(taskId: string): RunningTask | undefined;
|
|
73
|
+
list(): RunningTask[];
|
|
74
|
+
hasActiveTasks(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Abort the task's poll loop, call `type.cancel` if defined, mark the
|
|
77
|
+
* task as cancelled, and fire one cancelled status event. Safe to call
|
|
78
|
+
* on already-terminal tasks (no-op).
|
|
79
|
+
*/
|
|
80
|
+
cancel(taskId: string): Promise<void>;
|
|
81
|
+
cancelAll(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Resolves with the terminal status as soon as the task leaves
|
|
84
|
+
* `running` state. Rejects with a TimeoutError after `timeoutMs` if
|
|
85
|
+
* the task is still running.
|
|
86
|
+
*/
|
|
87
|
+
waitFor(taskId: string, timeoutMs: number): Promise<TaskStatus<unknown>>;
|
|
88
|
+
/**
|
|
89
|
+
* Register a listener for task status changes. Returns an unsubscribe
|
|
90
|
+
* function.
|
|
91
|
+
*/
|
|
92
|
+
onStatus(listener: TaskStatusListener): () => void;
|
|
93
|
+
/** Aborts every in-flight loop without changing task state. */
|
|
94
|
+
dispose(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Summary used by the peer push and the `<background_tasks>` block.
|
|
97
|
+
* Never includes `result`.
|
|
98
|
+
*/
|
|
99
|
+
summarize(task: RunningTask): BackgroundTaskSummary;
|
|
100
|
+
private spawnPollLoop;
|
|
101
|
+
private applyStatus;
|
|
102
|
+
private emit;
|
|
103
|
+
private snapshotStatus;
|
|
104
|
+
}
|
|
105
|
+
export declare function generateUlid(now?: number, random?: () => number): string;
|
|
106
|
+
//# sourceMappingURL=task-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../../../src/ai-service/tasks/task-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAE/C,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EAEX,UAAU,EACV,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,EAC3B,IAAI,EAAE,WAAW,KACd,IAAI,CAAC;AAEV,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGlB;IACJ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,GAAE,gBAAqB;IAM1C,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAIhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS;IAItE;;;;;;;OAOG;IACG,KAAK,CAAC,CAAC,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,oBAAoB,EAC1B,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACrC,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAoDF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI5C,IAAI,IAAI,WAAW,EAAE;IAIrB,cAAc,IAAI,OAAO;IAOzB;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhC;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAiCxE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI;IAKlD,+DAA+D;IAC/D,OAAO,IAAI,IAAI;IAOf;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,qBAAqB;YAiBrC,aAAa;IAqB3B,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,cAAc;CAYvB;AAUD,wBAAgB,YAAY,CAAC,GAAG,SAAa,EAAE,MAAM,eAAc,GAAG,MAAM,CAY3E"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { defaultJitter, realClock, runPollLoop, } from "./poll-loop.js";
|
|
2
|
+
/**
|
|
3
|
+
* Per-session registry + lifecycle owner for background tasks.
|
|
4
|
+
*
|
|
5
|
+
* Owns:
|
|
6
|
+
* - The registered `TaskType` table (`register` / `getType`).
|
|
7
|
+
* - The in-memory `Map<taskId, RunningTask>` of live + recently-finished tasks.
|
|
8
|
+
* - One `AbortController` per task that drives the loop.
|
|
9
|
+
* - Status change subscribers (peer push, in-memory `waitFor`).
|
|
10
|
+
*
|
|
11
|
+
* Does NOT yet handle:
|
|
12
|
+
* - On-disk persistence — that lives in `persistence.ts` and wraps the store.
|
|
13
|
+
* - Peer push or `<background_tasks>` block — those subscribe to `onStatus`.
|
|
14
|
+
*
|
|
15
|
+
* Cancellation:
|
|
16
|
+
* - `cancel(taskId)` aborts the loop, calls `type.cancel?.()`, emits
|
|
17
|
+
* `{ state: "cancelled" }`. Errors from `type.cancel` are logged and
|
|
18
|
+
* swallowed so cancellation always succeeds locally.
|
|
19
|
+
* - `cancelAll()` cancels every currently-running task.
|
|
20
|
+
* - `dispose()` aborts all loops without changing task state — used on
|
|
21
|
+
* FSM teardown so a restart can rehydrate the same on-disk records.
|
|
22
|
+
*/
|
|
23
|
+
export class TaskStore {
|
|
24
|
+
clock;
|
|
25
|
+
jitter;
|
|
26
|
+
generateId;
|
|
27
|
+
types = new Map();
|
|
28
|
+
tasks = new Map();
|
|
29
|
+
controllers = new Map();
|
|
30
|
+
listeners = new Set();
|
|
31
|
+
disposed = false;
|
|
32
|
+
constructor(options = {}) {
|
|
33
|
+
this.clock = options.clock ?? realClock;
|
|
34
|
+
this.jitter = options.jitter ?? defaultJitter;
|
|
35
|
+
this.generateId = options.generateId ?? generateUlid;
|
|
36
|
+
}
|
|
37
|
+
register(type) {
|
|
38
|
+
this.types.set(type.name, type);
|
|
39
|
+
}
|
|
40
|
+
getType(name) {
|
|
41
|
+
return this.types.get(name);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Start a new task of the given type. Returns the generated `taskId`
|
|
45
|
+
* and the type's `initialStatus` (or `{ state: "running" }` if absent).
|
|
46
|
+
*
|
|
47
|
+
* `ownerUserId` is optional metadata that gets stored on the task so
|
|
48
|
+
* the LLM-facing read tools can filter cross-user access (see
|
|
49
|
+
* `isTaskAccessibleTo`). Pass the JWT-derived userId when authentic.
|
|
50
|
+
*/
|
|
51
|
+
async start(typeName, input, opts, options = {}) {
|
|
52
|
+
if (this.disposed) {
|
|
53
|
+
throw new Error("TaskStore disposed");
|
|
54
|
+
}
|
|
55
|
+
const type = this.types.get(typeName);
|
|
56
|
+
if (!type) {
|
|
57
|
+
throw new Error(`unknown task type: ${typeName}`);
|
|
58
|
+
}
|
|
59
|
+
const startResult = (await type.start(input, opts));
|
|
60
|
+
const initialStatus = startResult.initialStatus ?? {
|
|
61
|
+
state: "running",
|
|
62
|
+
};
|
|
63
|
+
const taskId = this.generateId();
|
|
64
|
+
const task = {
|
|
65
|
+
taskId,
|
|
66
|
+
taskType: typeName,
|
|
67
|
+
externalHandle: startResult.externalHandle,
|
|
68
|
+
label: startResult.label,
|
|
69
|
+
startedAt: new Date(this.clock.now()).toISOString(),
|
|
70
|
+
state: initialStatus.state,
|
|
71
|
+
message: "message" in initialStatus ? initialStatus.message : undefined,
|
|
72
|
+
result: initialStatus.state === "completed"
|
|
73
|
+
? initialStatus.result
|
|
74
|
+
: undefined,
|
|
75
|
+
error: initialStatus.state === "failed"
|
|
76
|
+
? initialStatus.error
|
|
77
|
+
: undefined,
|
|
78
|
+
ownerUserId: options.ownerUserId,
|
|
79
|
+
};
|
|
80
|
+
this.tasks.set(taskId, task);
|
|
81
|
+
this.emit(taskId, initialStatus, task);
|
|
82
|
+
// Already-terminal initialStatus → no poll loop needed.
|
|
83
|
+
if (initialStatus.state === "running") {
|
|
84
|
+
const controller = new AbortController();
|
|
85
|
+
this.controllers.set(taskId, controller);
|
|
86
|
+
void this.spawnPollLoop(taskId, type, controller);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
taskId,
|
|
90
|
+
initialStatus,
|
|
91
|
+
label: startResult.label,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
get(taskId) {
|
|
95
|
+
return this.tasks.get(taskId);
|
|
96
|
+
}
|
|
97
|
+
list() {
|
|
98
|
+
return [...this.tasks.values()];
|
|
99
|
+
}
|
|
100
|
+
hasActiveTasks() {
|
|
101
|
+
for (const task of this.tasks.values()) {
|
|
102
|
+
if (task.state === "running")
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Abort the task's poll loop, call `type.cancel` if defined, mark the
|
|
109
|
+
* task as cancelled, and fire one cancelled status event. Safe to call
|
|
110
|
+
* on already-terminal tasks (no-op).
|
|
111
|
+
*/
|
|
112
|
+
async cancel(taskId) {
|
|
113
|
+
const task = this.tasks.get(taskId);
|
|
114
|
+
if (!task || task.state !== "running")
|
|
115
|
+
return;
|
|
116
|
+
const controller = this.controllers.get(taskId);
|
|
117
|
+
controller?.abort();
|
|
118
|
+
this.controllers.delete(taskId);
|
|
119
|
+
const type = this.types.get(task.taskType);
|
|
120
|
+
if (type?.cancel) {
|
|
121
|
+
try {
|
|
122
|
+
await type.cancel(task.externalHandle);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Best-effort; loop is already aborted locally regardless.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const status = { state: "cancelled" };
|
|
129
|
+
this.applyStatus(taskId, status);
|
|
130
|
+
}
|
|
131
|
+
async cancelAll() {
|
|
132
|
+
const ids = [...this.tasks.entries()]
|
|
133
|
+
.filter(([, t]) => t.state === "running")
|
|
134
|
+
.map(([id]) => id);
|
|
135
|
+
await Promise.all(ids.map((id) => this.cancel(id)));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolves with the terminal status as soon as the task leaves
|
|
139
|
+
* `running` state. Rejects with a TimeoutError after `timeoutMs` if
|
|
140
|
+
* the task is still running.
|
|
141
|
+
*/
|
|
142
|
+
waitFor(taskId, timeoutMs) {
|
|
143
|
+
const task = this.tasks.get(taskId);
|
|
144
|
+
if (!task) {
|
|
145
|
+
return Promise.reject(new Error(`unknown task: ${taskId}`));
|
|
146
|
+
}
|
|
147
|
+
if (task.state !== "running") {
|
|
148
|
+
return Promise.resolve(this.snapshotStatus(task));
|
|
149
|
+
}
|
|
150
|
+
return new Promise((resolve, reject) => {
|
|
151
|
+
const onStatus = (id, status) => {
|
|
152
|
+
if (id !== taskId)
|
|
153
|
+
return;
|
|
154
|
+
if (status.state === "running")
|
|
155
|
+
return;
|
|
156
|
+
cleanup();
|
|
157
|
+
resolve(status);
|
|
158
|
+
};
|
|
159
|
+
const timeoutAbort = new AbortController();
|
|
160
|
+
const cleanup = () => {
|
|
161
|
+
this.listeners.delete(onStatus);
|
|
162
|
+
timeoutAbort.abort();
|
|
163
|
+
};
|
|
164
|
+
this.listeners.add(onStatus);
|
|
165
|
+
this.clock
|
|
166
|
+
.sleep(timeoutMs, timeoutAbort.signal)
|
|
167
|
+
.then(() => {
|
|
168
|
+
cleanup();
|
|
169
|
+
reject(new Error(`timeout waiting for task ${taskId}`));
|
|
170
|
+
})
|
|
171
|
+
.catch(() => {
|
|
172
|
+
// Aborted by cleanup() — terminal status already delivered.
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Register a listener for task status changes. Returns an unsubscribe
|
|
178
|
+
* function.
|
|
179
|
+
*/
|
|
180
|
+
onStatus(listener) {
|
|
181
|
+
this.listeners.add(listener);
|
|
182
|
+
return () => this.listeners.delete(listener);
|
|
183
|
+
}
|
|
184
|
+
/** Aborts every in-flight loop without changing task state. */
|
|
185
|
+
dispose() {
|
|
186
|
+
this.disposed = true;
|
|
187
|
+
for (const controller of this.controllers.values())
|
|
188
|
+
controller.abort();
|
|
189
|
+
this.controllers.clear();
|
|
190
|
+
this.listeners.clear();
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Summary used by the peer push and the `<background_tasks>` block.
|
|
194
|
+
* Never includes `result`.
|
|
195
|
+
*/
|
|
196
|
+
summarize(task) {
|
|
197
|
+
const startedAtMs = Date.parse(task.startedAt);
|
|
198
|
+
return {
|
|
199
|
+
taskId: task.taskId,
|
|
200
|
+
taskType: task.taskType,
|
|
201
|
+
label: task.label,
|
|
202
|
+
state: task.state,
|
|
203
|
+
message: task.message,
|
|
204
|
+
ageMs: Math.max(0, this.clock.now() - startedAtMs),
|
|
205
|
+
completedAt: task.state === "running"
|
|
206
|
+
? undefined
|
|
207
|
+
: new Date(this.clock.now()).toISOString(),
|
|
208
|
+
error: task.error,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
async spawnPollLoop(taskId, type, controller) {
|
|
212
|
+
const task = this.tasks.get(taskId);
|
|
213
|
+
if (!task)
|
|
214
|
+
return;
|
|
215
|
+
try {
|
|
216
|
+
await runPollLoop({
|
|
217
|
+
type,
|
|
218
|
+
handle: task.externalHandle,
|
|
219
|
+
signal: controller.signal,
|
|
220
|
+
clock: this.clock,
|
|
221
|
+
jitter: this.jitter,
|
|
222
|
+
onStatus: (status) => this.applyStatus(taskId, status),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
this.controllers.delete(taskId);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
applyStatus(taskId, status) {
|
|
230
|
+
if (this.disposed)
|
|
231
|
+
return;
|
|
232
|
+
const task = this.tasks.get(taskId);
|
|
233
|
+
if (!task)
|
|
234
|
+
return;
|
|
235
|
+
if (task.state !== "running")
|
|
236
|
+
return; // already terminal, ignore late updates
|
|
237
|
+
task.state = status.state;
|
|
238
|
+
task.message = "message" in status ? status.message : task.message;
|
|
239
|
+
task.result =
|
|
240
|
+
status.state === "completed"
|
|
241
|
+
? status.result
|
|
242
|
+
: undefined;
|
|
243
|
+
task.error =
|
|
244
|
+
status.state === "failed"
|
|
245
|
+
? status.error
|
|
246
|
+
: undefined;
|
|
247
|
+
this.emit(taskId, status, task);
|
|
248
|
+
}
|
|
249
|
+
emit(taskId, status, task) {
|
|
250
|
+
for (const listener of this.listeners) {
|
|
251
|
+
try {
|
|
252
|
+
listener(taskId, status, task);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Listener must not break the loop.
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
snapshotStatus(task) {
|
|
260
|
+
switch (task.state) {
|
|
261
|
+
case "running":
|
|
262
|
+
return { state: "running", message: task.message };
|
|
263
|
+
case "completed":
|
|
264
|
+
return { state: "completed", result: task.result };
|
|
265
|
+
case "failed":
|
|
266
|
+
return { state: "failed", error: task.error ?? "unknown error" };
|
|
267
|
+
case "cancelled":
|
|
268
|
+
return { state: "cancelled" };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* ULID generator (Crockford base32, 26 chars). Lexically sortable; no
|
|
274
|
+
* dependency added. Not collision-free under heavy concurrent use within
|
|
275
|
+
* the same millisecond, but more than sufficient for human-scale task
|
|
276
|
+
* spawns.
|
|
277
|
+
*/
|
|
278
|
+
const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
279
|
+
export function generateUlid(now = Date.now(), random = Math.random) {
|
|
280
|
+
let ts = now;
|
|
281
|
+
const tsChars = [];
|
|
282
|
+
for (let i = 0; i < 10; i++) {
|
|
283
|
+
tsChars.unshift(CROCKFORD[ts % 32]);
|
|
284
|
+
ts = Math.floor(ts / 32);
|
|
285
|
+
}
|
|
286
|
+
let randomPart = "";
|
|
287
|
+
for (let i = 0; i < 16; i++) {
|
|
288
|
+
randomPart += CROCKFORD[Math.floor(random() * 32)];
|
|
289
|
+
}
|
|
290
|
+
return tsChars.join("") + randomPart;
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=task-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.js","sourceRoot":"","sources":["../../../src/ai-service/tasks/task-store.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EAEb,SAAS,EACT,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAmCxB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,SAAS;IACH,KAAK,CAAY;IACjB,MAAM,CAAoC;IAC1C,UAAU,CAAe;IACzB,KAAK,GAAG,IAAI,GAAG,EAG7B,CAAC;IACa,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IACvC,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IACnD,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,UAA4B,EAAE;QACxC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,YAAY,CAAC;IACvD,CAAC;IAED,QAAQ,CAAU,IAAuB;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAA2C,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,CACT,QAAgB,EAChB,KAAQ,EACR,IAA0B,EAC1B,UAAoC,EAAE;QAMtC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CACnC,KAAgB,EAChB,IAAI,CACL,CAAyB,CAAC;QAC3B,MAAM,aAAa,GAAwB,WAAW,CAAC,aAAa,IAAI;YACtE,KAAK,EAAE,SAAS;SACjB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,GAAgB;YACxB,MAAM;YACN,QAAQ,EAAE,QAAQ;YAClB,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;YACnD,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,OAAO,EAAE,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACvE,MAAM,EACJ,aAAa,CAAC,KAAK,KAAK,WAAW;gBACjC,CAAC,CAAE,aAAqC,CAAC,MAAM;gBAC/C,CAAC,CAAC,SAAS;YACf,KAAK,EACH,aAAa,CAAC,KAAK,KAAK,QAAQ;gBAC9B,CAAC,CAAE,aAAmC,CAAC,KAAK;gBAC5C,CAAC,CAAC,SAAS;YACf,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QAEvC,wDAAwD;QACxD,IAAI,aAAa,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACzC,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC;QAED,OAAO;YACL,MAAM;YACN,aAAa;YACb,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,cAAc;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,UAAU,EAAE,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;YAC7D,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAwB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACrB,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,MAAc,EAAE,SAAiB;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1D,MAAM,QAAQ,GAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;gBAClD,IAAI,EAAE,KAAK,MAAM;oBAAE,OAAO;gBAC1B,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;oBAAE,OAAO;gBACvC,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAChC,YAAY,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK;iBACP,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC;iBACrC,IAAI,CAAC,GAAG,EAAE;gBACT,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,4DAA4D;YAC9D,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,QAA4B;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,+DAA+D;IAC/D,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QACvE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,IAAiB;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;YAClD,WAAW,EACT,IAAI,CAAC,KAAK,KAAK,SAAS;gBACtB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,MAAc,EACd,IAAyC,EACzC,UAA2B;QAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;gBAChB,IAAI;gBACJ,MAAM,EAAE,IAAI,CAAC,cAAc;gBAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,MAA2B;QAC7D,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,wCAAwC;QAC9E,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACnE,IAAI,CAAC,MAAM;YACT,MAAM,CAAC,KAAK,KAAK,WAAW;gBAC1B,CAAC,CAAE,MAA8B,CAAC,MAAM;gBACxC,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,CAAC,KAAK;YACR,MAAM,CAAC,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAE,MAA4B,CAAC,KAAK;gBACrC,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAEO,IAAI,CACV,MAAc,EACd,MAA2B,EAC3B,IAAiB;QAEjB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,IAAiB;QACtC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,SAAS;gBACZ,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YACrD,KAAK,WAAW;gBACd,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACrD,KAAK,QAAQ;gBACX,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC;YACnE,KAAK,WAAW;gBACd,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,SAAS,GAAG,kCAAkC,CAAC;AAErD,MAAM,UAAU,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM;IACjE,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAE,CAAC,CAAC;QACrC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,UAAU,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAE,CAAC;IACtD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test-only helpers for the tasks subsystem. Not exported from index;
|
|
3
|
+
* production code must not import from here.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Deterministic clock used by `task-store.test.ts` and `poll-loop.test.ts`.
|
|
7
|
+
*
|
|
8
|
+
* Tests advance time by calling `tick(ms)`. Any `sleep` waiters whose
|
|
9
|
+
* deadline has passed resolve synchronously after the tick, in deadline
|
|
10
|
+
* order, in microtasks (`Promise.resolve().then(...)`), so test code can
|
|
11
|
+
* `await` between ticks without flushing setImmediate / process.nextTick.
|
|
12
|
+
*
|
|
13
|
+
* Aborting the supplied signal rejects the waiter with the standard
|
|
14
|
+
* `DOMException` of name "AbortError", matching the runtime behavior we
|
|
15
|
+
* need from the real clock.
|
|
16
|
+
*/
|
|
17
|
+
export interface FakeClock {
|
|
18
|
+
now: () => number;
|
|
19
|
+
sleep: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
20
|
+
tick: (ms: number) => Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare function createFakeClock(initialNow?: number): FakeClock;
|
|
23
|
+
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/ai-service/tasks/test-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,wBAAgB,eAAe,CAAC,UAAU,SAAI,GAAG,SAAS,CAoDzD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test-only helpers for the tasks subsystem. Not exported from index;
|
|
3
|
+
* production code must not import from here.
|
|
4
|
+
*/
|
|
5
|
+
export function createFakeClock(initialNow = 0) {
|
|
6
|
+
let current = initialNow;
|
|
7
|
+
const waiters = [];
|
|
8
|
+
const settle = async () => {
|
|
9
|
+
while (true) {
|
|
10
|
+
waiters.sort((a, b) => a.deadline - b.deadline);
|
|
11
|
+
const next = waiters[0];
|
|
12
|
+
if (!next || next.deadline > current)
|
|
13
|
+
return;
|
|
14
|
+
waiters.shift();
|
|
15
|
+
next.cleanup();
|
|
16
|
+
next.resolve();
|
|
17
|
+
await Promise.resolve();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
now: () => current,
|
|
22
|
+
sleep: (ms, signal) => new Promise((resolve, reject) => {
|
|
23
|
+
if (signal?.aborted) {
|
|
24
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const deadline = current + ms;
|
|
28
|
+
const entry = {
|
|
29
|
+
deadline,
|
|
30
|
+
resolve,
|
|
31
|
+
reject,
|
|
32
|
+
cleanup: () => {
|
|
33
|
+
if (onAbort)
|
|
34
|
+
signal?.removeEventListener("abort", onAbort);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
const onAbort = () => {
|
|
38
|
+
const idx = waiters.indexOf(entry);
|
|
39
|
+
if (idx >= 0)
|
|
40
|
+
waiters.splice(idx, 1);
|
|
41
|
+
entry.cleanup();
|
|
42
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
43
|
+
};
|
|
44
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
45
|
+
waiters.push(entry);
|
|
46
|
+
}),
|
|
47
|
+
tick: async (ms) => {
|
|
48
|
+
current += ms;
|
|
49
|
+
await settle();
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=test-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/ai-service/tasks/test-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,MAAM,UAAU,eAAe,CAAC,UAAU,GAAG,CAAC;IAC5C,IAAI,OAAO,GAAG,UAAU,CAAC;IACzB,MAAM,OAAO,GAKR,EAAE,CAAC;IAER,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,GAAG,OAAO;gBAAE,OAAO;YAC7C,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CACpB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,GAAG,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG;gBACZ,QAAQ;gBACR,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,OAAO;wBAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7D,CAAC;aACF,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,GAAG,IAAI,CAAC;oBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACrC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC;YACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QACJ,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACjB,OAAO,IAAI,EAAE,CAAC;YACd,MAAM,MAAM,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|