@monoes/monomindcli 2.8.3 → 2.9.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/.claude/helpers/auto-memory-hook.mjs +0 -0
- package/.claude/helpers/handlers/route-handler.cjs +12 -0
- package/.claude/helpers/handlers/session-restore-handler.cjs +28 -7
- package/.claude/helpers/hook-handler.cjs +0 -0
- package/.claude/helpers/utils/micro-agents.cjs +22 -0
- package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +11 -6
- package/.claude/skills/monodesign/scripts/live-inject.mjs +20 -7
- package/.claude/skills/monodesign/scripts/live-server.mjs +38 -2
- package/LICENSE +191 -0
- package/README.md +8 -6
- package/dist/src/browser/dashboard/server.d.ts +5 -0
- package/dist/src/browser/dashboard/server.d.ts.map +1 -1
- package/dist/src/browser/dashboard/server.js +59 -4
- package/dist/src/browser/dashboard/server.js.map +1 -1
- package/dist/src/browser/dashboard/ui.html +18 -8
- package/dist/src/browser/workflow/store.d.ts.map +1 -1
- package/dist/src/browser/workflow/store.js +3 -2
- package/dist/src/browser/workflow/store.js.map +1 -1
- package/dist/src/capabilities/cap-documents.d.ts.map +1 -1
- package/dist/src/capabilities/cap-documents.js +14 -9
- package/dist/src/capabilities/cap-documents.js.map +1 -1
- package/dist/src/commands/design-palette.d.ts +5 -0
- package/dist/src/commands/design-palette.d.ts.map +1 -1
- package/dist/src/commands/design-palette.js +8 -5
- package/dist/src/commands/design-palette.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +22 -18
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/download-embeddings.d.ts +8 -0
- package/dist/src/commands/download-embeddings.d.ts.map +1 -0
- package/dist/src/commands/download-embeddings.js +34 -0
- package/dist/src/commands/download-embeddings.js.map +1 -0
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +14 -0
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +4 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init-wizard.js +1 -1
- package/dist/src/commands/init-wizard.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +48 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +35 -1
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/commands/org-observe.d.ts +10 -0
- package/dist/src/commands/org-observe.d.ts.map +1 -1
- package/dist/src/commands/org-observe.js +195 -31
- package/dist/src/commands/org-observe.js.map +1 -1
- package/dist/src/commands/org.d.ts +1 -0
- package/dist/src/commands/org.d.ts.map +1 -1
- package/dist/src/commands/org.js +139 -3
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/commands/route.d.ts +1 -9
- package/dist/src/commands/route.d.ts.map +1 -1
- package/dist/src/commands/route.js +42 -65
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/security-cve.d.ts.map +1 -1
- package/dist/src/commands/security-cve.js +2 -1
- package/dist/src/commands/security-cve.js.map +1 -1
- package/dist/src/index.d.ts +0 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -15
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/copy-assets.d.ts +17 -0
- package/dist/src/init/copy-assets.d.ts.map +1 -0
- package/dist/src/init/copy-assets.js +271 -0
- package/dist/src/init/copy-assets.js.map +1 -0
- package/dist/src/init/executor.d.ts +2 -30
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +56 -2493
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/geminimd-generator.js +2 -2
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +9 -0
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/kimi-generator.js +3 -3
- package/dist/src/init/kimi-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +0 -4
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/shared.d.ts +112 -0
- package/dist/src/init/shared.d.ts.map +1 -0
- package/dist/src/init/shared.js +475 -0
- package/dist/src/init/shared.js.map +1 -0
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +37 -0
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +1 -1
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/upgrade.d.ts +34 -0
- package/dist/src/init/upgrade.d.ts.map +1 -0
- package/dist/src/init/upgrade.js +477 -0
- package/dist/src/init/upgrade.js.map +1 -0
- package/dist/src/init/write-antigravity.d.ts +13 -0
- package/dist/src/init/write-antigravity.d.ts.map +1 -0
- package/dist/src/init/write-antigravity.js +117 -0
- package/dist/src/init/write-antigravity.js.map +1 -0
- package/dist/src/init/write-capabilities.d.ts +9 -0
- package/dist/src/init/write-capabilities.d.ts.map +1 -0
- package/dist/src/init/write-capabilities.js +392 -0
- package/dist/src/init/write-capabilities.js.map +1 -0
- package/dist/src/init/write-claude.d.ts +25 -0
- package/dist/src/init/write-claude.d.ts.map +1 -0
- package/dist/src/init/write-claude.js +279 -0
- package/dist/src/init/write-claude.js.map +1 -0
- package/dist/src/init/write-kimicode.d.ts +19 -0
- package/dist/src/init/write-kimicode.d.ts.map +1 -0
- package/dist/src/init/write-kimicode.js +223 -0
- package/dist/src/init/write-kimicode.js.map +1 -0
- package/dist/src/init/write-opencode.d.ts +14 -0
- package/dist/src/init/write-opencode.d.ts.map +1 -0
- package/dist/src/init/write-opencode.js +130 -0
- package/dist/src/init/write-opencode.js.map +1 -0
- package/dist/src/init/write-runtime-config.d.ts +14 -0
- package/dist/src/init/write-runtime-config.d.ts.map +1 -0
- package/dist/src/init/write-runtime-config.js +214 -0
- package/dist/src/init/write-runtime-config.js.map +1 -0
- package/dist/src/init/write-sample-org.d.ts +9 -0
- package/dist/src/init/write-sample-org.d.ts.map +1 -0
- package/dist/src/init/write-sample-org.js +39 -0
- package/dist/src/init/write-sample-org.js.map +1 -0
- package/dist/src/knowledge/eval/golden-set.js +1 -1
- package/dist/src/knowledge/eval/golden-set.js.map +1 -1
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +7 -3
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.js +2 -25
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.d.ts.map +1 -1
- package/dist/src/mcp-tools/auto-install.js +2 -1
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +26 -0
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +2 -37
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/monodesign-tools.d.ts +19 -0
- package/dist/src/mcp-tools/monodesign-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monodesign-tools.js +233 -0
- package/dist/src/mcp-tools/monodesign-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.d.ts +5 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.js +177 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/build-tools.d.ts +9 -0
- package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/build-tools.js +299 -0
- package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/group-tools.d.ts +10 -0
- package/dist/src/mcp-tools/monograph/group-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/group-tools.js +225 -0
- package/dist/src/mcp-tools/monograph/group-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/health-tools.d.ts +6 -0
- package/dist/src/mcp-tools/monograph/health-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/health-tools.js +113 -0
- package/dist/src/mcp-tools/monograph/health-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/impact-tools.d.ts +9 -0
- package/dist/src/mcp-tools/monograph/impact-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/impact-tools.js +532 -0
- package/dist/src/mcp-tools/monograph/impact-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/index.d.ts +10 -0
- package/dist/src/mcp-tools/monograph/index.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/index.js +73 -0
- package/dist/src/mcp-tools/monograph/index.js.map +1 -0
- package/dist/src/mcp-tools/monograph/query-tools.d.ts +11 -0
- package/dist/src/mcp-tools/monograph/query-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/query-tools.js +500 -0
- package/dist/src/mcp-tools/monograph/query-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/shared.d.ts +64 -0
- package/dist/src/mcp-tools/monograph/shared.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/shared.js +215 -0
- package/dist/src/mcp-tools/monograph/shared.js.map +1 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.d.ts +10 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.js +382 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph-tools.d.ts +4 -23
- package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.js +4 -2439
- package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
- package/dist/src/mcp-tools/monomind-tools.d.ts +8 -0
- package/dist/src/mcp-tools/monomind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monomind-tools.js +13 -1
- package/dist/src/mcp-tools/monomind-tools.js.map +1 -1
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts.map +1 -1
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js +31 -2
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +31 -1
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/types.d.ts +8 -27
- package/dist/src/mcp-tools/types.d.ts.map +1 -1
- package/dist/src/mcp-tools/types.js +9 -91
- package/dist/src/mcp-tools/types.js.map +1 -1
- package/dist/src/memory/file-permissions.d.ts +15 -0
- package/dist/src/memory/file-permissions.d.ts.map +1 -0
- package/dist/src/memory/file-permissions.js +25 -0
- package/dist/src/memory/file-permissions.js.map +1 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +94 -34
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-crud.d.ts.map +1 -1
- package/dist/src/memory/memory-crud.js +298 -275
- package/dist/src/memory/memory-crud.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts +2 -4
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +53 -76
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/memory-migrations.d.ts +1 -14
- package/dist/src/memory/memory-migrations.d.ts.map +1 -1
- package/dist/src/memory/memory-migrations.js +52 -105
- package/dist/src/memory/memory-migrations.js.map +1 -1
- package/dist/src/memory/sona-optimizer.d.ts +1 -1
- package/dist/src/memory/sona-optimizer.js +1 -1
- package/dist/src/monovector/index.d.ts +16 -19
- package/dist/src/monovector/index.d.ts.map +1 -1
- package/dist/src/monovector/index.js +50 -8
- package/dist/src/monovector/index.js.map +1 -1
- package/dist/src/orgrt/approvals.d.ts +16 -0
- package/dist/src/orgrt/approvals.d.ts.map +1 -0
- package/dist/src/orgrt/approvals.js +72 -0
- package/dist/src/orgrt/approvals.js.map +1 -0
- package/dist/src/orgrt/bus.d.ts.map +1 -1
- package/dist/src/orgrt/bus.js +21 -0
- package/dist/src/orgrt/bus.js.map +1 -1
- package/dist/src/orgrt/checkpoint-ops.d.ts +19 -0
- package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -0
- package/dist/src/orgrt/checkpoint-ops.js +219 -0
- package/dist/src/orgrt/checkpoint-ops.js.map +1 -0
- package/dist/src/orgrt/checkpoint.d.ts +33 -1
- package/dist/src/orgrt/checkpoint.d.ts.map +1 -1
- package/dist/src/orgrt/checkpoint.js +50 -6
- package/dist/src/orgrt/checkpoint.js.map +1 -1
- package/dist/src/orgrt/cross-org.d.ts +32 -0
- package/dist/src/orgrt/cross-org.d.ts.map +1 -0
- package/dist/src/orgrt/cross-org.js +256 -0
- package/dist/src/orgrt/cross-org.js.map +1 -0
- package/dist/src/orgrt/daemon.d.ts +131 -157
- package/dist/src/orgrt/daemon.d.ts.map +1 -1
- package/dist/src/orgrt/daemon.js +356 -966
- package/dist/src/orgrt/daemon.js.map +1 -1
- package/dist/src/orgrt/decisions.d.ts +33 -0
- package/dist/src/orgrt/decisions.d.ts.map +1 -0
- package/dist/src/orgrt/decisions.js +169 -0
- package/dist/src/orgrt/decisions.js.map +1 -0
- package/dist/src/orgrt/kimicode-runner.d.ts.map +1 -1
- package/dist/src/orgrt/kimicode-runner.js +5 -1
- package/dist/src/orgrt/kimicode-runner.js.map +1 -1
- package/dist/src/orgrt/opencode-runner.d.ts.map +1 -1
- package/dist/src/orgrt/opencode-runner.js +10 -2
- package/dist/src/orgrt/opencode-runner.js.map +1 -1
- package/dist/src/orgrt/org-memory.d.ts +45 -0
- package/dist/src/orgrt/org-memory.d.ts.map +1 -0
- package/dist/src/orgrt/org-memory.js +220 -0
- package/dist/src/orgrt/org-memory.js.map +1 -0
- package/dist/src/orgrt/policy.d.ts +4 -0
- package/dist/src/orgrt/policy.d.ts.map +1 -1
- package/dist/src/orgrt/policy.js +13 -1
- package/dist/src/orgrt/policy.js.map +1 -1
- package/dist/src/orgrt/prechecks.d.ts +15 -0
- package/dist/src/orgrt/prechecks.d.ts.map +1 -0
- package/dist/src/orgrt/prechecks.js +21 -0
- package/dist/src/orgrt/prechecks.js.map +1 -0
- package/dist/src/orgrt/questions.d.ts +39 -0
- package/dist/src/orgrt/questions.d.ts.map +1 -0
- package/dist/src/orgrt/questions.js +135 -0
- package/dist/src/orgrt/questions.js.map +1 -0
- package/dist/src/orgrt/remote.d.ts +25 -0
- package/dist/src/orgrt/remote.d.ts.map +1 -0
- package/dist/src/orgrt/remote.js +73 -0
- package/dist/src/orgrt/remote.js.map +1 -0
- package/dist/src/orgrt/scheduler-integration.d.ts +19 -0
- package/dist/src/orgrt/scheduler-integration.d.ts.map +1 -0
- package/dist/src/orgrt/scheduler-integration.js +90 -0
- package/dist/src/orgrt/scheduler-integration.js.map +1 -0
- package/dist/src/orgrt/server.d.ts.map +1 -1
- package/dist/src/orgrt/server.js +70 -2
- package/dist/src/orgrt/server.js.map +1 -1
- package/dist/src/orgrt/session.d.ts +30 -1
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +184 -53
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/state-detector.d.ts +19 -0
- package/dist/src/orgrt/state-detector.d.ts.map +1 -0
- package/dist/src/orgrt/state-detector.js +59 -0
- package/dist/src/orgrt/state-detector.js.map +1 -0
- package/dist/src/orgrt/task-dag.d.ts +27 -0
- package/dist/src/orgrt/task-dag.d.ts.map +1 -0
- package/dist/src/orgrt/task-dag.js +100 -0
- package/dist/src/orgrt/task-dag.js.map +1 -0
- package/dist/src/orgrt/tool-fence.d.ts +7 -4
- package/dist/src/orgrt/tool-fence.d.ts.map +1 -1
- package/dist/src/orgrt/tool-fence.js +47 -6
- package/dist/src/orgrt/tool-fence.js.map +1 -1
- package/dist/src/orgrt/types.d.ts +57 -2
- package/dist/src/orgrt/types.d.ts.map +1 -1
- package/dist/src/orgrt/types.js +34 -3
- package/dist/src/orgrt/types.js.map +1 -1
- package/dist/src/routing/model-download.d.ts +49 -0
- package/dist/src/routing/model-download.d.ts.map +1 -0
- package/dist/src/routing/model-download.js +106 -0
- package/dist/src/routing/model-download.js.map +1 -0
- package/dist/src/services/crash-reporter.d.ts +5 -0
- package/dist/src/services/crash-reporter.d.ts.map +1 -1
- package/dist/src/services/crash-reporter.js +49 -0
- package/dist/src/services/crash-reporter.js.map +1 -1
- package/dist/src/transfer/anonymization/index.d.ts +18 -15
- package/dist/src/transfer/anonymization/index.d.ts.map +1 -1
- package/dist/src/transfer/anonymization/index.js +7 -119
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/ui/dashboard.html +606 -7
- package/dist/src/ui/orgs.html +7 -1
- package/dist/src/ui/routes-monograph.mjs +6 -0
- package/dist/src/ui/server.mjs +327 -7
- package/dist/src/update/checker.d.ts.map +1 -1
- package/dist/src/update/checker.js +2 -1
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.d.ts.map +1 -1
- package/dist/src/update/executor.js +7 -3
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.d.ts +0 -1
- package/dist/src/update/index.d.ts.map +1 -1
- package/dist/src/update/index.js +5 -24
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/utils/db-mutex.d.ts +11 -0
- package/dist/src/utils/db-mutex.d.ts.map +1 -0
- package/dist/src/utils/db-mutex.js +23 -0
- package/dist/src/utils/db-mutex.js.map +1 -0
- package/dist/src/utils/input-guards.d.ts +23 -0
- package/dist/src/utils/input-guards.d.ts.map +1 -1
- package/dist/src/utils/input-guards.js +72 -0
- package/dist/src/utils/input-guards.js.map +1 -1
- package/dist/src/utils/npm-command.d.ts +10 -0
- package/dist/src/utils/npm-command.d.ts.map +1 -0
- package/dist/src/utils/npm-command.js +12 -0
- package/dist/src/utils/npm-command.js.map +1 -0
- package/dist/src/utils/paths.d.ts +28 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +108 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -17
- package/scripts/download-embedding-model.mjs +97 -0
- package/scripts/publish.sh +0 -0
- package/scripts/sync-claude-assets.sh +0 -0
- package/dist/src/production/circuit-breaker.d.ts +0 -121
- package/dist/src/production/circuit-breaker.d.ts.map +0 -1
- package/dist/src/production/circuit-breaker.js +0 -262
- package/dist/src/production/circuit-breaker.js.map +0 -1
- package/dist/src/production/error-handler.d.ts +0 -119
- package/dist/src/production/error-handler.d.ts.map +0 -1
- package/dist/src/production/error-handler.js +0 -324
- package/dist/src/production/error-handler.js.map +0 -1
- package/dist/src/production/index.d.ts +0 -6
- package/dist/src/production/index.d.ts.map +0 -1
- package/dist/src/production/index.js +0 -6
- package/dist/src/production/index.js.map +0 -1
- package/dist/src/production/monitoring.d.ts +0 -181
- package/dist/src/production/monitoring.d.ts.map +0 -1
- package/dist/src/production/monitoring.js +0 -375
- package/dist/src/production/monitoring.js.map +0 -1
- package/dist/src/production/rate-limiter.d.ts +0 -125
- package/dist/src/production/rate-limiter.d.ts.map +0 -1
- package/dist/src/production/rate-limiter.js +0 -218
- package/dist/src/production/rate-limiter.js.map +0 -1
- package/dist/src/production/retry.d.ts +0 -48
- package/dist/src/production/retry.d.ts.map +0 -1
- package/dist/src/production/retry.js +0 -189
- package/dist/src/production/retry.js.map +0 -1
- package/dist/src/transfer/types.d.ts +0 -245
- package/dist/src/transfer/types.d.ts.map +0 -1
- package/dist/src/transfer/types.js +0 -6
- package/dist/src/transfer/types.js.map +0 -1
|
@@ -17,9 +17,15 @@ export interface RoleCheckpoint {
|
|
|
17
17
|
status: 'running' | 'ended' | 'crashed';
|
|
18
18
|
/** Error message if crashed */
|
|
19
19
|
error?: string;
|
|
20
|
+
/** Terminal scrollback — last N lines of agent output. */
|
|
21
|
+
scrollback?: string[];
|
|
20
22
|
}
|
|
21
23
|
/** Full checkpoint state for an org */
|
|
22
24
|
export interface OrgCheckpoint {
|
|
25
|
+
/** R6: schema version — bumped on any breaking shape change so a future
|
|
26
|
+
* resumeOrg can detect an old-shape checkpoint instead of failing the
|
|
27
|
+
* checksum and silently returning null. */
|
|
28
|
+
version: number;
|
|
23
29
|
status: 'running' | 'stopped' | 'crashed';
|
|
24
30
|
run: string;
|
|
25
31
|
pid: number;
|
|
@@ -33,6 +39,8 @@ export interface OrgCheckpoint {
|
|
|
33
39
|
/** Checksum for state validation */
|
|
34
40
|
checksum: string;
|
|
35
41
|
}
|
|
42
|
+
/** Current checkpoint format version. Bump on breaking shape changes. */
|
|
43
|
+
export declare const CHECKPOINT_VERSION = 1;
|
|
36
44
|
/** Checkpoint TTL config */
|
|
37
45
|
export declare const CHECKPOINT_TTL_MS: number;
|
|
38
46
|
/**
|
|
@@ -42,7 +50,12 @@ export declare const CHECKPOINT_TTL_MS: number;
|
|
|
42
50
|
export declare function captureCheckpoint(org: RunningOrg): OrgCheckpoint;
|
|
43
51
|
/**
|
|
44
52
|
* Validate checkpoint integrity using checksum
|
|
45
|
-
* Returns true if checksum matches
|
|
53
|
+
* Returns true if checksum matches AND the schema version is current.
|
|
54
|
+
*
|
|
55
|
+
* R6: a version field was added so future shape changes can be detected
|
|
56
|
+
* explicitly. Old checkpoints (no version field) fail with a clear cause
|
|
57
|
+
* instead of the silent checksum-mismatch → null return that masked the
|
|
58
|
+
* real reason resume was impossible.
|
|
46
59
|
*/
|
|
47
60
|
export declare function validateCheckpoint(checkpoint: OrgCheckpoint): boolean;
|
|
48
61
|
/**
|
|
@@ -50,6 +63,25 @@ export declare function validateCheckpoint(checkpoint: OrgCheckpoint): boolean;
|
|
|
50
63
|
* Returns true if checkpoint is stale and should not be used
|
|
51
64
|
*/
|
|
52
65
|
export declare function isCheckpointExpired(checkpoint: OrgCheckpoint, ttlMs?: number): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Generate checksum over checkpoint state.
|
|
68
|
+
*
|
|
69
|
+
* Uses a stable recursive stringify so semantically-equal checkpoints
|
|
70
|
+
* (same keys + values, regardless of insertion order) hash identically.
|
|
71
|
+
* Hashed with SHA-256 (truncated to 16 hex chars = 64 bits — plenty for
|
|
72
|
+
* tamper detection across realistic checkpoint counts).
|
|
73
|
+
*
|
|
74
|
+
* T3 (and a real latent bug): the previous implementation called
|
|
75
|
+
* `JSON.stringify(state, Object.keys(state).sort())`. Passing an array
|
|
76
|
+
* as the second argument makes it a *whitelist* — but JSON.stringify
|
|
77
|
+
* applies that whitelist at every level, not just the top. Since nested
|
|
78
|
+
* keys like `tokensUsed` / `mailboxQueue` aren't in the top-level keys
|
|
79
|
+
* list, they were silently stripped from the canonical form. Result: the
|
|
80
|
+
* checksum was identical for any two checkpoints sharing the same
|
|
81
|
+
* top-level shape, regardless of roleState values — validateCheckpoint
|
|
82
|
+
* provided ZERO integrity guarantee.
|
|
83
|
+
*/
|
|
84
|
+
export declare function generateChecksum(state: Omit<OrgCheckpoint, 'checksum'>): string;
|
|
53
85
|
/**
|
|
54
86
|
* Restore mailbox queue from checkpoint
|
|
55
87
|
* Replays messages into the mailbox in order
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../../src/orgrt/checkpoint.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,qCAAqC;IACrC,aAAa,EAAE,OAAO,CAAC;IACvB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../../src/orgrt/checkpoint.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,qCAAqC;IACrC,aAAa,EAAE,OAAO,CAAC;IACvB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B;;gDAE4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,yCAAyC;IACzC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uDAAuD;IACvD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,4BAA4B;AAC5B,eAAO,MAAM,iBAAiB,QAAsB,CAAC;AAErD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,aAAa,CAyChE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAUrE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,GAAE,MAA0B,GAAG,OAAO,CAIzG;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,MAAM,CAG/E;AAeD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIhF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,aAAa,EACzB,gBAAgB,GAAE,OAAc,EAChC,aAAa,GAAE,OAAc,GAC5B,IAAI,CA+BN"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/** Current checkpoint format version. Bump on breaking shape changes. */
|
|
3
|
+
export const CHECKPOINT_VERSION = 1;
|
|
1
4
|
/** Checkpoint TTL config */
|
|
2
5
|
export const CHECKPOINT_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours default
|
|
3
6
|
/**
|
|
@@ -19,6 +22,7 @@ export function captureCheckpoint(org) {
|
|
|
19
22
|
sessionId: undefined, // TODO: extract from session layer
|
|
20
23
|
status: runtime.status,
|
|
21
24
|
error: runtime.error,
|
|
25
|
+
scrollback: runtime.scrollback?.snapshot(),
|
|
22
26
|
};
|
|
23
27
|
}
|
|
24
28
|
// Capture pending roles (lazy spawn list)
|
|
@@ -27,6 +31,7 @@ export function captureCheckpoint(org) {
|
|
|
27
31
|
}
|
|
28
32
|
// Build checkpoint without checksum first
|
|
29
33
|
const partial = {
|
|
34
|
+
version: CHECKPOINT_VERSION,
|
|
30
35
|
status: 'running',
|
|
31
36
|
run: org.run,
|
|
32
37
|
pid: process.pid,
|
|
@@ -41,9 +46,20 @@ export function captureCheckpoint(org) {
|
|
|
41
46
|
}
|
|
42
47
|
/**
|
|
43
48
|
* Validate checkpoint integrity using checksum
|
|
44
|
-
* Returns true if checksum matches
|
|
49
|
+
* Returns true if checksum matches AND the schema version is current.
|
|
50
|
+
*
|
|
51
|
+
* R6: a version field was added so future shape changes can be detected
|
|
52
|
+
* explicitly. Old checkpoints (no version field) fail with a clear cause
|
|
53
|
+
* instead of the silent checksum-mismatch → null return that masked the
|
|
54
|
+
* real reason resume was impossible.
|
|
45
55
|
*/
|
|
46
56
|
export function validateCheckpoint(checkpoint) {
|
|
57
|
+
if (checkpoint.version !== CHECKPOINT_VERSION) {
|
|
58
|
+
if (process.env.DEBUG || process.env.MONOMIND_DEBUG) {
|
|
59
|
+
console.error(`[checkpoint] version mismatch: file has ${checkpoint.version ?? 'none'}, current is ${CHECKPOINT_VERSION}`);
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
47
63
|
const { checksum, ...state } = checkpoint;
|
|
48
64
|
const recomputed = generateChecksum(state);
|
|
49
65
|
return checksum === recomputed;
|
|
@@ -58,12 +74,40 @@ export function isCheckpointExpired(checkpoint, ttlMs = CHECKPOINT_TTL_MS) {
|
|
|
58
74
|
return (now - updated) > ttlMs;
|
|
59
75
|
}
|
|
60
76
|
/**
|
|
61
|
-
* Generate checksum over checkpoint state
|
|
62
|
-
*
|
|
77
|
+
* Generate checksum over checkpoint state.
|
|
78
|
+
*
|
|
79
|
+
* Uses a stable recursive stringify so semantically-equal checkpoints
|
|
80
|
+
* (same keys + values, regardless of insertion order) hash identically.
|
|
81
|
+
* Hashed with SHA-256 (truncated to 16 hex chars = 64 bits — plenty for
|
|
82
|
+
* tamper detection across realistic checkpoint counts).
|
|
83
|
+
*
|
|
84
|
+
* T3 (and a real latent bug): the previous implementation called
|
|
85
|
+
* `JSON.stringify(state, Object.keys(state).sort())`. Passing an array
|
|
86
|
+
* as the second argument makes it a *whitelist* — but JSON.stringify
|
|
87
|
+
* applies that whitelist at every level, not just the top. Since nested
|
|
88
|
+
* keys like `tokensUsed` / `mailboxQueue` aren't in the top-level keys
|
|
89
|
+
* list, they were silently stripped from the canonical form. Result: the
|
|
90
|
+
* checksum was identical for any two checkpoints sharing the same
|
|
91
|
+
* top-level shape, regardless of roleState values — validateCheckpoint
|
|
92
|
+
* provided ZERO integrity guarantee.
|
|
63
93
|
*/
|
|
64
|
-
function generateChecksum(state) {
|
|
65
|
-
const canonical = JSON.stringify(
|
|
66
|
-
return
|
|
94
|
+
export function generateChecksum(state) {
|
|
95
|
+
const canonical = JSON.stringify(stableNormalize(state));
|
|
96
|
+
return createHash('sha256').update(canonical).digest('hex').slice(0, 16);
|
|
97
|
+
}
|
|
98
|
+
/** Recursively produce a canonical form: object keys sorted at every depth,
|
|
99
|
+
* arrays preserved in order, primitives passed through. */
|
|
100
|
+
function stableNormalize(value) {
|
|
101
|
+
if (Array.isArray(value))
|
|
102
|
+
return value.map(stableNormalize);
|
|
103
|
+
if (value && typeof value === 'object') {
|
|
104
|
+
const sortedKeys = Object.keys(value).sort();
|
|
105
|
+
const out = {};
|
|
106
|
+
for (const k of sortedKeys)
|
|
107
|
+
out[k] = stableNormalize(value[k]);
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
return value;
|
|
67
111
|
}
|
|
68
112
|
/**
|
|
69
113
|
* Restore mailbox queue from checkpoint
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../../src/orgrt/checkpoint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../../src/orgrt/checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { OrgDaemon, RunningOrg } from './daemon.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves an org_send `to` address ("role" for same-org, "org:role" for
|
|
4
|
+
* cross-org) into its parts. Centralizes the one addressing rule that
|
|
5
|
+
* matters (an "own-org:role" self-prefix is intra-org, not cross-org) so
|
|
6
|
+
* deliver()/deliverRemote() don't each re-derive it — the qualified `to`
|
|
7
|
+
* string returned is always the canonical display form for that address.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveAddress(fromOrg: string, to: string): {
|
|
10
|
+
cross: boolean;
|
|
11
|
+
orgName: string;
|
|
12
|
+
role: string;
|
|
13
|
+
qualified: string;
|
|
14
|
+
};
|
|
15
|
+
/** Mailbox bodies are unbounded — a pasted 20KB file would persist in the
|
|
16
|
+
* recipient's context for the whole run. Bodies over MAIL_BODY_MAX are
|
|
17
|
+
* written to <org workdir>/.mail/<message-id>.md and replaced with a ~1KB
|
|
18
|
+
* digest plus a pointer; smaller messages stay byte-identical. */
|
|
19
|
+
export declare function mailBody(root: string, orgName: string, org: RunningOrg | undefined, header: string, body: string, id: string): string;
|
|
20
|
+
/** Route a message. to = "role" (same org) or "org:role" (cross-org). Returns a receipt string. */
|
|
21
|
+
export declare function deliver(daemon: OrgDaemon, fromOrg: string, fromRole: string, to: string, subject: string, body: string): Promise<string>;
|
|
22
|
+
/** Inbound handler for cross-process delivery — called by the server's POST /api/xdeliver route
|
|
23
|
+
* when ANOTHER process's deliverRemote() reaches this daemon. Pushes straight into the target
|
|
24
|
+
* agent's mailbox; the agent picks it up on its own next turn (see Mailbox — never interrupts). */
|
|
25
|
+
export declare function receiveRemote(daemon: OrgDaemon, toOrg: string, toRole: string, fromQualified: string, subject: string, body: string): {
|
|
26
|
+
ok: true;
|
|
27
|
+
receipt: string;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
error: string;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=cross-org.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-org.d.ts","sourceRoot":"","sources":["../../../src/orgrt/cross-org.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMhI;AAED;;;mEAGmE;AACnE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAWrI;AAED,mGAAmG;AACnG,wBAAsB,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0F9I;AA8DD;;oGAEoG;AACpG,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACrG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiD9D"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
// packages/@monomind/cli/src/orgrt/cross-org.ts
|
|
2
|
+
// Extracted from daemon.ts — message delivery, cross-org routing, remote delivery.
|
|
3
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { lookupOrg } from './broker.js';
|
|
6
|
+
import { queueMessage } from './inbox.js';
|
|
7
|
+
import { checkResources, waitForCapacity } from '../utils/resource-governor.js';
|
|
8
|
+
import { ORG_DIR } from './types.js';
|
|
9
|
+
/** Bodies larger than this are digested to a .mail file (see mailBody). */
|
|
10
|
+
const MAIL_BODY_MAX = 4096;
|
|
11
|
+
/** How much of an oversized body stays inline in the digest. */
|
|
12
|
+
const MAIL_DIGEST_CHARS = 1024;
|
|
13
|
+
/**
|
|
14
|
+
* Resolves an org_send `to` address ("role" for same-org, "org:role" for
|
|
15
|
+
* cross-org) into its parts. Centralizes the one addressing rule that
|
|
16
|
+
* matters (an "own-org:role" self-prefix is intra-org, not cross-org) so
|
|
17
|
+
* deliver()/deliverRemote() don't each re-derive it — the qualified `to`
|
|
18
|
+
* string returned is always the canonical display form for that address.
|
|
19
|
+
*/
|
|
20
|
+
export function resolveAddress(fromOrg, to) {
|
|
21
|
+
const cross = to.includes(':');
|
|
22
|
+
if (!cross)
|
|
23
|
+
return { cross: false, orgName: fromOrg, role: to, qualified: to };
|
|
24
|
+
const [orgName, role] = to.split(':', 2);
|
|
25
|
+
if (orgName === fromOrg)
|
|
26
|
+
return { cross: false, orgName, role, qualified: role }; // self-prefixed — still intra-org
|
|
27
|
+
return { cross: true, orgName, role, qualified: to };
|
|
28
|
+
}
|
|
29
|
+
/** Mailbox bodies are unbounded — a pasted 20KB file would persist in the
|
|
30
|
+
* recipient's context for the whole run. Bodies over MAIL_BODY_MAX are
|
|
31
|
+
* written to <org workdir>/.mail/<message-id>.md and replaced with a ~1KB
|
|
32
|
+
* digest plus a pointer; smaller messages stay byte-identical. */
|
|
33
|
+
export function mailBody(root, orgName, org, header, body, id) {
|
|
34
|
+
if (body.length <= MAIL_BODY_MAX)
|
|
35
|
+
return `${header}\n\n${body}`;
|
|
36
|
+
const mailDir = join(org?.workdir ?? join(root, ORG_DIR, orgName), '.mail');
|
|
37
|
+
const file = join(mailDir, `${id.replace(/[^a-zA-Z0-9_-]/g, '_')}.md`);
|
|
38
|
+
try {
|
|
39
|
+
mkdirSync(mailDir, { recursive: true });
|
|
40
|
+
writeFileSync(file, body);
|
|
41
|
+
return `${header}\n\n${body.slice(0, MAIL_DIGEST_CHARS)}\n\n[... truncated — full text at ${file} — Read it if needed]`;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return `${header}\n\n${body}`; // digest write failed — deliver in full rather than lose content
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Route a message. to = "role" (same org) or "org:role" (cross-org). Returns a receipt string. */
|
|
48
|
+
export async function deliver(daemon, fromOrg, fromRole, to, subject, body) {
|
|
49
|
+
const { cross, orgName: targetOrgName, role: targetRole, qualified: toQualified } = resolveAddress(fromOrg, to);
|
|
50
|
+
const targetOrg = daemon.orgs.get(targetOrgName);
|
|
51
|
+
const src = daemon.orgs.get(fromOrg);
|
|
52
|
+
// Lazy spawn: if the role is pending (not yet spawned), spawn it now.
|
|
53
|
+
// ATOMIC GUARD: Check spawning Set to prevent duplicate spawns from concurrent messages
|
|
54
|
+
const spawning = daemon.spawning.get(targetOrgName) ?? new Set();
|
|
55
|
+
daemon.spawning.set(targetOrgName, spawning);
|
|
56
|
+
if (targetOrg && !targetOrg.agents.has(targetRole) && targetOrg.pendingRoles?.has(targetRole) && !spawning.has(targetRole)) {
|
|
57
|
+
const role = targetOrg.pendingRoles.get(targetRole);
|
|
58
|
+
targetOrg.pendingRoles.delete(targetRole);
|
|
59
|
+
spawning.add(targetRole); // Mark as spawning before async work
|
|
60
|
+
const check = checkResources();
|
|
61
|
+
if (!check.ok) {
|
|
62
|
+
const waited = await waitForCapacity(60_000);
|
|
63
|
+
spawning.delete(targetRole); // Clear spawning flag after check
|
|
64
|
+
if (!waited.ok) {
|
|
65
|
+
targetOrg.bus.emit({ type: 'audit', from: targetRole, reason: 'resource-skip',
|
|
66
|
+
msg: `deferring lazy spawn of "${targetRole}": ${waited.reason}` });
|
|
67
|
+
// Queue the triggering message so it survives the deferred spawn — without
|
|
68
|
+
// this the sender got "queued" but the message was silently lost.
|
|
69
|
+
// B5 FIX: Queue FIRST, then schedule spawn only if queue succeeds.
|
|
70
|
+
// If queueing fails, we return the error without modifying spawn state.
|
|
71
|
+
const queued = queueMessage(daemon.root, targetOrgName, {
|
|
72
|
+
fromQualified: cross ? `${fromOrg}:${fromRole}` : fromRole,
|
|
73
|
+
toRole: targetRole, subject, body, ts: Date.now(),
|
|
74
|
+
});
|
|
75
|
+
if (!queued) {
|
|
76
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to: toQualified, msg: `queue failed: ${subject}`, reason: 'queue-failed' });
|
|
77
|
+
return `ERROR: could not queue message for ${toQualified} (disk full or permissions)`;
|
|
78
|
+
}
|
|
79
|
+
daemon.scheduleDeferredSpawn(targetOrgName, targetOrg, role, targetOrg.spawnRole);
|
|
80
|
+
return `queued for ${toQualified} (role starting — waiting for resources)`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
targetOrg.spawnRole(role);
|
|
84
|
+
spawning.delete(targetRole); // Clear spawning flag after spawn completes
|
|
85
|
+
targetOrg.bus.emit({ type: 'status', from: targetRole, msg: `lazy-spawned on first message from ${fromRole}` });
|
|
86
|
+
}
|
|
87
|
+
if (!targetOrg || !targetOrg.agents.has(targetRole)) {
|
|
88
|
+
if (cross && daemon.opts.crossProcess)
|
|
89
|
+
return deliverRemote(daemon, fromOrg, fromRole, targetOrgName, targetRole, toQualified, subject, body, src);
|
|
90
|
+
// Queue + auto-wake: if the org definition exists locally but isn't running, spool the message and start it
|
|
91
|
+
if (cross && daemon.hasOrgDef(targetOrgName)) {
|
|
92
|
+
const queued = queueMessage(daemon.root, targetOrgName, { fromQualified: `${fromOrg}:${fromRole}`, toRole: targetRole, subject, body, ts: Date.now() });
|
|
93
|
+
if (!queued) {
|
|
94
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to: toQualified, msg: `queue failed: ${subject}`, reason: 'queue-failed' });
|
|
95
|
+
return `ERROR: could not queue message for ${toQualified} (disk full or permissions)`;
|
|
96
|
+
}
|
|
97
|
+
src?.bus.emit({ type: 'xorg', from: `${fromOrg}:${fromRole}`, to: toQualified, subject, msg: body, data: { queued: true } });
|
|
98
|
+
daemon.autoWake(targetOrgName);
|
|
99
|
+
return `queued for ${toQualified} (org starting)`;
|
|
100
|
+
}
|
|
101
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to: toQualified, msg: `undeliverable: ${subject}`, reason: 'unknown recipient' });
|
|
102
|
+
return `ERROR: unknown recipient "${toQualified}" (known: ${[...(targetOrg?.agents.keys() ?? daemon.orgs.keys())].join(', ')})`;
|
|
103
|
+
}
|
|
104
|
+
const targetAgent = targetOrg.agents.get(targetRole);
|
|
105
|
+
if (targetAgent.status === 'crashed') {
|
|
106
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to: toQualified, msg: `undeliverable: ${subject}`, reason: 'recipient crashed (retry budget exhausted)' });
|
|
107
|
+
return `ERROR: recipient "${toQualified}" crashed and will not recover this run — message not delivered (${targetAgent.error ?? 'unknown error'})`;
|
|
108
|
+
}
|
|
109
|
+
if (targetAgent.mailbox.isClosed) {
|
|
110
|
+
// Distinguish two cases that used to share one drop:
|
|
111
|
+
// - org mid-shutdown: nothing will ever read the queue again — the
|
|
112
|
+
// message genuinely can't be delivered, so report the real outcome.
|
|
113
|
+
// - agent session ended but the org is alive (budget exhaustion,
|
|
114
|
+
// turn limit, crash-restart in flight): the result is still
|
|
115
|
+
// valuable, so persist it to the inbox. The boss-restart/next-run
|
|
116
|
+
// drainInbox will deliver it instead of the work vanishing.
|
|
117
|
+
if (daemon.stopping.has(targetOrgName)) {
|
|
118
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to: toQualified, msg: `undeliverable: ${subject}`, reason: 'target mailbox closed (org shutting down)' });
|
|
119
|
+
return `ERROR: recipient "${toQualified}" is shutting down — message not delivered`;
|
|
120
|
+
}
|
|
121
|
+
const q = queueMessage(daemon.root, targetOrgName, { fromQualified: `${fromOrg}:${fromRole}`, toRole: targetRole, subject, body, ts: Date.now() });
|
|
122
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to: toQualified, msg: `recipient session closed — queued to inbox: ${subject}`, data: { queued: q } });
|
|
123
|
+
return `queued to inbox for ${toQualified} (recipient session closed; will be delivered on restart)`;
|
|
124
|
+
}
|
|
125
|
+
// Track message chain: link this message to the target's last message (the one being responded to)
|
|
126
|
+
const targetAgentSrc = targetOrg === src ? src?.agents.get(targetRole) : undefined;
|
|
127
|
+
const parentId = targetAgentSrc?.lastMessageId;
|
|
128
|
+
const evt = { from: cross ? `${fromOrg}:${fromRole}` : fromRole, to: toQualified, subject, msg: body, parentId };
|
|
129
|
+
const emitted = src?.bus.emit({ type: cross ? 'xorg' : 'message', ...evt });
|
|
130
|
+
if (cross && targetOrg !== src)
|
|
131
|
+
targetOrg.bus.emit({ type: 'xorg', ...evt });
|
|
132
|
+
// Store message ID for the target (so responses can link to it)
|
|
133
|
+
if (targetAgentSrc && emitted)
|
|
134
|
+
targetAgentSrc.lastMessageId = emitted.id;
|
|
135
|
+
// Also track the source agent's last sent message for cross-org visibility
|
|
136
|
+
const srcAgent = src?.agents.get(fromRole);
|
|
137
|
+
if (srcAgent && emitted)
|
|
138
|
+
srcAgent.lastMessageId = emitted.id;
|
|
139
|
+
targetAgent.mailbox.push(mailBody(daemon.root, targetOrgName, targetOrg, `[message from ${evt.from}] subject: ${subject}`, body, emitted?.id ?? `mail-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`));
|
|
140
|
+
return `delivered to ${toQualified}`;
|
|
141
|
+
}
|
|
142
|
+
/** Cross-process leg of deliver(): ask the machine-local broker who hosts targetOrgName, then POST over HTTP.
|
|
143
|
+
* `to` here is always the fully-qualified "org:role" display form (resolveAddress already normalized it). */
|
|
144
|
+
async function deliverRemote(daemon, fromOrg, fromRole, targetOrgName, targetRole, to, subject, body, src) {
|
|
145
|
+
const remote = lookupOrg(targetOrgName, daemon.opts.brokerDir);
|
|
146
|
+
if (!remote) {
|
|
147
|
+
// No remote host either — queue + auto-wake if the org def exists locally
|
|
148
|
+
if (daemon.hasOrgDef(targetOrgName)) {
|
|
149
|
+
const queued = queueMessage(daemon.root, targetOrgName, { fromQualified: `${fromOrg}:${fromRole}`, toRole: targetRole, subject, body, ts: Date.now() });
|
|
150
|
+
if (!queued) {
|
|
151
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to, msg: `queue failed: ${subject}`, reason: 'queue-failed' });
|
|
152
|
+
return `ERROR: could not queue message for ${to} (disk full or permissions)`;
|
|
153
|
+
}
|
|
154
|
+
src?.bus.emit({ type: 'xorg', from: `${fromOrg}:${fromRole}`, to, subject, msg: body, data: { queued: true } });
|
|
155
|
+
daemon.autoWake(targetOrgName);
|
|
156
|
+
return `queued for ${to} (org starting)`;
|
|
157
|
+
}
|
|
158
|
+
// Check SSH remote host registry before giving up
|
|
159
|
+
try {
|
|
160
|
+
const { lookupRemoteOrg, deliverRemote: sshDeliver } = await import('./remote.js');
|
|
161
|
+
const remoteHost = lookupRemoteOrg(targetOrgName, daemon.root);
|
|
162
|
+
if (remoteHost) {
|
|
163
|
+
const result = await sshDeliver(targetOrgName, `${fromOrg}:${fromRole}`, subject, body, remoteHost);
|
|
164
|
+
if (result.ok) {
|
|
165
|
+
src?.bus.emit({ type: 'xorg', from: `${fromOrg}:${fromRole}`, to, subject, msg: body, data: { remote: 'ssh', host: remoteHost.host } });
|
|
166
|
+
return `delivered to ${to} via SSH (${remoteHost.host})`;
|
|
167
|
+
}
|
|
168
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to, msg: `SSH delivery failed: ${result.output}`, reason: 'ssh-delivery-failed' });
|
|
169
|
+
return `ERROR: SSH delivery to "${to}" on ${remoteHost.host} failed: ${result.output}`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch { /* remote.ts unavailable or SSH not configured — fall through */ }
|
|
173
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to, msg: `undeliverable: ${subject}`, reason: 'unknown recipient' });
|
|
174
|
+
return `ERROR: unknown recipient "${to}" (no local org, no process on this machine, and no SSH remote configured for "${targetOrgName}")`;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const res = await fetch(`${remote.url}/api/xdeliver`, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
'Content-Type': 'application/json',
|
|
181
|
+
...(remote.credential ? { 'x-monomind-cred': remote.credential } : {}),
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify({ fromOrg, fromRole, toOrg: targetOrgName, toRole: targetRole, subject, body }),
|
|
184
|
+
signal: AbortSignal.timeout(10_000),
|
|
185
|
+
});
|
|
186
|
+
const data = await res.json().catch(() => ({}));
|
|
187
|
+
if (res.ok && data.ok) {
|
|
188
|
+
src?.bus.emit({ type: 'xorg', from: `${fromOrg}:${fromRole}`, to, subject, msg: body });
|
|
189
|
+
return data.receipt ?? `delivered to ${to} (remote)`;
|
|
190
|
+
}
|
|
191
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to, msg: `remote delivery rejected: ${data.error ?? res.status}`, reason: 'remote-delivery-rejected' });
|
|
192
|
+
return `ERROR: remote org "${to}" rejected delivery: ${data.error ?? res.status}`;
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
196
|
+
src?.bus.emit({ type: 'audit', from: fromRole, to, msg: `remote delivery failed: ${message}`, reason: 'remote-delivery-failed' });
|
|
197
|
+
return `ERROR: remote org "${targetOrgName}" unreachable: ${message}`;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/** Inbound handler for cross-process delivery — called by the server's POST /api/xdeliver route
|
|
201
|
+
* when ANOTHER process's deliverRemote() reaches this daemon. Pushes straight into the target
|
|
202
|
+
* agent's mailbox; the agent picks it up on its own next turn (see Mailbox — never interrupts). */
|
|
203
|
+
export function receiveRemote(daemon, toOrg, toRole, fromQualified, subject, body) {
|
|
204
|
+
const org = daemon.orgs.get(toOrg);
|
|
205
|
+
if (!org) {
|
|
206
|
+
// Org not running — queue the message and auto-wake if the def exists
|
|
207
|
+
if (daemon.hasOrgDef(toOrg)) {
|
|
208
|
+
const queued = queueMessage(daemon.root, toOrg, { fromQualified, toRole, subject, body, ts: Date.now() });
|
|
209
|
+
if (!queued) {
|
|
210
|
+
return { ok: false, error: `could not queue message for ${toOrg}:${toRole} (disk full or permissions)` };
|
|
211
|
+
}
|
|
212
|
+
daemon.autoWake(toOrg);
|
|
213
|
+
return { ok: true, receipt: `queued for ${toOrg}:${toRole} (org waking)` };
|
|
214
|
+
}
|
|
215
|
+
return { ok: false, error: `org "${toOrg}" not hosted here` };
|
|
216
|
+
}
|
|
217
|
+
// Lazy-spawn pending roles on cross-process delivery (matches deliver/answerQuestion)
|
|
218
|
+
// ATOMIC GUARD: Check spawning Set to prevent duplicate spawns from concurrent messages
|
|
219
|
+
const spawning = daemon.spawning.get(toOrg) ?? new Set();
|
|
220
|
+
daemon.spawning.set(toOrg, spawning);
|
|
221
|
+
if (!org.agents.has(toRole) && org.pendingRoles?.has(toRole) && !spawning.has(toRole)) {
|
|
222
|
+
const role = org.pendingRoles.get(toRole);
|
|
223
|
+
org.pendingRoles.delete(toRole);
|
|
224
|
+
spawning.add(toRole); // Mark as spawning before async work
|
|
225
|
+
// Resource gate check before spawning (prevents bypass in cross-process delivery)
|
|
226
|
+
const check = checkResources();
|
|
227
|
+
if (!check.ok) {
|
|
228
|
+
spawning.delete(toRole); // Clear spawning flag after check
|
|
229
|
+
org.bus.emit({ type: 'audit', from: toRole, reason: 'resource-pressure',
|
|
230
|
+
msg: `cross-process lazy spawn deferred: ${check.reason}` });
|
|
231
|
+
// B4 FIX: Queue the triggering message FIRST, then schedule spawn only if queue succeeds.
|
|
232
|
+
// This matches the pattern in deliver() and prevents message loss if queue fails.
|
|
233
|
+
const queued = queueMessage(daemon.root, toOrg, { fromQualified, toRole, subject, body, ts: Date.now() });
|
|
234
|
+
if (!queued) {
|
|
235
|
+
return { ok: false, error: `could not queue message for ${toOrg}:${toRole} (disk full or permissions)` };
|
|
236
|
+
}
|
|
237
|
+
daemon.scheduleDeferredSpawn(toOrg, org, role, org.spawnRole);
|
|
238
|
+
return { ok: true, receipt: `queued for ${toOrg}:${toRole} (role starting — waiting for resources)` };
|
|
239
|
+
}
|
|
240
|
+
org.spawnRole?.(role);
|
|
241
|
+
spawning.delete(toRole); // Clear spawning flag after spawn completes
|
|
242
|
+
org.bus.emit({ type: 'status', from: toRole, msg: `lazy-spawned on remote delivery from ${fromQualified}` });
|
|
243
|
+
}
|
|
244
|
+
const agent = org.agents.get(toRole);
|
|
245
|
+
if (!agent)
|
|
246
|
+
return { ok: false, error: `role "${toRole}" not found in org "${toOrg}"` };
|
|
247
|
+
if (agent.status === 'crashed')
|
|
248
|
+
return { ok: false, error: `role "${toRole}" in org "${toOrg}" crashed and will not recover this run` };
|
|
249
|
+
if (agent.mailbox.isClosed)
|
|
250
|
+
return { ok: false, error: `role "${toRole}" in org "${toOrg}" is shutting down` };
|
|
251
|
+
const messageEvent = org.bus.emit({ type: 'xorg', from: fromQualified, to: `${toOrg}:${toRole}`, subject, msg: body });
|
|
252
|
+
agent.lastMessageId = messageEvent.id; // Track last message ID for response threading
|
|
253
|
+
agent.mailbox.push(mailBody(daemon.root, toOrg, org, `[message from ${fromQualified}] subject: ${subject}`, body, messageEvent.id));
|
|
254
|
+
return { ok: true, receipt: `delivered to ${toOrg}:${toRole} (remote)` };
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=cross-org.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-org.js","sourceRoot":"","sources":["../../../src/orgrt/cross-org.ts"],"names":[],"mappings":"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"}
|