@jungjaehoon/mama-os 0.28.6 → 0.29.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agent-loop.d.ts +0 -4
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +33 -10
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +53 -3
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/code-act/tool-policy.d.ts.map +1 -1
- package/dist/agent/code-act/tool-policy.js +5 -0
- package/dist/agent/code-act/tool-policy.js.map +1 -1
- package/dist/agent/codex-auth.d.ts +0 -1
- package/dist/agent/codex-auth.d.ts.map +1 -1
- package/dist/agent/codex-auth.js +0 -4
- package/dist/agent/codex-auth.js.map +1 -1
- package/dist/agent/codex-home.d.ts +0 -2
- package/dist/agent/codex-home.d.ts.map +1 -1
- package/dist/agent/codex-home.js +0 -66
- package/dist/agent/codex-home.js.map +1 -1
- package/dist/agent/context-compile-service.d.ts +9 -0
- package/dist/agent/context-compile-service.d.ts.map +1 -1
- package/dist/agent/context-compile-service.js +6 -0
- package/dist/agent/context-compile-service.js.map +1 -1
- package/dist/agent/context-prompt-builder.d.ts +0 -6
- package/dist/agent/context-prompt-builder.d.ts.map +1 -1
- package/dist/agent/context-prompt-builder.js +0 -131
- package/dist/agent/context-prompt-builder.js.map +1 -1
- package/dist/agent/contract-extractor.d.ts +0 -4
- package/dist/agent/contract-extractor.d.ts.map +1 -1
- package/dist/agent/contract-extractor.js +0 -68
- package/dist/agent/contract-extractor.js.map +1 -1
- package/dist/agent/gateway-tool-executor.d.ts +20 -15
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +236 -90
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +7 -4
- package/dist/agent/skill-loader.d.ts +0 -7
- package/dist/agent/skill-loader.d.ts.map +1 -1
- package/dist/agent/skill-loader.js +0 -86
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/token-estimator.d.ts +0 -8
- package/dist/agent/token-estimator.d.ts.map +1 -1
- package/dist/agent/token-estimator.js +0 -14
- package/dist/agent/token-estimator.js.map +1 -1
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +23 -5
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +27 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/agent-graph-handler.d.ts +9 -0
- package/dist/api/agent-graph-handler.d.ts.map +1 -1
- package/dist/api/agent-graph-handler.js +27 -1
- package/dist/api/agent-graph-handler.js.map +1 -1
- package/dist/api/entity-audit-handler.d.ts +1 -2
- package/dist/api/entity-audit-handler.d.ts.map +1 -1
- package/dist/api/entity-audit-handler.js +0 -5
- package/dist/api/entity-audit-handler.js.map +1 -1
- package/dist/api/index.d.ts +1 -9
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -17
- package/dist/api/index.js.map +1 -1
- package/dist/api/intelligence-handler.d.ts +0 -5
- package/dist/api/intelligence-handler.d.ts.map +1 -1
- package/dist/api/intelligence-handler.js +0 -15
- package/dist/api/intelligence-handler.js.map +1 -1
- package/dist/api/types.d.ts +1 -5
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js +0 -14
- package/dist/api/types.js.map +1 -1
- package/dist/cli/commands/start.d.ts +117 -3
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +223 -62
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/config-manager.d.ts +0 -5
- package/dist/cli/config/config-manager.d.ts.map +1 -1
- package/dist/cli/config/config-manager.js +0 -29
- package/dist/cli/config/config-manager.js.map +1 -1
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +3 -0
- package/dist/cli/config/types.js.map +1 -1
- package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-routes-init.js +32 -5
- package/dist/cli/runtime/api-routes-init.js.map +1 -1
- package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-server-init.js +2 -0
- package/dist/cli/runtime/api-server-init.js.map +1 -1
- package/dist/cli/runtime/gateway-init.d.ts +1 -1
- package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
- package/dist/cli/runtime/gateway-init.js +11 -38
- package/dist/cli/runtime/gateway-init.js.map +1 -1
- package/dist/cli/runtime/gateway-wiring.d.ts.map +1 -1
- package/dist/cli/runtime/gateway-wiring.js +6 -120
- package/dist/cli/runtime/gateway-wiring.js.map +1 -1
- package/dist/cli/utils/pid-manager.d.ts +0 -10
- package/dist/cli/utils/pid-manager.d.ts.map +1 -1
- package/dist/cli/utils/pid-manager.js +0 -26
- package/dist/cli/utils/pid-manager.js.map +1 -1
- package/dist/connectors/framework/polling-scheduler.d.ts +33 -1
- package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
- package/dist/connectors/framework/polling-scheduler.js +46 -40
- package/dist/connectors/framework/polling-scheduler.js.map +1 -1
- package/dist/connectors/trello/query-tools.d.ts +32 -5
- package/dist/connectors/trello/query-tools.d.ts.map +1 -1
- package/dist/connectors/trello/query-tools.js +56 -17
- package/dist/connectors/trello/query-tools.js.map +1 -1
- package/dist/db/agent-store.d.ts +0 -4
- package/dist/db/agent-store.d.ts.map +1 -1
- package/dist/db/agent-store.js +0 -65
- package/dist/db/agent-store.js.map +1 -1
- package/dist/envelope/enforcer.d.ts.map +1 -1
- package/dist/envelope/enforcer.js +10 -1
- package/dist/envelope/enforcer.js.map +1 -1
- package/dist/envelope/index.d.ts +0 -1
- package/dist/envelope/index.d.ts.map +1 -1
- package/dist/envelope/index.js +0 -1
- package/dist/envelope/index.js.map +1 -1
- package/dist/envelope/signature.d.ts +0 -1
- package/dist/envelope/signature.d.ts.map +1 -1
- package/dist/envelope/signature.js +0 -7
- package/dist/envelope/signature.js.map +1 -1
- package/dist/envelope/tool-connector-scope.d.ts +35 -0
- package/dist/envelope/tool-connector-scope.d.ts.map +1 -0
- package/dist/envelope/tool-connector-scope.js +57 -0
- package/dist/envelope/tool-connector-scope.js.map +1 -0
- package/dist/evidence/effects.d.ts +107 -0
- package/dist/evidence/effects.d.ts.map +1 -0
- package/dist/evidence/effects.js +281 -0
- package/dist/evidence/effects.js.map +1 -0
- package/dist/evidence/read.d.ts +75 -0
- package/dist/evidence/read.d.ts.map +1 -0
- package/dist/evidence/read.js +105 -0
- package/dist/evidence/read.js.map +1 -0
- package/dist/gateways/base-gateway.d.ts +23 -3
- package/dist/gateways/base-gateway.d.ts.map +1 -1
- package/dist/gateways/base-gateway.js +15 -2
- package/dist/gateways/base-gateway.js.map +1 -1
- package/dist/gateways/discord.d.ts +4 -16
- package/dist/gateways/discord.d.ts.map +1 -1
- package/dist/gateways/discord.js +22 -189
- package/dist/gateways/discord.js.map +1 -1
- package/dist/gateways/index.d.ts +2 -1
- package/dist/gateways/index.d.ts.map +1 -1
- package/dist/gateways/message-router.d.ts +13 -20
- package/dist/gateways/message-router.d.ts.map +1 -1
- package/dist/gateways/message-router.js +32 -3
- package/dist/gateways/message-router.js.map +1 -1
- package/dist/gateways/slack.d.ts +2 -12
- package/dist/gateways/slack.d.ts.map +1 -1
- package/dist/gateways/slack.js +6 -220
- package/dist/gateways/slack.js.map +1 -1
- package/dist/gateways/telegram.d.ts +2 -2
- package/dist/gateways/telegram.d.ts.map +1 -1
- package/dist/gateways/telegram.js +3 -2
- package/dist/gateways/telegram.js.map +1 -1
- package/dist/gateways/turn-contract.d.ts +104 -0
- package/dist/gateways/turn-contract.d.ts.map +1 -0
- package/dist/{memory/consult-contract.js → gateways/turn-contract.js} +1 -1
- package/dist/gateways/turn-contract.js.map +1 -0
- package/dist/memory/provenance-live.d.ts +111 -0
- package/dist/memory/provenance-live.d.ts.map +1 -0
- package/dist/memory/provenance-live.js +381 -0
- package/dist/memory/provenance-live.js.map +1 -0
- package/dist/memory/provenance-resolver.d.ts +184 -0
- package/dist/memory/provenance-resolver.d.ts.map +1 -0
- package/dist/memory/provenance-resolver.js +152 -0
- package/dist/memory/provenance-resolver.js.map +1 -0
- package/dist/multi-agent/agent-event-bus.d.ts +1 -0
- package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
- package/dist/multi-agent/bmad-templates.d.ts +0 -18
- package/dist/multi-agent/bmad-templates.d.ts.map +1 -1
- package/dist/multi-agent/bmad-templates.js +0 -127
- package/dist/multi-agent/bmad-templates.js.map +1 -1
- package/dist/multi-agent/dashboard-agent-persona.js +3 -3
- package/dist/operator/board-reconcile.d.ts +2 -3
- package/dist/operator/board-reconcile.d.ts.map +1 -1
- package/dist/operator/board-reconcile.js +18 -32
- package/dist/operator/board-reconcile.js.map +1 -1
- package/dist/operator/changes-projection.d.ts +70 -0
- package/dist/operator/changes-projection.d.ts.map +1 -0
- package/dist/operator/changes-projection.js +109 -0
- package/dist/operator/changes-projection.js.map +1 -0
- package/dist/operator/external-correlation.d.ts +94 -0
- package/dist/operator/external-correlation.d.ts.map +1 -0
- package/dist/operator/external-correlation.js +177 -0
- package/dist/operator/external-correlation.js.map +1 -0
- package/dist/operator/operator-trigger-loop.d.ts +9 -1
- package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
- package/dist/operator/operator-trigger-loop.js +8 -4
- package/dist/operator/operator-trigger-loop.js.map +1 -1
- package/dist/operator/provenance-lookup.d.ts +18 -0
- package/dist/operator/provenance-lookup.d.ts.map +1 -0
- package/dist/operator/provenance-lookup.js +54 -0
- package/dist/operator/provenance-lookup.js.map +1 -0
- package/dist/operator/report-carry.d.ts +18 -1
- package/dist/operator/report-carry.d.ts.map +1 -1
- package/dist/operator/report-carry.js +22 -3
- package/dist/operator/report-carry.js.map +1 -1
- package/dist/operator/report-run.d.ts +31 -0
- package/dist/operator/report-run.d.ts.map +1 -1
- package/dist/operator/report-run.js +140 -22
- package/dist/operator/report-run.js.map +1 -1
- package/dist/operator/task-ledger.d.ts +84 -2
- package/dist/operator/task-ledger.d.ts.map +1 -1
- package/dist/operator/task-ledger.js +274 -31
- package/dist/operator/task-ledger.js.map +1 -1
- package/dist/operator/trigger-author.d.ts +7 -0
- package/dist/operator/trigger-author.d.ts.map +1 -1
- package/dist/operator/trigger-author.js +78 -7
- package/dist/operator/trigger-author.js.map +1 -1
- package/dist/operator/worker-run.js +1 -1
- package/dist/operator/worker-run.js.map +1 -1
- package/dist/operator/workorder-hooks.d.ts +79 -4
- package/dist/operator/workorder-hooks.d.ts.map +1 -1
- package/dist/operator/workorder-hooks.js +152 -20
- package/dist/operator/workorder-hooks.js.map +1 -1
- package/dist/operator/workorder-publishers.d.ts +2 -0
- package/dist/operator/workorder-publishers.d.ts.map +1 -1
- package/dist/operator/workorder-publishers.js +8 -1
- package/dist/operator/workorder-publishers.js.map +1 -1
- package/dist/utils/untrusted-content.d.ts +11 -0
- package/dist/utils/untrusted-content.d.ts.map +1 -1
- package/dist/utils/untrusted-content.js +20 -0
- package/dist/utils/untrusted-content.js.map +1 -1
- package/package.json +4 -3
- package/scripts/backfill-channel-keys.ts +451 -0
- package/dist/agent/auto-recall.d.ts +0 -48
- package/dist/agent/auto-recall.d.ts.map +0 -1
- package/dist/agent/auto-recall.js +0 -192
- package/dist/agent/auto-recall.js.map +0 -1
- package/dist/agent/claude-client.d.ts +0 -50
- package/dist/agent/claude-client.d.ts.map +0 -1
- package/dist/agent/claude-client.js +0 -219
- package/dist/agent/claude-client.js.map +0 -1
- package/dist/agent/delegation-executor.d.ts +0 -49
- package/dist/agent/delegation-executor.d.ts.map +0 -1
- package/dist/agent/delegation-executor.js +0 -692
- package/dist/agent/delegation-executor.js.map +0 -1
- package/dist/agent/mcp-executor.d.ts +0 -60
- package/dist/agent/mcp-executor.d.ts.map +0 -1
- package/dist/agent/mcp-executor.js +0 -190
- package/dist/agent/mcp-executor.js.map +0 -1
- package/dist/agent/process-tree.d.ts +0 -6
- package/dist/agent/process-tree.d.ts.map +0 -1
- package/dist/agent/process-tree.js +0 -21
- package/dist/agent/process-tree.js.map +0 -1
- package/dist/agent/streaming-callback-manager.d.ts +0 -85
- package/dist/agent/streaming-callback-manager.d.ts.map +0 -1
- package/dist/agent/streaming-callback-manager.js +0 -103
- package/dist/agent/streaming-callback-manager.js.map +0 -1
- package/dist/agent/token-budget.d.ts +0 -49
- package/dist/agent/token-budget.d.ts.map +0 -1
- package/dist/agent/token-budget.js +0 -92
- package/dist/agent/token-budget.js.map +0 -1
- package/dist/connectors/kagemusha/history-compiler.d.ts +0 -18
- package/dist/connectors/kagemusha/history-compiler.d.ts.map +0 -1
- package/dist/connectors/kagemusha/history-compiler.js +0 -35
- package/dist/connectors/kagemusha/history-compiler.js.map +0 -1
- package/dist/db/migrations/wiki-artifacts.d.ts +0 -3
- package/dist/db/migrations/wiki-artifacts.d.ts.map +0 -1
- package/dist/db/migrations/wiki-artifacts.js +0 -24
- package/dist/db/migrations/wiki-artifacts.js.map +0 -1
- package/dist/envelope/subset.d.ts +0 -9
- package/dist/envelope/subset.d.ts.map +0 -1
- package/dist/envelope/subset.js +0 -67
- package/dist/envelope/subset.js.map +0 -1
- package/dist/memory/consult-contract.d.ts +0 -8
- package/dist/memory/consult-contract.d.ts.map +0 -1
- package/dist/memory/consult-contract.js.map +0 -1
- package/dist/multi-agent/agent-message-queue.d.ts +0 -104
- package/dist/multi-agent/agent-message-queue.d.ts.map +0 -1
- package/dist/multi-agent/agent-message-queue.js +0 -227
- package/dist/multi-agent/agent-message-queue.js.map +0 -1
- package/dist/multi-agent/background-task-manager.d.ts +0 -248
- package/dist/multi-agent/background-task-manager.d.ts.map +0 -1
- package/dist/multi-agent/background-task-manager.js +0 -415
- package/dist/multi-agent/background-task-manager.js.map +0 -1
- package/dist/multi-agent/category-router.d.ts +0 -56
- package/dist/multi-agent/category-router.d.ts.map +0 -1
- package/dist/multi-agent/category-router.js +0 -99
- package/dist/multi-agent/category-router.js.map +0 -1
- package/dist/multi-agent/council-engine.d.ts +0 -60
- package/dist/multi-agent/council-engine.d.ts.map +0 -1
- package/dist/multi-agent/council-engine.js +0 -284
- package/dist/multi-agent/council-engine.js.map +0 -1
- package/dist/multi-agent/delegation-format-validator.d.ts +0 -22
- package/dist/multi-agent/delegation-format-validator.d.ts.map +0 -1
- package/dist/multi-agent/delegation-format-validator.js +0 -31
- package/dist/multi-agent/delegation-format-validator.js.map +0 -1
- package/dist/multi-agent/delegation-manager.d.ts +0 -128
- package/dist/multi-agent/delegation-manager.d.ts.map +0 -1
- package/dist/multi-agent/delegation-manager.js +0 -276
- package/dist/multi-agent/delegation-manager.js.map +0 -1
- package/dist/multi-agent/i18n-messages.d.ts +0 -35
- package/dist/multi-agent/i18n-messages.d.ts.map +0 -1
- package/dist/multi-agent/i18n-messages.js +0 -54
- package/dist/multi-agent/i18n-messages.js.map +0 -1
- package/dist/multi-agent/index.d.ts +0 -31
- package/dist/multi-agent/index.d.ts.map +0 -1
- package/dist/multi-agent/index.js +0 -46
- package/dist/multi-agent/index.js.map +0 -1
- package/dist/multi-agent/multi-agent-base.d.ts +0 -223
- package/dist/multi-agent/multi-agent-base.d.ts.map +0 -1
- package/dist/multi-agent/multi-agent-base.js +0 -592
- package/dist/multi-agent/multi-agent-base.js.map +0 -1
- package/dist/multi-agent/multi-agent-discord.d.ts +0 -142
- package/dist/multi-agent/multi-agent-discord.d.ts.map +0 -1
- package/dist/multi-agent/multi-agent-discord.js +0 -1235
- package/dist/multi-agent/multi-agent-discord.js.map +0 -1
- package/dist/multi-agent/multi-agent-slack.d.ts +0 -146
- package/dist/multi-agent/multi-agent-slack.d.ts.map +0 -1
- package/dist/multi-agent/multi-agent-slack.js +0 -953
- package/dist/multi-agent/multi-agent-slack.js.map +0 -1
- package/dist/multi-agent/multi-bot-manager.d.ts +0 -119
- package/dist/multi-agent/multi-bot-manager.d.ts.map +0 -1
- package/dist/multi-agent/multi-bot-manager.js +0 -449
- package/dist/multi-agent/multi-bot-manager.js.map +0 -1
- package/dist/multi-agent/orchestrator.d.ts +0 -110
- package/dist/multi-agent/orchestrator.d.ts.map +0 -1
- package/dist/multi-agent/orchestrator.js +0 -436
- package/dist/multi-agent/orchestrator.js.map +0 -1
- package/dist/multi-agent/rate-limiter.d.ts +0 -76
- package/dist/multi-agent/rate-limiter.d.ts.map +0 -1
- package/dist/multi-agent/rate-limiter.js +0 -128
- package/dist/multi-agent/rate-limiter.js.map +0 -1
- package/dist/multi-agent/shared-context.d.ts +0 -127
- package/dist/multi-agent/shared-context.d.ts.map +0 -1
- package/dist/multi-agent/shared-context.js +0 -239
- package/dist/multi-agent/shared-context.js.map +0 -1
- package/dist/multi-agent/slack-config-validator.d.ts +0 -42
- package/dist/multi-agent/slack-config-validator.d.ts.map +0 -1
- package/dist/multi-agent/slack-config-validator.js +0 -194
- package/dist/multi-agent/slack-config-validator.js.map +0 -1
- package/dist/multi-agent/slack-multi-bot-manager.d.ts +0 -143
- package/dist/multi-agent/slack-multi-bot-manager.d.ts.map +0 -1
- package/dist/multi-agent/slack-multi-bot-manager.js +0 -413
- package/dist/multi-agent/slack-multi-bot-manager.js.map +0 -1
- package/dist/multi-agent/swarm/swarm-anti-pattern-detector.d.ts +0 -98
- package/dist/multi-agent/swarm/swarm-anti-pattern-detector.d.ts.map +0 -1
- package/dist/multi-agent/swarm/swarm-anti-pattern-detector.js +0 -225
- package/dist/multi-agent/swarm/swarm-anti-pattern-detector.js.map +0 -1
- package/dist/multi-agent/swarm/swarm-db.d.ts +0 -175
- package/dist/multi-agent/swarm/swarm-db.d.ts.map +0 -1
- package/dist/multi-agent/swarm/swarm-db.js +0 -313
- package/dist/multi-agent/swarm/swarm-db.js.map +0 -1
- package/dist/multi-agent/swarm/swarm-event-reporter.d.ts +0 -116
- package/dist/multi-agent/swarm/swarm-event-reporter.d.ts.map +0 -1
- package/dist/multi-agent/swarm/swarm-event-reporter.js +0 -243
- package/dist/multi-agent/swarm/swarm-event-reporter.js.map +0 -1
- package/dist/multi-agent/swarm/swarm-mama-adapter.d.ts +0 -57
- package/dist/multi-agent/swarm/swarm-mama-adapter.d.ts.map +0 -1
- package/dist/multi-agent/swarm/swarm-mama-adapter.js +0 -87
- package/dist/multi-agent/swarm/swarm-mama-adapter.js.map +0 -1
- package/dist/multi-agent/swarm/swarm-manager.d.ts +0 -122
- package/dist/multi-agent/swarm/swarm-manager.d.ts.map +0 -1
- package/dist/multi-agent/swarm/swarm-manager.js +0 -199
- package/dist/multi-agent/swarm/swarm-manager.js.map +0 -1
- package/dist/multi-agent/swarm/swarm-task-learner.d.ts +0 -104
- package/dist/multi-agent/swarm/swarm-task-learner.d.ts.map +0 -1
- package/dist/multi-agent/swarm/swarm-task-learner.js +0 -211
- package/dist/multi-agent/swarm/swarm-task-learner.js.map +0 -1
- package/dist/multi-agent/swarm/swarm-task-runner.d.ts +0 -155
- package/dist/multi-agent/swarm/swarm-task-runner.d.ts.map +0 -1
- package/dist/multi-agent/swarm/swarm-task-runner.js +0 -615
- package/dist/multi-agent/swarm/swarm-task-runner.js.map +0 -1
- package/dist/multi-agent/swarm/wave-engine.d.ts +0 -96
- package/dist/multi-agent/swarm/wave-engine.d.ts.map +0 -1
- package/dist/multi-agent/swarm/wave-engine.js +0 -123
- package/dist/multi-agent/swarm/wave-engine.js.map +0 -1
- package/dist/multi-agent/system-reminder.d.ts +0 -206
- package/dist/multi-agent/system-reminder.d.ts.map +0 -1
- package/dist/multi-agent/system-reminder.js +0 -455
- package/dist/multi-agent/system-reminder.js.map +0 -1
- package/dist/multi-agent/task-continuation.d.ts +0 -74
- package/dist/multi-agent/task-continuation.d.ts.map +0 -1
- package/dist/multi-agent/task-continuation.js +0 -172
- package/dist/multi-agent/task-continuation.js.map +0 -1
- package/dist/multi-agent/ultrawork-state.d.ts +0 -57
- package/dist/multi-agent/ultrawork-state.d.ts.map +0 -1
- package/dist/multi-agent/ultrawork-state.js +0 -191
- package/dist/multi-agent/ultrawork-state.js.map +0 -1
- package/dist/multi-agent/ultrawork.d.ts +0 -152
- package/dist/multi-agent/ultrawork.d.ts.map +0 -1
- package/dist/multi-agent/ultrawork.js +0 -879
- package/dist/multi-agent/ultrawork.js.map +0 -1
- package/dist/multi-agent/work-tracker.d.ts +0 -22
- package/dist/multi-agent/work-tracker.d.ts.map +0 -1
- package/dist/multi-agent/work-tracker.js +0 -45
- package/dist/multi-agent/work-tracker.js.map +0 -1
- package/dist/multi-agent/workflow-engine.d.ts +0 -87
- package/dist/multi-agent/workflow-engine.d.ts.map +0 -1
- package/dist/multi-agent/workflow-engine.js +0 -604
- package/dist/multi-agent/workflow-engine.js.map +0 -1
- package/dist/onboarding/all-tools.d.ts +0 -18
- package/dist/onboarding/all-tools.d.ts.map +0 -1
- package/dist/onboarding/all-tools.js +0 -149
- package/dist/onboarding/all-tools.js.map +0 -1
- package/dist/onboarding/autonomous-discovery-tools.d.ts +0 -23
- package/dist/onboarding/autonomous-discovery-tools.d.ts.map +0 -1
- package/dist/onboarding/autonomous-discovery-tools.js +0 -268
- package/dist/onboarding/autonomous-discovery-tools.js.map +0 -1
- package/dist/onboarding/onboarding-state.d.ts +0 -70
- package/dist/onboarding/onboarding-state.d.ts.map +0 -1
- package/dist/onboarding/onboarding-state.js +0 -183
- package/dist/onboarding/onboarding-state.js.map +0 -1
- package/dist/onboarding/personality-quiz.d.ts +0 -35
- package/dist/onboarding/personality-quiz.d.ts.map +0 -1
- package/dist/onboarding/personality-quiz.js +0 -219
- package/dist/onboarding/personality-quiz.js.map +0 -1
- package/dist/onboarding/phase-5-summary.d.ts +0 -26
- package/dist/onboarding/phase-5-summary.d.ts.map +0 -1
- package/dist/onboarding/phase-5-summary.js +0 -153
- package/dist/onboarding/phase-5-summary.js.map +0 -1
- package/dist/onboarding/phase-6-security.d.ts +0 -33
- package/dist/onboarding/phase-6-security.d.ts.map +0 -1
- package/dist/onboarding/phase-6-security.js +0 -473
- package/dist/onboarding/phase-6-security.js.map +0 -1
- package/dist/onboarding/phase-7-integrations.d.ts +0 -91
- package/dist/onboarding/phase-7-integrations.d.ts.map +0 -1
- package/dist/onboarding/phase-7-integrations.js +0 -725
- package/dist/onboarding/phase-7-integrations.js.map +0 -1
- package/dist/onboarding/phase-8-demo.d.ts +0 -43
- package/dist/onboarding/phase-8-demo.d.ts.map +0 -1
- package/dist/onboarding/phase-8-demo.js +0 -346
- package/dist/onboarding/phase-8-demo.js.map +0 -1
- package/dist/onboarding/phase-9-finalization.d.ts +0 -27
- package/dist/onboarding/phase-9-finalization.d.ts.map +0 -1
- package/dist/onboarding/phase-9-finalization.js +0 -417
- package/dist/onboarding/phase-9-finalization.js.map +0 -1
- package/dist/onboarding/ritual-prompt.d.ts +0 -2
- package/dist/onboarding/ritual-prompt.d.ts.map +0 -1
- package/dist/onboarding/ritual-prompt.js +0 -285
- package/dist/onboarding/ritual-prompt.js.map +0 -1
- package/dist/onboarding/ritual-tools.d.ts +0 -17
- package/dist/onboarding/ritual-tools.d.ts.map +0 -1
- package/dist/onboarding/ritual-tools.js +0 -93
- package/dist/onboarding/ritual-tools.js.map +0 -1
- package/dist/setup/setup-tools.d.ts +0 -13
- package/dist/setup/setup-tools.d.ts.map +0 -1
- package/dist/setup/setup-tools.js +0 -106
- package/dist/setup/setup-tools.js.map +0 -1
- package/dist/utils/slack-input-validator.d.ts +0 -74
- package/dist/utils/slack-input-validator.d.ts.map +0 -1
- package/dist/utils/slack-input-validator.js +0 -275
- package/dist/utils/slack-input-validator.js.map +0 -1
- package/dist/utils/slack-rate-limiter.d.ts +0 -139
- package/dist/utils/slack-rate-limiter.d.ts.map +0 -1
- package/dist/utils/slack-rate-limiter.js +0 -324
- package/dist/utils/slack-rate-limiter.js.map +0 -1
- package/dist/wiki/wiki-compiler.d.ts +0 -13
- package/dist/wiki/wiki-compiler.d.ts.map +0 -1
- package/dist/wiki/wiki-compiler.js +0 -82
- package/dist/wiki/wiki-compiler.js.map +0 -1
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* The db handle is SHARED with TriggerRegistry and owned by the caller
|
|
19
19
|
* (start.ts opens and closes it once) - deliberately no close() here.
|
|
20
20
|
*/
|
|
21
|
+
import { type ChangeCoverage, type EffectQuery, type EffectRecord, type EffectTarget } from '../evidence/effects.js';
|
|
21
22
|
import type { SQLiteDatabase } from '../sqlite.js';
|
|
22
23
|
import type { OperatorTask, TaskSource } from './operator-interfaces.js';
|
|
23
24
|
import { type TemporalEffectReceipt, type TemporalEvidenceAttestation, type TemporalReconcileInput, type TemporalWorkContext } from './temporal-effect.js';
|
|
@@ -91,6 +92,27 @@ export interface TaskLedgerOptions {
|
|
|
91
92
|
now?: () => number;
|
|
92
93
|
timeZone?: string;
|
|
93
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Who is making a change, supplied by the host rather than by the caller's arguments.
|
|
97
|
+
*
|
|
98
|
+
* Kept out of CreateTaskInput/UpdateTaskInput on purpose: those are agent-authored, and an
|
|
99
|
+
* agent that can write its own run id into the effect ledger can attribute its work to
|
|
100
|
+
* someone else's run. Same reason the temporal path takes its identity from trusted runtime
|
|
101
|
+
* context instead of from the tool call.
|
|
102
|
+
*/
|
|
103
|
+
export interface ChangeOrigin {
|
|
104
|
+
/** The model run behind this write, or null when the host itself made it. */
|
|
105
|
+
runId?: string | null;
|
|
106
|
+
/**
|
|
107
|
+
* The events this write responds to.
|
|
108
|
+
*
|
|
109
|
+
* A SET, because a cause is one: a reconcile run is handed a channel's delta batch and
|
|
110
|
+
* everything it changes rests on that batch. The system knows the batch before the run
|
|
111
|
+
* starts, so it does not have to ask the agent to restate it - which is what a single
|
|
112
|
+
* agent-supplied id was, and why 375 of 381 unattributed changes were updates.
|
|
113
|
+
*/
|
|
114
|
+
causeEventIds?: readonly string[];
|
|
115
|
+
}
|
|
94
116
|
export type TemporalGenerationDisposition = 'active' | 'resolved' | 'final_no_update' | 'deferred' | 'exhausted' | 'superseded';
|
|
95
117
|
export interface TemporalGenerationRecord {
|
|
96
118
|
generationKey: string;
|
|
@@ -166,6 +188,26 @@ export interface ListTasksFilter {
|
|
|
166
188
|
/** 'deadline_priority' = deadline asc NULLS LAST, then high>normal>low, then id. */
|
|
167
189
|
order?: 'deadline_priority' | 'updated';
|
|
168
190
|
}
|
|
191
|
+
export interface ListTasksPageFilter extends ListTasksFilter {
|
|
192
|
+
/** Opaque keyset cursor from a previous page's nextCursor. */
|
|
193
|
+
cursor?: string;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* One page plus the numbers a caller needs to PROVE it read everything.
|
|
197
|
+
*
|
|
198
|
+
* `list()` alone cannot support a whole-situation claim: it clamps to 200 and
|
|
199
|
+
* defaults to 50, so a caller reading a 150-row board saw a third of it and could
|
|
200
|
+
* not tell. Accumulating pages until nextCursor is null, with the unique ids
|
|
201
|
+
* collected equal to total, is that proof.
|
|
202
|
+
*/
|
|
203
|
+
export interface ListTasksPage {
|
|
204
|
+
tasks: TaskRecord[];
|
|
205
|
+
/** Rows matching the filter, ignoring limit and cursor. */
|
|
206
|
+
total: number;
|
|
207
|
+
returned: number;
|
|
208
|
+
/** Cursor for the next page, or null when this page ends the set. */
|
|
209
|
+
nextCursor: string | null;
|
|
210
|
+
}
|
|
169
211
|
export declare class TaskLedger implements TaskSource {
|
|
170
212
|
private db;
|
|
171
213
|
private now;
|
|
@@ -187,6 +229,22 @@ export declare class TaskLedger implements TaskSource {
|
|
|
187
229
|
getTasks(): OperatorTask[];
|
|
188
230
|
countOpenUnconfirmed(): number;
|
|
189
231
|
list(filter?: ListTasksFilter): TaskRecord[];
|
|
232
|
+
/** Shared filter predicate. Owner surface only - system workorder rows never appear in
|
|
233
|
+
* board/REST/gateway listings (Stage-2 kind filter; workorders have dedicated readers). */
|
|
234
|
+
private buildListPredicate;
|
|
235
|
+
/** ORDER BY for both list() and listPage(); the trailing id makes it a TOTAL order,
|
|
236
|
+
* which is what lets a keyset cursor resume without skipping or repeating a row.
|
|
237
|
+
* LIMIT applies AFTER ordering, so a bounded read still returns the true top-N. */
|
|
238
|
+
private static orderSql;
|
|
239
|
+
private static cursorFor;
|
|
240
|
+
/**
|
|
241
|
+
* One page of the same ordered set, with the totals that make completeness provable.
|
|
242
|
+
*
|
|
243
|
+
* Keyset, not OFFSET: an offset page silently skips or repeats rows when the set
|
|
244
|
+
* changes between pages, which would leave a "whole situation" claim resting on a
|
|
245
|
+
* read that quietly lost items.
|
|
246
|
+
*/
|
|
247
|
+
listPage(filter?: ListTasksPageFilter): ListTasksPage;
|
|
190
248
|
/** Internal bounded page for temporal reconciliation; excludes rows that can never be candidates. */
|
|
191
249
|
listTemporalScanPage(input: {
|
|
192
250
|
limit: number;
|
|
@@ -201,8 +259,22 @@ export declare class TaskLedger implements TaskSource {
|
|
|
201
259
|
* (source_channel, source_event_id) UPSERTS - the existing row gets the new
|
|
202
260
|
* latest_event (and title stays) instead of a near-duplicate row appearing.
|
|
203
261
|
*/
|
|
204
|
-
create(input: CreateTaskInput): TaskRecord;
|
|
205
|
-
|
|
262
|
+
create(input: CreateTaskInput, origin?: ChangeOrigin): TaskRecord;
|
|
263
|
+
/**
|
|
264
|
+
* Write the effect row for a task change.
|
|
265
|
+
*
|
|
266
|
+
* Called from inside the same transaction as the write it describes. The cause is the
|
|
267
|
+
* event the caller already recorded on the row - the tool has always accepted it, and
|
|
268
|
+
* 178 of the 179 owner tasks that carry one resolve to a real indexed event, so this is
|
|
269
|
+
* attribution that already exists rather than a new burden on the agent.
|
|
270
|
+
*
|
|
271
|
+
* When there is no cause the change is still recorded, marked unattributed. That is the
|
|
272
|
+
* honest reading of `task_update`, which has never had a cause field at all: the system
|
|
273
|
+
* has been changing owner work items without recording why, and the ledger's job is to
|
|
274
|
+
* show how often, not to pretend otherwise or to start refusing writes.
|
|
275
|
+
*/
|
|
276
|
+
private recordTaskChange;
|
|
277
|
+
update(id: number, patch: UpdateTaskInput, origin?: ChangeOrigin): TaskRecord;
|
|
206
278
|
private supersedeTemporalGenerationsInTransaction;
|
|
207
279
|
private supersedeAllActiveTemporalGenerationsInTransaction;
|
|
208
280
|
/**
|
|
@@ -222,6 +294,16 @@ export declare class TaskLedger implements TaskSource {
|
|
|
222
294
|
getTemporalGeneration(generationKey: string): TemporalGenerationRecord | null;
|
|
223
295
|
loadTemporalWorkContext(attemptId: number): TemporalWorkContext;
|
|
224
296
|
assertTemporalWorkContextActive(suppliedContext: TemporalWorkContext): TemporalWorkContext;
|
|
297
|
+
/**
|
|
298
|
+
* What this system changed, and what it changed it for.
|
|
299
|
+
*
|
|
300
|
+
* Reads live beside the writes because the effect ledger shares the tasks database on
|
|
301
|
+
* purpose. Exposed here rather than by handing out the connection: the ledger owns both
|
|
302
|
+
* halves, so a change and its account of itself cannot drift apart.
|
|
303
|
+
*/
|
|
304
|
+
listChanges(query?: EffectQuery): EffectRecord[];
|
|
305
|
+
/** Of what this system changed, how much rests on evidence. */
|
|
306
|
+
changeCoverage(sinceMs?: number, targetType?: EffectTarget): ChangeCoverage;
|
|
225
307
|
getTemporalEffect(attemptId: number): TemporalEffectReceipt | null;
|
|
226
308
|
/**
|
|
227
309
|
* Read and validate the durable state that decides a temporal attempt's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-ledger.d.ts","sourceRoot":"","sources":["../../src/operator/task-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,aAAa,yFAUhB,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe,oCAAqC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,UAAU,8BAA+B,CAAC;AACvD,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,eAAO,MAAM,eAAe,2DAA4D,CAAC;AACzF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,eAAe,CAAC;AAMrD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,aAAa,CAAC;IACxB,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,8BAA8B;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+FAA+F;AAC/F,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,wFAAwF;IACxF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,6BAA6B,GACrC,QAAQ,GACR,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,WAAW,GACX,YAAY,CAAC;AAEjB,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,6BAA6B,CAAC;IAC3C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,WAAW,+BAA+B;IAC9C,UAAU,EAAE,wBAAwB,CAAC;IACrC,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,eAAe,CAAC;IAC3B,UAAU,EAAE,wBAAwB,CAAC;IACrC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,WAAW,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/F;IACE,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACD;IAAE,WAAW,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,KAAK,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;CACzC;
|
|
1
|
+
{"version":3,"file":"task-ledger.d.ts","sourceRoot":"","sources":["../../src/operator/task-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
23
23
|
exports.TaskLedger = exports.WORKORDER_CHANNEL_PREFIX = exports.TEMPORAL_WORKORDER_MAX_ATTEMPTS = exports.WORKORDER_KINDS = exports.TASK_KINDS = exports.TASK_PRIORITIES = exports.TASK_STATUSES = void 0;
|
|
24
24
|
const node_crypto_1 = require("node:crypto");
|
|
25
25
|
const operator_task_temporal_js_1 = require("../db/migrations/operator-task-temporal.js");
|
|
26
|
+
const effects_js_1 = require("../evidence/effects.js");
|
|
26
27
|
const temporal_effect_js_1 = require("./temporal-effect.js");
|
|
27
28
|
const task_temporal_js_1 = require("./task-temporal.js");
|
|
28
29
|
exports.TASK_STATUSES = [
|
|
@@ -44,6 +45,31 @@ exports.TEMPORAL_WORKORDER_MAX_ATTEMPTS = 3;
|
|
|
44
45
|
exports.WORKORDER_CHANNEL_PREFIX = 'workorder:';
|
|
45
46
|
const KNOWN_WORKORDER_CHANNELS = exports.WORKORDER_KINDS.map((workKind) => `${exports.WORKORDER_CHANNEL_PREFIX}${workKind}`);
|
|
46
47
|
const KNOWN_WORKORDER_CHANNELS_SQL = KNOWN_WORKORDER_CHANNELS.map(() => '?').join(',');
|
|
48
|
+
const PRIORITY_RANK = { high: 0, normal: 1, low: 2 };
|
|
49
|
+
function encodeListCursor(payload) {
|
|
50
|
+
return Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url');
|
|
51
|
+
}
|
|
52
|
+
/** Loud on anything malformed or from a different ordering: a cursor silently
|
|
53
|
+
* reinterpreted under another order would skip or repeat rows, which is exactly
|
|
54
|
+
* the incompleteness this page contract exists to rule out. */
|
|
55
|
+
function decodeListCursor(cursor, order) {
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new Error('[task-ledger] malformed list cursor');
|
|
62
|
+
}
|
|
63
|
+
const payload = parsed;
|
|
64
|
+
if (!payload || payload.order !== order || !Array.isArray(payload.k)) {
|
|
65
|
+
throw new Error(`[task-ledger] list cursor does not belong to order '${order}'`);
|
|
66
|
+
}
|
|
67
|
+
const expected = order === 'deadline_priority' ? 4 : 2;
|
|
68
|
+
if (payload.k.length !== expected || payload.k.some((value) => value === null)) {
|
|
69
|
+
throw new Error('[task-ledger] malformed list cursor');
|
|
70
|
+
}
|
|
71
|
+
return payload;
|
|
72
|
+
}
|
|
47
73
|
const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
48
74
|
function isoToEpochMs(iso) {
|
|
49
75
|
if (!iso)
|
|
@@ -134,6 +160,9 @@ class TaskLedger {
|
|
|
134
160
|
CREATE INDEX IF NOT EXISTS idx_operator_no_update_scope
|
|
135
161
|
ON operator_no_update_notes(scope, id);
|
|
136
162
|
`);
|
|
163
|
+
// Same database as the tasks, so a change and its cause commit or roll back together.
|
|
164
|
+
// A ledger that can disagree with the rows it describes is worse than no ledger.
|
|
165
|
+
(0, effects_js_1.ensureEffectLedger)(this.db);
|
|
137
166
|
this.upgradeSchema();
|
|
138
167
|
const foreignKeyViolations = this.db.pragma('foreign_key_check');
|
|
139
168
|
if (foreignKeyViolations.length > 0) {
|
|
@@ -260,8 +289,20 @@ class TaskLedger {
|
|
|
260
289
|
return row.count;
|
|
261
290
|
}
|
|
262
291
|
list(filter = {}) {
|
|
263
|
-
|
|
264
|
-
|
|
292
|
+
const { where, params } = this.buildListPredicate(filter);
|
|
293
|
+
const rawLimit = Number(filter.limit);
|
|
294
|
+
const limit = Number.isFinite(rawLimit) ? Math.max(1, Math.min(200, Math.floor(rawLimit))) : 50;
|
|
295
|
+
const rows = this.db
|
|
296
|
+
.prepare(`SELECT * FROM operator_tasks
|
|
297
|
+
${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
|
|
298
|
+
ORDER BY ${TaskLedger.orderSql(filter.order)}
|
|
299
|
+
LIMIT ?`)
|
|
300
|
+
.all(...params, limit);
|
|
301
|
+
return rows.map((row) => this.toRecord(row));
|
|
302
|
+
}
|
|
303
|
+
/** Shared filter predicate. Owner surface only - system workorder rows never appear in
|
|
304
|
+
* board/REST/gateway listings (Stage-2 kind filter; workorders have dedicated readers). */
|
|
305
|
+
buildListPredicate(filter) {
|
|
265
306
|
const where = [`kind = 'owner'`];
|
|
266
307
|
const params = [];
|
|
267
308
|
if (filter.status) {
|
|
@@ -277,21 +318,77 @@ class TaskLedger {
|
|
|
277
318
|
const like = `%${filter.search}%`;
|
|
278
319
|
params.push(like, like, like);
|
|
279
320
|
}
|
|
280
|
-
|
|
321
|
+
return { where, params };
|
|
322
|
+
}
|
|
323
|
+
/** ORDER BY for both list() and listPage(); the trailing id makes it a TOTAL order,
|
|
324
|
+
* which is what lets a keyset cursor resume without skipping or repeating a row.
|
|
325
|
+
* LIMIT applies AFTER ordering, so a bounded read still returns the true top-N. */
|
|
326
|
+
static orderSql(order) {
|
|
327
|
+
return order === 'updated'
|
|
281
328
|
? 'updated_at DESC, id DESC'
|
|
282
329
|
: // deadline asc NULLS LAST, then priority high>normal>low, then id.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
330
|
+
`CASE WHEN deadline IS NULL THEN 1 ELSE 0 END ASC, COALESCE(deadline, '') ASC,
|
|
331
|
+
CASE priority WHEN 'high' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END ASC, id ASC`;
|
|
332
|
+
}
|
|
333
|
+
static cursorFor(record, order) {
|
|
334
|
+
if (order === 'updated') {
|
|
335
|
+
return { order, k: [record.updatedAt, record.id] };
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
order,
|
|
339
|
+
k: [
|
|
340
|
+
record.deadlineIso === null ? 1 : 0,
|
|
341
|
+
record.deadlineIso ?? '',
|
|
342
|
+
PRIORITY_RANK[record.priority] ?? 2,
|
|
343
|
+
record.id,
|
|
344
|
+
],
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* One page of the same ordered set, with the totals that make completeness provable.
|
|
349
|
+
*
|
|
350
|
+
* Keyset, not OFFSET: an offset page silently skips or repeats rows when the set
|
|
351
|
+
* changes between pages, which would leave a "whole situation" claim resting on a
|
|
352
|
+
* read that quietly lost items.
|
|
353
|
+
*/
|
|
354
|
+
listPage(filter = {}) {
|
|
355
|
+
const order = filter.order === 'updated' ? 'updated' : 'deadline_priority';
|
|
356
|
+
const { where, params } = this.buildListPredicate(filter);
|
|
286
357
|
const rawLimit = Number(filter.limit);
|
|
287
358
|
const limit = Number.isFinite(rawLimit) ? Math.max(1, Math.min(200, Math.floor(rawLimit))) : 50;
|
|
359
|
+
const totalRow = this.db
|
|
360
|
+
.prepare(`SELECT COUNT(*) AS total FROM operator_tasks WHERE ${where.join(' AND ')}`)
|
|
361
|
+
.get(...params);
|
|
362
|
+
const pageWhere = [...where];
|
|
363
|
+
const pageParams = [...params];
|
|
364
|
+
if (filter.cursor) {
|
|
365
|
+
const { k } = decodeListCursor(filter.cursor, order);
|
|
366
|
+
if (order === 'updated') {
|
|
367
|
+
pageWhere.push('(updated_at, id) < (?, ?)');
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
pageWhere.push(`(CASE WHEN deadline IS NULL THEN 1 ELSE 0 END, COALESCE(deadline, ''),
|
|
371
|
+
CASE priority WHEN 'high' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END, id) > (?, ?, ?, ?)`);
|
|
372
|
+
}
|
|
373
|
+
pageParams.push(...k);
|
|
374
|
+
}
|
|
375
|
+
// limit + 1 probes for a next page instead of guessing from a full page, so the
|
|
376
|
+
// final page never hands out a cursor that resolves to nothing.
|
|
288
377
|
const rows = this.db
|
|
289
378
|
.prepare(`SELECT * FROM operator_tasks
|
|
290
|
-
|
|
291
|
-
ORDER BY ${order}
|
|
379
|
+
WHERE ${pageWhere.join(' AND ')}
|
|
380
|
+
ORDER BY ${TaskLedger.orderSql(filter.order)}
|
|
292
381
|
LIMIT ?`)
|
|
293
|
-
.all(...
|
|
294
|
-
|
|
382
|
+
.all(...pageParams, limit + 1);
|
|
383
|
+
const hasMore = rows.length > limit;
|
|
384
|
+
const tasks = rows.slice(0, limit).map((row) => this.toRecord(row));
|
|
385
|
+
const last = tasks[tasks.length - 1];
|
|
386
|
+
return {
|
|
387
|
+
tasks,
|
|
388
|
+
total: totalRow.total,
|
|
389
|
+
returned: tasks.length,
|
|
390
|
+
nextCursor: hasMore && last ? encodeListCursor(TaskLedger.cursorFor(last, order)) : null,
|
|
391
|
+
};
|
|
295
392
|
}
|
|
296
393
|
/** Internal bounded page for temporal reconciliation; excludes rows that can never be candidates. */
|
|
297
394
|
listTemporalScanPage(input) {
|
|
@@ -327,7 +424,7 @@ class TaskLedger {
|
|
|
327
424
|
* (source_channel, source_event_id) UPSERTS - the existing row gets the new
|
|
328
425
|
* latest_event (and title stays) instead of a near-duplicate row appearing.
|
|
329
426
|
*/
|
|
330
|
-
create(input) {
|
|
427
|
+
create(input, origin = {}) {
|
|
331
428
|
if (!input.title || input.title.trim() === '') {
|
|
332
429
|
throw new Error('task title must be a non-empty string');
|
|
333
430
|
}
|
|
@@ -373,22 +470,114 @@ class TaskLedger {
|
|
|
373
470
|
...(input.due_at !== undefined ? { due_at: input.due_at } : {}),
|
|
374
471
|
...(input.confirmed !== undefined ? { confirmed: input.confirmed } : {}),
|
|
375
472
|
...(input.latest_event !== undefined ? { latest_event: input.latest_event } : {}),
|
|
473
|
+
},
|
|
474
|
+
// A duplicate delivery of the same event: here the cause genuinely is known,
|
|
475
|
+
// because it is the event the row is keyed on.
|
|
476
|
+
{
|
|
477
|
+
...origin,
|
|
478
|
+
causeEventIds: input.source_event_id ? [input.source_event_id] : origin.causeEventIds,
|
|
376
479
|
});
|
|
377
480
|
}
|
|
378
481
|
}
|
|
379
|
-
|
|
380
|
-
|
|
482
|
+
let createdId = 0;
|
|
483
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
484
|
+
try {
|
|
485
|
+
const result = this.db
|
|
486
|
+
.prepare(`INSERT INTO operator_tasks
|
|
381
487
|
(title, status, priority, assignee, deadline, due_at, deadline_offset_minutes,
|
|
382
488
|
revision, temporal_epoch, source_channel, source_event_id, latest_event,
|
|
383
489
|
auto_created, confirmed, created_at, updated_at)
|
|
384
490
|
VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
385
|
-
|
|
386
|
-
|
|
491
|
+
.run(input.title.trim(), input.status ?? 'pending', input.priority ?? 'normal', input.assignee ?? null, normalizedDeadline, exactDue?.dueAt ?? null, exactDue?.offsetMinutes ?? null, initialTemporalEpoch, input.source_channel ?? null, input.source_event_id ?? null, input.latest_event ?? null, 1, input.confirmed ? 1 : 0, now, now);
|
|
492
|
+
createdId = Number(result.lastInsertRowid);
|
|
493
|
+
this.recordTaskChange({
|
|
494
|
+
kind: 'task_create',
|
|
495
|
+
taskId: createdId,
|
|
496
|
+
// The HOST batch wins. `source_event_id` arrives on agent-authored task_create
|
|
497
|
+
// input, so letting it take precedence made the attribution the agent's to choose:
|
|
498
|
+
// any 1-200 character string passes the ledger's shape check, and the change was
|
|
499
|
+
// then stamped `attributed` on a cause nobody could resolve. The run id is already
|
|
500
|
+
// protected for exactly this reason; the cause was not. Found in review.
|
|
501
|
+
//
|
|
502
|
+
// The agent's field is still USED when the host handed the run no batch - a named
|
|
503
|
+
// source event is better evidence than none, and an unbounded run has nothing else.
|
|
504
|
+
// It is weaker evidence, not worthless.
|
|
505
|
+
//
|
|
506
|
+
// A plain spread would be wrong in the other direction: an absent caller field must
|
|
507
|
+
// not erase what the host knows.
|
|
508
|
+
origin: {
|
|
509
|
+
...origin,
|
|
510
|
+
causeEventIds: origin.causeEventIds && origin.causeEventIds.length > 0
|
|
511
|
+
? origin.causeEventIds
|
|
512
|
+
: input.source_event_id
|
|
513
|
+
? [input.source_event_id]
|
|
514
|
+
: origin.causeEventIds,
|
|
515
|
+
},
|
|
516
|
+
channel: input.source_channel ?? null,
|
|
517
|
+
// Everything the INSERT wrote. A hash over two of fifteen columns cannot tell two
|
|
518
|
+
// materially different writes apart, which is most of what a receipt is for.
|
|
519
|
+
payload: {
|
|
520
|
+
title: input.title.trim(),
|
|
521
|
+
status: input.status ?? 'pending',
|
|
522
|
+
priority: input.priority ?? 'normal',
|
|
523
|
+
assignee: input.assignee ?? null,
|
|
524
|
+
deadline: normalizedDeadline,
|
|
525
|
+
due_at: exactDue?.dueAt ?? null,
|
|
526
|
+
deadline_offset_minutes: exactDue?.offsetMinutes ?? null,
|
|
527
|
+
temporal_epoch: initialTemporalEpoch,
|
|
528
|
+
source_channel: input.source_channel ?? null,
|
|
529
|
+
source_event_id: input.source_event_id ?? null,
|
|
530
|
+
latest_event: input.latest_event ?? null,
|
|
531
|
+
confirmed: input.confirmed ? 1 : 0,
|
|
532
|
+
},
|
|
533
|
+
atMs: now,
|
|
534
|
+
});
|
|
535
|
+
this.db.exec('COMMIT');
|
|
536
|
+
}
|
|
537
|
+
catch (error) {
|
|
538
|
+
this.db.exec('ROLLBACK');
|
|
539
|
+
throw error;
|
|
540
|
+
}
|
|
541
|
+
const created = this.getById(createdId);
|
|
387
542
|
if (!created)
|
|
388
543
|
throw new Error('task_create: inserted row could not be read back');
|
|
389
544
|
return created;
|
|
390
545
|
}
|
|
391
|
-
|
|
546
|
+
/**
|
|
547
|
+
* Write the effect row for a task change.
|
|
548
|
+
*
|
|
549
|
+
* Called from inside the same transaction as the write it describes. The cause is the
|
|
550
|
+
* event the caller already recorded on the row - the tool has always accepted it, and
|
|
551
|
+
* 178 of the 179 owner tasks that carry one resolve to a real indexed event, so this is
|
|
552
|
+
* attribution that already exists rather than a new burden on the agent.
|
|
553
|
+
*
|
|
554
|
+
* When there is no cause the change is still recorded, marked unattributed. That is the
|
|
555
|
+
* honest reading of `task_update`, which has never had a cause field at all: the system
|
|
556
|
+
* has been changing owner work items without recording why, and the ledger's job is to
|
|
557
|
+
* show how often, not to pretend otherwise or to start refusing writes.
|
|
558
|
+
*/
|
|
559
|
+
recordTaskChange(input) {
|
|
560
|
+
const common = {
|
|
561
|
+
runId: input.origin.runId ?? null,
|
|
562
|
+
channelId: input.channel,
|
|
563
|
+
kind: input.kind,
|
|
564
|
+
targetType: 'task',
|
|
565
|
+
targetId: String(input.taskId),
|
|
566
|
+
payload: input.payload,
|
|
567
|
+
atMs: input.atMs,
|
|
568
|
+
};
|
|
569
|
+
// A cause the ledger cannot use makes the change unattributed - it never makes the
|
|
570
|
+
// change fail. Some live rows carry 400-character legacy source identifiers, and an
|
|
571
|
+
// operator that cannot close a work item because its upstream id is malformed is a
|
|
572
|
+
// worse system than one that admits it does not know why the item changed.
|
|
573
|
+
const causes = (input.origin.causeEventIds ?? []).filter(effects_js_1.isUsableCause);
|
|
574
|
+
if (causes.length > 0) {
|
|
575
|
+
(0, effects_js_1.recordEffect)(this.db, { ...common, sourceEventIds: causes });
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
(0, effects_js_1.recordUnattributedChange)(this.db, common);
|
|
579
|
+
}
|
|
580
|
+
update(id, patch, origin = {}) {
|
|
392
581
|
if (patch.status === 'failed') {
|
|
393
582
|
throw new Error(`task_update: 'failed' is a system-only status`);
|
|
394
583
|
}
|
|
@@ -491,24 +680,43 @@ class TaskLedger {
|
|
|
491
680
|
];
|
|
492
681
|
const changedColumns = persistedColumns.filter((column) => next[column] !== existing[column]);
|
|
493
682
|
if (changedColumns.length === 0) {
|
|
683
|
+
// Nothing moved, so nothing is recorded. This is the whole point of the ledger:
|
|
684
|
+
// a call that ran is not a change, and the two must not be countable as one.
|
|
685
|
+
//
|
|
686
|
+
// The read-back happens after the catch, not here: a throw between COMMIT and
|
|
687
|
+
// return would send this into the catch and issue ROLLBACK with no open
|
|
688
|
+
// transaction, replacing the real error with a confusing one.
|
|
494
689
|
this.db.exec('COMMIT');
|
|
495
|
-
return this.toRecord(existing);
|
|
496
690
|
}
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
.
|
|
504
|
-
.
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
691
|
+
else {
|
|
692
|
+
const nextRevision = existing.revision + 1;
|
|
693
|
+
const sets = changedColumns.map((column) => `${column} = ?`);
|
|
694
|
+
const values = changedColumns.map((column) => next[column]);
|
|
695
|
+
const updatedAt = this.now();
|
|
696
|
+
sets.push('revision = ?', 'updated_at = ?');
|
|
697
|
+
values.push(nextRevision, updatedAt);
|
|
698
|
+
this.db
|
|
699
|
+
.prepare(`UPDATE operator_tasks SET ${sets.join(', ')} WHERE id = ?`)
|
|
700
|
+
.run(...values, id);
|
|
701
|
+
this.recordTaskChange({
|
|
702
|
+
kind: 'task_update',
|
|
703
|
+
taskId: id,
|
|
704
|
+
origin,
|
|
705
|
+
channel: existing.source_channel,
|
|
706
|
+
payload: {
|
|
707
|
+
revision: nextRevision,
|
|
708
|
+
changed: Object.fromEntries(changedColumns.map((column) => [column, next[column]])),
|
|
709
|
+
},
|
|
710
|
+
atMs: updatedAt,
|
|
711
|
+
});
|
|
712
|
+
if (temporalChanged || terminalToOpen) {
|
|
713
|
+
this.supersedeTemporalGenerationsInTransaction(id, Number(next.temporal_epoch));
|
|
714
|
+
}
|
|
715
|
+
else if (openToTerminal) {
|
|
716
|
+
this.supersedeAllActiveTemporalGenerationsInTransaction(id);
|
|
717
|
+
}
|
|
718
|
+
this.db.exec('COMMIT');
|
|
510
719
|
}
|
|
511
|
-
this.db.exec('COMMIT');
|
|
512
720
|
}
|
|
513
721
|
catch (error) {
|
|
514
722
|
this.db.exec('ROLLBACK');
|
|
@@ -733,6 +941,20 @@ class TaskLedger {
|
|
|
733
941
|
this.assertTemporalContextMatches(suppliedContext, trustedContext);
|
|
734
942
|
return trustedContext;
|
|
735
943
|
}
|
|
944
|
+
/**
|
|
945
|
+
* What this system changed, and what it changed it for.
|
|
946
|
+
*
|
|
947
|
+
* Reads live beside the writes because the effect ledger shares the tasks database on
|
|
948
|
+
* purpose. Exposed here rather than by handing out the connection: the ledger owns both
|
|
949
|
+
* halves, so a change and its account of itself cannot drift apart.
|
|
950
|
+
*/
|
|
951
|
+
listChanges(query = {}) {
|
|
952
|
+
return (0, effects_js_1.listEffects)(this.db, query);
|
|
953
|
+
}
|
|
954
|
+
/** Of what this system changed, how much rests on evidence. */
|
|
955
|
+
changeCoverage(sinceMs, targetType) {
|
|
956
|
+
return (0, effects_js_1.changeCoverage)(this.db, sinceMs, targetType);
|
|
957
|
+
}
|
|
736
958
|
getTemporalEffect(attemptId) {
|
|
737
959
|
const row = this.db
|
|
738
960
|
.prepare(`SELECT * FROM operator_temporal_effects WHERE workorder_attempt_id = ?`)
|
|
@@ -970,6 +1192,27 @@ class TaskLedger {
|
|
|
970
1192
|
if (ownerUpdate.changes !== 1) {
|
|
971
1193
|
throw new Error(`temporal effect lost owner task revision for task ${context.taskId}`);
|
|
972
1194
|
}
|
|
1195
|
+
// The same ledger as every other owner-task change. This is the canonical case -
|
|
1196
|
+
// a scheduled run closing a work item - and leaving it out would have meant the
|
|
1197
|
+
// effect ledger could not see the one change type it was built to account for,
|
|
1198
|
+
// with its receipt filed in a second table nobody joins against.
|
|
1199
|
+
//
|
|
1200
|
+
// Unattributed, and correctly so: a temporal check fires because a clock advanced,
|
|
1201
|
+
// not because an event arrived. Its evidence is the context packet, which today
|
|
1202
|
+
// carries recalled memories and zero connector events - measured, not assumed.
|
|
1203
|
+
// Recording it as attributed would name a cause that does not exist.
|
|
1204
|
+
this.recordTaskChange({
|
|
1205
|
+
kind: 'task_update',
|
|
1206
|
+
taskId: context.taskId,
|
|
1207
|
+
origin: { runId: null },
|
|
1208
|
+
channel: existing.source_channel,
|
|
1209
|
+
payload: {
|
|
1210
|
+
revision: afterRevision,
|
|
1211
|
+
outcome: input.outcome,
|
|
1212
|
+
changed: Object.fromEntries(changedFields.map((column) => [column, next[column]])),
|
|
1213
|
+
},
|
|
1214
|
+
atMs: now,
|
|
1215
|
+
});
|
|
973
1216
|
if (rescheduled) {
|
|
974
1217
|
this.supersedeTemporalGenerationsInTransaction(context.taskId, Number(next.temporal_epoch), context.generationKey, now);
|
|
975
1218
|
}
|