@elizaos/agent 2.0.0-alpha.144 → 2.0.0-alpha.151
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/apps/app-lifeops/src/actions/inbox-digest.d.ts +2 -0
- package/apps/app-lifeops/src/actions/inbox-digest.d.ts.map +1 -0
- package/apps/app-lifeops/src/actions/inbox-digest.js +1 -0
- package/apps/app-lifeops/src/actions/inbox-respond.d.ts +2 -0
- package/apps/app-lifeops/src/actions/inbox-respond.d.ts.map +1 -0
- package/apps/app-lifeops/src/actions/inbox-respond.js +1 -0
- package/apps/app-lifeops/src/actions/inbox-triage.d.ts +2 -0
- package/apps/app-lifeops/src/actions/inbox-triage.d.ts.map +1 -0
- package/apps/app-lifeops/src/actions/inbox-triage.js +1 -0
- package/apps/app-lifeops/src/actions/inbox.d.ts +3 -0
- package/apps/app-lifeops/src/actions/inbox.d.ts.map +1 -0
- package/apps/app-lifeops/src/actions/inbox.js +856 -0
- package/apps/app-lifeops/src/actions/update-owner-profile.d.ts +3 -0
- package/apps/app-lifeops/src/actions/update-owner-profile.d.ts.map +1 -0
- package/apps/app-lifeops/src/actions/update-owner-profile.js +131 -0
- package/apps/app-lifeops/src/inbox/channel-deep-links.d.ts.map +1 -0
- package/apps/app-lifeops/src/inbox/config.d.ts.map +1 -0
- package/{packages/agent → apps/app-lifeops}/src/inbox/config.js +1 -1
- package/apps/app-lifeops/src/inbox/message-fetcher.d.ts.map +1 -0
- package/apps/app-lifeops/src/inbox/reflection.d.ts.map +1 -0
- package/apps/app-lifeops/src/inbox/repository.d.ts.map +1 -0
- package/apps/app-lifeops/src/inbox/triage-classifier.d.ts.map +1 -0
- package/apps/app-lifeops/src/inbox/types.d.ts.map +1 -0
- package/apps/app-lifeops/src/lifeops/index.d.ts +25 -0
- package/apps/app-lifeops/src/lifeops/index.d.ts.map +1 -0
- package/apps/app-lifeops/src/lifeops/index.js +24 -0
- package/apps/app-lifeops/src/lifeops/screen-context.d.ts +52 -0
- package/apps/app-lifeops/src/lifeops/screen-context.d.ts.map +1 -0
- package/apps/app-lifeops/src/lifeops/screen-context.js +332 -0
- package/apps/app-lifeops/src/plugin.d.ts +3 -0
- package/apps/app-lifeops/src/plugin.d.ts.map +1 -1
- package/apps/app-lifeops/src/plugin.js +16 -3
- package/apps/app-lifeops/src/providers/inbox-triage.d.ts +3 -0
- package/apps/app-lifeops/src/providers/inbox-triage.d.ts.map +1 -0
- package/apps/app-lifeops/src/providers/inbox-triage.js +89 -0
- package/package.json +6 -4
- package/packages/agent/src/actions/calendar.d.ts +1 -18
- package/packages/agent/src/actions/calendar.d.ts.map +1 -1
- package/packages/agent/src/actions/calendar.js +1 -3143
- package/packages/agent/src/actions/check-balance.d.ts +17 -0
- package/packages/agent/src/actions/check-balance.d.ts.map +1 -0
- package/packages/agent/src/actions/check-balance.js +167 -0
- package/packages/agent/src/actions/connector-resolver.d.ts +75 -0
- package/packages/agent/src/actions/connector-resolver.d.ts.map +1 -0
- package/packages/agent/src/actions/connector-resolver.js +245 -0
- package/packages/agent/src/actions/context-signal-lexicon.d.ts +1 -1
- package/packages/agent/src/actions/context-signal-lexicon.d.ts.map +1 -1
- package/packages/agent/src/actions/context-signal-lexicon.js +6 -0
- package/packages/agent/src/actions/eject-plugin.d.ts +3 -0
- package/packages/agent/src/actions/eject-plugin.d.ts.map +1 -0
- package/packages/agent/src/actions/eject-plugin.js +48 -0
- package/packages/agent/src/actions/execute-trade.d.ts +17 -0
- package/packages/agent/src/actions/execute-trade.d.ts.map +1 -0
- package/packages/agent/src/actions/execute-trade.js +299 -0
- package/packages/agent/src/actions/get-self-status.d.ts +13 -0
- package/packages/agent/src/actions/get-self-status.d.ts.map +1 -0
- package/packages/agent/src/actions/get-self-status.js +66 -0
- package/packages/agent/src/actions/gmail.d.ts +1 -32
- package/packages/agent/src/actions/gmail.d.ts.map +1 -1
- package/packages/agent/src/actions/gmail.js +1 -1734
- package/packages/agent/src/actions/inbox-digest.d.ts +1 -1
- package/packages/agent/src/actions/inbox-digest.d.ts.map +1 -1
- package/packages/agent/src/actions/inbox-digest.js +1 -1
- package/packages/agent/src/actions/inbox-respond.d.ts +1 -1
- package/packages/agent/src/actions/inbox-respond.d.ts.map +1 -1
- package/packages/agent/src/actions/inbox-respond.js +1 -1
- package/packages/agent/src/actions/inbox-triage.d.ts +1 -1
- package/packages/agent/src/actions/inbox-triage.d.ts.map +1 -1
- package/packages/agent/src/actions/inbox-triage.js +1 -1
- package/packages/agent/src/actions/inbox.d.ts +1 -2
- package/packages/agent/src/actions/inbox.d.ts.map +1 -1
- package/packages/agent/src/actions/inbox.js +1 -856
- package/packages/agent/src/actions/index.d.ts +13 -0
- package/packages/agent/src/actions/index.d.ts.map +1 -1
- package/packages/agent/src/actions/index.js +13 -0
- package/packages/agent/src/actions/install-plugin.d.ts +3 -0
- package/packages/agent/src/actions/install-plugin.d.ts.map +1 -0
- package/packages/agent/src/actions/install-plugin.js +65 -0
- package/packages/agent/src/actions/life-goal-extractor.d.ts +1 -68
- package/packages/agent/src/actions/life-goal-extractor.d.ts.map +1 -1
- package/packages/agent/src/actions/life-goal-extractor.js +1 -354
- package/packages/agent/src/actions/life-param-extractor.d.ts +1 -77
- package/packages/agent/src/actions/life-param-extractor.d.ts.map +1 -1
- package/packages/agent/src/actions/life-param-extractor.js +1 -423
- package/packages/agent/src/actions/life-recent-context.d.ts +1 -8
- package/packages/agent/src/actions/life-recent-context.d.ts.map +1 -1
- package/packages/agent/src/actions/life-recent-context.js +1 -84
- package/packages/agent/src/actions/life-update-extractor.d.ts +1 -26
- package/packages/agent/src/actions/life-update-extractor.d.ts.map +1 -1
- package/packages/agent/src/actions/life-update-extractor.js +1 -195
- package/packages/agent/src/actions/life.d.ts +1 -8
- package/packages/agent/src/actions/life.d.ts.map +1 -1
- package/packages/agent/src/actions/life.extractor.d.ts +1 -17
- package/packages/agent/src/actions/life.extractor.d.ts.map +1 -1
- package/packages/agent/src/actions/life.extractor.js +1 -264
- package/packages/agent/src/actions/life.js +1 -3379
- package/packages/agent/src/actions/lifeops-extraction-config.d.ts +1 -15
- package/packages/agent/src/actions/lifeops-extraction-config.d.ts.map +1 -1
- package/packages/agent/src/actions/lifeops-extraction-config.js +1 -25
- package/packages/agent/src/actions/lifeops-google-helpers.d.ts +1 -61
- package/packages/agent/src/actions/lifeops-google-helpers.d.ts.map +1 -1
- package/packages/agent/src/actions/lifeops-google-helpers.js +1 -607
- package/packages/agent/src/actions/list-ejected.d.ts +3 -0
- package/packages/agent/src/actions/list-ejected.d.ts.map +1 -0
- package/packages/agent/src/actions/list-ejected.js +35 -0
- package/packages/agent/src/actions/log-level.d.ts +3 -0
- package/packages/agent/src/actions/log-level.d.ts.map +1 -0
- package/packages/agent/src/actions/log-level.js +125 -0
- package/packages/agent/src/actions/manage-tasks.d.ts.map +1 -1
- package/packages/agent/src/actions/manage-tasks.js +51 -15
- package/packages/agent/src/actions/media.d.ts +21 -0
- package/packages/agent/src/actions/media.d.ts.map +1 -0
- package/packages/agent/src/actions/media.js +384 -0
- package/packages/agent/src/actions/read-messages.d.ts +14 -0
- package/packages/agent/src/actions/read-messages.d.ts.map +1 -0
- package/packages/agent/src/actions/read-messages.js +228 -0
- package/packages/agent/src/actions/reinject-plugin.d.ts +3 -0
- package/packages/agent/src/actions/reinject-plugin.d.ts.map +1 -0
- package/packages/agent/src/actions/reinject-plugin.js +47 -0
- package/packages/agent/src/actions/send-message.d.ts +0 -7
- package/packages/agent/src/actions/send-message.d.ts.map +1 -1
- package/packages/agent/src/actions/send-message.js +170 -49
- package/packages/agent/src/actions/sync-plugin.d.ts +3 -0
- package/packages/agent/src/actions/sync-plugin.d.ts.map +1 -0
- package/packages/agent/src/actions/sync-plugin.js +47 -0
- package/packages/agent/src/actions/timezone-normalization.d.ts +1 -2
- package/packages/agent/src/actions/timezone-normalization.d.ts.map +1 -1
- package/packages/agent/src/actions/timezone-normalization.js +1 -107
- package/packages/agent/src/actions/transfer-token.d.ts +17 -0
- package/packages/agent/src/actions/transfer-token.d.ts.map +1 -0
- package/packages/agent/src/actions/transfer-token.js +470 -0
- package/packages/agent/src/actions/update-owner-profile.d.ts +1 -2
- package/packages/agent/src/actions/update-owner-profile.d.ts.map +1 -1
- package/packages/agent/src/actions/update-owner-profile.js +1 -131
- package/packages/agent/src/actions/wallet-action-shared.d.ts +15 -0
- package/packages/agent/src/actions/wallet-action-shared.d.ts.map +1 -0
- package/packages/agent/src/actions/wallet-action-shared.js +24 -0
- package/packages/agent/src/api/agent-admin-routes.d.ts.map +1 -1
- package/packages/agent/src/api/agent-admin-routes.js +1 -1
- package/packages/agent/src/api/binance-skill-helpers.d.ts.map +1 -1
- package/packages/agent/src/api/binance-skill-helpers.js +8 -3
- package/packages/agent/src/api/chat-routes.d.ts.map +1 -1
- package/packages/agent/src/api/chat-routes.js +20 -5
- package/packages/agent/src/api/coding-agents-auth-sanitize.d.ts +1 -22
- package/packages/agent/src/api/coding-agents-auth-sanitize.d.ts.map +1 -1
- package/packages/agent/src/api/coding-agents-auth-sanitize.js +1 -39
- package/packages/agent/src/api/coding-agents-preflight-normalize.d.ts +1 -28
- package/packages/agent/src/api/coding-agents-preflight-normalize.d.ts.map +1 -1
- package/packages/agent/src/api/coding-agents-preflight-normalize.js +1 -45
- package/packages/agent/src/api/coordinator-types.d.ts +1 -46
- package/packages/agent/src/api/coordinator-types.d.ts.map +1 -1
- package/packages/agent/src/api/coordinator-types.js +1 -1
- package/packages/agent/src/api/coordinator-wiring.d.ts +1 -45
- package/packages/agent/src/api/coordinator-wiring.d.ts.map +1 -1
- package/packages/agent/src/api/coordinator-wiring.js +1 -108
- package/packages/agent/src/api/index.d.ts +1 -1
- package/packages/agent/src/api/index.d.ts.map +1 -1
- package/packages/agent/src/api/index.js +1 -1
- package/packages/agent/src/api/lifeops-browser-packaging.d.ts +1 -15
- package/packages/agent/src/api/lifeops-browser-packaging.d.ts.map +1 -1
- package/packages/agent/src/api/lifeops-browser-packaging.js +1 -305
- package/packages/agent/src/api/lifeops-routes.d.ts +1 -19
- package/packages/agent/src/api/lifeops-routes.d.ts.map +1 -1
- package/packages/agent/src/api/lifeops-routes.js +1 -1173
- package/packages/agent/src/api/server.d.ts.map +1 -1
- package/packages/agent/src/api/server.js +6 -6
- package/packages/agent/src/api/task-agent-message-routing.d.ts +1 -9
- package/packages/agent/src/api/task-agent-message-routing.d.ts.map +1 -1
- package/packages/agent/src/api/task-agent-message-routing.js +1 -62
- package/packages/agent/src/api/website-blocker-routes.d.ts +1 -6
- package/packages/agent/src/api/website-blocker-routes.d.ts.map +1 -1
- package/packages/agent/src/api/website-blocker-routes.js +1 -174
- package/packages/agent/src/config/types.agent-defaults.d.ts +1 -1
- package/packages/agent/src/config/types.agent-defaults.d.ts.map +1 -1
- package/packages/agent/src/evals/coordinator-eval-client.d.ts +1 -38
- package/packages/agent/src/evals/coordinator-eval-client.d.ts.map +1 -1
- package/packages/agent/src/evals/coordinator-eval-client.js +1 -138
- package/packages/agent/src/evals/coordinator-live-runner.d.ts +1 -56
- package/packages/agent/src/evals/coordinator-live-runner.d.ts.map +1 -1
- package/packages/agent/src/evals/coordinator-live-runner.js +1 -546
- package/packages/agent/src/evals/coordinator-preflight.d.ts +1 -31
- package/packages/agent/src/evals/coordinator-preflight.d.ts.map +1 -1
- package/packages/agent/src/evals/coordinator-preflight.js +1 -296
- package/packages/agent/src/evals/coordinator-scenarios.d.ts +1 -23
- package/packages/agent/src/evals/coordinator-scenarios.d.ts.map +1 -1
- package/packages/agent/src/evals/coordinator-scenarios.js +1 -1141
- package/packages/agent/src/lifeops/app-state.d.ts +1 -10
- package/packages/agent/src/lifeops/app-state.d.ts.map +1 -1
- package/packages/agent/src/lifeops/app-state.js +1 -32
- package/packages/agent/src/lifeops/apple-reminders.d.ts +1 -57
- package/packages/agent/src/lifeops/apple-reminders.d.ts.map +1 -1
- package/packages/agent/src/lifeops/apple-reminders.js +1 -325
- package/packages/agent/src/lifeops/defaults.d.ts +1 -23
- package/packages/agent/src/lifeops/defaults.d.ts.map +1 -1
- package/packages/agent/src/lifeops/defaults.js +1 -205
- package/packages/agent/src/lifeops/engine.d.ts +1 -7
- package/packages/agent/src/lifeops/engine.d.ts.map +1 -1
- package/packages/agent/src/lifeops/engine.js +1 -389
- package/packages/agent/src/lifeops/goal-grounding.d.ts +1 -53
- package/packages/agent/src/lifeops/goal-grounding.d.ts.map +1 -1
- package/packages/agent/src/lifeops/goal-grounding.js +1 -147
- package/packages/agent/src/lifeops/goal-semantic-evaluator.d.ts +1 -11
- package/packages/agent/src/lifeops/goal-semantic-evaluator.d.ts.map +1 -1
- package/packages/agent/src/lifeops/goal-semantic-evaluator.js +1 -154
- package/packages/agent/src/lifeops/google-api-error.d.ts +1 -6
- package/packages/agent/src/lifeops/google-api-error.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-api-error.js +1 -35
- package/packages/agent/src/lifeops/google-calendar.d.ts +1 -52
- package/packages/agent/src/lifeops/google-calendar.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-calendar.js +1 -268
- package/packages/agent/src/lifeops/google-connector-gateway.d.ts +1 -18
- package/packages/agent/src/lifeops/google-connector-gateway.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-connector-gateway.js +1 -65
- package/packages/agent/src/lifeops/google-fetch.d.ts +1 -10
- package/packages/agent/src/lifeops/google-fetch.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-fetch.js +1 -85
- package/packages/agent/src/lifeops/google-gmail.d.ts +1 -53
- package/packages/agent/src/lifeops/google-gmail.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-gmail.js +1 -471
- package/packages/agent/src/lifeops/google-managed-client.d.ts +1 -126
- package/packages/agent/src/lifeops/google-managed-client.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-managed-client.js +1 -294
- package/packages/agent/src/lifeops/google-oauth.d.ts +1 -60
- package/packages/agent/src/lifeops/google-oauth.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-oauth.js +1 -494
- package/packages/agent/src/lifeops/google-scopes.d.ts +1 -12
- package/packages/agent/src/lifeops/google-scopes.d.ts.map +1 -1
- package/packages/agent/src/lifeops/google-scopes.js +1 -96
- package/packages/agent/src/lifeops/index.d.ts +1 -2
- package/packages/agent/src/lifeops/index.d.ts.map +1 -1
- package/packages/agent/src/lifeops/index.js +1 -2
- package/packages/agent/src/lifeops/owner-profile.d.ts +1 -14
- package/packages/agent/src/lifeops/owner-profile.d.ts.map +1 -1
- package/packages/agent/src/lifeops/owner-profile.js +1 -194
- package/packages/agent/src/lifeops/repository.d.ts +1 -208
- package/packages/agent/src/lifeops/repository.d.ts.map +1 -1
- package/packages/agent/src/lifeops/repository.js +1 -3187
- package/packages/agent/src/lifeops/runtime.d.ts +1 -13
- package/packages/agent/src/lifeops/runtime.d.ts.map +1 -1
- package/packages/agent/src/lifeops/runtime.js +1 -120
- package/packages/agent/src/lifeops/screen-context.d.ts +1 -51
- package/packages/agent/src/lifeops/screen-context.d.ts.map +1 -1
- package/packages/agent/src/lifeops/screen-context.js +1 -332
- package/packages/agent/src/lifeops/seed-routines.d.ts +1 -19
- package/packages/agent/src/lifeops/seed-routines.d.ts.map +1 -1
- package/packages/agent/src/lifeops/seed-routines.js +1 -111
- package/packages/agent/src/lifeops/service.d.ts +1 -274
- package/packages/agent/src/lifeops/service.d.ts.map +1 -1
- package/packages/agent/src/lifeops/service.js +1 -9260
- package/packages/agent/src/lifeops/sql.d.ts +1 -30
- package/packages/agent/src/lifeops/sql.d.ts.map +1 -1
- package/packages/agent/src/lifeops/sql.js +1 -247
- package/packages/agent/src/lifeops/time.d.ts +1 -16
- package/packages/agent/src/lifeops/time.d.ts.map +1 -1
- package/packages/agent/src/lifeops/time.js +1 -132
- package/packages/agent/src/lifeops/twilio.d.ts +1 -24
- package/packages/agent/src/lifeops/twilio.d.ts.map +1 -1
- package/packages/agent/src/lifeops/twilio.js +1 -157
- package/packages/agent/src/lifeops/x-poster.d.ts +1 -18
- package/packages/agent/src/lifeops/x-poster.d.ts.map +1 -1
- package/packages/agent/src/lifeops/x-poster.js +1 -148
- package/packages/agent/src/providers/inbox-triage.d.ts +1 -2
- package/packages/agent/src/providers/inbox-triage.d.ts.map +1 -1
- package/packages/agent/src/providers/inbox-triage.js +1 -89
- package/packages/agent/src/providers/index.d.ts +4 -1
- package/packages/agent/src/providers/index.d.ts.map +1 -1
- package/packages/agent/src/providers/index.js +4 -1
- package/packages/agent/src/providers/lifeops.d.ts +1 -2
- package/packages/agent/src/providers/lifeops.d.ts.map +1 -1
- package/packages/agent/src/providers/lifeops.js +1 -157
- package/packages/agent/src/providers/local-models.d.ts +118 -0
- package/packages/agent/src/providers/local-models.d.ts.map +1 -0
- package/packages/agent/src/providers/local-models.js +427 -0
- package/packages/agent/src/providers/media-provider.d.ts +192 -0
- package/packages/agent/src/providers/media-provider.d.ts.map +1 -0
- package/packages/agent/src/providers/media-provider.js +1088 -0
- package/packages/agent/src/providers/self-status.d.ts +4 -0
- package/packages/agent/src/providers/self-status.d.ts.map +1 -0
- package/packages/agent/src/providers/self-status.js +12 -0
- package/packages/agent/src/providers/tasks.d.ts.map +1 -1
- package/packages/agent/src/providers/tasks.js +7 -7
- package/packages/agent/src/runtime/core-plugins.js +1 -1
- package/packages/agent/src/runtime/eliza-plugin.d.ts.map +1 -1
- package/packages/agent/src/runtime/eliza-plugin.js +1 -7
- package/packages/agent/src/runtime/eliza.js +2 -2
- package/packages/agent/src/runtime/plugin-collector.js +3 -3
- package/packages/agent/src/runtime/plugin-lifecycle.d.ts.map +1 -1
- package/packages/agent/src/runtime/plugin-lifecycle.js +3 -13
- package/packages/agent/src/runtime/trajectory-internals.d.ts.map +1 -1
- package/packages/agent/src/runtime/trajectory-internals.js +1 -3
- package/packages/agent/src/services/built-in-app-routes/hyperscape.d.ts.map +1 -1
- package/packages/agent/src/services/coding-task-executor.d.ts +3 -3
- package/packages/agent/src/services/coding-task-executor.js +3 -3
- package/packages/shared/src/awareness/index.d.ts +2 -0
- package/packages/shared/src/awareness/index.d.ts.map +1 -0
- package/packages/shared/src/awareness/index.js +1 -0
- package/packages/shared/src/awareness/registry.d.ts +27 -0
- package/packages/shared/src/awareness/registry.d.ts.map +1 -0
- package/packages/shared/src/awareness/registry.js +161 -0
- package/packages/shared/src/i18n/generated/validation-keyword-data.d.ts +24 -0
- package/packages/shared/src/i18n/generated/validation-keyword-data.d.ts.map +1 -1
- package/packages/shared/src/i18n/generated/validation-keyword-data.js +24 -0
- package/packages/shared/src/runtime-env.d.ts.map +1 -1
- package/packages/shared/src/runtime-env.js +5 -1
- package/packages/typescript/src/generated/action-docs.d.ts +135 -0
- package/packages/typescript/src/generated/action-docs.d.ts.map +1 -1
- package/packages/typescript/src/generated/action-docs.js +237 -0
- package/packages/typescript/src/i18n/generated/validation-keyword-data.d.ts +24 -0
- package/packages/typescript/src/i18n/generated/validation-keyword-data.d.ts.map +1 -1
- package/packages/typescript/src/i18n/generated/validation-keyword-data.js +24 -0
- package/packages/typescript/src/index.node.d.ts +2 -2
- package/packages/typescript/src/index.node.d.ts.map +1 -1
- package/packages/typescript/src/index.node.js +4 -3
- package/packages/typescript/src/plugin-lifecycle.d.ts.map +1 -1
- package/packages/typescript/src/plugin-lifecycle.js +42 -3
- package/packages/typescript/src/services/message.d.ts.map +1 -1
- package/packages/typescript/src/services/message.js +32 -0
- package/apps/app-training/src/core/cli.d.ts +0 -11
- package/apps/app-training/src/core/cli.d.ts.map +0 -1
- package/apps/app-training/src/core/cli.js +0 -302
- package/apps/app-training/src/core/context-audit.d.ts +0 -51
- package/apps/app-training/src/core/context-audit.d.ts.map +0 -1
- package/apps/app-training/src/core/context-audit.js +0 -141
- package/apps/app-training/src/core/context-catalog.d.ts +0 -47
- package/apps/app-training/src/core/context-catalog.d.ts.map +0 -1
- package/apps/app-training/src/core/context-catalog.js +0 -259
- package/apps/app-training/src/core/context-types.d.ts +0 -3
- package/apps/app-training/src/core/context-types.d.ts.map +0 -1
- package/apps/app-training/src/core/context-types.js +0 -11
- package/apps/app-training/src/core/dataset-generator.d.ts +0 -135
- package/apps/app-training/src/core/dataset-generator.d.ts.map +0 -1
- package/apps/app-training/src/core/dataset-generator.js +0 -703
- package/apps/app-training/src/core/replay-validator.d.ts +0 -96
- package/apps/app-training/src/core/replay-validator.d.ts.map +0 -1
- package/apps/app-training/src/core/replay-validator.js +0 -265
- package/apps/app-training/src/core/roleplay-executor.d.ts +0 -123
- package/apps/app-training/src/core/roleplay-executor.d.ts.map +0 -1
- package/apps/app-training/src/core/roleplay-executor.js +0 -645
- package/apps/app-training/src/core/roleplay-trajectories.d.ts +0 -54
- package/apps/app-training/src/core/roleplay-trajectories.d.ts.map +0 -1
- package/apps/app-training/src/core/roleplay-trajectories.js +0 -73
- package/apps/app-training/src/core/scenario-blueprints.d.ts +0 -62
- package/apps/app-training/src/core/scenario-blueprints.d.ts.map +0 -1
- package/apps/app-training/src/core/scenario-blueprints.js +0 -790
- package/apps/app-training/src/core/trajectory-task-datasets.d.ts +0 -38
- package/apps/app-training/src/core/trajectory-task-datasets.d.ts.map +0 -1
- package/apps/app-training/src/core/trajectory-task-datasets.js +0 -281
- package/apps/app-training/src/core/vertex-tuning.d.ts +0 -139
- package/apps/app-training/src/core/vertex-tuning.d.ts.map +0 -1
- package/apps/app-training/src/core/vertex-tuning.js +0 -234
- package/packages/agent/src/inbox/channel-deep-links.d.ts.map +0 -1
- package/packages/agent/src/inbox/config.d.ts.map +0 -1
- package/packages/agent/src/inbox/message-fetcher.d.ts.map +0 -1
- package/packages/agent/src/inbox/reflection.d.ts.map +0 -1
- package/packages/agent/src/inbox/repository.d.ts.map +0 -1
- package/packages/agent/src/inbox/triage-classifier.d.ts.map +0 -1
- package/packages/agent/src/inbox/types.d.ts.map +0 -1
- package/packages/agent/src/training/cli.d.ts +0 -2
- package/packages/agent/src/training/cli.d.ts.map +0 -1
- package/packages/agent/src/training/cli.js +0 -2
- package/packages/agent/src/training/context-audit.d.ts +0 -2
- package/packages/agent/src/training/context-audit.d.ts.map +0 -1
- package/packages/agent/src/training/context-audit.js +0 -2
- package/packages/agent/src/training/context-catalog.d.ts +0 -2
- package/packages/agent/src/training/context-catalog.d.ts.map +0 -1
- package/packages/agent/src/training/context-catalog.js +0 -2
- package/packages/agent/src/training/context-types.d.ts +0 -2
- package/packages/agent/src/training/context-types.d.ts.map +0 -1
- package/packages/agent/src/training/context-types.js +0 -2
- package/packages/agent/src/training/dataset-generator.d.ts +0 -2
- package/packages/agent/src/training/dataset-generator.d.ts.map +0 -1
- package/packages/agent/src/training/dataset-generator.js +0 -2
- package/packages/agent/src/training/replay-validator.d.ts +0 -2
- package/packages/agent/src/training/replay-validator.d.ts.map +0 -1
- package/packages/agent/src/training/replay-validator.js +0 -2
- package/packages/agent/src/training/roleplay-executor.d.ts +0 -2
- package/packages/agent/src/training/roleplay-executor.d.ts.map +0 -1
- package/packages/agent/src/training/roleplay-executor.js +0 -2
- package/packages/agent/src/training/roleplay-trajectories.d.ts +0 -2
- package/packages/agent/src/training/roleplay-trajectories.d.ts.map +0 -1
- package/packages/agent/src/training/roleplay-trajectories.js +0 -2
- package/packages/agent/src/training/scenario-blueprints.d.ts +0 -2
- package/packages/agent/src/training/scenario-blueprints.d.ts.map +0 -1
- package/packages/agent/src/training/scenario-blueprints.js +0 -2
- package/packages/agent/src/training/trajectory-task-datasets.d.ts +0 -2
- package/packages/agent/src/training/trajectory-task-datasets.d.ts.map +0 -1
- package/packages/agent/src/training/trajectory-task-datasets.js +0 -2
- package/packages/agent/src/training/vertex-tuning.d.ts +0 -2
- package/packages/agent/src/training/vertex-tuning.d.ts.map +0 -1
- package/packages/agent/src/training/vertex-tuning.js +0 -2
- package/packages/typescript/src/features/orchestrator/actions/coding-task-handlers.d.ts +0 -41
- package/packages/typescript/src/features/orchestrator/actions/coding-task-handlers.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/coding-task-handlers.js +0 -443
- package/packages/typescript/src/features/orchestrator/actions/coding-task-helpers.d.ts +0 -34
- package/packages/typescript/src/features/orchestrator/actions/coding-task-helpers.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/coding-task-helpers.js +0 -171
- package/packages/typescript/src/features/orchestrator/actions/eval-metadata.d.ts +0 -11
- package/packages/typescript/src/features/orchestrator/actions/eval-metadata.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/eval-metadata.js +0 -55
- package/packages/typescript/src/features/orchestrator/actions/finalize-workspace.d.ts +0 -11
- package/packages/typescript/src/features/orchestrator/actions/finalize-workspace.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/finalize-workspace.js +0 -214
- package/packages/typescript/src/features/orchestrator/actions/list-agents.d.ts +0 -13
- package/packages/typescript/src/features/orchestrator/actions/list-agents.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/list-agents.js +0 -174
- package/packages/typescript/src/features/orchestrator/actions/manage-issues.d.ts +0 -11
- package/packages/typescript/src/features/orchestrator/actions/manage-issues.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/manage-issues.js +0 -428
- package/packages/typescript/src/features/orchestrator/actions/provision-workspace.d.ts +0 -11
- package/packages/typescript/src/features/orchestrator/actions/provision-workspace.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/provision-workspace.js +0 -189
- package/packages/typescript/src/features/orchestrator/actions/send-to-agent.d.ts +0 -12
- package/packages/typescript/src/features/orchestrator/actions/send-to-agent.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/send-to-agent.js +0 -265
- package/packages/typescript/src/features/orchestrator/actions/spawn-agent.d.ts +0 -12
- package/packages/typescript/src/features/orchestrator/actions/spawn-agent.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/spawn-agent.js +0 -356
- package/packages/typescript/src/features/orchestrator/actions/start-coding-task.d.ts +0 -22
- package/packages/typescript/src/features/orchestrator/actions/start-coding-task.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/start-coding-task.js +0 -270
- package/packages/typescript/src/features/orchestrator/actions/stop-agent.d.ts +0 -12
- package/packages/typescript/src/features/orchestrator/actions/stop-agent.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/stop-agent.js +0 -192
- package/packages/typescript/src/features/orchestrator/actions/task-control.d.ts +0 -3
- package/packages/typescript/src/features/orchestrator/actions/task-control.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/task-control.js +0 -217
- package/packages/typescript/src/features/orchestrator/actions/task-history.d.ts +0 -3
- package/packages/typescript/src/features/orchestrator/actions/task-history.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/task-history.js +0 -323
- package/packages/typescript/src/features/orchestrator/actions/task-share.d.ts +0 -3
- package/packages/typescript/src/features/orchestrator/actions/task-share.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/task-share.js +0 -168
- package/packages/typescript/src/features/orchestrator/actions/task-thread-target.d.ts +0 -11
- package/packages/typescript/src/features/orchestrator/actions/task-thread-target.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/actions/task-thread-target.js +0 -68
- package/packages/typescript/src/features/orchestrator/api/agent-routes.d.ts +0 -18
- package/packages/typescript/src/features/orchestrator/api/agent-routes.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/api/agent-routes.js +0 -654
- package/packages/typescript/src/features/orchestrator/api/coordinator-routes.d.ts +0 -22
- package/packages/typescript/src/features/orchestrator/api/coordinator-routes.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/api/coordinator-routes.js +0 -403
- package/packages/typescript/src/features/orchestrator/api/hook-routes.d.ts +0 -18
- package/packages/typescript/src/features/orchestrator/api/hook-routes.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/api/hook-routes.js +0 -164
- package/packages/typescript/src/features/orchestrator/api/issue-routes.d.ts +0 -17
- package/packages/typescript/src/features/orchestrator/api/issue-routes.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/api/issue-routes.js +0 -132
- package/packages/typescript/src/features/orchestrator/api/routes.d.ts +0 -37
- package/packages/typescript/src/features/orchestrator/api/routes.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/api/routes.js +0 -96
- package/packages/typescript/src/features/orchestrator/api/workspace-routes.d.ts +0 -17
- package/packages/typescript/src/features/orchestrator/api/workspace-routes.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/api/workspace-routes.js +0 -149
- package/packages/typescript/src/features/orchestrator/base-plugin.d.ts +0 -19
- package/packages/typescript/src/features/orchestrator/base-plugin.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/base-plugin.js +0 -75
- package/packages/typescript/src/features/orchestrator/claude-jsonl-completion-watcher.d.ts +0 -101
- package/packages/typescript/src/features/orchestrator/claude-jsonl-completion-watcher.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/claude-jsonl-completion-watcher.js +0 -310
- package/packages/typescript/src/features/orchestrator/index.d.ts +0 -33
- package/packages/typescript/src/features/orchestrator/index.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/index.js +0 -30
- package/packages/typescript/src/features/orchestrator/patch-agent-orchestrator-plugin.d.ts +0 -15
- package/packages/typescript/src/features/orchestrator/patch-agent-orchestrator-plugin.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/patch-agent-orchestrator-plugin.js +0 -1449
- package/packages/typescript/src/features/orchestrator/providers/action-examples.d.ts +0 -14
- package/packages/typescript/src/features/orchestrator/providers/action-examples.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/providers/action-examples.js +0 -151
- package/packages/typescript/src/features/orchestrator/providers/active-workspace-context.d.ts +0 -13
- package/packages/typescript/src/features/orchestrator/providers/active-workspace-context.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/providers/active-workspace-context.js +0 -142
- package/packages/typescript/src/features/orchestrator/services/agent-credentials.d.ts +0 -6
- package/packages/typescript/src/features/orchestrator/services/agent-credentials.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/agent-credentials.js +0 -91
- package/packages/typescript/src/features/orchestrator/services/agent-metrics.d.ts +0 -30
- package/packages/typescript/src/features/orchestrator/services/agent-metrics.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/agent-metrics.js +0 -54
- package/packages/typescript/src/features/orchestrator/services/agent-selection.d.ts +0 -53
- package/packages/typescript/src/features/orchestrator/services/agent-selection.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/agent-selection.js +0 -70
- package/packages/typescript/src/features/orchestrator/services/ansi-utils.d.ts +0 -61
- package/packages/typescript/src/features/orchestrator/services/ansi-utils.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/ansi-utils.js +0 -252
- package/packages/typescript/src/features/orchestrator/services/config-env.d.ts +0 -13
- package/packages/typescript/src/features/orchestrator/services/config-env.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/config-env.js +0 -37
- package/packages/typescript/src/features/orchestrator/services/coordinator-event-normalizer.d.ts +0 -50
- package/packages/typescript/src/features/orchestrator/services/coordinator-event-normalizer.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/coordinator-event-normalizer.js +0 -184
- package/packages/typescript/src/features/orchestrator/services/debug-capture.d.ts +0 -38
- package/packages/typescript/src/features/orchestrator/services/debug-capture.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/debug-capture.js +0 -113
- package/packages/typescript/src/features/orchestrator/services/pty-auto-response.d.ts +0 -30
- package/packages/typescript/src/features/orchestrator/services/pty-auto-response.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/pty-auto-response.js +0 -146
- package/packages/typescript/src/features/orchestrator/services/pty-init.d.ts +0 -54
- package/packages/typescript/src/features/orchestrator/services/pty-init.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/pty-init.js +0 -315
- package/packages/typescript/src/features/orchestrator/services/pty-service.d.ts +0 -175
- package/packages/typescript/src/features/orchestrator/services/pty-service.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/pty-service.js +0 -1469
- package/packages/typescript/src/features/orchestrator/services/pty-session-io.d.ts +0 -49
- package/packages/typescript/src/features/orchestrator/services/pty-session-io.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/pty-session-io.js +0 -180
- package/packages/typescript/src/features/orchestrator/services/pty-spawn.d.ts +0 -53
- package/packages/typescript/src/features/orchestrator/services/pty-spawn.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/pty-spawn.js +0 -280
- package/packages/typescript/src/features/orchestrator/services/pty-types.d.ts +0 -80
- package/packages/typescript/src/features/orchestrator/services/pty-types.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/pty-types.js +0 -51
- package/packages/typescript/src/features/orchestrator/services/repo-input.d.ts +0 -16
- package/packages/typescript/src/features/orchestrator/services/repo-input.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/repo-input.js +0 -88
- package/packages/typescript/src/features/orchestrator/services/stall-classifier.d.ts +0 -69
- package/packages/typescript/src/features/orchestrator/services/stall-classifier.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/stall-classifier.js +0 -446
- package/packages/typescript/src/features/orchestrator/services/swarm-coordinator-prompts.d.ts +0 -97
- package/packages/typescript/src/features/orchestrator/services/swarm-coordinator-prompts.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/swarm-coordinator-prompts.js +0 -342
- package/packages/typescript/src/features/orchestrator/services/swarm-coordinator.d.ts +0 -421
- package/packages/typescript/src/features/orchestrator/services/swarm-coordinator.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/swarm-coordinator.js +0 -2356
- package/packages/typescript/src/features/orchestrator/services/swarm-decision-loop.d.ts +0 -52
- package/packages/typescript/src/features/orchestrator/services/swarm-decision-loop.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/swarm-decision-loop.js +0 -1538
- package/packages/typescript/src/features/orchestrator/services/swarm-event-triage.d.ts +0 -49
- package/packages/typescript/src/features/orchestrator/services/swarm-event-triage.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/swarm-event-triage.js +0 -171
- package/packages/typescript/src/features/orchestrator/services/swarm-history.d.ts +0 -27
- package/packages/typescript/src/features/orchestrator/services/swarm-history.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/swarm-history.js +0 -148
- package/packages/typescript/src/features/orchestrator/services/swarm-idle-watchdog.d.ts +0 -22
- package/packages/typescript/src/features/orchestrator/services/swarm-idle-watchdog.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/swarm-idle-watchdog.js +0 -265
- package/packages/typescript/src/features/orchestrator/services/task-acceptance.d.ts +0 -8
- package/packages/typescript/src/features/orchestrator/services/task-acceptance.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-acceptance.js +0 -114
- package/packages/typescript/src/features/orchestrator/services/task-agent-auth.d.ts +0 -68
- package/packages/typescript/src/features/orchestrator/services/task-agent-auth.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-agent-auth.js +0 -559
- package/packages/typescript/src/features/orchestrator/services/task-agent-frameworks.d.ts +0 -82
- package/packages/typescript/src/features/orchestrator/services/task-agent-frameworks.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-agent-frameworks.js +0 -738
- package/packages/typescript/src/features/orchestrator/services/task-kind.d.ts +0 -3
- package/packages/typescript/src/features/orchestrator/services/task-kind.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-kind.js +0 -40
- package/packages/typescript/src/features/orchestrator/services/task-policy.d.ts +0 -17
- package/packages/typescript/src/features/orchestrator/services/task-policy.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-policy.js +0 -226
- package/packages/typescript/src/features/orchestrator/services/task-registry.d.ts +0 -550
- package/packages/typescript/src/features/orchestrator/services/task-registry.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-registry.js +0 -2182
- package/packages/typescript/src/features/orchestrator/services/task-share.d.ts +0 -18
- package/packages/typescript/src/features/orchestrator/services/task-share.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-share.js +0 -159
- package/packages/typescript/src/features/orchestrator/services/task-validation.d.ts +0 -69
- package/packages/typescript/src/features/orchestrator/services/task-validation.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-validation.js +0 -587
- package/packages/typescript/src/features/orchestrator/services/task-verifier-runner.d.ts +0 -5
- package/packages/typescript/src/features/orchestrator/services/task-verifier-runner.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/task-verifier-runner.js +0 -372
- package/packages/typescript/src/features/orchestrator/services/trajectory-context.d.ts +0 -73
- package/packages/typescript/src/features/orchestrator/services/trajectory-context.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/trajectory-context.js +0 -64
- package/packages/typescript/src/features/orchestrator/services/trajectory-feedback.d.ts +0 -53
- package/packages/typescript/src/features/orchestrator/services/trajectory-feedback.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/trajectory-feedback.js +0 -260
- package/packages/typescript/src/features/orchestrator/services/workspace-git-ops.d.ts +0 -28
- package/packages/typescript/src/features/orchestrator/services/workspace-git-ops.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/workspace-git-ops.js +0 -105
- package/packages/typescript/src/features/orchestrator/services/workspace-github.d.ts +0 -58
- package/packages/typescript/src/features/orchestrator/services/workspace-github.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/workspace-github.js +0 -139
- package/packages/typescript/src/features/orchestrator/services/workspace-lifecycle.d.ts +0 -18
- package/packages/typescript/src/features/orchestrator/services/workspace-lifecycle.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/workspace-lifecycle.js +0 -86
- package/packages/typescript/src/features/orchestrator/services/workspace-service.d.ts +0 -118
- package/packages/typescript/src/features/orchestrator/services/workspace-service.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/workspace-service.js +0 -533
- package/packages/typescript/src/features/orchestrator/services/workspace-types.d.ts +0 -81
- package/packages/typescript/src/features/orchestrator/services/workspace-types.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/services/workspace-types.js +0 -8
- package/packages/typescript/src/features/orchestrator/task-progress-streamer.d.ts +0 -38
- package/packages/typescript/src/features/orchestrator/task-progress-streamer.d.ts.map +0 -1
- package/packages/typescript/src/features/orchestrator/task-progress-streamer.js +0 -293
- /package/{packages/agent → apps/app-lifeops}/src/inbox/channel-deep-links.d.ts +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/channel-deep-links.js +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/config.d.ts +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/message-fetcher.d.ts +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/message-fetcher.js +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/reflection.d.ts +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/reflection.js +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/repository.d.ts +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/repository.js +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/triage-classifier.d.ts +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/triage-classifier.js +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/types.d.ts +0 -0
- /package/{packages/agent → apps/app-lifeops}/src/inbox/types.js +0 -0
|
@@ -1,2182 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
|
-
let cachedSqlRaw = null;
|
|
3
|
-
const schemaReady = new WeakSet();
|
|
4
|
-
function asObject(value) {
|
|
5
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
6
|
-
return null;
|
|
7
|
-
return value;
|
|
8
|
-
}
|
|
9
|
-
function toText(value, fallback = "") {
|
|
10
|
-
if (typeof value === "string")
|
|
11
|
-
return value;
|
|
12
|
-
if (value === null || value === undefined)
|
|
13
|
-
return fallback;
|
|
14
|
-
return String(value);
|
|
15
|
-
}
|
|
16
|
-
function toNumber(value, fallback = 0) {
|
|
17
|
-
if (typeof value === "number" && Number.isFinite(value))
|
|
18
|
-
return value;
|
|
19
|
-
if (typeof value === "string") {
|
|
20
|
-
const parsed = Number(value);
|
|
21
|
-
if (Number.isFinite(parsed))
|
|
22
|
-
return parsed;
|
|
23
|
-
}
|
|
24
|
-
return fallback;
|
|
25
|
-
}
|
|
26
|
-
function toNullableText(value) {
|
|
27
|
-
if (value === null || value === undefined || value === "")
|
|
28
|
-
return null;
|
|
29
|
-
return toText(value);
|
|
30
|
-
}
|
|
31
|
-
function toNullableNumber(value) {
|
|
32
|
-
if (value === null || value === undefined || value === "")
|
|
33
|
-
return null;
|
|
34
|
-
const parsed = toNumber(value, Number.NaN);
|
|
35
|
-
return Number.isFinite(parsed) ? parsed : null;
|
|
36
|
-
}
|
|
37
|
-
function toBoolean(value, fallback = false) {
|
|
38
|
-
if (typeof value === "boolean")
|
|
39
|
-
return value;
|
|
40
|
-
if (typeof value === "number")
|
|
41
|
-
return value !== 0;
|
|
42
|
-
if (typeof value === "string") {
|
|
43
|
-
const normalized = value.trim().toLowerCase();
|
|
44
|
-
if (["1", "true", "yes", "on"].includes(normalized))
|
|
45
|
-
return true;
|
|
46
|
-
if (["0", "false", "no", "off"].includes(normalized))
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
return fallback;
|
|
50
|
-
}
|
|
51
|
-
function parseJsonRecord(value) {
|
|
52
|
-
if (value === null || value === undefined || value === "")
|
|
53
|
-
return {};
|
|
54
|
-
if (typeof value !== "string")
|
|
55
|
-
return asObject(value) ?? {};
|
|
56
|
-
try {
|
|
57
|
-
return asObject(JSON.parse(value)) ?? {};
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return {};
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function parseJsonArray(value) {
|
|
64
|
-
if (value === null || value === undefined || value === "")
|
|
65
|
-
return [];
|
|
66
|
-
if (Array.isArray(value)) {
|
|
67
|
-
return value.filter((entry) => typeof entry === "string");
|
|
68
|
-
}
|
|
69
|
-
if (typeof value !== "string")
|
|
70
|
-
return [];
|
|
71
|
-
try {
|
|
72
|
-
const parsed = JSON.parse(value);
|
|
73
|
-
return Array.isArray(parsed)
|
|
74
|
-
? parsed.filter((entry) => typeof entry === "string")
|
|
75
|
-
: [];
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function isoNow() {
|
|
82
|
-
return new Date().toISOString();
|
|
83
|
-
}
|
|
84
|
-
function sqlQuote(value) {
|
|
85
|
-
return `'${value.replace(/'/g, "''")}'`;
|
|
86
|
-
}
|
|
87
|
-
function sqlText(value) {
|
|
88
|
-
if (value === null || value === undefined)
|
|
89
|
-
return "NULL";
|
|
90
|
-
return sqlQuote(value);
|
|
91
|
-
}
|
|
92
|
-
function sqlInteger(value) {
|
|
93
|
-
if (value === null || value === undefined)
|
|
94
|
-
return "NULL";
|
|
95
|
-
if (!Number.isFinite(value)) {
|
|
96
|
-
throw new Error("invalid numeric SQL literal");
|
|
97
|
-
}
|
|
98
|
-
return String(Math.trunc(value));
|
|
99
|
-
}
|
|
100
|
-
function sqlBoolean(value) {
|
|
101
|
-
return value ? "TRUE" : "FALSE";
|
|
102
|
-
}
|
|
103
|
-
function sqlJson(value) {
|
|
104
|
-
return sqlQuote(JSON.stringify(value ?? null));
|
|
105
|
-
}
|
|
106
|
-
function sqlStringList(values) {
|
|
107
|
-
return values.map((value) => sqlQuote(value)).join(", ");
|
|
108
|
-
}
|
|
109
|
-
function normalizeThreadStatus(value) {
|
|
110
|
-
switch (toText(value).toLowerCase()) {
|
|
111
|
-
case "active":
|
|
112
|
-
case "waiting_on_user":
|
|
113
|
-
case "blocked":
|
|
114
|
-
case "validating":
|
|
115
|
-
case "done":
|
|
116
|
-
case "failed":
|
|
117
|
-
case "archived":
|
|
118
|
-
case "interrupted":
|
|
119
|
-
return toText(value).toLowerCase();
|
|
120
|
-
default:
|
|
121
|
-
return "open";
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
function normalizeSessionStatus(value) {
|
|
125
|
-
switch (toText(value).toLowerCase()) {
|
|
126
|
-
case "blocked":
|
|
127
|
-
case "waiting_on_user":
|
|
128
|
-
case "completed":
|
|
129
|
-
case "stopped":
|
|
130
|
-
case "error":
|
|
131
|
-
case "tool_running":
|
|
132
|
-
case "interrupted":
|
|
133
|
-
return toText(value).toLowerCase();
|
|
134
|
-
default:
|
|
135
|
-
return "active";
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
function normalizeTaskNodeKind(value) {
|
|
139
|
-
switch (toText(value).toLowerCase()) {
|
|
140
|
-
case "goal":
|
|
141
|
-
case "execution":
|
|
142
|
-
case "research":
|
|
143
|
-
case "planning":
|
|
144
|
-
case "verification":
|
|
145
|
-
case "handoff":
|
|
146
|
-
return toText(value).toLowerCase();
|
|
147
|
-
default:
|
|
148
|
-
return "execution";
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
function normalizeTaskNodeStatus(value) {
|
|
152
|
-
switch (toText(value).toLowerCase()) {
|
|
153
|
-
case "ready":
|
|
154
|
-
case "claimed":
|
|
155
|
-
case "running":
|
|
156
|
-
case "blocked":
|
|
157
|
-
case "waiting_on_user":
|
|
158
|
-
case "verifying":
|
|
159
|
-
case "completed":
|
|
160
|
-
case "failed":
|
|
161
|
-
case "canceled":
|
|
162
|
-
case "interrupted":
|
|
163
|
-
return toText(value).toLowerCase();
|
|
164
|
-
default:
|
|
165
|
-
return "planned";
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
function normalizeTaskDependencyKind(value) {
|
|
169
|
-
switch (toText(value).toLowerCase()) {
|
|
170
|
-
case "parent_child":
|
|
171
|
-
case "artifact":
|
|
172
|
-
case "handoff":
|
|
173
|
-
return toText(value).toLowerCase();
|
|
174
|
-
default:
|
|
175
|
-
return "blocks";
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
function normalizeTaskClaimType(value) {
|
|
179
|
-
switch (toText(value).toLowerCase()) {
|
|
180
|
-
case "verification":
|
|
181
|
-
case "ownership":
|
|
182
|
-
return toText(value).toLowerCase();
|
|
183
|
-
default:
|
|
184
|
-
return "execution";
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
function normalizeTaskClaimStatus(value) {
|
|
188
|
-
switch (toText(value).toLowerCase()) {
|
|
189
|
-
case "released":
|
|
190
|
-
case "completed":
|
|
191
|
-
case "failed":
|
|
192
|
-
case "interrupted":
|
|
193
|
-
return toText(value).toLowerCase();
|
|
194
|
-
default:
|
|
195
|
-
return "active";
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
function normalizeMailboxDeliveryState(value) {
|
|
199
|
-
switch (toText(value).toLowerCase()) {
|
|
200
|
-
case "delivered":
|
|
201
|
-
case "consumed":
|
|
202
|
-
return toText(value).toLowerCase();
|
|
203
|
-
default:
|
|
204
|
-
return "pending";
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
function normalizeVerifierJobStatus(value) {
|
|
208
|
-
switch (toText(value).toLowerCase()) {
|
|
209
|
-
case "running":
|
|
210
|
-
case "passed":
|
|
211
|
-
case "failed":
|
|
212
|
-
case "canceled":
|
|
213
|
-
return toText(value).toLowerCase();
|
|
214
|
-
default:
|
|
215
|
-
return "pending";
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
function extractRows(result) {
|
|
219
|
-
if (Array.isArray(result)) {
|
|
220
|
-
return result
|
|
221
|
-
.map((row) => asObject(row))
|
|
222
|
-
.filter((row) => row !== null);
|
|
223
|
-
}
|
|
224
|
-
const obj = asObject(result);
|
|
225
|
-
if (!obj || !Array.isArray(obj.rows))
|
|
226
|
-
return [];
|
|
227
|
-
return obj.rows
|
|
228
|
-
.map((row) => asObject(row))
|
|
229
|
-
.filter((row) => row !== null);
|
|
230
|
-
}
|
|
231
|
-
async function getSqlRaw() {
|
|
232
|
-
if (cachedSqlRaw)
|
|
233
|
-
return cachedSqlRaw;
|
|
234
|
-
const drizzle = (await import("drizzle-orm"));
|
|
235
|
-
cachedSqlRaw = drizzle.sql.raw;
|
|
236
|
-
return cachedSqlRaw;
|
|
237
|
-
}
|
|
238
|
-
function getRuntimeDb(runtime) {
|
|
239
|
-
const runtimeLike = runtime;
|
|
240
|
-
const db = runtimeLike.adapter?.db ?? runtimeLike.databaseAdapter?.db;
|
|
241
|
-
if (!db || typeof db.execute !== "function") {
|
|
242
|
-
throw new Error("runtime database adapter unavailable");
|
|
243
|
-
}
|
|
244
|
-
return db;
|
|
245
|
-
}
|
|
246
|
-
async function executeRawSql(runtime, sqlTextValue) {
|
|
247
|
-
const raw = await getSqlRaw();
|
|
248
|
-
const result = await getRuntimeDb(runtime).execute(raw(sqlTextValue));
|
|
249
|
-
return extractRows(result);
|
|
250
|
-
}
|
|
251
|
-
function parseThreadRow(row) {
|
|
252
|
-
return {
|
|
253
|
-
id: toText(row.id),
|
|
254
|
-
agentId: toText(row.agent_id),
|
|
255
|
-
roomId: toNullableText(row.room_id),
|
|
256
|
-
worldId: toNullableText(row.world_id),
|
|
257
|
-
ownerUserId: toNullableText(row.owner_user_id),
|
|
258
|
-
scenarioId: toNullableText(row.scenario_id),
|
|
259
|
-
batchId: toNullableText(row.batch_id),
|
|
260
|
-
title: toText(row.title),
|
|
261
|
-
kind: toText(row.kind, "coding"),
|
|
262
|
-
status: normalizeThreadStatus(row.status),
|
|
263
|
-
originalRequest: toText(row.original_request),
|
|
264
|
-
summary: toText(row.summary),
|
|
265
|
-
acceptanceCriteria: parseJsonArray(row.acceptance_criteria_json),
|
|
266
|
-
currentPlan: parseJsonRecord(row.current_plan_json),
|
|
267
|
-
searchText: toText(row.search_text),
|
|
268
|
-
createdAt: toText(row.created_at),
|
|
269
|
-
updatedAt: toText(row.updated_at),
|
|
270
|
-
closedAt: toNullableText(row.closed_at),
|
|
271
|
-
archivedAt: toNullableText(row.archived_at),
|
|
272
|
-
lastUserTurnAt: toNullableText(row.last_user_turn_at),
|
|
273
|
-
lastCoordinatorTurnAt: toNullableText(row.last_coordinator_turn_at),
|
|
274
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
function parseThreadSummaryRow(row) {
|
|
278
|
-
return {
|
|
279
|
-
...parseThreadRow(row),
|
|
280
|
-
sessionCount: toNumber(row.session_count, 0),
|
|
281
|
-
activeSessionCount: toNumber(row.active_session_count, 0),
|
|
282
|
-
latestSessionId: toNullableText(row.latest_session_id),
|
|
283
|
-
latestSessionLabel: toNullableText(row.latest_session_label),
|
|
284
|
-
latestWorkdir: toNullableText(row.latest_workdir),
|
|
285
|
-
latestRepo: toNullableText(row.latest_repo),
|
|
286
|
-
latestActivityAt: toNullableNumber(row.latest_activity_at),
|
|
287
|
-
decisionCount: toNumber(row.decision_count, 0),
|
|
288
|
-
nodeCount: toNumber(row.node_count, 0),
|
|
289
|
-
readyNodeCount: toNumber(row.ready_node_count, 0),
|
|
290
|
-
completedNodeCount: toNumber(row.completed_node_count, 0),
|
|
291
|
-
verifierJobCount: toNumber(row.verifier_job_count, 0),
|
|
292
|
-
evidenceCount: toNumber(row.evidence_count, 0),
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
function parseSessionRow(row) {
|
|
296
|
-
return {
|
|
297
|
-
id: toText(row.id),
|
|
298
|
-
threadId: toText(row.thread_id),
|
|
299
|
-
agentId: toText(row.agent_id),
|
|
300
|
-
sessionId: toText(row.session_id),
|
|
301
|
-
framework: toText(row.framework, "claude"),
|
|
302
|
-
providerSource: toNullableText(row.provider_source),
|
|
303
|
-
label: toText(row.label),
|
|
304
|
-
originalTask: toText(row.original_task),
|
|
305
|
-
workdir: toText(row.workdir),
|
|
306
|
-
repo: toNullableText(row.repo),
|
|
307
|
-
status: normalizeSessionStatus(row.status),
|
|
308
|
-
decisionCount: toNumber(row.decision_count, 0),
|
|
309
|
-
autoResolvedCount: toNumber(row.auto_resolved_count, 0),
|
|
310
|
-
registeredAt: toNumber(row.registered_at, 0),
|
|
311
|
-
lastActivityAt: toNumber(row.last_activity_at, 0),
|
|
312
|
-
idleCheckCount: toNumber(row.idle_check_count, 0),
|
|
313
|
-
taskDelivered: toBoolean(row.task_delivered),
|
|
314
|
-
completionSummary: toNullableText(row.completion_summary),
|
|
315
|
-
lastSeenDecisionIndex: toNumber(row.last_seen_decision_index, 0),
|
|
316
|
-
lastInputSentAt: toNullableNumber(row.last_input_sent_at),
|
|
317
|
-
stoppedAt: toNullableNumber(row.stopped_at),
|
|
318
|
-
createdAt: toText(row.created_at),
|
|
319
|
-
updatedAt: toText(row.updated_at),
|
|
320
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
function parseDecisionRow(row) {
|
|
324
|
-
return {
|
|
325
|
-
id: toText(row.id),
|
|
326
|
-
threadId: toText(row.thread_id),
|
|
327
|
-
sessionId: toText(row.session_id),
|
|
328
|
-
timestamp: toNumber(row.timestamp, 0),
|
|
329
|
-
event: toText(row.event_type),
|
|
330
|
-
promptText: toText(row.prompt_text),
|
|
331
|
-
decision: toText(row.decision),
|
|
332
|
-
response: toNullableText(row.response),
|
|
333
|
-
reasoning: toText(row.reasoning),
|
|
334
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
function parseEventRow(row) {
|
|
338
|
-
return {
|
|
339
|
-
id: toText(row.id),
|
|
340
|
-
threadId: toText(row.thread_id),
|
|
341
|
-
sessionId: toNullableText(row.session_id),
|
|
342
|
-
eventType: toText(row.event_type),
|
|
343
|
-
timestamp: toNumber(row.timestamp, 0),
|
|
344
|
-
summary: toText(row.summary),
|
|
345
|
-
data: parseJsonRecord(row.data_json),
|
|
346
|
-
createdAt: toText(row.created_at),
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
function parseArtifactRow(row) {
|
|
350
|
-
return {
|
|
351
|
-
id: toText(row.id),
|
|
352
|
-
threadId: toText(row.thread_id),
|
|
353
|
-
sessionId: toNullableText(row.session_id),
|
|
354
|
-
artifactType: toText(row.artifact_type),
|
|
355
|
-
title: toText(row.title),
|
|
356
|
-
path: toNullableText(row.path),
|
|
357
|
-
uri: toNullableText(row.uri),
|
|
358
|
-
mimeType: toNullableText(row.mime_type),
|
|
359
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
360
|
-
createdAt: toText(row.created_at),
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
function parseTranscriptRow(row) {
|
|
364
|
-
return {
|
|
365
|
-
id: toText(row.id),
|
|
366
|
-
threadId: toText(row.thread_id),
|
|
367
|
-
sessionId: toText(row.session_id),
|
|
368
|
-
timestamp: toNumber(row.timestamp, 0),
|
|
369
|
-
direction: toText(row.direction),
|
|
370
|
-
content: toText(row.content),
|
|
371
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
372
|
-
createdAt: toText(row.created_at),
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
function parsePendingDecisionRow(row) {
|
|
376
|
-
return {
|
|
377
|
-
sessionId: toText(row.session_id),
|
|
378
|
-
threadId: toText(row.thread_id),
|
|
379
|
-
promptText: toText(row.prompt_text),
|
|
380
|
-
recentOutput: toText(row.recent_output),
|
|
381
|
-
llmDecision: parseJsonRecord(row.llm_decision_json),
|
|
382
|
-
taskContext: parseJsonRecord(row.task_context_json),
|
|
383
|
-
createdAt: toNumber(row.created_at, 0),
|
|
384
|
-
updatedAt: toText(row.updated_at),
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
function parseTaskNodeRow(row) {
|
|
388
|
-
return {
|
|
389
|
-
id: toText(row.id),
|
|
390
|
-
threadId: toText(row.thread_id),
|
|
391
|
-
parentNodeId: toNullableText(row.parent_node_id),
|
|
392
|
-
kind: normalizeTaskNodeKind(row.kind),
|
|
393
|
-
status: normalizeTaskNodeStatus(row.status),
|
|
394
|
-
title: toText(row.title),
|
|
395
|
-
instructions: toText(row.instructions),
|
|
396
|
-
acceptanceCriteria: parseJsonArray(row.acceptance_criteria_json),
|
|
397
|
-
requiredCapabilities: parseJsonArray(row.required_capabilities_json),
|
|
398
|
-
expectedArtifacts: parseJsonArray(row.expected_artifacts_json),
|
|
399
|
-
assignedSessionId: toNullableText(row.assigned_session_id),
|
|
400
|
-
assignedLabel: toNullableText(row.assigned_label),
|
|
401
|
-
agentType: toNullableText(row.agent_type),
|
|
402
|
-
workdir: toNullableText(row.workdir),
|
|
403
|
-
repo: toNullableText(row.repo),
|
|
404
|
-
priority: toNumber(row.priority, 0),
|
|
405
|
-
depth: toNumber(row.depth, 0),
|
|
406
|
-
sequence: toNumber(row.sequence, 0),
|
|
407
|
-
createdFrom: toNullableText(row.created_from),
|
|
408
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
409
|
-
createdAt: toText(row.created_at),
|
|
410
|
-
updatedAt: toText(row.updated_at),
|
|
411
|
-
startedAt: toNullableText(row.started_at),
|
|
412
|
-
completedAt: toNullableText(row.completed_at),
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
function parseTaskDependencyRow(row) {
|
|
416
|
-
return {
|
|
417
|
-
id: toText(row.id),
|
|
418
|
-
threadId: toText(row.thread_id),
|
|
419
|
-
fromNodeId: toText(row.from_node_id),
|
|
420
|
-
toNodeId: toText(row.to_node_id),
|
|
421
|
-
dependencyKind: normalizeTaskDependencyKind(row.dependency_kind),
|
|
422
|
-
requiredStatus: normalizeTaskNodeStatus(row.required_status),
|
|
423
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
424
|
-
createdAt: toText(row.created_at),
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
function parseTaskClaimRow(row) {
|
|
428
|
-
return {
|
|
429
|
-
id: toText(row.id),
|
|
430
|
-
threadId: toText(row.thread_id),
|
|
431
|
-
nodeId: toText(row.node_id),
|
|
432
|
-
sessionId: toText(row.session_id),
|
|
433
|
-
claimType: normalizeTaskClaimType(row.claim_type),
|
|
434
|
-
status: normalizeTaskClaimStatus(row.status),
|
|
435
|
-
claimedAt: toText(row.claimed_at),
|
|
436
|
-
releasedAt: toNullableText(row.released_at),
|
|
437
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
438
|
-
};
|
|
439
|
-
}
|
|
440
|
-
function parseTaskMailboxMessageRow(row) {
|
|
441
|
-
return {
|
|
442
|
-
id: toText(row.id),
|
|
443
|
-
threadId: toText(row.thread_id),
|
|
444
|
-
nodeId: toNullableText(row.node_id),
|
|
445
|
-
sessionId: toNullableText(row.session_id),
|
|
446
|
-
sender: toText(row.sender),
|
|
447
|
-
recipient: toText(row.recipient),
|
|
448
|
-
subject: toText(row.subject),
|
|
449
|
-
body: toText(row.body),
|
|
450
|
-
deliveryState: normalizeMailboxDeliveryState(row.delivery_state),
|
|
451
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
452
|
-
createdAt: toText(row.created_at),
|
|
453
|
-
deliveredAt: toNullableText(row.delivered_at),
|
|
454
|
-
};
|
|
455
|
-
}
|
|
456
|
-
function parseTaskVerifierJobRow(row) {
|
|
457
|
-
return {
|
|
458
|
-
id: toText(row.id),
|
|
459
|
-
threadId: toText(row.thread_id),
|
|
460
|
-
nodeId: toText(row.node_id),
|
|
461
|
-
status: normalizeVerifierJobStatus(row.status),
|
|
462
|
-
verifierType: toText(row.verifier_type),
|
|
463
|
-
title: toText(row.title),
|
|
464
|
-
instructions: toText(row.instructions),
|
|
465
|
-
config: parseJsonRecord(row.config_json),
|
|
466
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
467
|
-
createdAt: toText(row.created_at),
|
|
468
|
-
startedAt: toNullableText(row.started_at),
|
|
469
|
-
completedAt: toNullableText(row.completed_at),
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
function parseTaskEvidenceRow(row) {
|
|
473
|
-
return {
|
|
474
|
-
id: toText(row.id),
|
|
475
|
-
threadId: toText(row.thread_id),
|
|
476
|
-
nodeId: toNullableText(row.node_id),
|
|
477
|
-
sessionId: toNullableText(row.session_id),
|
|
478
|
-
verifierJobId: toNullableText(row.verifier_job_id),
|
|
479
|
-
evidenceType: toText(row.evidence_type),
|
|
480
|
-
title: toText(row.title),
|
|
481
|
-
summary: toText(row.summary),
|
|
482
|
-
path: toNullableText(row.path),
|
|
483
|
-
uri: toNullableText(row.uri),
|
|
484
|
-
content: parseJsonRecord(row.content_json),
|
|
485
|
-
metadata: parseJsonRecord(row.metadata_json),
|
|
486
|
-
createdAt: toText(row.created_at),
|
|
487
|
-
};
|
|
488
|
-
}
|
|
489
|
-
function buildSearchText(parts) {
|
|
490
|
-
return parts
|
|
491
|
-
.map((part) => (part ?? "").trim().toLowerCase())
|
|
492
|
-
.filter(Boolean)
|
|
493
|
-
.join(" ");
|
|
494
|
-
}
|
|
495
|
-
function isTerminalTaskNodeStatus(status) {
|
|
496
|
-
return (status === "completed" ||
|
|
497
|
-
status === "failed" ||
|
|
498
|
-
status === "canceled" ||
|
|
499
|
-
status === "interrupted");
|
|
500
|
-
}
|
|
501
|
-
function dependencyStatusSatisfied(actual, required) {
|
|
502
|
-
if (actual === required)
|
|
503
|
-
return true;
|
|
504
|
-
return false;
|
|
505
|
-
}
|
|
506
|
-
function buildThreadListWhereClauses(options) {
|
|
507
|
-
const clauses = [];
|
|
508
|
-
if (options.threadId) {
|
|
509
|
-
clauses.push(`thread.id = ${sqlQuote(options.threadId)}`);
|
|
510
|
-
}
|
|
511
|
-
if (!options.includeArchived) {
|
|
512
|
-
clauses.push("thread.archived_at IS NULL");
|
|
513
|
-
}
|
|
514
|
-
if (options.status) {
|
|
515
|
-
clauses.push(`thread.status = ${sqlQuote(options.status)}`);
|
|
516
|
-
}
|
|
517
|
-
if (Array.isArray(options.statuses) && options.statuses.length > 0) {
|
|
518
|
-
const normalizedStatuses = options.statuses
|
|
519
|
-
.map((status) => normalizeThreadStatus(status))
|
|
520
|
-
.filter(Boolean);
|
|
521
|
-
if (normalizedStatuses.length > 0) {
|
|
522
|
-
clauses.push(`thread.status IN (${sqlStringList(normalizedStatuses)})`);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
if (options.kind) {
|
|
526
|
-
clauses.push(`thread.kind = ${sqlQuote(options.kind)}`);
|
|
527
|
-
}
|
|
528
|
-
if (options.roomId) {
|
|
529
|
-
clauses.push(`thread.room_id = ${sqlQuote(options.roomId)}`);
|
|
530
|
-
}
|
|
531
|
-
if (options.worldId) {
|
|
532
|
-
clauses.push(`thread.world_id = ${sqlQuote(options.worldId)}`);
|
|
533
|
-
}
|
|
534
|
-
if (options.ownerUserId) {
|
|
535
|
-
clauses.push(`thread.owner_user_id = ${sqlQuote(options.ownerUserId)}`);
|
|
536
|
-
}
|
|
537
|
-
if (options.scenarioId) {
|
|
538
|
-
clauses.push(`thread.scenario_id = ${sqlQuote(options.scenarioId)}`);
|
|
539
|
-
}
|
|
540
|
-
if (options.batchId) {
|
|
541
|
-
clauses.push(`thread.batch_id = ${sqlQuote(options.batchId)}`);
|
|
542
|
-
}
|
|
543
|
-
if (options.createdAfter) {
|
|
544
|
-
clauses.push(`thread.created_at >= ${sqlQuote(options.createdAfter)}`);
|
|
545
|
-
}
|
|
546
|
-
if (options.createdBefore) {
|
|
547
|
-
clauses.push(`thread.created_at <= ${sqlQuote(options.createdBefore)}`);
|
|
548
|
-
}
|
|
549
|
-
if (options.updatedAfter) {
|
|
550
|
-
clauses.push(`thread.updated_at >= ${sqlQuote(options.updatedAfter)}`);
|
|
551
|
-
}
|
|
552
|
-
if (options.updatedBefore) {
|
|
553
|
-
clauses.push(`thread.updated_at <= ${sqlQuote(options.updatedBefore)}`);
|
|
554
|
-
}
|
|
555
|
-
if (typeof options.latestActivityAfter === "number") {
|
|
556
|
-
clauses.push(`COALESCE(latest.last_activity_at, 0) >= ${sqlInteger(options.latestActivityAfter)}`);
|
|
557
|
-
}
|
|
558
|
-
if (typeof options.latestActivityBefore === "number") {
|
|
559
|
-
clauses.push(`COALESCE(latest.last_activity_at, 0) <= ${sqlInteger(options.latestActivityBefore)}`);
|
|
560
|
-
}
|
|
561
|
-
if (typeof options.hasActiveSession === "boolean") {
|
|
562
|
-
clauses.push(options.hasActiveSession
|
|
563
|
-
? "COALESCE(session_counts.active_session_count, 0) > 0"
|
|
564
|
-
: "COALESCE(session_counts.active_session_count, 0) = 0");
|
|
565
|
-
}
|
|
566
|
-
if (options.search?.trim()) {
|
|
567
|
-
const q = options.search.trim().toLowerCase().replace(/[%_]/g, "\\$&");
|
|
568
|
-
clauses.push(`thread.search_text LIKE ${sqlQuote(`%${q}%`)}`);
|
|
569
|
-
}
|
|
570
|
-
return clauses;
|
|
571
|
-
}
|
|
572
|
-
export class TaskRegistry {
|
|
573
|
-
runtime;
|
|
574
|
-
constructor(runtime) {
|
|
575
|
-
this.runtime = runtime;
|
|
576
|
-
}
|
|
577
|
-
schemaKey() {
|
|
578
|
-
const runtimeLike = this.runtime;
|
|
579
|
-
return (runtimeLike.adapter ??
|
|
580
|
-
runtimeLike.databaseAdapter ??
|
|
581
|
-
this.runtime);
|
|
582
|
-
}
|
|
583
|
-
async ensureSchema() {
|
|
584
|
-
const key = this.schemaKey();
|
|
585
|
-
if (schemaReady.has(key))
|
|
586
|
-
return;
|
|
587
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_threads (
|
|
588
|
-
id TEXT PRIMARY KEY,
|
|
589
|
-
agent_id TEXT NOT NULL,
|
|
590
|
-
room_id TEXT,
|
|
591
|
-
world_id TEXT,
|
|
592
|
-
owner_user_id TEXT,
|
|
593
|
-
scenario_id TEXT,
|
|
594
|
-
batch_id TEXT,
|
|
595
|
-
title TEXT NOT NULL,
|
|
596
|
-
kind TEXT NOT NULL DEFAULT 'coding',
|
|
597
|
-
status TEXT NOT NULL DEFAULT 'open',
|
|
598
|
-
original_request TEXT NOT NULL,
|
|
599
|
-
summary TEXT NOT NULL DEFAULT '',
|
|
600
|
-
acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',
|
|
601
|
-
current_plan_json TEXT NOT NULL DEFAULT '{}',
|
|
602
|
-
search_text TEXT NOT NULL DEFAULT '',
|
|
603
|
-
created_at TEXT NOT NULL,
|
|
604
|
-
updated_at TEXT NOT NULL,
|
|
605
|
-
closed_at TEXT,
|
|
606
|
-
archived_at TEXT,
|
|
607
|
-
last_user_turn_at TEXT,
|
|
608
|
-
last_coordinator_turn_at TEXT,
|
|
609
|
-
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
610
|
-
)`);
|
|
611
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_sessions (
|
|
612
|
-
id TEXT PRIMARY KEY,
|
|
613
|
-
thread_id TEXT NOT NULL,
|
|
614
|
-
agent_id TEXT NOT NULL,
|
|
615
|
-
session_id TEXT NOT NULL UNIQUE,
|
|
616
|
-
framework TEXT NOT NULL,
|
|
617
|
-
provider_source TEXT,
|
|
618
|
-
label TEXT NOT NULL,
|
|
619
|
-
original_task TEXT NOT NULL,
|
|
620
|
-
workdir TEXT NOT NULL,
|
|
621
|
-
repo TEXT,
|
|
622
|
-
status TEXT NOT NULL DEFAULT 'active',
|
|
623
|
-
decision_count INTEGER NOT NULL DEFAULT 0,
|
|
624
|
-
auto_resolved_count INTEGER NOT NULL DEFAULT 0,
|
|
625
|
-
registered_at BIGINT NOT NULL,
|
|
626
|
-
last_activity_at BIGINT NOT NULL,
|
|
627
|
-
idle_check_count INTEGER NOT NULL DEFAULT 0,
|
|
628
|
-
task_delivered BOOLEAN NOT NULL DEFAULT FALSE,
|
|
629
|
-
completion_summary TEXT,
|
|
630
|
-
last_seen_decision_index INTEGER NOT NULL DEFAULT 0,
|
|
631
|
-
last_input_sent_at BIGINT,
|
|
632
|
-
stopped_at BIGINT,
|
|
633
|
-
created_at TEXT NOT NULL,
|
|
634
|
-
updated_at TEXT NOT NULL,
|
|
635
|
-
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
636
|
-
)`);
|
|
637
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_decisions (
|
|
638
|
-
id TEXT PRIMARY KEY,
|
|
639
|
-
thread_id TEXT NOT NULL,
|
|
640
|
-
session_id TEXT NOT NULL,
|
|
641
|
-
timestamp BIGINT NOT NULL,
|
|
642
|
-
event_type TEXT NOT NULL,
|
|
643
|
-
prompt_text TEXT NOT NULL DEFAULT '',
|
|
644
|
-
decision TEXT NOT NULL,
|
|
645
|
-
response TEXT,
|
|
646
|
-
reasoning TEXT NOT NULL,
|
|
647
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
648
|
-
created_at TEXT NOT NULL
|
|
649
|
-
)`);
|
|
650
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_events (
|
|
651
|
-
id TEXT PRIMARY KEY,
|
|
652
|
-
thread_id TEXT NOT NULL,
|
|
653
|
-
session_id TEXT,
|
|
654
|
-
event_type TEXT NOT NULL,
|
|
655
|
-
timestamp BIGINT NOT NULL,
|
|
656
|
-
summary TEXT NOT NULL DEFAULT '',
|
|
657
|
-
data_json TEXT NOT NULL DEFAULT '{}',
|
|
658
|
-
created_at TEXT NOT NULL
|
|
659
|
-
)`);
|
|
660
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_artifacts (
|
|
661
|
-
id TEXT PRIMARY KEY,
|
|
662
|
-
thread_id TEXT NOT NULL,
|
|
663
|
-
session_id TEXT,
|
|
664
|
-
artifact_type TEXT NOT NULL,
|
|
665
|
-
title TEXT NOT NULL,
|
|
666
|
-
path TEXT,
|
|
667
|
-
uri TEXT,
|
|
668
|
-
mime_type TEXT,
|
|
669
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
670
|
-
created_at TEXT NOT NULL
|
|
671
|
-
)`);
|
|
672
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_transcripts (
|
|
673
|
-
id TEXT PRIMARY KEY,
|
|
674
|
-
thread_id TEXT NOT NULL,
|
|
675
|
-
session_id TEXT NOT NULL,
|
|
676
|
-
timestamp BIGINT NOT NULL,
|
|
677
|
-
direction TEXT NOT NULL,
|
|
678
|
-
content TEXT NOT NULL,
|
|
679
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
680
|
-
created_at TEXT NOT NULL
|
|
681
|
-
)`);
|
|
682
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_pending_decisions (
|
|
683
|
-
session_id TEXT PRIMARY KEY,
|
|
684
|
-
thread_id TEXT NOT NULL,
|
|
685
|
-
prompt_text TEXT NOT NULL,
|
|
686
|
-
recent_output TEXT NOT NULL DEFAULT '',
|
|
687
|
-
llm_decision_json TEXT NOT NULL DEFAULT '{}',
|
|
688
|
-
task_context_json TEXT NOT NULL DEFAULT '{}',
|
|
689
|
-
created_at BIGINT NOT NULL,
|
|
690
|
-
updated_at TEXT NOT NULL
|
|
691
|
-
)`);
|
|
692
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_nodes (
|
|
693
|
-
id TEXT PRIMARY KEY,
|
|
694
|
-
thread_id TEXT NOT NULL,
|
|
695
|
-
parent_node_id TEXT,
|
|
696
|
-
kind TEXT NOT NULL DEFAULT 'execution',
|
|
697
|
-
status TEXT NOT NULL DEFAULT 'planned',
|
|
698
|
-
title TEXT NOT NULL,
|
|
699
|
-
instructions TEXT NOT NULL DEFAULT '',
|
|
700
|
-
acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',
|
|
701
|
-
required_capabilities_json TEXT NOT NULL DEFAULT '[]',
|
|
702
|
-
expected_artifacts_json TEXT NOT NULL DEFAULT '[]',
|
|
703
|
-
assigned_session_id TEXT,
|
|
704
|
-
assigned_label TEXT,
|
|
705
|
-
agent_type TEXT,
|
|
706
|
-
workdir TEXT,
|
|
707
|
-
repo TEXT,
|
|
708
|
-
priority INTEGER NOT NULL DEFAULT 0,
|
|
709
|
-
depth INTEGER NOT NULL DEFAULT 0,
|
|
710
|
-
sequence INTEGER NOT NULL DEFAULT 0,
|
|
711
|
-
created_from TEXT,
|
|
712
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
713
|
-
created_at TEXT NOT NULL,
|
|
714
|
-
updated_at TEXT NOT NULL,
|
|
715
|
-
started_at TEXT,
|
|
716
|
-
completed_at TEXT
|
|
717
|
-
)`);
|
|
718
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_dependencies (
|
|
719
|
-
id TEXT PRIMARY KEY,
|
|
720
|
-
thread_id TEXT NOT NULL,
|
|
721
|
-
from_node_id TEXT NOT NULL,
|
|
722
|
-
to_node_id TEXT NOT NULL,
|
|
723
|
-
dependency_kind TEXT NOT NULL DEFAULT 'blocks',
|
|
724
|
-
required_status TEXT NOT NULL DEFAULT 'completed',
|
|
725
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
726
|
-
created_at TEXT NOT NULL
|
|
727
|
-
)`);
|
|
728
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_claims (
|
|
729
|
-
id TEXT PRIMARY KEY,
|
|
730
|
-
thread_id TEXT NOT NULL,
|
|
731
|
-
node_id TEXT NOT NULL,
|
|
732
|
-
session_id TEXT NOT NULL,
|
|
733
|
-
claim_type TEXT NOT NULL DEFAULT 'execution',
|
|
734
|
-
status TEXT NOT NULL DEFAULT 'active',
|
|
735
|
-
claimed_at TEXT NOT NULL,
|
|
736
|
-
released_at TEXT,
|
|
737
|
-
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
738
|
-
)`);
|
|
739
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_mailbox (
|
|
740
|
-
id TEXT PRIMARY KEY,
|
|
741
|
-
thread_id TEXT NOT NULL,
|
|
742
|
-
node_id TEXT,
|
|
743
|
-
session_id TEXT,
|
|
744
|
-
sender TEXT NOT NULL,
|
|
745
|
-
recipient TEXT NOT NULL,
|
|
746
|
-
subject TEXT NOT NULL DEFAULT '',
|
|
747
|
-
body TEXT NOT NULL,
|
|
748
|
-
delivery_state TEXT NOT NULL DEFAULT 'pending',
|
|
749
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
750
|
-
created_at TEXT NOT NULL,
|
|
751
|
-
delivered_at TEXT
|
|
752
|
-
)`);
|
|
753
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_verifier_jobs (
|
|
754
|
-
id TEXT PRIMARY KEY,
|
|
755
|
-
thread_id TEXT NOT NULL,
|
|
756
|
-
node_id TEXT NOT NULL,
|
|
757
|
-
status TEXT NOT NULL DEFAULT 'pending',
|
|
758
|
-
verifier_type TEXT NOT NULL,
|
|
759
|
-
title TEXT NOT NULL,
|
|
760
|
-
instructions TEXT NOT NULL DEFAULT '',
|
|
761
|
-
config_json TEXT NOT NULL DEFAULT '{}',
|
|
762
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
763
|
-
created_at TEXT NOT NULL,
|
|
764
|
-
started_at TEXT,
|
|
765
|
-
completed_at TEXT
|
|
766
|
-
)`);
|
|
767
|
-
await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_evidence (
|
|
768
|
-
id TEXT PRIMARY KEY,
|
|
769
|
-
thread_id TEXT NOT NULL,
|
|
770
|
-
node_id TEXT,
|
|
771
|
-
session_id TEXT,
|
|
772
|
-
verifier_job_id TEXT,
|
|
773
|
-
evidence_type TEXT NOT NULL,
|
|
774
|
-
title TEXT NOT NULL,
|
|
775
|
-
summary TEXT NOT NULL DEFAULT '',
|
|
776
|
-
path TEXT,
|
|
777
|
-
uri TEXT,
|
|
778
|
-
content_json TEXT NOT NULL DEFAULT '{}',
|
|
779
|
-
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
780
|
-
created_at TEXT NOT NULL
|
|
781
|
-
)`);
|
|
782
|
-
await executeRawSql(this.runtime, `ALTER TABLE orchestrator_task_threads ADD COLUMN scenario_id TEXT`).catch(() => undefined);
|
|
783
|
-
await executeRawSql(this.runtime, `ALTER TABLE orchestrator_task_threads ADD COLUMN batch_id TEXT`).catch(() => undefined);
|
|
784
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_status
|
|
785
|
-
ON orchestrator_task_threads(status)`);
|
|
786
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_scenario_id
|
|
787
|
-
ON orchestrator_task_threads(scenario_id)`);
|
|
788
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_batch_id
|
|
789
|
-
ON orchestrator_task_threads(batch_id)`);
|
|
790
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_updated_at
|
|
791
|
-
ON orchestrator_task_threads(updated_at)`);
|
|
792
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_archived_at
|
|
793
|
-
ON orchestrator_task_threads(archived_at)`);
|
|
794
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_thread_id
|
|
795
|
-
ON orchestrator_task_sessions(thread_id)`);
|
|
796
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_status
|
|
797
|
-
ON orchestrator_task_sessions(status)`);
|
|
798
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_decisions_thread_id
|
|
799
|
-
ON orchestrator_task_decisions(thread_id, timestamp DESC)`);
|
|
800
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_events_thread_id
|
|
801
|
-
ON orchestrator_task_events(thread_id, timestamp DESC)`);
|
|
802
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_transcripts_thread_id
|
|
803
|
-
ON orchestrator_task_transcripts(thread_id, timestamp DESC)`);
|
|
804
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_thread_id
|
|
805
|
-
ON orchestrator_task_pending_decisions(thread_id)`);
|
|
806
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_created_at
|
|
807
|
-
ON orchestrator_task_pending_decisions(created_at DESC)`);
|
|
808
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_nodes_thread_id
|
|
809
|
-
ON orchestrator_task_nodes(thread_id, sequence ASC, created_at ASC)`);
|
|
810
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_nodes_status
|
|
811
|
-
ON orchestrator_task_nodes(thread_id, status)`);
|
|
812
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_dependencies_thread_id
|
|
813
|
-
ON orchestrator_task_dependencies(thread_id)`);
|
|
814
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_dependencies_to_node_id
|
|
815
|
-
ON orchestrator_task_dependencies(to_node_id)`);
|
|
816
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_claims_thread_id
|
|
817
|
-
ON orchestrator_task_claims(thread_id, status, claimed_at DESC)`);
|
|
818
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_claims_node_id
|
|
819
|
-
ON orchestrator_task_claims(node_id, status)`);
|
|
820
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_mailbox_thread_id
|
|
821
|
-
ON orchestrator_task_mailbox(thread_id, created_at ASC)`);
|
|
822
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_verifier_jobs_thread_id
|
|
823
|
-
ON orchestrator_task_verifier_jobs(thread_id, status, created_at ASC)`);
|
|
824
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_evidence_thread_id
|
|
825
|
-
ON orchestrator_task_evidence(thread_id, created_at ASC)`);
|
|
826
|
-
await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_search_text
|
|
827
|
-
ON orchestrator_task_threads(search_text)`);
|
|
828
|
-
schemaReady.add(key);
|
|
829
|
-
}
|
|
830
|
-
async recoverInterruptedTasks() {
|
|
831
|
-
await this.ensureSchema();
|
|
832
|
-
const impactedSessions = await executeRawSql(this.runtime, `SELECT session_id, thread_id
|
|
833
|
-
FROM orchestrator_task_sessions
|
|
834
|
-
WHERE status IN ('active', 'blocked', 'tool_running')`);
|
|
835
|
-
if (impactedSessions.length === 0)
|
|
836
|
-
return;
|
|
837
|
-
const nowIso = isoNow();
|
|
838
|
-
const now = Date.now();
|
|
839
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_sessions
|
|
840
|
-
SET status = 'interrupted',
|
|
841
|
-
updated_at = ${sqlQuote(nowIso)},
|
|
842
|
-
stopped_at = COALESCE(stopped_at, ${sqlInteger(now)})
|
|
843
|
-
WHERE status IN ('active', 'blocked', 'tool_running')`);
|
|
844
|
-
const affectedThreadIds = new Set();
|
|
845
|
-
for (const row of impactedSessions) {
|
|
846
|
-
const sessionId = toText(row.session_id);
|
|
847
|
-
const threadId = toText(row.thread_id);
|
|
848
|
-
if (!threadId)
|
|
849
|
-
continue;
|
|
850
|
-
affectedThreadIds.add(threadId);
|
|
851
|
-
await this.appendEvent({
|
|
852
|
-
threadId,
|
|
853
|
-
sessionId,
|
|
854
|
-
eventType: "session_interrupted",
|
|
855
|
-
timestamp: now,
|
|
856
|
-
summary: "Session interrupted by runtime restart or shutdown",
|
|
857
|
-
data: { reason: "runtime_restart" },
|
|
858
|
-
});
|
|
859
|
-
}
|
|
860
|
-
for (const threadId of affectedThreadIds) {
|
|
861
|
-
await this.recomputeThreadStatus(threadId);
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
async createThread(input) {
|
|
865
|
-
await this.ensureSchema();
|
|
866
|
-
const id = input.id?.trim() || `task-${crypto.randomUUID()}`;
|
|
867
|
-
const createdAt = isoNow();
|
|
868
|
-
const acceptanceCriteria = input.acceptanceCriteria ?? [];
|
|
869
|
-
const currentPlan = input.currentPlan ?? {};
|
|
870
|
-
const summary = input.summary?.trim() ?? "";
|
|
871
|
-
const scenarioId = input.scenarioId ??
|
|
872
|
-
(typeof input.metadata?.scenarioId === "string"
|
|
873
|
-
? input.metadata.scenarioId
|
|
874
|
-
: typeof input.metadata?.scenario_id === "string"
|
|
875
|
-
? input.metadata.scenario_id
|
|
876
|
-
: null);
|
|
877
|
-
const batchId = input.batchId ??
|
|
878
|
-
(typeof input.metadata?.batchId === "string"
|
|
879
|
-
? input.metadata.batchId
|
|
880
|
-
: typeof input.metadata?.batch_id === "string"
|
|
881
|
-
? input.metadata.batch_id
|
|
882
|
-
: null);
|
|
883
|
-
const searchText = buildSearchText([
|
|
884
|
-
input.title,
|
|
885
|
-
input.originalRequest,
|
|
886
|
-
summary,
|
|
887
|
-
scenarioId,
|
|
888
|
-
batchId,
|
|
889
|
-
input.metadata ? JSON.stringify(input.metadata) : "",
|
|
890
|
-
]);
|
|
891
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_threads (
|
|
892
|
-
id, agent_id, room_id, world_id, owner_user_id, scenario_id, batch_id, title, kind, status,
|
|
893
|
-
original_request, summary, acceptance_criteria_json, current_plan_json,
|
|
894
|
-
search_text, created_at, updated_at, closed_at, archived_at,
|
|
895
|
-
last_user_turn_at, last_coordinator_turn_at, metadata_json
|
|
896
|
-
) VALUES (
|
|
897
|
-
${sqlQuote(id)},
|
|
898
|
-
${sqlQuote(this.runtime.agentId)},
|
|
899
|
-
${sqlText(input.roomId ?? null)},
|
|
900
|
-
${sqlText(input.worldId ?? null)},
|
|
901
|
-
${sqlText(input.ownerUserId ?? null)},
|
|
902
|
-
${sqlText(scenarioId ?? null)},
|
|
903
|
-
${sqlText(batchId ?? null)},
|
|
904
|
-
${sqlQuote(input.title.trim())},
|
|
905
|
-
${sqlQuote(input.kind ?? "coding")},
|
|
906
|
-
'open',
|
|
907
|
-
${sqlQuote(input.originalRequest)},
|
|
908
|
-
${sqlQuote(summary)},
|
|
909
|
-
${sqlJson(acceptanceCriteria)},
|
|
910
|
-
${sqlJson(currentPlan)},
|
|
911
|
-
${sqlQuote(searchText)},
|
|
912
|
-
${sqlQuote(createdAt)},
|
|
913
|
-
${sqlQuote(createdAt)},
|
|
914
|
-
NULL,
|
|
915
|
-
NULL,
|
|
916
|
-
${sqlText(input.lastUserTurnAt ?? createdAt)},
|
|
917
|
-
NULL,
|
|
918
|
-
${sqlJson(input.metadata ?? {})}
|
|
919
|
-
)`);
|
|
920
|
-
await this.appendEvent({
|
|
921
|
-
threadId: id,
|
|
922
|
-
eventType: "task_created",
|
|
923
|
-
timestamp: Date.now(),
|
|
924
|
-
summary: `Created task thread "${input.title.trim()}"`,
|
|
925
|
-
data: {
|
|
926
|
-
kind: input.kind ?? "coding",
|
|
927
|
-
roomId: input.roomId ?? null,
|
|
928
|
-
worldId: input.worldId ?? null,
|
|
929
|
-
},
|
|
930
|
-
});
|
|
931
|
-
const created = await this.getThreadRecord(id);
|
|
932
|
-
if (!created) {
|
|
933
|
-
throw new Error(`Failed to create task thread ${id}`);
|
|
934
|
-
}
|
|
935
|
-
return created;
|
|
936
|
-
}
|
|
937
|
-
async getThreadRecord(threadId) {
|
|
938
|
-
await this.ensureSchema();
|
|
939
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
940
|
-
FROM orchestrator_task_threads
|
|
941
|
-
WHERE id = ${sqlQuote(threadId)}
|
|
942
|
-
LIMIT 1`);
|
|
943
|
-
return rows[0] ? parseThreadRow(rows[0]) : null;
|
|
944
|
-
}
|
|
945
|
-
async getThread(threadId) {
|
|
946
|
-
await this.ensureSchema();
|
|
947
|
-
const summary = await this.getThreadSummary(threadId);
|
|
948
|
-
if (!summary)
|
|
949
|
-
return null;
|
|
950
|
-
const [sessions, decisions, events, artifacts, transcripts, pendingDecisions, nodes, dependencies, claims, mailbox, verifierJobs, evidence,] = await Promise.all([
|
|
951
|
-
this.listSessionsForThread(threadId),
|
|
952
|
-
this.listDecisionsForThread(threadId),
|
|
953
|
-
this.listEventsForThread(threadId),
|
|
954
|
-
this.listArtifactsForThread(threadId),
|
|
955
|
-
this.listTranscriptsForThread(threadId),
|
|
956
|
-
this.listPendingDecisionsForThread(threadId),
|
|
957
|
-
this.listTaskNodesForThread(threadId),
|
|
958
|
-
this.listTaskDependenciesForThread(threadId),
|
|
959
|
-
this.listTaskClaimsForThread(threadId),
|
|
960
|
-
this.listTaskMailboxMessagesForThread(threadId),
|
|
961
|
-
this.listTaskVerifierJobsForThread(threadId),
|
|
962
|
-
this.listTaskEvidenceForThread(threadId),
|
|
963
|
-
]);
|
|
964
|
-
return {
|
|
965
|
-
...summary,
|
|
966
|
-
sessions,
|
|
967
|
-
decisions,
|
|
968
|
-
events,
|
|
969
|
-
artifacts,
|
|
970
|
-
transcripts,
|
|
971
|
-
pendingDecisions,
|
|
972
|
-
nodes,
|
|
973
|
-
dependencies,
|
|
974
|
-
claims,
|
|
975
|
-
mailbox,
|
|
976
|
-
verifierJobs,
|
|
977
|
-
evidence,
|
|
978
|
-
};
|
|
979
|
-
}
|
|
980
|
-
async listThreads(options = {}) {
|
|
981
|
-
await this.ensureSchema();
|
|
982
|
-
const clauses = buildThreadListWhereClauses(options);
|
|
983
|
-
const whereClause = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
984
|
-
const limitClause = typeof options.limit === "number" && options.limit > 0
|
|
985
|
-
? `LIMIT ${Math.trunc(options.limit)}`
|
|
986
|
-
: "";
|
|
987
|
-
const rows = await executeRawSql(this.runtime, `SELECT
|
|
988
|
-
thread.*,
|
|
989
|
-
COALESCE(session_counts.session_count, 0) AS session_count,
|
|
990
|
-
COALESCE(session_counts.active_session_count, 0) AS active_session_count,
|
|
991
|
-
latest.session_id AS latest_session_id,
|
|
992
|
-
latest.label AS latest_session_label,
|
|
993
|
-
latest.workdir AS latest_workdir,
|
|
994
|
-
latest.repo AS latest_repo,
|
|
995
|
-
latest.last_activity_at AS latest_activity_at,
|
|
996
|
-
COALESCE(decision_counts.decision_count, 0) AS decision_count,
|
|
997
|
-
COALESCE(node_counts.node_count, 0) AS node_count,
|
|
998
|
-
COALESCE(node_counts.ready_node_count, 0) AS ready_node_count,
|
|
999
|
-
COALESCE(node_counts.completed_node_count, 0) AS completed_node_count,
|
|
1000
|
-
COALESCE(verifier_counts.verifier_job_count, 0) AS verifier_job_count,
|
|
1001
|
-
COALESCE(evidence_counts.evidence_count, 0) AS evidence_count
|
|
1002
|
-
FROM orchestrator_task_threads AS thread
|
|
1003
|
-
LEFT JOIN (
|
|
1004
|
-
SELECT
|
|
1005
|
-
thread_id,
|
|
1006
|
-
COUNT(*) AS session_count,
|
|
1007
|
-
SUM(CASE WHEN status IN ('active', 'blocked', 'tool_running') THEN 1 ELSE 0 END) AS active_session_count
|
|
1008
|
-
FROM orchestrator_task_sessions
|
|
1009
|
-
GROUP BY thread_id
|
|
1010
|
-
) AS session_counts
|
|
1011
|
-
ON session_counts.thread_id = thread.id
|
|
1012
|
-
LEFT JOIN (
|
|
1013
|
-
SELECT latest_session.thread_id,
|
|
1014
|
-
latest_session.session_id,
|
|
1015
|
-
latest_session.label,
|
|
1016
|
-
latest_session.workdir,
|
|
1017
|
-
latest_session.repo,
|
|
1018
|
-
latest_session.last_activity_at
|
|
1019
|
-
FROM orchestrator_task_sessions AS latest_session
|
|
1020
|
-
INNER JOIN (
|
|
1021
|
-
SELECT thread_id, MAX(last_activity_at) AS max_last_activity_at
|
|
1022
|
-
FROM orchestrator_task_sessions
|
|
1023
|
-
GROUP BY thread_id
|
|
1024
|
-
) AS grouped
|
|
1025
|
-
ON grouped.thread_id = latest_session.thread_id
|
|
1026
|
-
AND grouped.max_last_activity_at = latest_session.last_activity_at
|
|
1027
|
-
) AS latest
|
|
1028
|
-
ON latest.thread_id = thread.id
|
|
1029
|
-
LEFT JOIN (
|
|
1030
|
-
SELECT thread_id, COUNT(*) AS decision_count
|
|
1031
|
-
FROM orchestrator_task_decisions
|
|
1032
|
-
GROUP BY thread_id
|
|
1033
|
-
) AS decision_counts
|
|
1034
|
-
ON decision_counts.thread_id = thread.id
|
|
1035
|
-
LEFT JOIN (
|
|
1036
|
-
SELECT
|
|
1037
|
-
thread_id,
|
|
1038
|
-
COUNT(*) AS node_count,
|
|
1039
|
-
SUM(CASE WHEN status = 'ready' THEN 1 ELSE 0 END) AS ready_node_count,
|
|
1040
|
-
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_node_count
|
|
1041
|
-
FROM orchestrator_task_nodes
|
|
1042
|
-
GROUP BY thread_id
|
|
1043
|
-
) AS node_counts
|
|
1044
|
-
ON node_counts.thread_id = thread.id
|
|
1045
|
-
LEFT JOIN (
|
|
1046
|
-
SELECT thread_id, COUNT(*) AS verifier_job_count
|
|
1047
|
-
FROM orchestrator_task_verifier_jobs
|
|
1048
|
-
GROUP BY thread_id
|
|
1049
|
-
) AS verifier_counts
|
|
1050
|
-
ON verifier_counts.thread_id = thread.id
|
|
1051
|
-
LEFT JOIN (
|
|
1052
|
-
SELECT thread_id, COUNT(*) AS evidence_count
|
|
1053
|
-
FROM orchestrator_task_evidence
|
|
1054
|
-
GROUP BY thread_id
|
|
1055
|
-
) AS evidence_counts
|
|
1056
|
-
ON evidence_counts.thread_id = thread.id
|
|
1057
|
-
${whereClause}
|
|
1058
|
-
ORDER BY thread.updated_at DESC
|
|
1059
|
-
${limitClause}`);
|
|
1060
|
-
return rows.map(parseThreadSummaryRow);
|
|
1061
|
-
}
|
|
1062
|
-
async countThreads(options = {}) {
|
|
1063
|
-
await this.ensureSchema();
|
|
1064
|
-
const clauses = buildThreadListWhereClauses(options);
|
|
1065
|
-
const whereClause = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
1066
|
-
const rows = await executeRawSql(this.runtime, `SELECT COUNT(*) AS total
|
|
1067
|
-
FROM orchestrator_task_threads AS thread
|
|
1068
|
-
LEFT JOIN (
|
|
1069
|
-
SELECT
|
|
1070
|
-
thread_id,
|
|
1071
|
-
COUNT(*) AS session_count,
|
|
1072
|
-
SUM(CASE WHEN status IN ('active', 'blocked', 'tool_running') THEN 1 ELSE 0 END) AS active_session_count
|
|
1073
|
-
FROM orchestrator_task_sessions
|
|
1074
|
-
GROUP BY thread_id
|
|
1075
|
-
) AS session_counts
|
|
1076
|
-
ON session_counts.thread_id = thread.id
|
|
1077
|
-
LEFT JOIN (
|
|
1078
|
-
SELECT latest_session.thread_id,
|
|
1079
|
-
latest_session.session_id,
|
|
1080
|
-
latest_session.label,
|
|
1081
|
-
latest_session.workdir,
|
|
1082
|
-
latest_session.repo,
|
|
1083
|
-
latest_session.last_activity_at
|
|
1084
|
-
FROM orchestrator_task_sessions AS latest_session
|
|
1085
|
-
INNER JOIN (
|
|
1086
|
-
SELECT thread_id, MAX(last_activity_at) AS max_last_activity_at
|
|
1087
|
-
FROM orchestrator_task_sessions
|
|
1088
|
-
GROUP BY thread_id
|
|
1089
|
-
) AS grouped
|
|
1090
|
-
ON grouped.thread_id = latest_session.thread_id
|
|
1091
|
-
AND grouped.max_last_activity_at = latest_session.last_activity_at
|
|
1092
|
-
) AS latest
|
|
1093
|
-
ON latest.thread_id = thread.id
|
|
1094
|
-
LEFT JOIN (
|
|
1095
|
-
SELECT
|
|
1096
|
-
thread_id,
|
|
1097
|
-
COUNT(*) AS node_count,
|
|
1098
|
-
SUM(CASE WHEN status = 'ready' THEN 1 ELSE 0 END) AS ready_node_count,
|
|
1099
|
-
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_node_count
|
|
1100
|
-
FROM orchestrator_task_nodes
|
|
1101
|
-
GROUP BY thread_id
|
|
1102
|
-
) AS node_counts
|
|
1103
|
-
ON node_counts.thread_id = thread.id
|
|
1104
|
-
LEFT JOIN (
|
|
1105
|
-
SELECT thread_id, COUNT(*) AS verifier_job_count
|
|
1106
|
-
FROM orchestrator_task_verifier_jobs
|
|
1107
|
-
GROUP BY thread_id
|
|
1108
|
-
) AS verifier_counts
|
|
1109
|
-
ON verifier_counts.thread_id = thread.id
|
|
1110
|
-
LEFT JOIN (
|
|
1111
|
-
SELECT thread_id, COUNT(*) AS evidence_count
|
|
1112
|
-
FROM orchestrator_task_evidence
|
|
1113
|
-
GROUP BY thread_id
|
|
1114
|
-
) AS evidence_counts
|
|
1115
|
-
ON evidence_counts.thread_id = thread.id
|
|
1116
|
-
${whereClause}`);
|
|
1117
|
-
return toNumber(rows[0]?.total, 0);
|
|
1118
|
-
}
|
|
1119
|
-
async getThreadSummary(threadId) {
|
|
1120
|
-
const rows = await this.listThreads({
|
|
1121
|
-
threadId,
|
|
1122
|
-
includeArchived: true,
|
|
1123
|
-
});
|
|
1124
|
-
return rows[0] ?? null;
|
|
1125
|
-
}
|
|
1126
|
-
async findThreadIdBySessionId(sessionId) {
|
|
1127
|
-
await this.ensureSchema();
|
|
1128
|
-
const rows = await executeRawSql(this.runtime, `SELECT thread_id
|
|
1129
|
-
FROM orchestrator_task_sessions
|
|
1130
|
-
WHERE session_id = ${sqlQuote(sessionId)}
|
|
1131
|
-
LIMIT 1`);
|
|
1132
|
-
return rows[0] ? toText(rows[0].thread_id) : null;
|
|
1133
|
-
}
|
|
1134
|
-
async getSession(sessionId) {
|
|
1135
|
-
await this.ensureSchema();
|
|
1136
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1137
|
-
FROM orchestrator_task_sessions
|
|
1138
|
-
WHERE session_id = ${sqlQuote(sessionId)}
|
|
1139
|
-
LIMIT 1`);
|
|
1140
|
-
return rows[0] ? parseSessionRow(rows[0]) : null;
|
|
1141
|
-
}
|
|
1142
|
-
async registerSession(input) {
|
|
1143
|
-
await this.ensureSchema();
|
|
1144
|
-
const nowIso = isoNow();
|
|
1145
|
-
const registeredAt = input.registeredAt ?? Date.now();
|
|
1146
|
-
const lastActivityAt = input.lastActivityAt ?? registeredAt;
|
|
1147
|
-
const existingThread = await this.getThreadRecord(input.threadId);
|
|
1148
|
-
if (!existingThread) {
|
|
1149
|
-
throw new Error(`Task thread ${input.threadId} not found`);
|
|
1150
|
-
}
|
|
1151
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_sessions (
|
|
1152
|
-
id, thread_id, agent_id, session_id, framework, provider_source, label,
|
|
1153
|
-
original_task, workdir, repo, status, decision_count, auto_resolved_count,
|
|
1154
|
-
registered_at, last_activity_at, idle_check_count, task_delivered,
|
|
1155
|
-
completion_summary, last_seen_decision_index, last_input_sent_at, stopped_at,
|
|
1156
|
-
created_at, updated_at, metadata_json
|
|
1157
|
-
) VALUES (
|
|
1158
|
-
${sqlQuote(input.sessionId)},
|
|
1159
|
-
${sqlQuote(input.threadId)},
|
|
1160
|
-
${sqlQuote(this.runtime.agentId)},
|
|
1161
|
-
${sqlQuote(input.sessionId)},
|
|
1162
|
-
${sqlQuote(input.framework)},
|
|
1163
|
-
${sqlText(input.providerSource ?? null)},
|
|
1164
|
-
${sqlQuote(input.label)},
|
|
1165
|
-
${sqlQuote(input.originalTask)},
|
|
1166
|
-
${sqlQuote(input.workdir)},
|
|
1167
|
-
${sqlText(input.repo ?? null)},
|
|
1168
|
-
${sqlQuote(input.status ?? "active")},
|
|
1169
|
-
${sqlInteger(input.decisionCount ?? 0)},
|
|
1170
|
-
${sqlInteger(input.autoResolvedCount ?? 0)},
|
|
1171
|
-
${sqlInteger(registeredAt)},
|
|
1172
|
-
${sqlInteger(lastActivityAt)},
|
|
1173
|
-
${sqlInteger(input.idleCheckCount ?? 0)},
|
|
1174
|
-
${sqlBoolean(input.taskDelivered ?? false)},
|
|
1175
|
-
${sqlText(input.completionSummary ?? null)},
|
|
1176
|
-
${sqlInteger(input.lastSeenDecisionIndex ?? 0)},
|
|
1177
|
-
${sqlInteger(input.lastInputSentAt ?? null)},
|
|
1178
|
-
${sqlInteger(input.stoppedAt ?? null)},
|
|
1179
|
-
${sqlQuote(nowIso)},
|
|
1180
|
-
${sqlQuote(nowIso)},
|
|
1181
|
-
${sqlJson(input.metadata ?? {})}
|
|
1182
|
-
)
|
|
1183
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
1184
|
-
thread_id = EXCLUDED.thread_id,
|
|
1185
|
-
framework = EXCLUDED.framework,
|
|
1186
|
-
provider_source = EXCLUDED.provider_source,
|
|
1187
|
-
label = EXCLUDED.label,
|
|
1188
|
-
original_task = EXCLUDED.original_task,
|
|
1189
|
-
workdir = EXCLUDED.workdir,
|
|
1190
|
-
repo = EXCLUDED.repo,
|
|
1191
|
-
status = EXCLUDED.status,
|
|
1192
|
-
decision_count = EXCLUDED.decision_count,
|
|
1193
|
-
auto_resolved_count = EXCLUDED.auto_resolved_count,
|
|
1194
|
-
registered_at = EXCLUDED.registered_at,
|
|
1195
|
-
last_activity_at = EXCLUDED.last_activity_at,
|
|
1196
|
-
idle_check_count = EXCLUDED.idle_check_count,
|
|
1197
|
-
task_delivered = EXCLUDED.task_delivered,
|
|
1198
|
-
completion_summary = EXCLUDED.completion_summary,
|
|
1199
|
-
last_seen_decision_index = EXCLUDED.last_seen_decision_index,
|
|
1200
|
-
last_input_sent_at = EXCLUDED.last_input_sent_at,
|
|
1201
|
-
stopped_at = EXCLUDED.stopped_at,
|
|
1202
|
-
updated_at = EXCLUDED.updated_at,
|
|
1203
|
-
metadata_json = EXCLUDED.metadata_json`);
|
|
1204
|
-
await this.appendEvent({
|
|
1205
|
-
threadId: input.threadId,
|
|
1206
|
-
sessionId: input.sessionId,
|
|
1207
|
-
eventType: "session_registered",
|
|
1208
|
-
timestamp: registeredAt,
|
|
1209
|
-
summary: `Registered session "${input.label}"`,
|
|
1210
|
-
data: {
|
|
1211
|
-
framework: input.framework,
|
|
1212
|
-
repo: input.repo ?? null,
|
|
1213
|
-
workdir: input.workdir,
|
|
1214
|
-
},
|
|
1215
|
-
});
|
|
1216
|
-
await this.recomputeThreadStatus(input.threadId);
|
|
1217
|
-
}
|
|
1218
|
-
async updateSession(sessionId, patch) {
|
|
1219
|
-
await this.ensureSchema();
|
|
1220
|
-
const threadId = await this.findThreadIdBySessionId(sessionId);
|
|
1221
|
-
if (!threadId)
|
|
1222
|
-
return;
|
|
1223
|
-
const existingRows = await executeRawSql(this.runtime, `SELECT *
|
|
1224
|
-
FROM orchestrator_task_sessions
|
|
1225
|
-
WHERE session_id = ${sqlQuote(sessionId)}
|
|
1226
|
-
LIMIT 1`);
|
|
1227
|
-
if (!existingRows[0])
|
|
1228
|
-
return;
|
|
1229
|
-
const existing = parseSessionRow(existingRows[0]);
|
|
1230
|
-
const nextMeta = patch.metadata
|
|
1231
|
-
? { ...existing.metadata, ...patch.metadata }
|
|
1232
|
-
: existing.metadata;
|
|
1233
|
-
const nowIso = isoNow();
|
|
1234
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_sessions
|
|
1235
|
-
SET status = ${sqlQuote(patch.status ?? existing.status)},
|
|
1236
|
-
decision_count = ${sqlInteger(patch.decisionCount ?? existing.decisionCount)},
|
|
1237
|
-
auto_resolved_count = ${sqlInteger(patch.autoResolvedCount ?? existing.autoResolvedCount)},
|
|
1238
|
-
last_activity_at = ${sqlInteger(patch.lastActivityAt ?? existing.lastActivityAt)},
|
|
1239
|
-
idle_check_count = ${sqlInteger(patch.idleCheckCount ?? existing.idleCheckCount)},
|
|
1240
|
-
task_delivered = ${sqlBoolean(patch.taskDelivered ?? existing.taskDelivered)},
|
|
1241
|
-
completion_summary = ${sqlText(patch.completionSummary ?? existing.completionSummary)},
|
|
1242
|
-
last_seen_decision_index = ${sqlInteger(patch.lastSeenDecisionIndex ?? existing.lastSeenDecisionIndex)},
|
|
1243
|
-
last_input_sent_at = ${sqlInteger(patch.lastInputSentAt ?? existing.lastInputSentAt)},
|
|
1244
|
-
stopped_at = ${sqlInteger(patch.stoppedAt ?? existing.stoppedAt)},
|
|
1245
|
-
updated_at = ${sqlQuote(nowIso)},
|
|
1246
|
-
metadata_json = ${sqlJson(nextMeta)}
|
|
1247
|
-
WHERE session_id = ${sqlQuote(sessionId)}`);
|
|
1248
|
-
await this.appendEvent({
|
|
1249
|
-
threadId,
|
|
1250
|
-
sessionId,
|
|
1251
|
-
eventType: "session_updated",
|
|
1252
|
-
timestamp: patch.lastActivityAt ?? Date.now(),
|
|
1253
|
-
summary: `Updated session "${existing.label}"`,
|
|
1254
|
-
data: {
|
|
1255
|
-
status: patch.status ?? existing.status,
|
|
1256
|
-
decisionCount: patch.decisionCount ?? existing.decisionCount,
|
|
1257
|
-
autoResolvedCount: patch.autoResolvedCount ?? existing.autoResolvedCount,
|
|
1258
|
-
},
|
|
1259
|
-
});
|
|
1260
|
-
await this.recomputeThreadStatus(threadId);
|
|
1261
|
-
}
|
|
1262
|
-
async recordDecision(input) {
|
|
1263
|
-
await this.ensureSchema();
|
|
1264
|
-
const createdAt = isoNow();
|
|
1265
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_decisions (
|
|
1266
|
-
id, thread_id, session_id, timestamp, event_type, prompt_text, decision,
|
|
1267
|
-
response, reasoning, metadata_json, created_at
|
|
1268
|
-
) VALUES (
|
|
1269
|
-
${sqlQuote(`decision-${crypto.randomUUID()}`)},
|
|
1270
|
-
${sqlQuote(input.threadId)},
|
|
1271
|
-
${sqlQuote(input.sessionId)},
|
|
1272
|
-
${sqlInteger(input.timestamp)},
|
|
1273
|
-
${sqlQuote(input.event)},
|
|
1274
|
-
${sqlQuote(input.promptText)},
|
|
1275
|
-
${sqlQuote(input.decision)},
|
|
1276
|
-
${sqlText(input.response ?? null)},
|
|
1277
|
-
${sqlQuote(input.reasoning)},
|
|
1278
|
-
${sqlJson(input.metadata ?? {})},
|
|
1279
|
-
${sqlQuote(createdAt)}
|
|
1280
|
-
)`);
|
|
1281
|
-
await this.appendEvent({
|
|
1282
|
-
threadId: input.threadId,
|
|
1283
|
-
sessionId: input.sessionId,
|
|
1284
|
-
eventType: "decision_recorded",
|
|
1285
|
-
timestamp: input.timestamp,
|
|
1286
|
-
summary: `${input.decision} decision recorded`,
|
|
1287
|
-
data: {
|
|
1288
|
-
event: input.event,
|
|
1289
|
-
promptText: input.promptText,
|
|
1290
|
-
response: input.response ?? null,
|
|
1291
|
-
},
|
|
1292
|
-
});
|
|
1293
|
-
}
|
|
1294
|
-
async appendEvent(input) {
|
|
1295
|
-
await this.ensureSchema();
|
|
1296
|
-
const createdAt = isoNow();
|
|
1297
|
-
const timestamp = input.timestamp ?? Date.now();
|
|
1298
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_events (
|
|
1299
|
-
id, thread_id, session_id, event_type, timestamp, summary, data_json, created_at
|
|
1300
|
-
) VALUES (
|
|
1301
|
-
${sqlQuote(`event-${crypto.randomUUID()}`)},
|
|
1302
|
-
${sqlQuote(input.threadId)},
|
|
1303
|
-
${sqlText(input.sessionId ?? null)},
|
|
1304
|
-
${sqlQuote(input.eventType)},
|
|
1305
|
-
${sqlInteger(timestamp)},
|
|
1306
|
-
${sqlQuote(input.summary ?? "")},
|
|
1307
|
-
${sqlJson(input.data ?? {})},
|
|
1308
|
-
${sqlQuote(createdAt)}
|
|
1309
|
-
)`);
|
|
1310
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1311
|
-
SET updated_at = ${sqlQuote(createdAt)}
|
|
1312
|
-
WHERE id = ${sqlQuote(input.threadId)}`);
|
|
1313
|
-
}
|
|
1314
|
-
async recordArtifact(input) {
|
|
1315
|
-
await this.ensureSchema();
|
|
1316
|
-
const createdAt = isoNow();
|
|
1317
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_artifacts (
|
|
1318
|
-
id, thread_id, session_id, artifact_type, title, path, uri, mime_type, metadata_json, created_at
|
|
1319
|
-
) VALUES (
|
|
1320
|
-
${sqlQuote(`artifact-${crypto.randomUUID()}`)},
|
|
1321
|
-
${sqlQuote(input.threadId)},
|
|
1322
|
-
${sqlText(input.sessionId ?? null)},
|
|
1323
|
-
${sqlQuote(input.artifactType)},
|
|
1324
|
-
${sqlQuote(input.title)},
|
|
1325
|
-
${sqlText(input.path ?? null)},
|
|
1326
|
-
${sqlText(input.uri ?? null)},
|
|
1327
|
-
${sqlText(input.mimeType ?? null)},
|
|
1328
|
-
${sqlJson(input.metadata ?? {})},
|
|
1329
|
-
${sqlQuote(createdAt)}
|
|
1330
|
-
)`);
|
|
1331
|
-
await this.appendEvent({
|
|
1332
|
-
threadId: input.threadId,
|
|
1333
|
-
sessionId: input.sessionId ?? null,
|
|
1334
|
-
eventType: "artifact_recorded",
|
|
1335
|
-
summary: `Recorded ${input.artifactType} artifact`,
|
|
1336
|
-
data: {
|
|
1337
|
-
artifactType: input.artifactType,
|
|
1338
|
-
title: input.title,
|
|
1339
|
-
path: input.path ?? null,
|
|
1340
|
-
uri: input.uri ?? null,
|
|
1341
|
-
},
|
|
1342
|
-
});
|
|
1343
|
-
}
|
|
1344
|
-
async recordTranscript(input) {
|
|
1345
|
-
await this.ensureSchema();
|
|
1346
|
-
const createdAt = isoNow();
|
|
1347
|
-
const timestamp = input.timestamp ?? Date.now();
|
|
1348
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_transcripts (
|
|
1349
|
-
id, thread_id, session_id, timestamp, direction, content, metadata_json, created_at
|
|
1350
|
-
) VALUES (
|
|
1351
|
-
${sqlQuote(`transcript-${crypto.randomUUID()}`)},
|
|
1352
|
-
${sqlQuote(input.threadId)},
|
|
1353
|
-
${sqlQuote(input.sessionId)},
|
|
1354
|
-
${sqlInteger(timestamp)},
|
|
1355
|
-
${sqlQuote(input.direction)},
|
|
1356
|
-
${sqlQuote(input.content)},
|
|
1357
|
-
${sqlJson(input.metadata ?? {})},
|
|
1358
|
-
${sqlQuote(createdAt)}
|
|
1359
|
-
)`);
|
|
1360
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1361
|
-
SET updated_at = ${sqlQuote(createdAt)}
|
|
1362
|
-
WHERE id = ${sqlQuote(input.threadId)}`);
|
|
1363
|
-
}
|
|
1364
|
-
async updateThreadSummary(threadId, summary) {
|
|
1365
|
-
await this.ensureSchema();
|
|
1366
|
-
const thread = await this.getThreadRecord(threadId);
|
|
1367
|
-
if (!thread)
|
|
1368
|
-
return;
|
|
1369
|
-
const nextSearchText = buildSearchText([
|
|
1370
|
-
thread.title,
|
|
1371
|
-
thread.originalRequest,
|
|
1372
|
-
summary,
|
|
1373
|
-
thread.searchText,
|
|
1374
|
-
]);
|
|
1375
|
-
const nowIso = isoNow();
|
|
1376
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1377
|
-
SET summary = ${sqlQuote(summary)},
|
|
1378
|
-
search_text = ${sqlQuote(nextSearchText)},
|
|
1379
|
-
updated_at = ${sqlQuote(nowIso)}
|
|
1380
|
-
WHERE id = ${sqlQuote(threadId)}`);
|
|
1381
|
-
await this.appendEvent({
|
|
1382
|
-
threadId,
|
|
1383
|
-
eventType: "summary_updated",
|
|
1384
|
-
summary: "Updated task summary",
|
|
1385
|
-
data: { summary },
|
|
1386
|
-
});
|
|
1387
|
-
}
|
|
1388
|
-
async updateThread(threadId, patch) {
|
|
1389
|
-
await this.ensureSchema();
|
|
1390
|
-
const existing = await this.getThreadRecord(threadId);
|
|
1391
|
-
if (!existing)
|
|
1392
|
-
return;
|
|
1393
|
-
const nextMetadata = patch.metadata
|
|
1394
|
-
? { ...existing.metadata, ...patch.metadata }
|
|
1395
|
-
: existing.metadata;
|
|
1396
|
-
const nextSummary = patch.summary ?? existing.summary;
|
|
1397
|
-
const nextSearchText = buildSearchText([
|
|
1398
|
-
existing.title,
|
|
1399
|
-
existing.originalRequest,
|
|
1400
|
-
nextSummary,
|
|
1401
|
-
patch.status ?? existing.status,
|
|
1402
|
-
existing.scenarioId,
|
|
1403
|
-
existing.batchId,
|
|
1404
|
-
JSON.stringify(nextMetadata),
|
|
1405
|
-
]);
|
|
1406
|
-
const nowIso = isoNow();
|
|
1407
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1408
|
-
SET status = ${sqlQuote(patch.status ?? existing.status)},
|
|
1409
|
-
summary = ${sqlQuote(nextSummary)},
|
|
1410
|
-
current_plan_json = ${sqlJson(patch.currentPlan ?? existing.currentPlan)},
|
|
1411
|
-
search_text = ${sqlQuote(nextSearchText)},
|
|
1412
|
-
closed_at = ${sqlText(patch.closedAt !== undefined
|
|
1413
|
-
? patch.closedAt
|
|
1414
|
-
: existing.closedAt)},
|
|
1415
|
-
archived_at = ${sqlText(patch.archivedAt !== undefined
|
|
1416
|
-
? patch.archivedAt
|
|
1417
|
-
: existing.archivedAt)},
|
|
1418
|
-
last_user_turn_at = ${sqlText(patch.lastUserTurnAt !== undefined
|
|
1419
|
-
? patch.lastUserTurnAt
|
|
1420
|
-
: existing.lastUserTurnAt)},
|
|
1421
|
-
last_coordinator_turn_at = ${sqlText(patch.lastCoordinatorTurnAt !== undefined
|
|
1422
|
-
? patch.lastCoordinatorTurnAt
|
|
1423
|
-
: existing.lastCoordinatorTurnAt)},
|
|
1424
|
-
updated_at = ${sqlQuote(nowIso)},
|
|
1425
|
-
metadata_json = ${sqlJson(nextMetadata)}
|
|
1426
|
-
WHERE id = ${sqlQuote(threadId)}`);
|
|
1427
|
-
}
|
|
1428
|
-
async archiveThread(threadId) {
|
|
1429
|
-
await this.ensureSchema();
|
|
1430
|
-
const nowIso = isoNow();
|
|
1431
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1432
|
-
SET status = 'archived',
|
|
1433
|
-
archived_at = ${sqlQuote(nowIso)},
|
|
1434
|
-
closed_at = COALESCE(closed_at, ${sqlQuote(nowIso)}),
|
|
1435
|
-
updated_at = ${sqlQuote(nowIso)}
|
|
1436
|
-
WHERE id = ${sqlQuote(threadId)}`);
|
|
1437
|
-
await this.appendEvent({
|
|
1438
|
-
threadId,
|
|
1439
|
-
eventType: "task_archived",
|
|
1440
|
-
summary: "Archived task thread",
|
|
1441
|
-
data: {},
|
|
1442
|
-
});
|
|
1443
|
-
}
|
|
1444
|
-
async reopenThread(threadId) {
|
|
1445
|
-
await this.ensureSchema();
|
|
1446
|
-
const nowIso = isoNow();
|
|
1447
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1448
|
-
SET status = 'open',
|
|
1449
|
-
archived_at = NULL,
|
|
1450
|
-
closed_at = NULL,
|
|
1451
|
-
updated_at = ${sqlQuote(nowIso)}
|
|
1452
|
-
WHERE id = ${sqlQuote(threadId)}`);
|
|
1453
|
-
await this.appendEvent({
|
|
1454
|
-
threadId,
|
|
1455
|
-
eventType: "task_reopened",
|
|
1456
|
-
summary: "Reopened task thread",
|
|
1457
|
-
data: {},
|
|
1458
|
-
});
|
|
1459
|
-
await this.recomputeThreadStatus(threadId);
|
|
1460
|
-
}
|
|
1461
|
-
async upsertPendingDecision(input) {
|
|
1462
|
-
await this.ensureSchema();
|
|
1463
|
-
const createdAt = input.createdAt ?? Date.now();
|
|
1464
|
-
const nowIso = isoNow();
|
|
1465
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_pending_decisions (
|
|
1466
|
-
session_id,
|
|
1467
|
-
thread_id,
|
|
1468
|
-
prompt_text,
|
|
1469
|
-
recent_output,
|
|
1470
|
-
llm_decision_json,
|
|
1471
|
-
task_context_json,
|
|
1472
|
-
created_at,
|
|
1473
|
-
updated_at
|
|
1474
|
-
) VALUES (
|
|
1475
|
-
${sqlQuote(input.sessionId)},
|
|
1476
|
-
${sqlQuote(input.threadId)},
|
|
1477
|
-
${sqlQuote(input.promptText)},
|
|
1478
|
-
${sqlQuote(input.recentOutput)},
|
|
1479
|
-
${sqlJson(input.llmDecision)},
|
|
1480
|
-
${sqlJson(input.taskContext)},
|
|
1481
|
-
${sqlInteger(createdAt)},
|
|
1482
|
-
${sqlQuote(nowIso)}
|
|
1483
|
-
)
|
|
1484
|
-
ON CONFLICT(session_id) DO UPDATE SET
|
|
1485
|
-
thread_id = EXCLUDED.thread_id,
|
|
1486
|
-
prompt_text = EXCLUDED.prompt_text,
|
|
1487
|
-
recent_output = EXCLUDED.recent_output,
|
|
1488
|
-
llm_decision_json = EXCLUDED.llm_decision_json,
|
|
1489
|
-
task_context_json = EXCLUDED.task_context_json,
|
|
1490
|
-
created_at = EXCLUDED.created_at,
|
|
1491
|
-
updated_at = EXCLUDED.updated_at`);
|
|
1492
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1493
|
-
SET updated_at = ${sqlQuote(nowIso)}
|
|
1494
|
-
WHERE id = ${sqlQuote(input.threadId)}`);
|
|
1495
|
-
}
|
|
1496
|
-
async deletePendingDecision(sessionId) {
|
|
1497
|
-
await this.ensureSchema();
|
|
1498
|
-
const rows = await executeRawSql(this.runtime, `SELECT thread_id
|
|
1499
|
-
FROM orchestrator_task_pending_decisions
|
|
1500
|
-
WHERE session_id = ${sqlQuote(sessionId)}
|
|
1501
|
-
LIMIT 1`);
|
|
1502
|
-
if (rows.length === 0)
|
|
1503
|
-
return;
|
|
1504
|
-
const threadId = toText(rows[0]?.thread_id);
|
|
1505
|
-
await executeRawSql(this.runtime, `DELETE FROM orchestrator_task_pending_decisions
|
|
1506
|
-
WHERE session_id = ${sqlQuote(sessionId)}`);
|
|
1507
|
-
if (threadId) {
|
|
1508
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
1509
|
-
SET updated_at = ${sqlQuote(isoNow())}
|
|
1510
|
-
WHERE id = ${sqlQuote(threadId)}`);
|
|
1511
|
-
}
|
|
1512
|
-
}
|
|
1513
|
-
async listPendingDecisions() {
|
|
1514
|
-
await this.ensureSchema();
|
|
1515
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1516
|
-
FROM orchestrator_task_pending_decisions
|
|
1517
|
-
ORDER BY created_at ASC`);
|
|
1518
|
-
return rows.map(parsePendingDecisionRow);
|
|
1519
|
-
}
|
|
1520
|
-
async listPendingDecisionsForThread(threadId) {
|
|
1521
|
-
await this.ensureSchema();
|
|
1522
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1523
|
-
FROM orchestrator_task_pending_decisions
|
|
1524
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1525
|
-
ORDER BY created_at ASC`);
|
|
1526
|
-
return rows.map(parsePendingDecisionRow);
|
|
1527
|
-
}
|
|
1528
|
-
async createTaskNode(input) {
|
|
1529
|
-
await this.ensureSchema();
|
|
1530
|
-
const nowIso = isoNow();
|
|
1531
|
-
const id = input.id?.trim() || `node-${crypto.randomUUID()}`;
|
|
1532
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_nodes (
|
|
1533
|
-
id, thread_id, parent_node_id, kind, status, title, instructions,
|
|
1534
|
-
acceptance_criteria_json, required_capabilities_json, expected_artifacts_json,
|
|
1535
|
-
assigned_session_id, assigned_label, agent_type, workdir, repo, priority,
|
|
1536
|
-
depth, sequence, created_from, metadata_json, created_at, updated_at,
|
|
1537
|
-
started_at, completed_at
|
|
1538
|
-
) VALUES (
|
|
1539
|
-
${sqlQuote(id)},
|
|
1540
|
-
${sqlQuote(input.threadId)},
|
|
1541
|
-
${sqlText(input.parentNodeId ?? null)},
|
|
1542
|
-
${sqlQuote(input.kind ?? "execution")},
|
|
1543
|
-
${sqlQuote(input.status ?? "planned")},
|
|
1544
|
-
${sqlQuote(input.title)},
|
|
1545
|
-
${sqlQuote(input.instructions ?? "")},
|
|
1546
|
-
${sqlJson(input.acceptanceCriteria ?? [])},
|
|
1547
|
-
${sqlJson(input.requiredCapabilities ?? [])},
|
|
1548
|
-
${sqlJson(input.expectedArtifacts ?? [])},
|
|
1549
|
-
${sqlText(input.assignedSessionId ?? null)},
|
|
1550
|
-
${sqlText(input.assignedLabel ?? null)},
|
|
1551
|
-
${sqlText(input.agentType ?? null)},
|
|
1552
|
-
${sqlText(input.workdir ?? null)},
|
|
1553
|
-
${sqlText(input.repo ?? null)},
|
|
1554
|
-
${sqlInteger(input.priority ?? 0)},
|
|
1555
|
-
${sqlInteger(input.depth ?? 0)},
|
|
1556
|
-
${sqlInteger(input.sequence ?? 0)},
|
|
1557
|
-
${sqlText(input.createdFrom ?? null)},
|
|
1558
|
-
${sqlJson(input.metadata ?? {})},
|
|
1559
|
-
${sqlQuote(nowIso)},
|
|
1560
|
-
${sqlQuote(nowIso)},
|
|
1561
|
-
${sqlText(input.startedAt ?? null)},
|
|
1562
|
-
${sqlText(input.completedAt ?? null)}
|
|
1563
|
-
)`);
|
|
1564
|
-
await this.appendEvent({
|
|
1565
|
-
threadId: input.threadId,
|
|
1566
|
-
sessionId: input.assignedSessionId ?? null,
|
|
1567
|
-
eventType: "task_node_created",
|
|
1568
|
-
summary: `Created task node "${input.title}"`,
|
|
1569
|
-
data: {
|
|
1570
|
-
nodeId: id,
|
|
1571
|
-
kind: input.kind ?? "execution",
|
|
1572
|
-
status: input.status ?? "planned",
|
|
1573
|
-
parentNodeId: input.parentNodeId ?? null,
|
|
1574
|
-
},
|
|
1575
|
-
});
|
|
1576
|
-
const node = await this.getTaskNode(id);
|
|
1577
|
-
if (!node) {
|
|
1578
|
-
throw new Error(`Failed to create task node ${id}`);
|
|
1579
|
-
}
|
|
1580
|
-
await this.recomputeTaskGraphState(input.threadId);
|
|
1581
|
-
return node;
|
|
1582
|
-
}
|
|
1583
|
-
async getTaskNode(nodeId) {
|
|
1584
|
-
await this.ensureSchema();
|
|
1585
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1586
|
-
FROM orchestrator_task_nodes
|
|
1587
|
-
WHERE id = ${sqlQuote(nodeId)}
|
|
1588
|
-
LIMIT 1`);
|
|
1589
|
-
return rows[0] ? parseTaskNodeRow(rows[0]) : null;
|
|
1590
|
-
}
|
|
1591
|
-
async updateTaskNode(nodeId, patch) {
|
|
1592
|
-
await this.ensureSchema();
|
|
1593
|
-
const existing = await this.getTaskNode(nodeId);
|
|
1594
|
-
if (!existing)
|
|
1595
|
-
return;
|
|
1596
|
-
const nextMetadata = patch.metadata
|
|
1597
|
-
? { ...existing.metadata, ...patch.metadata }
|
|
1598
|
-
: existing.metadata;
|
|
1599
|
-
const nextStatus = patch.status ?? existing.status;
|
|
1600
|
-
const nextStartedAt = patch.startedAt !== undefined
|
|
1601
|
-
? patch.startedAt
|
|
1602
|
-
: nextStatus === "running" || nextStatus === "verifying"
|
|
1603
|
-
? (existing.startedAt ?? isoNow())
|
|
1604
|
-
: existing.startedAt;
|
|
1605
|
-
const nextCompletedAt = patch.completedAt !== undefined
|
|
1606
|
-
? patch.completedAt
|
|
1607
|
-
: ["completed", "failed", "canceled", "interrupted"].includes(nextStatus)
|
|
1608
|
-
? (existing.completedAt ?? isoNow())
|
|
1609
|
-
: null;
|
|
1610
|
-
const nowIso = isoNow();
|
|
1611
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_nodes
|
|
1612
|
-
SET parent_node_id = ${sqlText(patch.parentNodeId !== undefined
|
|
1613
|
-
? patch.parentNodeId
|
|
1614
|
-
: existing.parentNodeId)},
|
|
1615
|
-
kind = ${sqlQuote(patch.kind ?? existing.kind)},
|
|
1616
|
-
status = ${sqlQuote(nextStatus)},
|
|
1617
|
-
title = ${sqlQuote(patch.title ?? existing.title)},
|
|
1618
|
-
instructions = ${sqlQuote(patch.instructions ?? existing.instructions)},
|
|
1619
|
-
acceptance_criteria_json = ${sqlJson(patch.acceptanceCriteria ?? existing.acceptanceCriteria)},
|
|
1620
|
-
required_capabilities_json = ${sqlJson(patch.requiredCapabilities ?? existing.requiredCapabilities)},
|
|
1621
|
-
expected_artifacts_json = ${sqlJson(patch.expectedArtifacts ?? existing.expectedArtifacts)},
|
|
1622
|
-
assigned_session_id = ${sqlText(patch.assignedSessionId !== undefined
|
|
1623
|
-
? patch.assignedSessionId
|
|
1624
|
-
: existing.assignedSessionId)},
|
|
1625
|
-
assigned_label = ${sqlText(patch.assignedLabel !== undefined
|
|
1626
|
-
? patch.assignedLabel
|
|
1627
|
-
: existing.assignedLabel)},
|
|
1628
|
-
agent_type = ${sqlText(patch.agentType !== undefined
|
|
1629
|
-
? patch.agentType
|
|
1630
|
-
: existing.agentType)},
|
|
1631
|
-
workdir = ${sqlText(patch.workdir !== undefined ? patch.workdir : existing.workdir)},
|
|
1632
|
-
repo = ${sqlText(patch.repo !== undefined ? patch.repo : existing.repo)},
|
|
1633
|
-
priority = ${sqlInteger(patch.priority ?? existing.priority)},
|
|
1634
|
-
depth = ${sqlInteger(patch.depth ?? existing.depth)},
|
|
1635
|
-
sequence = ${sqlInteger(patch.sequence ?? existing.sequence)},
|
|
1636
|
-
created_from = ${sqlText(patch.createdFrom !== undefined
|
|
1637
|
-
? patch.createdFrom
|
|
1638
|
-
: existing.createdFrom)},
|
|
1639
|
-
metadata_json = ${sqlJson(nextMetadata)},
|
|
1640
|
-
updated_at = ${sqlQuote(nowIso)},
|
|
1641
|
-
started_at = ${sqlText(nextStartedAt)},
|
|
1642
|
-
completed_at = ${sqlText(nextCompletedAt)}
|
|
1643
|
-
WHERE id = ${sqlQuote(nodeId)}`);
|
|
1644
|
-
await this.appendEvent({
|
|
1645
|
-
threadId: existing.threadId,
|
|
1646
|
-
sessionId: patch.assignedSessionId !== undefined
|
|
1647
|
-
? patch.assignedSessionId
|
|
1648
|
-
: existing.assignedSessionId,
|
|
1649
|
-
eventType: "task_node_updated",
|
|
1650
|
-
summary: `Updated task node "${patch.title ?? existing.title}"`,
|
|
1651
|
-
data: {
|
|
1652
|
-
nodeId,
|
|
1653
|
-
status: nextStatus,
|
|
1654
|
-
},
|
|
1655
|
-
});
|
|
1656
|
-
await this.recomputeTaskGraphState(existing.threadId);
|
|
1657
|
-
}
|
|
1658
|
-
async listTaskNodesForThread(threadId) {
|
|
1659
|
-
await this.ensureSchema();
|
|
1660
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1661
|
-
FROM orchestrator_task_nodes
|
|
1662
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1663
|
-
ORDER BY depth ASC, sequence ASC, created_at ASC`);
|
|
1664
|
-
return rows.map(parseTaskNodeRow);
|
|
1665
|
-
}
|
|
1666
|
-
async listReadyTaskNodesForThread(threadId) {
|
|
1667
|
-
await this.ensureSchema();
|
|
1668
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1669
|
-
FROM orchestrator_task_nodes
|
|
1670
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1671
|
-
AND status = 'ready'
|
|
1672
|
-
ORDER BY priority DESC, depth ASC, sequence ASC, created_at ASC`);
|
|
1673
|
-
return rows.map(parseTaskNodeRow);
|
|
1674
|
-
}
|
|
1675
|
-
async createTaskDependency(input) {
|
|
1676
|
-
await this.ensureSchema();
|
|
1677
|
-
const createdAt = isoNow();
|
|
1678
|
-
const id = input.id?.trim() || `dep-${crypto.randomUUID()}`;
|
|
1679
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_dependencies (
|
|
1680
|
-
id, thread_id, from_node_id, to_node_id, dependency_kind, required_status,
|
|
1681
|
-
metadata_json, created_at
|
|
1682
|
-
) VALUES (
|
|
1683
|
-
${sqlQuote(id)},
|
|
1684
|
-
${sqlQuote(input.threadId)},
|
|
1685
|
-
${sqlQuote(input.fromNodeId)},
|
|
1686
|
-
${sqlQuote(input.toNodeId)},
|
|
1687
|
-
${sqlQuote(input.dependencyKind ?? "blocks")},
|
|
1688
|
-
${sqlQuote(input.requiredStatus ?? "completed")},
|
|
1689
|
-
${sqlJson(input.metadata ?? {})},
|
|
1690
|
-
${sqlQuote(createdAt)}
|
|
1691
|
-
)`);
|
|
1692
|
-
await this.appendEvent({
|
|
1693
|
-
threadId: input.threadId,
|
|
1694
|
-
eventType: "task_dependency_created",
|
|
1695
|
-
summary: `Created dependency ${input.fromNodeId} -> ${input.toNodeId}`,
|
|
1696
|
-
data: {
|
|
1697
|
-
dependencyId: id,
|
|
1698
|
-
fromNodeId: input.fromNodeId,
|
|
1699
|
-
toNodeId: input.toNodeId,
|
|
1700
|
-
dependencyKind: input.dependencyKind ?? "blocks",
|
|
1701
|
-
requiredStatus: input.requiredStatus ?? "completed",
|
|
1702
|
-
},
|
|
1703
|
-
});
|
|
1704
|
-
const dependency = await this.getTaskDependency(id);
|
|
1705
|
-
if (!dependency) {
|
|
1706
|
-
throw new Error(`Failed to create task dependency ${id}`);
|
|
1707
|
-
}
|
|
1708
|
-
await this.recomputeTaskGraphState(input.threadId);
|
|
1709
|
-
return dependency;
|
|
1710
|
-
}
|
|
1711
|
-
async getTaskDependency(dependencyId) {
|
|
1712
|
-
await this.ensureSchema();
|
|
1713
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1714
|
-
FROM orchestrator_task_dependencies
|
|
1715
|
-
WHERE id = ${sqlQuote(dependencyId)}
|
|
1716
|
-
LIMIT 1`);
|
|
1717
|
-
return rows[0] ? parseTaskDependencyRow(rows[0]) : null;
|
|
1718
|
-
}
|
|
1719
|
-
async listTaskDependenciesForThread(threadId) {
|
|
1720
|
-
await this.ensureSchema();
|
|
1721
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1722
|
-
FROM orchestrator_task_dependencies
|
|
1723
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1724
|
-
ORDER BY created_at ASC`);
|
|
1725
|
-
return rows.map(parseTaskDependencyRow);
|
|
1726
|
-
}
|
|
1727
|
-
async createTaskClaim(input) {
|
|
1728
|
-
await this.ensureSchema();
|
|
1729
|
-
const claimedAt = input.claimedAt ?? isoNow();
|
|
1730
|
-
const id = input.id?.trim() || `claim-${crypto.randomUUID()}`;
|
|
1731
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_claims (
|
|
1732
|
-
id, thread_id, node_id, session_id, claim_type, status, claimed_at,
|
|
1733
|
-
released_at, metadata_json
|
|
1734
|
-
) VALUES (
|
|
1735
|
-
${sqlQuote(id)},
|
|
1736
|
-
${sqlQuote(input.threadId)},
|
|
1737
|
-
${sqlQuote(input.nodeId)},
|
|
1738
|
-
${sqlQuote(input.sessionId)},
|
|
1739
|
-
${sqlQuote(input.claimType ?? "execution")},
|
|
1740
|
-
${sqlQuote(input.status ?? "active")},
|
|
1741
|
-
${sqlQuote(claimedAt)},
|
|
1742
|
-
${sqlText(input.releasedAt ?? null)},
|
|
1743
|
-
${sqlJson(input.metadata ?? {})}
|
|
1744
|
-
)`);
|
|
1745
|
-
await this.appendEvent({
|
|
1746
|
-
threadId: input.threadId,
|
|
1747
|
-
sessionId: input.sessionId,
|
|
1748
|
-
eventType: "task_claim_created",
|
|
1749
|
-
summary: `Claimed task node ${input.nodeId}`,
|
|
1750
|
-
data: {
|
|
1751
|
-
claimId: id,
|
|
1752
|
-
nodeId: input.nodeId,
|
|
1753
|
-
sessionId: input.sessionId,
|
|
1754
|
-
claimType: input.claimType ?? "execution",
|
|
1755
|
-
status: input.status ?? "active",
|
|
1756
|
-
},
|
|
1757
|
-
});
|
|
1758
|
-
const claim = await this.getTaskClaim(id);
|
|
1759
|
-
if (!claim) {
|
|
1760
|
-
throw new Error(`Failed to create task claim ${id}`);
|
|
1761
|
-
}
|
|
1762
|
-
return claim;
|
|
1763
|
-
}
|
|
1764
|
-
async getTaskClaim(claimId) {
|
|
1765
|
-
await this.ensureSchema();
|
|
1766
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1767
|
-
FROM orchestrator_task_claims
|
|
1768
|
-
WHERE id = ${sqlQuote(claimId)}
|
|
1769
|
-
LIMIT 1`);
|
|
1770
|
-
return rows[0] ? parseTaskClaimRow(rows[0]) : null;
|
|
1771
|
-
}
|
|
1772
|
-
async findActiveTaskClaim(nodeId, sessionId) {
|
|
1773
|
-
await this.ensureSchema();
|
|
1774
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1775
|
-
FROM orchestrator_task_claims
|
|
1776
|
-
WHERE node_id = ${sqlQuote(nodeId)}
|
|
1777
|
-
AND session_id = ${sqlQuote(sessionId)}
|
|
1778
|
-
AND status = 'active'
|
|
1779
|
-
ORDER BY claimed_at DESC
|
|
1780
|
-
LIMIT 1`);
|
|
1781
|
-
return rows[0] ? parseTaskClaimRow(rows[0]) : null;
|
|
1782
|
-
}
|
|
1783
|
-
async updateTaskClaim(claimId, patch) {
|
|
1784
|
-
await this.ensureSchema();
|
|
1785
|
-
const existing = await this.getTaskClaim(claimId);
|
|
1786
|
-
if (!existing)
|
|
1787
|
-
return;
|
|
1788
|
-
const nextMetadata = patch.metadata
|
|
1789
|
-
? { ...existing.metadata, ...patch.metadata }
|
|
1790
|
-
: existing.metadata;
|
|
1791
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_claims
|
|
1792
|
-
SET status = ${sqlQuote(patch.status ?? existing.status)},
|
|
1793
|
-
released_at = ${sqlText(patch.releasedAt !== undefined
|
|
1794
|
-
? patch.releasedAt
|
|
1795
|
-
: existing.releasedAt)},
|
|
1796
|
-
metadata_json = ${sqlJson(nextMetadata)}
|
|
1797
|
-
WHERE id = ${sqlQuote(claimId)}`);
|
|
1798
|
-
}
|
|
1799
|
-
async listTaskClaimsForThread(threadId) {
|
|
1800
|
-
await this.ensureSchema();
|
|
1801
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1802
|
-
FROM orchestrator_task_claims
|
|
1803
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1804
|
-
ORDER BY claimed_at ASC`);
|
|
1805
|
-
return rows.map(parseTaskClaimRow);
|
|
1806
|
-
}
|
|
1807
|
-
async appendTaskMailboxMessage(input) {
|
|
1808
|
-
await this.ensureSchema();
|
|
1809
|
-
const id = input.id?.trim() || `mail-${crypto.randomUUID()}`;
|
|
1810
|
-
const createdAt = input.createdAt ?? isoNow();
|
|
1811
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_mailbox (
|
|
1812
|
-
id, thread_id, node_id, session_id, sender, recipient, subject, body,
|
|
1813
|
-
delivery_state, metadata_json, created_at, delivered_at
|
|
1814
|
-
) VALUES (
|
|
1815
|
-
${sqlQuote(id)},
|
|
1816
|
-
${sqlQuote(input.threadId)},
|
|
1817
|
-
${sqlText(input.nodeId ?? null)},
|
|
1818
|
-
${sqlText(input.sessionId ?? null)},
|
|
1819
|
-
${sqlQuote(input.sender)},
|
|
1820
|
-
${sqlQuote(input.recipient)},
|
|
1821
|
-
${sqlQuote(input.subject ?? "")},
|
|
1822
|
-
${sqlQuote(input.body)},
|
|
1823
|
-
${sqlQuote(input.deliveryState ?? "pending")},
|
|
1824
|
-
${sqlJson(input.metadata ?? {})},
|
|
1825
|
-
${sqlQuote(createdAt)},
|
|
1826
|
-
${sqlText(input.deliveredAt ?? null)}
|
|
1827
|
-
)`);
|
|
1828
|
-
await this.appendEvent({
|
|
1829
|
-
threadId: input.threadId,
|
|
1830
|
-
sessionId: input.sessionId ?? null,
|
|
1831
|
-
eventType: "task_mailbox_message",
|
|
1832
|
-
summary: `Mailbox message "${input.subject ?? ""}" queued for ${input.recipient}`,
|
|
1833
|
-
data: {
|
|
1834
|
-
messageId: id,
|
|
1835
|
-
nodeId: input.nodeId ?? null,
|
|
1836
|
-
sender: input.sender,
|
|
1837
|
-
recipient: input.recipient,
|
|
1838
|
-
deliveryState: input.deliveryState ?? "pending",
|
|
1839
|
-
},
|
|
1840
|
-
});
|
|
1841
|
-
const message = await this.getTaskMailboxMessage(id);
|
|
1842
|
-
if (!message) {
|
|
1843
|
-
throw new Error(`Failed to create mailbox message ${id}`);
|
|
1844
|
-
}
|
|
1845
|
-
return message;
|
|
1846
|
-
}
|
|
1847
|
-
async getTaskMailboxMessage(messageId) {
|
|
1848
|
-
await this.ensureSchema();
|
|
1849
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1850
|
-
FROM orchestrator_task_mailbox
|
|
1851
|
-
WHERE id = ${sqlQuote(messageId)}
|
|
1852
|
-
LIMIT 1`);
|
|
1853
|
-
return rows[0] ? parseTaskMailboxMessageRow(rows[0]) : null;
|
|
1854
|
-
}
|
|
1855
|
-
async markTaskMailboxMessageDelivered(messageId) {
|
|
1856
|
-
await this.ensureSchema();
|
|
1857
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_mailbox
|
|
1858
|
-
SET delivery_state = 'delivered',
|
|
1859
|
-
delivered_at = ${sqlQuote(isoNow())}
|
|
1860
|
-
WHERE id = ${sqlQuote(messageId)}`);
|
|
1861
|
-
}
|
|
1862
|
-
async listTaskMailboxMessagesForThread(threadId) {
|
|
1863
|
-
await this.ensureSchema();
|
|
1864
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1865
|
-
FROM orchestrator_task_mailbox
|
|
1866
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1867
|
-
ORDER BY created_at ASC`);
|
|
1868
|
-
return rows.map(parseTaskMailboxMessageRow);
|
|
1869
|
-
}
|
|
1870
|
-
async createTaskVerifierJob(input) {
|
|
1871
|
-
await this.ensureSchema();
|
|
1872
|
-
const id = input.id?.trim() || `verify-${crypto.randomUUID()}`;
|
|
1873
|
-
const createdAt = input.createdAt ?? isoNow();
|
|
1874
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_verifier_jobs (
|
|
1875
|
-
id, thread_id, node_id, status, verifier_type, title, instructions,
|
|
1876
|
-
config_json, metadata_json, created_at, started_at, completed_at
|
|
1877
|
-
) VALUES (
|
|
1878
|
-
${sqlQuote(id)},
|
|
1879
|
-
${sqlQuote(input.threadId)},
|
|
1880
|
-
${sqlQuote(input.nodeId)},
|
|
1881
|
-
${sqlQuote(input.status ?? "pending")},
|
|
1882
|
-
${sqlQuote(input.verifierType)},
|
|
1883
|
-
${sqlQuote(input.title)},
|
|
1884
|
-
${sqlQuote(input.instructions ?? "")},
|
|
1885
|
-
${sqlJson(input.config ?? {})},
|
|
1886
|
-
${sqlJson(input.metadata ?? {})},
|
|
1887
|
-
${sqlQuote(createdAt)},
|
|
1888
|
-
${sqlText(input.startedAt ?? null)},
|
|
1889
|
-
${sqlText(input.completedAt ?? null)}
|
|
1890
|
-
)`);
|
|
1891
|
-
await this.appendEvent({
|
|
1892
|
-
threadId: input.threadId,
|
|
1893
|
-
eventType: "verifier_job_created",
|
|
1894
|
-
summary: `Created verifier job "${input.title}"`,
|
|
1895
|
-
data: {
|
|
1896
|
-
verifierJobId: id,
|
|
1897
|
-
nodeId: input.nodeId,
|
|
1898
|
-
verifierType: input.verifierType,
|
|
1899
|
-
status: input.status ?? "pending",
|
|
1900
|
-
},
|
|
1901
|
-
});
|
|
1902
|
-
const job = await this.getTaskVerifierJob(id);
|
|
1903
|
-
if (!job) {
|
|
1904
|
-
throw new Error(`Failed to create verifier job ${id}`);
|
|
1905
|
-
}
|
|
1906
|
-
return job;
|
|
1907
|
-
}
|
|
1908
|
-
async getTaskVerifierJob(verifierJobId) {
|
|
1909
|
-
await this.ensureSchema();
|
|
1910
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1911
|
-
FROM orchestrator_task_verifier_jobs
|
|
1912
|
-
WHERE id = ${sqlQuote(verifierJobId)}
|
|
1913
|
-
LIMIT 1`);
|
|
1914
|
-
return rows[0] ? parseTaskVerifierJobRow(rows[0]) : null;
|
|
1915
|
-
}
|
|
1916
|
-
async updateTaskVerifierJob(verifierJobId, patch) {
|
|
1917
|
-
await this.ensureSchema();
|
|
1918
|
-
const existing = await this.getTaskVerifierJob(verifierJobId);
|
|
1919
|
-
if (!existing)
|
|
1920
|
-
return;
|
|
1921
|
-
const nextMetadata = patch.metadata
|
|
1922
|
-
? { ...existing.metadata, ...patch.metadata }
|
|
1923
|
-
: existing.metadata;
|
|
1924
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_verifier_jobs
|
|
1925
|
-
SET status = ${sqlQuote(patch.status ?? existing.status)},
|
|
1926
|
-
title = ${sqlQuote(patch.title ?? existing.title)},
|
|
1927
|
-
instructions = ${sqlQuote(patch.instructions ?? existing.instructions)},
|
|
1928
|
-
config_json = ${sqlJson(patch.config ?? existing.config)},
|
|
1929
|
-
metadata_json = ${sqlJson(nextMetadata)},
|
|
1930
|
-
started_at = ${sqlText(patch.startedAt !== undefined
|
|
1931
|
-
? patch.startedAt
|
|
1932
|
-
: existing.startedAt)},
|
|
1933
|
-
completed_at = ${sqlText(patch.completedAt !== undefined
|
|
1934
|
-
? patch.completedAt
|
|
1935
|
-
: existing.completedAt)}
|
|
1936
|
-
WHERE id = ${sqlQuote(verifierJobId)}`);
|
|
1937
|
-
}
|
|
1938
|
-
async listTaskVerifierJobsForThread(threadId) {
|
|
1939
|
-
await this.ensureSchema();
|
|
1940
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1941
|
-
FROM orchestrator_task_verifier_jobs
|
|
1942
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1943
|
-
ORDER BY created_at ASC`);
|
|
1944
|
-
return rows.map(parseTaskVerifierJobRow);
|
|
1945
|
-
}
|
|
1946
|
-
async recordTaskEvidence(input) {
|
|
1947
|
-
await this.ensureSchema();
|
|
1948
|
-
const id = input.id?.trim() || `evidence-${crypto.randomUUID()}`;
|
|
1949
|
-
const createdAt = isoNow();
|
|
1950
|
-
await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_evidence (
|
|
1951
|
-
id, thread_id, node_id, session_id, verifier_job_id, evidence_type, title,
|
|
1952
|
-
summary, path, uri, content_json, metadata_json, created_at
|
|
1953
|
-
) VALUES (
|
|
1954
|
-
${sqlQuote(id)},
|
|
1955
|
-
${sqlQuote(input.threadId)},
|
|
1956
|
-
${sqlText(input.nodeId ?? null)},
|
|
1957
|
-
${sqlText(input.sessionId ?? null)},
|
|
1958
|
-
${sqlText(input.verifierJobId ?? null)},
|
|
1959
|
-
${sqlQuote(input.evidenceType)},
|
|
1960
|
-
${sqlQuote(input.title)},
|
|
1961
|
-
${sqlQuote(input.summary ?? "")},
|
|
1962
|
-
${sqlText(input.path ?? null)},
|
|
1963
|
-
${sqlText(input.uri ?? null)},
|
|
1964
|
-
${sqlJson(input.content ?? {})},
|
|
1965
|
-
${sqlJson(input.metadata ?? {})},
|
|
1966
|
-
${sqlQuote(createdAt)}
|
|
1967
|
-
)`);
|
|
1968
|
-
await this.appendEvent({
|
|
1969
|
-
threadId: input.threadId,
|
|
1970
|
-
sessionId: input.sessionId ?? null,
|
|
1971
|
-
eventType: "task_evidence_recorded",
|
|
1972
|
-
summary: `Recorded ${input.evidenceType} evidence`,
|
|
1973
|
-
data: {
|
|
1974
|
-
evidenceId: id,
|
|
1975
|
-
nodeId: input.nodeId ?? null,
|
|
1976
|
-
verifierJobId: input.verifierJobId ?? null,
|
|
1977
|
-
title: input.title,
|
|
1978
|
-
},
|
|
1979
|
-
});
|
|
1980
|
-
const evidence = await this.getTaskEvidence(id);
|
|
1981
|
-
if (!evidence) {
|
|
1982
|
-
throw new Error(`Failed to create task evidence ${id}`);
|
|
1983
|
-
}
|
|
1984
|
-
return evidence;
|
|
1985
|
-
}
|
|
1986
|
-
async getTaskEvidence(evidenceId) {
|
|
1987
|
-
await this.ensureSchema();
|
|
1988
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1989
|
-
FROM orchestrator_task_evidence
|
|
1990
|
-
WHERE id = ${sqlQuote(evidenceId)}
|
|
1991
|
-
LIMIT 1`);
|
|
1992
|
-
return rows[0] ? parseTaskEvidenceRow(rows[0]) : null;
|
|
1993
|
-
}
|
|
1994
|
-
async listTaskEvidenceForThread(threadId) {
|
|
1995
|
-
await this.ensureSchema();
|
|
1996
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
1997
|
-
FROM orchestrator_task_evidence
|
|
1998
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
1999
|
-
ORDER BY created_at ASC`);
|
|
2000
|
-
return rows.map(parseTaskEvidenceRow);
|
|
2001
|
-
}
|
|
2002
|
-
deriveDependentNodeStatus(node, incomingDependencies, nodesById) {
|
|
2003
|
-
if (isTerminalTaskNodeStatus(node.status)) {
|
|
2004
|
-
return node.status;
|
|
2005
|
-
}
|
|
2006
|
-
if (node.status === "running" ||
|
|
2007
|
-
node.status === "blocked" ||
|
|
2008
|
-
node.status === "waiting_on_user" ||
|
|
2009
|
-
node.status === "verifying" ||
|
|
2010
|
-
node.status === "claimed") {
|
|
2011
|
-
return node.status;
|
|
2012
|
-
}
|
|
2013
|
-
const prerequisiteStatuses = incomingDependencies
|
|
2014
|
-
.map((dependency) => nodesById.get(dependency.fromNodeId))
|
|
2015
|
-
.filter((entry) => Boolean(entry))
|
|
2016
|
-
.map((entry) => entry.status);
|
|
2017
|
-
const allSatisfied = incomingDependencies.length === 0 ||
|
|
2018
|
-
incomingDependencies.every((dependency) => {
|
|
2019
|
-
const source = nodesById.get(dependency.fromNodeId);
|
|
2020
|
-
return (source !== undefined &&
|
|
2021
|
-
dependencyStatusSatisfied(source.status, dependency.requiredStatus));
|
|
2022
|
-
});
|
|
2023
|
-
const hasFailedPrerequisite = prerequisiteStatuses.some((status) => status === "failed" ||
|
|
2024
|
-
status === "canceled" ||
|
|
2025
|
-
status === "interrupted");
|
|
2026
|
-
if (node.kind === "goal" && incomingDependencies.length > 0) {
|
|
2027
|
-
if (allSatisfied) {
|
|
2028
|
-
return "completed";
|
|
2029
|
-
}
|
|
2030
|
-
return hasFailedPrerequisite ? "failed" : "planned";
|
|
2031
|
-
}
|
|
2032
|
-
if (node.assignedSessionId) {
|
|
2033
|
-
return node.status;
|
|
2034
|
-
}
|
|
2035
|
-
if (allSatisfied) {
|
|
2036
|
-
return "ready";
|
|
2037
|
-
}
|
|
2038
|
-
return hasFailedPrerequisite ? "blocked" : "planned";
|
|
2039
|
-
}
|
|
2040
|
-
async recomputeTaskGraphState(threadId) {
|
|
2041
|
-
const [nodes, dependencies] = await Promise.all([
|
|
2042
|
-
this.listTaskNodesForThread(threadId),
|
|
2043
|
-
this.listTaskDependenciesForThread(threadId),
|
|
2044
|
-
]);
|
|
2045
|
-
if (nodes.length === 0) {
|
|
2046
|
-
return;
|
|
2047
|
-
}
|
|
2048
|
-
const nodesById = new Map(nodes.map((node) => [node.id, node]));
|
|
2049
|
-
const incomingDependencies = new Map();
|
|
2050
|
-
for (const dependency of dependencies) {
|
|
2051
|
-
const bucket = incomingDependencies.get(dependency.toNodeId) ?? [];
|
|
2052
|
-
bucket.push(dependency);
|
|
2053
|
-
incomingDependencies.set(dependency.toNodeId, bucket);
|
|
2054
|
-
}
|
|
2055
|
-
const nowIso = isoNow();
|
|
2056
|
-
for (const node of nodes) {
|
|
2057
|
-
const nextStatus = this.deriveDependentNodeStatus(node, incomingDependencies.get(node.id) ?? [], nodesById);
|
|
2058
|
-
if (nextStatus === node.status) {
|
|
2059
|
-
continue;
|
|
2060
|
-
}
|
|
2061
|
-
const nextCompletedAt = nextStatus === "completed" || nextStatus === "failed"
|
|
2062
|
-
? (node.completedAt ?? nowIso)
|
|
2063
|
-
: null;
|
|
2064
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_nodes
|
|
2065
|
-
SET status = ${sqlQuote(nextStatus)},
|
|
2066
|
-
updated_at = ${sqlQuote(nowIso)},
|
|
2067
|
-
completed_at = ${sqlText(nextCompletedAt)}
|
|
2068
|
-
WHERE id = ${sqlQuote(node.id)}`);
|
|
2069
|
-
}
|
|
2070
|
-
}
|
|
2071
|
-
async getLastUsedRepo() {
|
|
2072
|
-
await this.ensureSchema();
|
|
2073
|
-
const rows = await executeRawSql(this.runtime, `SELECT repo
|
|
2074
|
-
FROM orchestrator_task_sessions
|
|
2075
|
-
WHERE repo IS NOT NULL AND repo <> ''
|
|
2076
|
-
ORDER BY last_activity_at DESC
|
|
2077
|
-
LIMIT 1`);
|
|
2078
|
-
return rows[0] ? toText(rows[0].repo) : undefined;
|
|
2079
|
-
}
|
|
2080
|
-
async listSessionsForThread(threadId) {
|
|
2081
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
2082
|
-
FROM orchestrator_task_sessions
|
|
2083
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
2084
|
-
ORDER BY registered_at ASC`);
|
|
2085
|
-
return rows.map(parseSessionRow);
|
|
2086
|
-
}
|
|
2087
|
-
async listDecisionsForThread(threadId) {
|
|
2088
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
2089
|
-
FROM orchestrator_task_decisions
|
|
2090
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
2091
|
-
ORDER BY timestamp ASC`);
|
|
2092
|
-
return rows.map(parseDecisionRow);
|
|
2093
|
-
}
|
|
2094
|
-
async listDecisionsForSession(sessionId) {
|
|
2095
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
2096
|
-
FROM orchestrator_task_decisions
|
|
2097
|
-
WHERE session_id = ${sqlQuote(sessionId)}
|
|
2098
|
-
ORDER BY timestamp ASC`);
|
|
2099
|
-
return rows.map(parseDecisionRow);
|
|
2100
|
-
}
|
|
2101
|
-
async listEventsForThread(threadId) {
|
|
2102
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
2103
|
-
FROM orchestrator_task_events
|
|
2104
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
2105
|
-
ORDER BY timestamp ASC`);
|
|
2106
|
-
return rows.map(parseEventRow);
|
|
2107
|
-
}
|
|
2108
|
-
async listArtifactsForThread(threadId) {
|
|
2109
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
2110
|
-
FROM orchestrator_task_artifacts
|
|
2111
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
2112
|
-
ORDER BY created_at ASC`);
|
|
2113
|
-
return rows.map(parseArtifactRow);
|
|
2114
|
-
}
|
|
2115
|
-
async listTranscriptsForThread(threadId) {
|
|
2116
|
-
const rows = await executeRawSql(this.runtime, `SELECT *
|
|
2117
|
-
FROM orchestrator_task_transcripts
|
|
2118
|
-
WHERE thread_id = ${sqlQuote(threadId)}
|
|
2119
|
-
ORDER BY timestamp ASC`);
|
|
2120
|
-
return rows.map(parseTranscriptRow);
|
|
2121
|
-
}
|
|
2122
|
-
async recomputeThreadStatus(threadId) {
|
|
2123
|
-
await this.ensureSchema();
|
|
2124
|
-
const thread = await this.getThreadRecord(threadId);
|
|
2125
|
-
if (!thread)
|
|
2126
|
-
return;
|
|
2127
|
-
if (thread.archivedAt)
|
|
2128
|
-
return;
|
|
2129
|
-
const controlState = toText(thread.metadata.controlState)
|
|
2130
|
-
.trim()
|
|
2131
|
-
.toLowerCase();
|
|
2132
|
-
const sessions = await this.listSessionsForThread(threadId);
|
|
2133
|
-
const nowIso = isoNow();
|
|
2134
|
-
let nextStatus = "open";
|
|
2135
|
-
let closedAt = null;
|
|
2136
|
-
const activeCount = sessions.filter((session) => ["active", "tool_running"].includes(session.status)).length;
|
|
2137
|
-
const waitingOnUserCount = sessions.filter((session) => session.status === "waiting_on_user").length;
|
|
2138
|
-
const blockedCount = sessions.filter((session) => session.status === "blocked").length;
|
|
2139
|
-
const interruptedCount = sessions.filter((session) => ["interrupted", "stopped"].includes(session.status)).length;
|
|
2140
|
-
const errorCount = sessions.filter((session) => session.status === "error").length;
|
|
2141
|
-
const completedCount = sessions.filter((session) => session.status === "completed").length;
|
|
2142
|
-
if (controlState === "paused" && activeCount === 0 && blockedCount === 0) {
|
|
2143
|
-
nextStatus = "waiting_on_user";
|
|
2144
|
-
}
|
|
2145
|
-
else if (controlState === "stopped" &&
|
|
2146
|
-
activeCount === 0 &&
|
|
2147
|
-
blockedCount === 0 &&
|
|
2148
|
-
waitingOnUserCount === 0) {
|
|
2149
|
-
nextStatus = "interrupted";
|
|
2150
|
-
closedAt = nowIso;
|
|
2151
|
-
}
|
|
2152
|
-
else if (sessions.length === 0) {
|
|
2153
|
-
nextStatus = "open";
|
|
2154
|
-
}
|
|
2155
|
-
else if (activeCount > 0) {
|
|
2156
|
-
nextStatus = "active";
|
|
2157
|
-
}
|
|
2158
|
-
else if (waitingOnUserCount > 0) {
|
|
2159
|
-
nextStatus = "waiting_on_user";
|
|
2160
|
-
}
|
|
2161
|
-
else if (blockedCount > 0) {
|
|
2162
|
-
nextStatus = "blocked";
|
|
2163
|
-
}
|
|
2164
|
-
else if (interruptedCount > 0) {
|
|
2165
|
-
nextStatus = "interrupted";
|
|
2166
|
-
closedAt = nowIso;
|
|
2167
|
-
}
|
|
2168
|
-
else if (completedCount === sessions.length) {
|
|
2169
|
-
nextStatus = "done";
|
|
2170
|
-
closedAt = nowIso;
|
|
2171
|
-
}
|
|
2172
|
-
else if (errorCount > 0) {
|
|
2173
|
-
nextStatus = "failed";
|
|
2174
|
-
closedAt = nowIso;
|
|
2175
|
-
}
|
|
2176
|
-
await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
|
|
2177
|
-
SET status = ${sqlQuote(nextStatus)},
|
|
2178
|
-
closed_at = ${sqlText(closedAt)},
|
|
2179
|
-
updated_at = ${sqlQuote(nowIso)}
|
|
2180
|
-
WHERE id = ${sqlQuote(threadId)}`);
|
|
2181
|
-
}
|
|
2182
|
-
}
|