claudecode-omc 4.4.5 → 4.4.7
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/.mcp.json +2 -6
- package/README.es.md +64 -8
- package/README.ja.md +64 -8
- package/README.ko.md +64 -8
- package/README.pt.md +29 -0
- package/README.vi.md +29 -0
- package/README.zh.md +64 -8
- package/agents/architect.md +17 -7
- package/agents/code-reviewer.md +6 -7
- package/agents/critic.md +14 -1
- package/agents/deep-executor.md +6 -7
- package/agents/designer.md +6 -8
- package/agents/executor.md +6 -7
- package/agents/planner.md +21 -0
- package/agents/quality-reviewer.md +6 -7
- package/agents/security-reviewer.md +6 -7
- package/agents/test-engineer.md +6 -7
- package/bridge/mcp-server.cjs +517 -202
- package/bridge/runtime-cli.cjs +1550 -0
- package/bridge/team-bridge.cjs +362 -103
- package/bridge/{gemini-server.cjs → team-mcp.cjs} +10914 -10240
- package/dist/__tests__/auto-update.test.js +1 -1
- package/dist/__tests__/auto-update.test.js.map +1 -1
- package/dist/__tests__/cli-win32-warning.test.d.ts +2 -0
- package/dist/__tests__/cli-win32-warning.test.d.ts.map +1 -0
- package/dist/__tests__/cli-win32-warning.test.js +46 -0
- package/dist/__tests__/cli-win32-warning.test.js.map +1 -0
- package/dist/__tests__/codex-callsite-normalization.test.js +112 -0
- package/dist/__tests__/consensus-execution-handoff.test.d.ts +2 -0
- package/dist/__tests__/consensus-execution-handoff.test.d.ts.map +1 -1
- package/dist/__tests__/consensus-execution-handoff.test.js +48 -0
- package/dist/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/__tests__/context-safety.test.d.ts +2 -0
- package/dist/__tests__/context-safety.test.d.ts.map +1 -0
- package/dist/__tests__/context-safety.test.js +59 -0
- package/dist/__tests__/context-safety.test.js.map +1 -0
- package/dist/__tests__/hooks.test.js +15 -0
- package/dist/__tests__/hooks.test.js.map +1 -1
- package/dist/__tests__/hud/call-counts.test.js +0 -3
- package/dist/__tests__/hud/call-counts.test.js.map +1 -1
- package/dist/__tests__/hud/defaults.test.js +3 -5
- package/dist/__tests__/hud/defaults.test.js.map +1 -1
- package/dist/__tests__/hud/prompt-time.test.d.ts +2 -0
- package/dist/__tests__/hud/prompt-time.test.d.ts.map +1 -0
- package/dist/__tests__/hud/prompt-time.test.js +24 -0
- package/dist/__tests__/hud/prompt-time.test.js.map +1 -0
- package/dist/__tests__/hud/render.test.js +0 -1
- package/dist/__tests__/hud/render.test.js.map +1 -1
- package/dist/__tests__/hud/usage-api.test.js +5 -0
- package/dist/__tests__/hud/usage-api.test.js.map +1 -1
- package/dist/__tests__/hud/version-display.test.js +1 -0
- package/dist/__tests__/hud/version-display.test.js.map +1 -1
- package/dist/__tests__/hud/windows-platform.test.js +0 -4
- package/dist/__tests__/hud/windows-platform.test.js.map +1 -1
- package/dist/__tests__/hud-windows.test.js +5 -3
- package/dist/__tests__/hud-windows.test.js.map +1 -1
- package/dist/__tests__/installer-hud-skip.test.js +12 -2
- package/dist/__tests__/installer-hud-skip.test.js.map +1 -1
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/installer.test.js.map +1 -1
- package/dist/__tests__/job-management-sqlite.test.js +0 -15
- package/dist/__tests__/job-management-sqlite.test.js.map +1 -1
- package/dist/__tests__/job-management.test.js +0 -16
- package/dist/__tests__/job-management.test.js.map +1 -1
- package/dist/__tests__/load-agent-prompt.test.js +0 -23
- package/dist/__tests__/load-agent-prompt.test.js.map +1 -1
- package/dist/__tests__/model-routing.test.js +3 -2
- package/dist/__tests__/model-routing.test.js.map +1 -1
- package/dist/__tests__/omc-tools-server-interop.test.js +1 -1
- package/dist/__tests__/omc-tools-server-interop.test.js.map +1 -1
- package/dist/__tests__/pre-tool-enforcer.test.d.ts +2 -0
- package/dist/__tests__/pre-tool-enforcer.test.d.ts.map +1 -0
- package/dist/__tests__/pre-tool-enforcer.test.js +194 -0
- package/dist/__tests__/pre-tool-enforcer.test.js.map +1 -0
- package/dist/__tests__/prompt-injection.test.js +0 -26
- package/dist/__tests__/prompt-injection.test.js.map +1 -1
- package/dist/__tests__/purge-stale-cache.test.js +3 -2
- package/dist/__tests__/purge-stale-cache.test.js.map +1 -1
- package/dist/__tests__/run-cjs-graceful-fallback.test.d.ts +2 -0
- package/dist/__tests__/run-cjs-graceful-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/run-cjs-graceful-fallback.test.js +167 -0
- package/dist/__tests__/run-cjs-graceful-fallback.test.js.map +1 -0
- package/dist/__tests__/session-start-cache-cleanup.test.d.ts +2 -0
- package/dist/__tests__/session-start-cache-cleanup.test.d.ts.map +1 -0
- package/dist/__tests__/session-start-cache-cleanup.test.js +150 -0
- package/dist/__tests__/session-start-cache-cleanup.test.js.map +1 -0
- package/dist/__tests__/skills.test.js +7 -10
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/__tests__/team-server-validation.test.d.ts +2 -0
- package/dist/__tests__/team-server-validation.test.d.ts.map +1 -0
- package/dist/__tests__/team-server-validation.test.js +122 -0
- package/dist/__tests__/team-server-validation.test.js.map +1 -0
- package/dist/agents/index.d.ts +0 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +0 -2
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/prompt-helpers.d.ts +74 -0
- package/dist/agents/prompt-helpers.d.ts.map +1 -0
- package/dist/agents/prompt-helpers.js +187 -0
- package/dist/agents/prompt-helpers.js.map +1 -0
- package/dist/agents/utils.d.ts +1 -5
- package/dist/agents/utils.d.ts.map +1 -1
- package/dist/agents/utils.js +1 -34
- package/dist/agents/utils.js.map +1 -1
- package/dist/cli/__tests__/launch.test.d.ts +1 -2
- package/dist/cli/__tests__/launch.test.d.ts.map +1 -1
- package/dist/cli/__tests__/launch.test.js +442 -48
- package/dist/cli/__tests__/launch.test.js.map +1 -1
- package/dist/cli/__tests__/teleport-help.test.d.ts +2 -0
- package/dist/cli/__tests__/teleport-help.test.d.ts.map +1 -0
- package/dist/cli/__tests__/teleport-help.test.js +17 -0
- package/dist/cli/__tests__/teleport-help.test.js.map +1 -0
- package/dist/cli/commands/teleport.d.ts +2 -1
- package/dist/cli/commands/teleport.d.ts.map +1 -1
- package/dist/cli/commands/teleport.js +6 -3
- package/dist/cli/commands/teleport.js.map +1 -1
- package/dist/cli/index.js +40 -290
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/launch.d.ts +83 -3
- package/dist/cli/launch.d.ts.map +1 -1
- package/dist/cli/launch.js +213 -48
- package/dist/cli/launch.js.map +1 -1
- package/dist/cli/win32-warning.d.ts +6 -0
- package/dist/cli/win32-warning.d.ts.map +1 -0
- package/dist/cli/win32-warning.js +15 -0
- package/dist/cli/win32-warning.js.map +1 -0
- package/dist/config/loader.d.ts +9 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +29 -19
- package/dist/config/loader.js.map +1 -1
- package/dist/config/models.d.ts +33 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +49 -0
- package/dist/config/models.js.map +1 -0
- package/dist/constants/names.d.ts +2 -0
- package/dist/constants/names.d.ts.map +1 -1
- package/dist/constants/names.js +2 -0
- package/dist/constants/names.js.map +1 -1
- package/dist/features/auto-update.d.ts.map +1 -1
- package/dist/features/auto-update.js +21 -11
- package/dist/features/auto-update.js.map +1 -1
- package/dist/features/background-agent/manager.d.ts.map +1 -1
- package/dist/features/background-agent/manager.js +1 -2
- package/dist/features/background-agent/manager.js.map +1 -1
- package/dist/features/boulder-state/storage.d.ts.map +1 -1
- package/dist/features/boulder-state/storage.js +9 -5
- package/dist/features/boulder-state/storage.js.map +1 -1
- package/dist/features/boulder-state/types.d.ts +4 -0
- package/dist/features/boulder-state/types.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.js +25 -78
- package/dist/features/builtin-skills/skills.js.map +1 -1
- package/dist/features/delegation-enforcer.d.ts.map +1 -1
- package/dist/features/delegation-enforcer.js +4 -1
- package/dist/features/delegation-enforcer.js.map +1 -1
- package/dist/features/delegation-routing/__tests__/resolver.test.js +47 -122
- package/dist/features/delegation-routing/__tests__/resolver.test.js.map +1 -1
- package/dist/features/delegation-routing/resolver.d.ts.map +1 -1
- package/dist/features/delegation-routing/resolver.js +24 -47
- package/dist/features/delegation-routing/resolver.js.map +1 -1
- package/dist/features/delegation-routing/types.d.ts.map +1 -1
- package/dist/features/delegation-routing/types.js +2 -0
- package/dist/features/delegation-routing/types.js.map +1 -1
- package/dist/features/model-routing/external-model-policy.d.ts.map +1 -1
- package/dist/features/model-routing/external-model-policy.js.map +1 -1
- package/dist/features/model-routing/router.d.ts.map +1 -1
- package/dist/features/model-routing/router.js +12 -2
- package/dist/features/model-routing/router.js.map +1 -1
- package/dist/features/model-routing/types.d.ts +5 -1
- package/dist/features/model-routing/types.d.ts.map +1 -1
- package/dist/features/model-routing/types.js +7 -6
- package/dist/features/model-routing/types.js.map +1 -1
- package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
- package/dist/features/rate-limit-wait/daemon.js +40 -4
- package/dist/features/rate-limit-wait/daemon.js.map +1 -1
- package/dist/features/task-decomposer/index.js +14 -4
- package/dist/features/task-decomposer/index.js.map +1 -1
- package/dist/hooks/__tests__/bridge-openclaw.test.d.ts +2 -0
- package/dist/hooks/__tests__/bridge-openclaw.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/bridge-openclaw.test.js +124 -0
- package/dist/hooks/__tests__/bridge-openclaw.test.js.map +1 -0
- package/dist/hooks/__tests__/bridge-security.test.js +1 -1
- package/dist/hooks/__tests__/bridge-security.test.js.map +1 -1
- package/dist/hooks/auto-slash-command/executor.d.ts.map +1 -1
- package/dist/hooks/auto-slash-command/executor.js +38 -61
- package/dist/hooks/auto-slash-command/executor.js.map +1 -1
- package/dist/hooks/bridge.d.ts +11 -0
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +154 -82
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/comment-checker/index.d.ts.map +1 -1
- package/dist/hooks/comment-checker/index.js +3 -1
- package/dist/hooks/comment-checker/index.js.map +1 -1
- package/dist/hooks/conductor/__tests__/state.test.js +4 -2
- package/dist/hooks/conductor/__tests__/state.test.js.map +1 -1
- package/dist/hooks/keyword-detector/__tests__/index.test.js +348 -1
- package/dist/hooks/keyword-detector/__tests__/index.test.js.map +1 -1
- package/dist/hooks/keyword-detector/index.d.ts +29 -0
- package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
- package/dist/hooks/keyword-detector/index.js +123 -1
- package/dist/hooks/keyword-detector/index.js.map +1 -1
- package/dist/hooks/learner/bridge.d.ts.map +1 -1
- package/dist/hooks/learner/bridge.js +19 -4
- package/dist/hooks/learner/bridge.js.map +1 -1
- package/dist/hooks/learner/finder.d.ts.map +1 -1
- package/dist/hooks/learner/finder.js +19 -4
- package/dist/hooks/learner/finder.js.map +1 -1
- package/dist/hooks/mode-registry/__tests__/session-isolation.test.js +40 -0
- package/dist/hooks/mode-registry/__tests__/session-isolation.test.js.map +1 -1
- package/dist/hooks/mode-registry/index.d.ts.map +1 -1
- package/dist/hooks/mode-registry/index.js +135 -52
- package/dist/hooks/mode-registry/index.js.map +1 -1
- package/dist/hooks/notepad/index.d.ts.map +1 -1
- package/dist/hooks/notepad/index.js +5 -3
- package/dist/hooks/notepad/index.js.map +1 -1
- package/dist/hooks/persistent-mode/__tests__/cancel-race.test.d.ts +2 -0
- package/dist/hooks/persistent-mode/__tests__/cancel-race.test.d.ts.map +1 -0
- package/dist/hooks/persistent-mode/__tests__/cancel-race.test.js +73 -0
- package/dist/hooks/persistent-mode/__tests__/cancel-race.test.js.map +1 -0
- package/dist/hooks/persistent-mode/__tests__/idle-cooldown.test.js +89 -13
- package/dist/hooks/persistent-mode/__tests__/idle-cooldown.test.js.map +1 -1
- package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.d.ts +2 -0
- package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.d.ts.map +1 -0
- package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.js +156 -0
- package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.js.map +1 -0
- package/dist/hooks/persistent-mode/idle-cooldown.test.d.ts +2 -3
- package/dist/hooks/persistent-mode/idle-cooldown.test.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/idle-cooldown.test.js +19 -4
- package/dist/hooks/persistent-mode/idle-cooldown.test.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts +2 -2
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js +144 -26
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
- package/dist/hooks/plugin-patterns/index.js +22 -31
- package/dist/hooks/plugin-patterns/index.js.map +1 -1
- package/dist/hooks/pre-compact/index.js +1 -1
- package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
- package/dist/hooks/preemptive-compaction/index.js +3 -1
- package/dist/hooks/preemptive-compaction/index.js.map +1 -1
- package/dist/hooks/project-memory/index.d.ts.map +1 -1
- package/dist/hooks/project-memory/index.js +9 -0
- package/dist/hooks/project-memory/index.js.map +1 -1
- package/dist/hooks/project-memory/learner.d.ts.map +1 -1
- package/dist/hooks/project-memory/learner.js +107 -85
- package/dist/hooks/project-memory/learner.js.map +1 -1
- package/dist/hooks/project-memory/storage.d.ts.map +1 -1
- package/dist/hooks/project-memory/storage.js +3 -2
- package/dist/hooks/project-memory/storage.js.map +1 -1
- package/dist/hooks/recovery/context-window.d.ts +4 -0
- package/dist/hooks/recovery/context-window.d.ts.map +1 -1
- package/dist/hooks/recovery/context-window.js +22 -1
- package/dist/hooks/recovery/context-window.js.map +1 -1
- package/dist/hooks/recovery/session-recovery.js +1 -1
- package/dist/hooks/recovery/session-recovery.js.map +1 -1
- package/dist/hooks/session-end/index.d.ts.map +1 -1
- package/dist/hooks/session-end/index.js +13 -22
- package/dist/hooks/session-end/index.js.map +1 -1
- package/dist/hooks/setup/__tests__/windows-patch.test.d.ts +2 -0
- package/dist/hooks/setup/__tests__/windows-patch.test.d.ts.map +1 -0
- package/dist/hooks/setup/__tests__/windows-patch.test.js +110 -0
- package/dist/hooks/setup/__tests__/windows-patch.test.js.map +1 -0
- package/dist/hooks/setup/index.d.ts +18 -0
- package/dist/hooks/setup/index.d.ts.map +1 -1
- package/dist/hooks/setup/index.js +59 -1
- package/dist/hooks/setup/index.js.map +1 -1
- package/dist/hooks/skill-bridge.cjs +17 -3
- package/dist/hooks/skill-state/__tests__/skill-state.test.d.ts +2 -0
- package/dist/hooks/skill-state/__tests__/skill-state.test.d.ts.map +1 -0
- package/dist/hooks/skill-state/__tests__/skill-state.test.js +301 -0
- package/dist/hooks/skill-state/__tests__/skill-state.test.js.map +1 -0
- package/dist/hooks/skill-state/index.d.ts +79 -0
- package/dist/hooks/skill-state/index.d.ts.map +1 -0
- package/dist/hooks/skill-state/index.js +245 -0
- package/dist/hooks/skill-state/index.js.map +1 -0
- package/dist/hooks/team-pipeline/state.d.ts.map +1 -1
- package/dist/hooks/team-pipeline/state.js +5 -0
- package/dist/hooks/team-pipeline/state.js.map +1 -1
- package/dist/hooks/todo-continuation/index.d.ts +17 -0
- package/dist/hooks/todo-continuation/index.d.ts.map +1 -1
- package/dist/hooks/todo-continuation/index.js +44 -2
- package/dist/hooks/todo-continuation/index.js.map +1 -1
- package/dist/hud/elements/call-counts.d.ts.map +1 -1
- package/dist/hud/elements/call-counts.js +6 -4
- package/dist/hud/elements/call-counts.js.map +1 -1
- package/dist/hud/elements/index.d.ts +1 -0
- package/dist/hud/elements/index.d.ts.map +1 -1
- package/dist/hud/elements/index.js +1 -0
- package/dist/hud/elements/index.js.map +1 -1
- package/dist/hud/elements/prompt-time.d.ts +13 -0
- package/dist/hud/elements/prompt-time.d.ts.map +1 -0
- package/dist/hud/elements/prompt-time.js +21 -0
- package/dist/hud/elements/prompt-time.js.map +1 -0
- package/dist/hud/index.d.ts +2 -1
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +40 -215
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +7 -108
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +4 -3
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/stdin.d.ts +10 -0
- package/dist/hud/stdin.d.ts.map +1 -1
- package/dist/hud/stdin.js +43 -0
- package/dist/hud/stdin.js.map +1 -1
- package/dist/hud/types.d.ts +6 -18
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +6 -46
- package/dist/hud/types.js.map +1 -1
- package/dist/hud/usage-api.d.ts.map +1 -1
- package/dist/hud/usage-api.js +12 -0
- package/dist/hud/usage-api.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -11
- package/dist/index.js.map +1 -1
- package/dist/installer/hooks.d.ts +5 -0
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +8 -0
- package/dist/installer/hooks.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +26 -11
- package/dist/installer/index.js.map +1 -1
- package/dist/interop/omx-team-state.d.ts.map +1 -1
- package/dist/interop/omx-team-state.js +38 -6
- package/dist/interop/omx-team-state.js.map +1 -1
- package/dist/interop/shared-state.d.ts.map +1 -1
- package/dist/interop/shared-state.js +58 -7
- package/dist/interop/shared-state.js.map +1 -1
- package/dist/lib/__tests__/worktree-paths.test.js +250 -1
- package/dist/lib/__tests__/worktree-paths.test.js.map +1 -1
- package/dist/lib/job-state-db.d.ts +150 -0
- package/dist/lib/job-state-db.d.ts.map +1 -0
- package/dist/lib/job-state-db.js +650 -0
- package/dist/lib/job-state-db.js.map +1 -0
- package/dist/lib/mode-names.d.ts +46 -0
- package/dist/lib/mode-names.d.ts.map +1 -0
- package/dist/lib/mode-names.js +73 -0
- package/dist/lib/mode-names.js.map +1 -0
- package/dist/lib/session-isolation.d.ts +32 -0
- package/dist/lib/session-isolation.d.ts.map +1 -0
- package/dist/lib/session-isolation.js +39 -0
- package/dist/lib/session-isolation.js.map +1 -0
- package/dist/lib/worktree-paths.d.ts +38 -8
- package/dist/lib/worktree-paths.d.ts.map +1 -1
- package/dist/lib/worktree-paths.js +124 -56
- package/dist/lib/worktree-paths.js.map +1 -1
- package/dist/mcp/__tests__/team-cleanup.test.d.ts +11 -0
- package/dist/mcp/__tests__/team-cleanup.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/team-cleanup.test.js +228 -0
- package/dist/mcp/__tests__/team-cleanup.test.js.map +1 -0
- package/dist/mcp/cli-detection.d.ts +4 -8
- package/dist/mcp/cli-detection.d.ts.map +1 -1
- package/dist/mcp/cli-detection.js +5 -8
- package/dist/mcp/cli-detection.js.map +1 -1
- package/dist/mcp/codex-request-normalizer.js +59 -0
- package/dist/mcp/codex-server.js +16 -4
- package/dist/mcp/codex-standalone-server.js +13 -4
- package/dist/mcp/index.d.ts +2 -4
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -5
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/job-management.d.ts.map +1 -1
- package/dist/mcp/job-management.js +11 -9
- package/dist/mcp/job-management.js.map +1 -1
- package/dist/mcp/job-state-db.d.ts +1 -149
- package/dist/mcp/job-state-db.d.ts.map +1 -1
- package/dist/mcp/job-state-db.js +2 -649
- package/dist/mcp/job-state-db.js.map +1 -1
- package/dist/mcp/mcp-config.d.ts +1 -1
- package/dist/mcp/mcp-config.js +1 -1
- package/dist/mcp/prompt-injection.d.ts +14 -76
- package/dist/mcp/prompt-injection.d.ts.map +1 -1
- package/dist/mcp/prompt-injection.js +34 -175
- package/dist/mcp/prompt-injection.js.map +1 -1
- package/dist/mcp/standalone-server.js +2 -0
- package/dist/mcp/standalone-server.js.map +1 -1
- package/dist/mcp/team-server.d.ts +16 -0
- package/dist/mcp/team-server.d.ts.map +1 -0
- package/dist/mcp/team-server.js +356 -0
- package/dist/mcp/team-server.js.map +1 -0
- package/dist/notifications/__tests__/formatter.test.js +62 -0
- package/dist/notifications/__tests__/formatter.test.js.map +1 -1
- package/dist/notifications/__tests__/hook-config.test.d.ts +14 -0
- package/dist/notifications/__tests__/hook-config.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/hook-config.test.js +210 -0
- package/dist/notifications/__tests__/hook-config.test.js.map +1 -0
- package/dist/notifications/__tests__/platform-gating.test.d.ts +12 -0
- package/dist/notifications/__tests__/platform-gating.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/platform-gating.test.js +140 -0
- package/dist/notifications/__tests__/platform-gating.test.js.map +1 -0
- package/dist/notifications/__tests__/template-engine.test.d.ts +13 -0
- package/dist/notifications/__tests__/template-engine.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/template-engine.test.js +378 -0
- package/dist/notifications/__tests__/template-engine.test.js.map +1 -0
- package/dist/notifications/config.d.ts.map +1 -1
- package/dist/notifications/config.js +54 -18
- package/dist/notifications/config.js.map +1 -1
- package/dist/notifications/dispatcher.d.ts +2 -2
- package/dist/notifications/dispatcher.d.ts.map +1 -1
- package/dist/notifications/dispatcher.js +10 -6
- package/dist/notifications/dispatcher.js.map +1 -1
- package/dist/notifications/formatter.d.ts.map +1 -1
- package/dist/notifications/formatter.js +22 -0
- package/dist/notifications/formatter.js.map +1 -1
- package/dist/notifications/hook-config-types.d.ts +44 -0
- package/dist/notifications/hook-config-types.d.ts.map +1 -0
- package/dist/notifications/hook-config-types.js +8 -0
- package/dist/notifications/hook-config-types.js.map +1 -0
- package/dist/notifications/hook-config.d.ts +36 -0
- package/dist/notifications/hook-config.d.ts.map +1 -0
- package/dist/notifications/hook-config.js +95 -0
- package/dist/notifications/hook-config.js.map +1 -0
- package/dist/notifications/index.d.ts +3 -0
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +31 -3
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/reply-listener.d.ts.map +1 -1
- package/dist/notifications/reply-listener.js +1 -0
- package/dist/notifications/reply-listener.js.map +1 -1
- package/dist/notifications/session-registry.d.ts.map +1 -1
- package/dist/notifications/session-registry.js +13 -5
- package/dist/notifications/session-registry.js.map +1 -1
- package/dist/notifications/template-engine.d.ts +34 -0
- package/dist/notifications/template-engine.d.ts.map +1 -0
- package/dist/notifications/template-engine.js +248 -0
- package/dist/notifications/template-engine.js.map +1 -0
- package/dist/notifications/types.d.ts +0 -2
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/openclaw/__tests__/config.test.d.ts +2 -0
- package/dist/openclaw/__tests__/config.test.d.ts.map +1 -0
- package/dist/openclaw/__tests__/config.test.js +200 -0
- package/dist/openclaw/__tests__/config.test.js.map +1 -0
- package/dist/openclaw/__tests__/dispatcher.test.d.ts +2 -0
- package/dist/openclaw/__tests__/dispatcher.test.d.ts.map +1 -0
- package/dist/openclaw/__tests__/dispatcher.test.js +348 -0
- package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -0
- package/dist/openclaw/__tests__/index.test.d.ts +2 -0
- package/dist/openclaw/__tests__/index.test.d.ts.map +1 -0
- package/dist/openclaw/__tests__/index.test.js +235 -0
- package/dist/openclaw/__tests__/index.test.js.map +1 -0
- package/dist/openclaw/config.d.ts +33 -0
- package/dist/openclaw/config.d.ts.map +1 -0
- package/dist/openclaw/config.js +83 -0
- package/dist/openclaw/config.js.map +1 -0
- package/dist/openclaw/dispatcher.d.ts +47 -0
- package/dist/openclaw/dispatcher.d.ts.map +1 -0
- package/dist/openclaw/dispatcher.js +138 -0
- package/dist/openclaw/dispatcher.js.map +1 -0
- package/dist/openclaw/index.d.ts +25 -0
- package/dist/openclaw/index.d.ts.map +1 -0
- package/dist/openclaw/index.js +132 -0
- package/dist/openclaw/index.js.map +1 -0
- package/dist/openclaw/types.d.ts +102 -0
- package/dist/openclaw/types.d.ts.map +1 -0
- package/dist/openclaw/types.js +8 -0
- package/dist/openclaw/types.js.map +1 -0
- package/dist/platform/index.d.ts +5 -0
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +17 -0
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/process-utils.d.ts.map +1 -1
- package/dist/platform/process-utils.js +55 -9
- package/dist/platform/process-utils.js.map +1 -1
- package/dist/shared/types.d.ts +7 -5
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/team/__tests__/bridge-integration.test.js +10 -8
- package/dist/team/__tests__/bridge-integration.test.js.map +1 -1
- package/dist/team/__tests__/edge-cases.test.js +40 -29
- package/dist/team/__tests__/edge-cases.test.js.map +1 -1
- package/dist/team/__tests__/idle-nudge.test.d.ts +11 -0
- package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
- package/dist/team/__tests__/idle-nudge.test.js +282 -0
- package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
- package/dist/team/__tests__/mcp-team-bridge.spawn-args.test.js +2 -2
- package/dist/team/__tests__/mcp-team-bridge.spawn-args.test.js.map +1 -1
- package/dist/team/__tests__/mcp-team-bridge.usage.test.d.ts +2 -0
- package/dist/team/__tests__/mcp-team-bridge.usage.test.d.ts.map +1 -0
- package/dist/team/__tests__/mcp-team-bridge.usage.test.js +49 -0
- package/dist/team/__tests__/mcp-team-bridge.usage.test.js.map +1 -0
- package/dist/team/__tests__/merge-coordinator.test.js +1 -1
- package/dist/team/__tests__/merge-coordinator.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.d.ts +2 -0
- package/dist/team/__tests__/model-contract.test.d.ts.map +1 -0
- package/dist/team/__tests__/model-contract.test.js +121 -0
- package/dist/team/__tests__/model-contract.test.js.map +1 -0
- package/dist/team/__tests__/phase-controller.test.d.ts +2 -0
- package/dist/team/__tests__/phase-controller.test.d.ts.map +1 -0
- package/dist/team/__tests__/phase-controller.test.js +45 -0
- package/dist/team/__tests__/phase-controller.test.js.map +1 -0
- package/dist/team/__tests__/runtime-assign.test.d.ts +2 -0
- package/dist/team/__tests__/runtime-assign.test.d.ts.map +1 -0
- package/dist/team/__tests__/runtime-assign.test.js +43 -0
- package/dist/team/__tests__/runtime-assign.test.js.map +1 -0
- package/dist/team/__tests__/runtime-gemini-prompt.test.d.ts +2 -0
- package/dist/team/__tests__/runtime-gemini-prompt.test.d.ts.map +1 -0
- package/dist/team/__tests__/runtime-gemini-prompt.test.js +153 -0
- package/dist/team/__tests__/runtime-gemini-prompt.test.js.map +1 -0
- package/dist/team/__tests__/runtime-prompt-mode.test.d.ts +2 -0
- package/dist/team/__tests__/runtime-prompt-mode.test.d.ts.map +1 -0
- package/dist/team/__tests__/runtime-prompt-mode.test.js +162 -0
- package/dist/team/__tests__/runtime-prompt-mode.test.js.map +1 -0
- package/dist/team/__tests__/runtime.test.d.ts +2 -0
- package/dist/team/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/team/__tests__/runtime.test.js +37 -0
- package/dist/team/__tests__/runtime.test.js.map +1 -0
- package/dist/team/__tests__/task-file-ops.test.js +63 -59
- package/dist/team/__tests__/task-file-ops.test.js.map +1 -1
- package/dist/team/__tests__/team-name.test.d.ts +2 -0
- package/dist/team/__tests__/team-name.test.d.ts.map +1 -0
- package/dist/team/__tests__/team-name.test.js +18 -0
- package/dist/team/__tests__/team-name.test.js.map +1 -0
- package/dist/team/__tests__/team-status.test.js +52 -6
- package/dist/team/__tests__/team-status.test.js.map +1 -1
- package/dist/team/__tests__/tmux-comm.test.d.ts +2 -0
- package/dist/team/__tests__/tmux-comm.test.d.ts.map +1 -0
- package/dist/team/__tests__/tmux-comm.test.js +26 -0
- package/dist/team/__tests__/tmux-comm.test.js.map +1 -0
- package/dist/team/__tests__/tmux-session.create-team.test.d.ts +2 -0
- package/dist/team/__tests__/tmux-session.create-team.test.d.ts.map +1 -0
- package/dist/team/__tests__/tmux-session.create-team.test.js +104 -0
- package/dist/team/__tests__/tmux-session.create-team.test.js.map +1 -0
- package/dist/team/__tests__/tmux-session.spawn.test.d.ts +2 -0
- package/dist/team/__tests__/tmux-session.spawn.test.d.ts.map +1 -0
- package/dist/team/__tests__/tmux-session.spawn.test.js +61 -0
- package/dist/team/__tests__/tmux-session.spawn.test.js.map +1 -0
- package/dist/team/__tests__/tmux-session.test.js +161 -2
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.d.ts +2 -0
- package/dist/team/__tests__/worker-bootstrap.test.d.ts.map +1 -0
- package/dist/team/__tests__/worker-bootstrap.test.js +58 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -0
- package/dist/team/bridge-entry.d.ts.map +1 -1
- package/dist/team/bridge-entry.js +4 -0
- package/dist/team/bridge-entry.js.map +1 -1
- package/dist/team/capabilities.d.ts.map +1 -1
- package/dist/team/capabilities.js +3 -0
- package/dist/team/capabilities.js.map +1 -1
- package/dist/team/cli-detection.d.ts +9 -0
- package/dist/team/cli-detection.d.ts.map +1 -0
- package/dist/team/cli-detection.js +29 -0
- package/dist/team/cli-detection.js.map +1 -0
- package/dist/team/fs-utils.d.ts.map +1 -1
- package/dist/team/fs-utils.js +25 -4
- package/dist/team/fs-utils.js.map +1 -1
- package/dist/team/idle-nudge.d.ts +53 -0
- package/dist/team/idle-nudge.d.ts.map +1 -0
- package/dist/team/idle-nudge.js +124 -0
- package/dist/team/idle-nudge.js.map +1 -0
- package/dist/team/inbox-outbox.d.ts.map +1 -1
- package/dist/team/inbox-outbox.js +7 -3
- package/dist/team/inbox-outbox.js.map +1 -1
- package/dist/team/index.d.ts +14 -1
- package/dist/team/index.d.ts.map +1 -1
- package/dist/team/index.js +12 -1
- package/dist/team/index.js.map +1 -1
- package/dist/team/mcp-team-bridge.d.ts +9 -0
- package/dist/team/mcp-team-bridge.d.ts.map +1 -1
- package/dist/team/mcp-team-bridge.js +82 -3
- package/dist/team/mcp-team-bridge.js.map +1 -1
- package/dist/team/model-contract.d.ts +37 -0
- package/dist/team/model-contract.d.ts.map +1 -0
- package/dist/team/model-contract.js +139 -0
- package/dist/team/model-contract.js.map +1 -0
- package/dist/team/phase-controller.d.ts +33 -0
- package/dist/team/phase-controller.d.ts.map +1 -0
- package/dist/team/phase-controller.js +79 -0
- package/dist/team/phase-controller.js.map +1 -0
- package/dist/team/runtime-cli.d.ts +9 -0
- package/dist/team/runtime-cli.d.ts.map +1 -0
- package/dist/team/runtime-cli.js +188 -0
- package/dist/team/runtime-cli.js.map +1 -0
- package/dist/team/runtime.d.ts +95 -0
- package/dist/team/runtime.d.ts.map +1 -0
- package/dist/team/runtime.js +692 -0
- package/dist/team/runtime.js.map +1 -0
- package/dist/team/state-paths.d.ts +72 -0
- package/dist/team/state-paths.d.ts.map +1 -0
- package/dist/team/state-paths.js +87 -0
- package/dist/team/state-paths.js.map +1 -0
- package/dist/team/task-file-ops.d.ts +27 -7
- package/dist/team/task-file-ops.d.ts.map +1 -1
- package/dist/team/task-file-ops.js +116 -55
- package/dist/team/task-file-ops.js.map +1 -1
- package/dist/team/team-name.d.ts +2 -0
- package/dist/team/team-name.d.ts.map +1 -0
- package/dist/team/team-name.js +8 -0
- package/dist/team/team-name.js.map +1 -0
- package/dist/team/team-registration.d.ts +1 -1
- package/dist/team/team-registration.d.ts.map +1 -1
- package/dist/team/team-registration.js.map +1 -1
- package/dist/team/team-status.d.ts +11 -1
- package/dist/team/team-status.d.ts.map +1 -1
- package/dist/team/team-status.js +32 -3
- package/dist/team/team-status.js.map +1 -1
- package/dist/team/tmux-comm.d.ts +36 -0
- package/dist/team/tmux-comm.d.ts.map +1 -0
- package/dist/team/tmux-comm.js +115 -0
- package/dist/team/tmux-comm.js.map +1 -0
- package/dist/team/tmux-session.d.ts +92 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +533 -2
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/types.d.ts +10 -3
- package/dist/team/types.d.ts.map +1 -1
- package/dist/team/unified-team.d.ts.map +1 -1
- package/dist/team/unified-team.js +13 -3
- package/dist/team/unified-team.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +39 -0
- package/dist/team/worker-bootstrap.d.ts.map +1 -0
- package/dist/team/worker-bootstrap.js +117 -0
- package/dist/team/worker-bootstrap.js.map +1 -0
- package/dist/team/worker-health.d.ts.map +1 -1
- package/dist/team/worker-health.js +15 -3
- package/dist/team/worker-health.js.map +1 -1
- package/dist/tools/ast-tools.js +1 -1
- package/dist/tools/ast-tools.js.map +1 -1
- package/dist/tools/diagnostics/lsp-aggregator.d.ts.map +1 -1
- package/dist/tools/diagnostics/lsp-aggregator.js +4 -2
- package/dist/tools/diagnostics/lsp-aggregator.js.map +1 -1
- package/dist/tools/lsp/__tests__/client-handle-data.test.d.ts +2 -0
- package/dist/tools/lsp/__tests__/client-handle-data.test.d.ts.map +1 -0
- package/dist/tools/lsp/__tests__/client-handle-data.test.js +138 -0
- package/dist/tools/lsp/__tests__/client-handle-data.test.js.map +1 -0
- package/dist/tools/lsp/client.d.ts +13 -0
- package/dist/tools/lsp/client.d.ts.map +1 -1
- package/dist/tools/lsp/client.js +64 -8
- package/dist/tools/lsp/client.js.map +1 -1
- package/dist/tools/lsp/servers.d.ts.map +1 -1
- package/dist/tools/lsp/servers.js +4 -9
- package/dist/tools/lsp/servers.js.map +1 -1
- package/dist/tools/lsp-tools.d.ts.map +1 -1
- package/dist/tools/lsp-tools.js +4 -0
- package/dist/tools/lsp-tools.js.map +1 -1
- package/dist/tools/python-repl/bridge-manager.d.ts.map +1 -1
- package/dist/tools/python-repl/bridge-manager.js +15 -1
- package/dist/tools/python-repl/bridge-manager.js.map +1 -1
- package/dist/tools/python-repl/session-lock.d.ts.map +1 -1
- package/dist/tools/python-repl/session-lock.js +35 -15
- package/dist/tools/python-repl/session-lock.js.map +1 -1
- package/dist/tools/state-tools.d.ts.map +1 -1
- package/dist/tools/state-tools.js +10 -0
- package/dist/tools/state-tools.js.map +1 -1
- package/dist/utils/__tests__/frontmatter.test.d.ts +2 -0
- package/dist/utils/__tests__/frontmatter.test.d.ts.map +1 -0
- package/dist/utils/__tests__/frontmatter.test.js +147 -0
- package/dist/utils/__tests__/frontmatter.test.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +24 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +62 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +4 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/string-width.d.ts.map +1 -1
- package/dist/utils/string-width.js +15 -4
- package/dist/utils/string-width.js.map +1 -1
- package/dist/verification/tier-selector.js +1 -1
- package/dist/verification/tier-selector.js.map +1 -1
- package/docs/AGENTS.md +4 -2
- package/docs/CLAUDE.md +8 -48
- package/docs/MIGRATION.md +114 -0
- package/docs/REFERENCE.md +35 -102
- package/hooks/hooks.json +23 -23
- package/package.json +8 -8
- package/scripts/build-runtime-cli.mjs +24 -0
- package/scripts/build-team-server.mjs +28 -0
- package/scripts/cleanup-orphans.mjs +22 -5
- package/scripts/context-safety.mjs +5 -1
- package/scripts/demo-team.mjs +26 -0
- package/scripts/keyword-detector.mjs +6 -76
- package/scripts/openclaw-gateway-demo.mjs +168 -0
- package/scripts/persistent-mode.cjs +30 -4
- package/scripts/persistent-mode.mjs +48 -3
- package/scripts/plugin-setup.mjs +66 -3
- package/scripts/post-tool-use-failure.mjs +20 -2
- package/scripts/post-tool-verifier.mjs +57 -6
- package/scripts/pre-tool-enforcer.mjs +125 -5
- package/scripts/run.cjs +114 -0
- package/scripts/session-start.mjs +56 -7
- package/scripts/status.mjs +144 -0
- package/scripts/test-codex-gemini-team.mjs +78 -0
- package/skills/AGENTS.md +5 -2
- package/skills/analyze/SKILL.md +5 -11
- package/skills/autopilot/SKILL.md +5 -6
- package/skills/ccg/SKILL.md +88 -99
- package/skills/configure-notifications/SKILL.md +177 -0
- package/skills/configure-openclaw/SKILL.md +320 -0
- package/skills/external-context/SKILL.md +7 -83
- package/skills/hud/SKILL.md +68 -46
- package/skills/omc-setup/SKILL.md +58 -19
- package/skills/omc-teams/SKILL.md +178 -0
- package/skills/pipeline/SKILL.md +4 -4
- package/skills/plan/SKILL.md +28 -16
- package/skills/ralph/SKILL.md +3 -4
- package/skills/ralph-init/SKILL.md +3 -1
- package/skills/ralplan/SKILL.md +93 -8
- package/skills/security-review/SKILL.md +5 -6
- package/skills/tdd/SKILL.md +5 -6
- package/skills/team/SKILL.md +35 -34
- package/templates/hooks/keyword-detector.mjs +11 -82
- package/templates/hooks/persistent-mode.mjs +120 -3
- package/templates/hooks/post-tool-use-failure.mjs +20 -2
- package/templates/hooks/session-start.mjs +2 -16
- package/dist/__tests__/analytics/backfill-dedup.test.d.ts +0 -2
- package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/backfill-dedup.test.js +0 -179
- package/dist/__tests__/analytics/backfill-dedup.test.js.map +0 -1
- package/dist/__tests__/analytics/backfill-engine.test.d.ts +0 -2
- package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/backfill-engine.test.js +0 -362
- package/dist/__tests__/analytics/backfill-engine.test.js.map +0 -1
- package/dist/__tests__/analytics/output-estimator.test.d.ts +0 -2
- package/dist/__tests__/analytics/output-estimator.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/output-estimator.test.js +0 -124
- package/dist/__tests__/analytics/output-estimator.test.js.map +0 -1
- package/dist/__tests__/analytics/token-extractor.test.d.ts +0 -2
- package/dist/__tests__/analytics/token-extractor.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/token-extractor.test.js +0 -165
- package/dist/__tests__/analytics/token-extractor.test.js.map +0 -1
- package/dist/__tests__/analytics/token-tracker.test.d.ts +0 -2
- package/dist/__tests__/analytics/token-tracker.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/token-tracker.test.js +0 -189
- package/dist/__tests__/analytics/token-tracker.test.js.map +0 -1
- package/dist/__tests__/analytics/tokscale-adapter.test.d.ts +0 -2
- package/dist/__tests__/analytics/tokscale-adapter.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/tokscale-adapter.test.js +0 -79
- package/dist/__tests__/analytics/tokscale-adapter.test.js.map +0 -1
- package/dist/__tests__/analytics/transcript-parser.test.d.ts +0 -2
- package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/transcript-parser.test.js +0 -285
- package/dist/__tests__/analytics/transcript-parser.test.js.map +0 -1
- package/dist/__tests__/analytics/transcript-scanner.test.d.ts +0 -2
- package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/transcript-scanner.test.js +0 -443
- package/dist/__tests__/analytics/transcript-scanner.test.js.map +0 -1
- package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +0 -2
- package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +0 -1
- package/dist/__tests__/analytics/transcript-token-extractor.test.js +0 -177
- package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +0 -1
- package/dist/analytics/analytics-summary.d.ts +0 -47
- package/dist/analytics/analytics-summary.d.ts.map +0 -1
- package/dist/analytics/analytics-summary.js +0 -171
- package/dist/analytics/analytics-summary.js.map +0 -1
- package/dist/analytics/backfill-dedup.d.ts +0 -49
- package/dist/analytics/backfill-dedup.d.ts.map +0 -1
- package/dist/analytics/backfill-dedup.js +0 -115
- package/dist/analytics/backfill-dedup.js.map +0 -1
- package/dist/analytics/backfill-engine.d.ts +0 -59
- package/dist/analytics/backfill-engine.d.ts.map +0 -1
- package/dist/analytics/backfill-engine.js +0 -172
- package/dist/analytics/backfill-engine.js.map +0 -1
- package/dist/analytics/cost-estimator.d.ts +0 -29
- package/dist/analytics/cost-estimator.d.ts.map +0 -1
- package/dist/analytics/cost-estimator.js +0 -135
- package/dist/analytics/cost-estimator.js.map +0 -1
- package/dist/analytics/export.d.ts +0 -7
- package/dist/analytics/export.d.ts.map +0 -1
- package/dist/analytics/export.js +0 -93
- package/dist/analytics/export.js.map +0 -1
- package/dist/analytics/index.d.ts +0 -24
- package/dist/analytics/index.d.ts.map +0 -1
- package/dist/analytics/index.js +0 -30
- package/dist/analytics/index.js.map +0 -1
- package/dist/analytics/metrics-collector.d.ts +0 -30
- package/dist/analytics/metrics-collector.d.ts.map +0 -1
- package/dist/analytics/metrics-collector.js +0 -96
- package/dist/analytics/metrics-collector.js.map +0 -1
- package/dist/analytics/output-estimator.d.ts +0 -26
- package/dist/analytics/output-estimator.d.ts.map +0 -1
- package/dist/analytics/output-estimator.js +0 -65
- package/dist/analytics/output-estimator.js.map +0 -1
- package/dist/analytics/query-engine.d.ts +0 -35
- package/dist/analytics/query-engine.d.ts.map +0 -1
- package/dist/analytics/query-engine.js +0 -239
- package/dist/analytics/query-engine.js.map +0 -1
- package/dist/analytics/session-catalog.d.ts +0 -45
- package/dist/analytics/session-catalog.d.ts.map +0 -1
- package/dist/analytics/session-catalog.js +0 -153
- package/dist/analytics/session-catalog.js.map +0 -1
- package/dist/analytics/session-manager.d.ts +0 -58
- package/dist/analytics/session-manager.d.ts.map +0 -1
- package/dist/analytics/session-manager.js +0 -396
- package/dist/analytics/session-manager.js.map +0 -1
- package/dist/analytics/session-types.d.ts +0 -37
- package/dist/analytics/session-types.d.ts.map +0 -1
- package/dist/analytics/session-types.js +0 -2
- package/dist/analytics/session-types.js.map +0 -1
- package/dist/analytics/token-extractor.d.ts +0 -31
- package/dist/analytics/token-extractor.d.ts.map +0 -1
- package/dist/analytics/token-extractor.js +0 -57
- package/dist/analytics/token-extractor.js.map +0 -1
- package/dist/analytics/token-tracker.d.ts +0 -33
- package/dist/analytics/token-tracker.d.ts.map +0 -1
- package/dist/analytics/token-tracker.js +0 -443
- package/dist/analytics/token-tracker.js.map +0 -1
- package/dist/analytics/tokscale-adapter.d.ts +0 -71
- package/dist/analytics/tokscale-adapter.d.ts.map +0 -1
- package/dist/analytics/tokscale-adapter.js +0 -223
- package/dist/analytics/tokscale-adapter.js.map +0 -1
- package/dist/analytics/transcript-parser.d.ts +0 -42
- package/dist/analytics/transcript-parser.d.ts.map +0 -1
- package/dist/analytics/transcript-parser.js +0 -90
- package/dist/analytics/transcript-parser.js.map +0 -1
- package/dist/analytics/transcript-scanner.d.ts +0 -51
- package/dist/analytics/transcript-scanner.d.ts.map +0 -1
- package/dist/analytics/transcript-scanner.js +0 -279
- package/dist/analytics/transcript-scanner.js.map +0 -1
- package/dist/analytics/transcript-token-extractor.d.ts +0 -35
- package/dist/analytics/transcript-token-extractor.d.ts.map +0 -1
- package/dist/analytics/transcript-token-extractor.js +0 -136
- package/dist/analytics/transcript-token-extractor.js.map +0 -1
- package/dist/analytics/types.d.ts +0 -119
- package/dist/analytics/types.d.ts.map +0 -1
- package/dist/analytics/types.js +0 -32
- package/dist/analytics/types.js.map +0 -1
- package/dist/cli/analytics.d.ts +0 -3
- package/dist/cli/analytics.d.ts.map +0 -1
- package/dist/cli/analytics.js +0 -105
- package/dist/cli/analytics.js.map +0 -1
- package/dist/cli/commands/agents.d.ts +0 -5
- package/dist/cli/commands/agents.d.ts.map +0 -1
- package/dist/cli/commands/agents.js +0 -31
- package/dist/cli/commands/agents.js.map +0 -1
- package/dist/cli/commands/backfill.d.ts +0 -15
- package/dist/cli/commands/backfill.d.ts.map +0 -1
- package/dist/cli/commands/backfill.js +0 -146
- package/dist/cli/commands/backfill.js.map +0 -1
- package/dist/cli/commands/cleanup.d.ts +0 -4
- package/dist/cli/commands/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/cleanup.js +0 -31
- package/dist/cli/commands/cleanup.js.map +0 -1
- package/dist/cli/commands/cost.d.ts +0 -4
- package/dist/cli/commands/cost.d.ts.map +0 -1
- package/dist/cli/commands/cost.js +0 -53
- package/dist/cli/commands/cost.js.map +0 -1
- package/dist/cli/commands/export.d.ts +0 -5
- package/dist/cli/commands/export.d.ts.map +0 -1
- package/dist/cli/commands/export.js +0 -30
- package/dist/cli/commands/export.js.map +0 -1
- package/dist/cli/commands/sessions.d.ts +0 -5
- package/dist/cli/commands/sessions.d.ts.map +0 -1
- package/dist/cli/commands/sessions.js +0 -89
- package/dist/cli/commands/sessions.js.map +0 -1
- package/dist/cli/commands/stats.d.ts +0 -5
- package/dist/cli/commands/stats.d.ts.map +0 -1
- package/dist/cli/commands/stats.js +0 -84
- package/dist/cli/commands/stats.js.map +0 -1
- package/dist/cli/utils/tokscale-launcher.d.ts +0 -25
- package/dist/cli/utils/tokscale-launcher.d.ts.map +0 -1
- package/dist/cli/utils/tokscale-launcher.js +0 -70
- package/dist/cli/utils/tokscale-launcher.js.map +0 -1
- package/dist/hud/analytics-display.d.ts +0 -63
- package/dist/hud/analytics-display.d.ts.map +0 -1
- package/dist/hud/analytics-display.js +0 -190
- package/dist/hud/analytics-display.js.map +0 -1
- package/scripts/build-codex-server.mjs +0 -95
package/bridge/team-bridge.cjs
CHANGED
|
@@ -12,9 +12,11 @@ try {
|
|
|
12
12
|
} catch (_e) { /* npm not available - native modules will gracefully degrade */ }
|
|
13
13
|
|
|
14
14
|
"use strict";
|
|
15
|
+
var __create = Object.create;
|
|
15
16
|
var __defProp = Object.defineProperty;
|
|
16
17
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
17
18
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
19
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
18
20
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
19
21
|
var __export = (target, all) => {
|
|
20
22
|
for (var name in all)
|
|
@@ -28,6 +30,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
28
30
|
}
|
|
29
31
|
return to;
|
|
30
32
|
};
|
|
33
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
34
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
35
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
36
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
37
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
38
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
39
|
+
mod
|
|
40
|
+
));
|
|
31
41
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
42
|
|
|
33
43
|
// src/team/bridge-entry.ts
|
|
@@ -37,13 +47,13 @@ __export(bridge_entry_exports, {
|
|
|
37
47
|
});
|
|
38
48
|
module.exports = __toCommonJS(bridge_entry_exports);
|
|
39
49
|
var import_fs10 = require("fs");
|
|
40
|
-
var
|
|
50
|
+
var import_path12 = require("path");
|
|
41
51
|
var import_os2 = require("os");
|
|
42
52
|
|
|
43
53
|
// src/team/mcp-team-bridge.ts
|
|
44
54
|
var import_child_process2 = require("child_process");
|
|
45
55
|
var import_fs8 = require("fs");
|
|
46
|
-
var
|
|
56
|
+
var import_path10 = require("path");
|
|
47
57
|
|
|
48
58
|
// src/team/fs-utils.ts
|
|
49
59
|
var import_fs = require("fs");
|
|
@@ -69,31 +79,34 @@ function appendFileWithMode(filePath, data, mode = 384) {
|
|
|
69
79
|
function ensureDirWithMode(dirPath, mode = 448) {
|
|
70
80
|
if (!(0, import_fs.existsSync)(dirPath)) (0, import_fs.mkdirSync)(dirPath, { recursive: true, mode });
|
|
71
81
|
}
|
|
72
|
-
function
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const name = (0, import_path.basename)(p);
|
|
82
|
+
function canonicalizePath(p) {
|
|
83
|
+
const absInput = (0, import_path.resolve)(p);
|
|
84
|
+
const tail = [];
|
|
85
|
+
let probe = absInput;
|
|
86
|
+
while (true) {
|
|
78
87
|
try {
|
|
79
|
-
|
|
88
|
+
const realBase = (0, import_fs.realpathSync)(probe);
|
|
89
|
+
return tail.reduce((acc, seg) => (0, import_path.resolve)(acc, seg), realBase);
|
|
80
90
|
} catch {
|
|
81
|
-
|
|
91
|
+
const parent = (0, import_path.dirname)(probe);
|
|
92
|
+
if (parent === probe) return absInput;
|
|
93
|
+
tail.unshift((0, import_path.basename)(probe));
|
|
94
|
+
probe = parent;
|
|
82
95
|
}
|
|
83
96
|
}
|
|
84
97
|
}
|
|
85
98
|
function validateResolvedPath(resolvedPath, expectedBase) {
|
|
86
|
-
const absResolved =
|
|
87
|
-
const absBase =
|
|
99
|
+
const absResolved = canonicalizePath(resolvedPath);
|
|
100
|
+
const absBase = canonicalizePath(expectedBase);
|
|
88
101
|
const rel = (0, import_path.relative)(absBase, absResolved);
|
|
89
|
-
if (rel.startsWith("..") || (0, import_path.resolve)(absBase, rel) !== absResolved) {
|
|
102
|
+
if (rel !== "" && (rel.startsWith("..") || (0, import_path.isAbsolute)(rel) || (0, import_path.resolve)(absBase, rel) !== absResolved)) {
|
|
90
103
|
throw new Error(`Path traversal detected: "${resolvedPath}" escapes base "${expectedBase}"`);
|
|
91
104
|
}
|
|
92
105
|
}
|
|
93
106
|
|
|
94
107
|
// src/team/task-file-ops.ts
|
|
95
108
|
var import_fs3 = require("fs");
|
|
96
|
-
var
|
|
109
|
+
var import_path5 = require("path");
|
|
97
110
|
|
|
98
111
|
// src/utils/paths.ts
|
|
99
112
|
var import_path2 = require("path");
|
|
@@ -111,11 +124,16 @@ function getConfigDir() {
|
|
|
111
124
|
function getClaudeConfigDir() {
|
|
112
125
|
return getConfigDir();
|
|
113
126
|
}
|
|
114
|
-
var STALE_THRESHOLD_MS = 60 * 60 * 1e3;
|
|
127
|
+
var STALE_THRESHOLD_MS = 24 * 60 * 60 * 1e3;
|
|
115
128
|
|
|
116
129
|
// src/team/tmux-session.ts
|
|
117
130
|
var import_child_process = require("child_process");
|
|
131
|
+
var import_path3 = require("path");
|
|
132
|
+
var import_util = require("util");
|
|
133
|
+
var import_promises = __toESM(require("fs/promises"), 1);
|
|
118
134
|
var TMUX_SESSION_PREFIX = "omc-team";
|
|
135
|
+
var promisifiedExec = (0, import_util.promisify)(import_child_process.exec);
|
|
136
|
+
var promisifiedExecFile = (0, import_util.promisify)(import_child_process.execFile);
|
|
119
137
|
function sanitizeName(name) {
|
|
120
138
|
const sanitized = name.replace(/[^a-zA-Z0-9-]/g, "");
|
|
121
139
|
if (sanitized.length === 0) {
|
|
@@ -137,6 +155,38 @@ function killSession(teamName, workerName) {
|
|
|
137
155
|
}
|
|
138
156
|
}
|
|
139
157
|
|
|
158
|
+
// src/team/state-paths.ts
|
|
159
|
+
var import_path4 = require("path");
|
|
160
|
+
var TeamPaths = {
|
|
161
|
+
root: (teamName) => `.omc/state/team/${teamName}`,
|
|
162
|
+
config: (teamName) => `.omc/state/team/${teamName}/config.json`,
|
|
163
|
+
shutdown: (teamName) => `.omc/state/team/${teamName}/shutdown.json`,
|
|
164
|
+
tasks: (teamName) => `.omc/state/team/${teamName}/tasks`,
|
|
165
|
+
taskFile: (teamName, taskId) => `.omc/state/team/${teamName}/tasks/${taskId}.json`,
|
|
166
|
+
workers: (teamName) => `.omc/state/team/${teamName}/workers`,
|
|
167
|
+
workerDir: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}`,
|
|
168
|
+
heartbeat: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/heartbeat.json`,
|
|
169
|
+
inbox: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/inbox.md`,
|
|
170
|
+
outbox: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/outbox.jsonl`,
|
|
171
|
+
ready: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/.ready`,
|
|
172
|
+
overlay: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/AGENTS.md`,
|
|
173
|
+
shutdownAck: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/shutdown-ack.json`,
|
|
174
|
+
done: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/done.json`,
|
|
175
|
+
mailbox: (teamName, workerName) => `.omc/state/team/${teamName}/mailbox/${workerName}.jsonl`
|
|
176
|
+
};
|
|
177
|
+
function getTaskStoragePath(cwd, teamName, taskId) {
|
|
178
|
+
if (taskId !== void 0) {
|
|
179
|
+
return (0, import_path4.join)(cwd, TeamPaths.taskFile(teamName, taskId));
|
|
180
|
+
}
|
|
181
|
+
return (0, import_path4.join)(cwd, TeamPaths.tasks(teamName));
|
|
182
|
+
}
|
|
183
|
+
function getLegacyTaskStoragePath(claudeConfigDir, teamName, taskId) {
|
|
184
|
+
if (taskId !== void 0) {
|
|
185
|
+
return (0, import_path4.join)(claudeConfigDir, "tasks", teamName, `${taskId}.json`);
|
|
186
|
+
}
|
|
187
|
+
return (0, import_path4.join)(claudeConfigDir, "tasks", teamName);
|
|
188
|
+
}
|
|
189
|
+
|
|
140
190
|
// src/team/task-file-ops.ts
|
|
141
191
|
var DEFAULT_STALE_LOCK_MS = 3e4;
|
|
142
192
|
function isPidAlive(pid) {
|
|
@@ -151,9 +201,9 @@ function isPidAlive(pid) {
|
|
|
151
201
|
}
|
|
152
202
|
function acquireTaskLock(teamName, taskId, opts) {
|
|
153
203
|
const staleLockMs = opts?.staleLockMs ?? DEFAULT_STALE_LOCK_MS;
|
|
154
|
-
const dir =
|
|
204
|
+
const dir = canonicalTasksDir(teamName, opts?.cwd);
|
|
155
205
|
ensureDirWithMode(dir);
|
|
156
|
-
const lockPath = (0,
|
|
206
|
+
const lockPath = (0, import_path5.join)(dir, `${sanitizeTaskId(taskId)}.lock`);
|
|
157
207
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
158
208
|
try {
|
|
159
209
|
const fd = (0, import_fs3.openSync)(lockPath, import_fs3.constants.O_CREAT | import_fs3.constants.O_EXCL | import_fs3.constants.O_WRONLY, 384);
|
|
@@ -212,19 +262,33 @@ function sanitizeTaskId(taskId) {
|
|
|
212
262
|
}
|
|
213
263
|
return taskId;
|
|
214
264
|
}
|
|
215
|
-
function
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
265
|
+
function canonicalTasksDir(teamName, cwd) {
|
|
266
|
+
const root = cwd ?? process.cwd();
|
|
267
|
+
const dir = getTaskStoragePath(root, sanitizeName(teamName));
|
|
268
|
+
validateResolvedPath(dir, (0, import_path5.join)(root, ".omc", "state", "team"));
|
|
269
|
+
return dir;
|
|
219
270
|
}
|
|
220
|
-
function
|
|
221
|
-
|
|
271
|
+
function legacyTasksDir(teamName) {
|
|
272
|
+
const claudeConfigDir = getClaudeConfigDir();
|
|
273
|
+
const dir = getLegacyTaskStoragePath(claudeConfigDir, sanitizeName(teamName));
|
|
274
|
+
validateResolvedPath(dir, (0, import_path5.join)(claudeConfigDir, "tasks"));
|
|
275
|
+
return dir;
|
|
276
|
+
}
|
|
277
|
+
function resolveTaskPathForRead(teamName, taskId, cwd) {
|
|
278
|
+
const canonical = (0, import_path5.join)(canonicalTasksDir(teamName, cwd), `${sanitizeTaskId(taskId)}.json`);
|
|
279
|
+
if ((0, import_fs3.existsSync)(canonical)) return canonical;
|
|
280
|
+
const legacy = (0, import_path5.join)(legacyTasksDir(teamName), `${sanitizeTaskId(taskId)}.json`);
|
|
281
|
+
if ((0, import_fs3.existsSync)(legacy)) return legacy;
|
|
282
|
+
return canonical;
|
|
283
|
+
}
|
|
284
|
+
function resolveTaskPathForWrite(teamName, taskId, cwd) {
|
|
285
|
+
return (0, import_path5.join)(canonicalTasksDir(teamName, cwd), `${sanitizeTaskId(taskId)}.json`);
|
|
222
286
|
}
|
|
223
|
-
function failureSidecarPath(teamName, taskId) {
|
|
224
|
-
return (0,
|
|
287
|
+
function failureSidecarPath(teamName, taskId, cwd) {
|
|
288
|
+
return (0, import_path5.join)(canonicalTasksDir(teamName, cwd), `${sanitizeTaskId(taskId)}.failure.json`);
|
|
225
289
|
}
|
|
226
|
-
function readTask(teamName, taskId) {
|
|
227
|
-
const filePath =
|
|
290
|
+
function readTask(teamName, taskId, opts) {
|
|
291
|
+
const filePath = resolveTaskPathForRead(teamName, taskId, opts?.cwd);
|
|
228
292
|
if (!(0, import_fs3.existsSync)(filePath)) return null;
|
|
229
293
|
try {
|
|
230
294
|
const raw = (0, import_fs3.readFileSync)(filePath, "utf-8");
|
|
@@ -236,10 +300,10 @@ function readTask(teamName, taskId) {
|
|
|
236
300
|
function updateTask(teamName, taskId, updates, opts) {
|
|
237
301
|
const useLock = opts?.useLock ?? true;
|
|
238
302
|
const doUpdate = () => {
|
|
239
|
-
const
|
|
303
|
+
const readPath = resolveTaskPathForRead(teamName, taskId, opts?.cwd);
|
|
240
304
|
let task;
|
|
241
305
|
try {
|
|
242
|
-
const raw = (0, import_fs3.readFileSync)(
|
|
306
|
+
const raw = (0, import_fs3.readFileSync)(readPath, "utf-8");
|
|
243
307
|
task = JSON.parse(raw);
|
|
244
308
|
} catch {
|
|
245
309
|
throw new Error(`Task file not found or malformed: ${taskId}`);
|
|
@@ -249,13 +313,14 @@ function updateTask(teamName, taskId, updates, opts) {
|
|
|
249
313
|
task[key] = value;
|
|
250
314
|
}
|
|
251
315
|
}
|
|
252
|
-
|
|
316
|
+
const writePath = resolveTaskPathForWrite(teamName, taskId, opts?.cwd);
|
|
317
|
+
atomicWriteJson(writePath, task);
|
|
253
318
|
};
|
|
254
319
|
if (!useLock) {
|
|
255
320
|
doUpdate();
|
|
256
321
|
return;
|
|
257
322
|
}
|
|
258
|
-
const handle = acquireTaskLock(teamName, taskId);
|
|
323
|
+
const handle = acquireTaskLock(teamName, taskId, { cwd: opts?.cwd });
|
|
259
324
|
if (!handle) {
|
|
260
325
|
if (typeof process !== "undefined" && process.stderr) {
|
|
261
326
|
process.stderr.write(`[task-file-ops] WARN: could not acquire lock for task ${taskId}, updating without lock
|
|
@@ -270,27 +335,28 @@ function updateTask(teamName, taskId, updates, opts) {
|
|
|
270
335
|
releaseTaskLock(handle);
|
|
271
336
|
}
|
|
272
337
|
}
|
|
273
|
-
async function findNextTask(teamName, workerName) {
|
|
274
|
-
const dir =
|
|
338
|
+
async function findNextTask(teamName, workerName, opts) {
|
|
339
|
+
const dir = canonicalTasksDir(teamName, opts?.cwd);
|
|
275
340
|
if (!(0, import_fs3.existsSync)(dir)) return null;
|
|
276
|
-
const taskIds = listTaskIds(teamName);
|
|
341
|
+
const taskIds = listTaskIds(teamName, opts);
|
|
277
342
|
for (const id of taskIds) {
|
|
278
|
-
const task = readTask(teamName, id);
|
|
343
|
+
const task = readTask(teamName, id, opts);
|
|
279
344
|
if (!task) continue;
|
|
280
345
|
if (task.status !== "pending") continue;
|
|
281
346
|
if (task.owner !== workerName) continue;
|
|
282
|
-
if (!areBlockersResolved(teamName, task.blockedBy)) continue;
|
|
283
|
-
const handle = acquireTaskLock(teamName, id, { workerName });
|
|
347
|
+
if (!areBlockersResolved(teamName, task.blockedBy, opts)) continue;
|
|
348
|
+
const handle = acquireTaskLock(teamName, id, { workerName, cwd: opts?.cwd });
|
|
284
349
|
if (!handle) continue;
|
|
285
350
|
try {
|
|
286
|
-
const freshTask = readTask(teamName, id);
|
|
287
|
-
if (!freshTask || freshTask.status !== "pending" || freshTask.owner !== workerName || !areBlockersResolved(teamName, freshTask.blockedBy)) {
|
|
351
|
+
const freshTask = readTask(teamName, id, opts);
|
|
352
|
+
if (!freshTask || freshTask.status !== "pending" || freshTask.owner !== workerName || !areBlockersResolved(teamName, freshTask.blockedBy, opts)) {
|
|
288
353
|
continue;
|
|
289
354
|
}
|
|
290
|
-
const filePath = (
|
|
355
|
+
const filePath = resolveTaskPathForWrite(teamName, id, opts?.cwd);
|
|
291
356
|
let taskData;
|
|
292
357
|
try {
|
|
293
|
-
const
|
|
358
|
+
const readPath = resolveTaskPathForRead(teamName, id, opts?.cwd);
|
|
359
|
+
const raw = (0, import_fs3.readFileSync)(readPath, "utf-8");
|
|
294
360
|
taskData = JSON.parse(raw);
|
|
295
361
|
} catch {
|
|
296
362
|
continue;
|
|
@@ -307,17 +373,17 @@ async function findNextTask(teamName, workerName) {
|
|
|
307
373
|
}
|
|
308
374
|
return null;
|
|
309
375
|
}
|
|
310
|
-
function areBlockersResolved(teamName, blockedBy) {
|
|
376
|
+
function areBlockersResolved(teamName, blockedBy, opts) {
|
|
311
377
|
if (!blockedBy || blockedBy.length === 0) return true;
|
|
312
378
|
for (const blockerId of blockedBy) {
|
|
313
|
-
const blocker = readTask(teamName, blockerId);
|
|
379
|
+
const blocker = readTask(teamName, blockerId, opts);
|
|
314
380
|
if (!blocker || blocker.status !== "completed") return false;
|
|
315
381
|
}
|
|
316
382
|
return true;
|
|
317
383
|
}
|
|
318
|
-
function writeTaskFailure(teamName, taskId, error) {
|
|
319
|
-
const filePath = failureSidecarPath(teamName, taskId);
|
|
320
|
-
const existing = readTaskFailure(teamName, taskId);
|
|
384
|
+
function writeTaskFailure(teamName, taskId, error, opts) {
|
|
385
|
+
const filePath = failureSidecarPath(teamName, taskId, opts?.cwd);
|
|
386
|
+
const existing = readTaskFailure(teamName, taskId, opts);
|
|
321
387
|
const sidecar = {
|
|
322
388
|
taskId,
|
|
323
389
|
lastError: error,
|
|
@@ -326,8 +392,8 @@ function writeTaskFailure(teamName, taskId, error) {
|
|
|
326
392
|
};
|
|
327
393
|
atomicWriteJson(filePath, sidecar);
|
|
328
394
|
}
|
|
329
|
-
function readTaskFailure(teamName, taskId) {
|
|
330
|
-
const filePath = failureSidecarPath(teamName, taskId);
|
|
395
|
+
function readTaskFailure(teamName, taskId, opts) {
|
|
396
|
+
const filePath = failureSidecarPath(teamName, taskId, opts?.cwd);
|
|
331
397
|
if (!(0, import_fs3.existsSync)(filePath)) return null;
|
|
332
398
|
try {
|
|
333
399
|
const raw = (0, import_fs3.readFileSync)(filePath, "utf-8");
|
|
@@ -337,52 +403,58 @@ function readTaskFailure(teamName, taskId) {
|
|
|
337
403
|
}
|
|
338
404
|
}
|
|
339
405
|
var DEFAULT_MAX_TASK_RETRIES = 5;
|
|
340
|
-
function isTaskRetryExhausted(teamName, taskId, maxRetries = DEFAULT_MAX_TASK_RETRIES) {
|
|
341
|
-
const failure = readTaskFailure(teamName, taskId);
|
|
406
|
+
function isTaskRetryExhausted(teamName, taskId, maxRetries = DEFAULT_MAX_TASK_RETRIES, opts) {
|
|
407
|
+
const failure = readTaskFailure(teamName, taskId, opts);
|
|
342
408
|
if (!failure) return false;
|
|
343
409
|
return failure.retryCount >= maxRetries;
|
|
344
410
|
}
|
|
345
|
-
function listTaskIds(teamName) {
|
|
346
|
-
const
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
}
|
|
411
|
+
function listTaskIds(teamName, opts) {
|
|
412
|
+
const scanDir = (dir) => {
|
|
413
|
+
if (!(0, import_fs3.existsSync)(dir)) return [];
|
|
414
|
+
try {
|
|
415
|
+
return (0, import_fs3.readdirSync)(dir).filter((f) => f.endsWith(".json") && !f.includes(".tmp.") && !f.includes(".failure.") && !f.endsWith(".lock")).map((f) => f.replace(".json", ""));
|
|
416
|
+
} catch {
|
|
417
|
+
return [];
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
let ids = scanDir(canonicalTasksDir(teamName, opts?.cwd));
|
|
421
|
+
if (ids.length === 0) {
|
|
422
|
+
ids = scanDir(legacyTasksDir(teamName));
|
|
423
|
+
}
|
|
424
|
+
return ids.sort((a, b) => {
|
|
425
|
+
const numA = parseInt(a, 10);
|
|
426
|
+
const numB = parseInt(b, 10);
|
|
427
|
+
if (!isNaN(numA) && !isNaN(numB)) return numA - numB;
|
|
428
|
+
return a.localeCompare(b);
|
|
429
|
+
});
|
|
358
430
|
}
|
|
359
431
|
|
|
360
432
|
// src/team/inbox-outbox.ts
|
|
361
433
|
var import_fs4 = require("fs");
|
|
362
|
-
var
|
|
434
|
+
var import_path6 = require("path");
|
|
363
435
|
var MAX_INBOX_READ_SIZE = 10 * 1024 * 1024;
|
|
364
436
|
function teamsDir(teamName) {
|
|
365
|
-
const result = (0,
|
|
366
|
-
validateResolvedPath(result, (0,
|
|
437
|
+
const result = (0, import_path6.join)(getClaudeConfigDir(), "teams", sanitizeName(teamName));
|
|
438
|
+
validateResolvedPath(result, (0, import_path6.join)(getClaudeConfigDir(), "teams"));
|
|
367
439
|
return result;
|
|
368
440
|
}
|
|
369
441
|
function inboxPath(teamName, workerName) {
|
|
370
|
-
return (0,
|
|
442
|
+
return (0, import_path6.join)(teamsDir(teamName), "inbox", `${sanitizeName(workerName)}.jsonl`);
|
|
371
443
|
}
|
|
372
444
|
function inboxCursorPath(teamName, workerName) {
|
|
373
|
-
return (0,
|
|
445
|
+
return (0, import_path6.join)(teamsDir(teamName), "inbox", `${sanitizeName(workerName)}.offset`);
|
|
374
446
|
}
|
|
375
447
|
function outboxPath(teamName, workerName) {
|
|
376
|
-
return (0,
|
|
448
|
+
return (0, import_path6.join)(teamsDir(teamName), "outbox", `${sanitizeName(workerName)}.jsonl`);
|
|
377
449
|
}
|
|
378
450
|
function signalPath(teamName, workerName) {
|
|
379
|
-
return (0,
|
|
451
|
+
return (0, import_path6.join)(teamsDir(teamName), "signals", `${sanitizeName(workerName)}.shutdown`);
|
|
380
452
|
}
|
|
381
453
|
function drainSignalPath(teamName, workerName) {
|
|
382
|
-
return (0,
|
|
454
|
+
return (0, import_path6.join)(teamsDir(teamName), "signals", `${sanitizeName(workerName)}.drain`);
|
|
383
455
|
}
|
|
384
456
|
function ensureDir(filePath) {
|
|
385
|
-
const dir = (0,
|
|
457
|
+
const dir = (0, import_path6.dirname)(filePath);
|
|
386
458
|
ensureDirWithMode(dir);
|
|
387
459
|
}
|
|
388
460
|
function appendOutbox(teamName, workerName, message) {
|
|
@@ -398,7 +470,7 @@ function rotateOutboxIfNeeded(teamName, workerName, maxLines) {
|
|
|
398
470
|
const lines = content.split("\n").filter((l) => l.trim());
|
|
399
471
|
if (lines.length <= maxLines) return;
|
|
400
472
|
const keepCount = Math.floor(maxLines / 2);
|
|
401
|
-
const kept = lines.slice(-keepCount);
|
|
473
|
+
const kept = keepCount === 0 ? [] : lines.slice(-keepCount);
|
|
402
474
|
const tmpPath = `${filePath}.tmp.${process.pid}.${Date.now()}`;
|
|
403
475
|
writeFileWithMode(tmpPath, kept.join("\n") + "\n");
|
|
404
476
|
(0, import_fs4.renameSync)(tmpPath, filePath);
|
|
@@ -475,7 +547,8 @@ function readNewInboxMessages(teamName, workerName) {
|
|
|
475
547
|
messages.push(JSON.parse(cleanLine));
|
|
476
548
|
bytesProcessed += lineBytes;
|
|
477
549
|
} catch {
|
|
478
|
-
|
|
550
|
+
console.warn(`[inbox-outbox] Skipping malformed JSONL line for ${workerName}: ${cleanLine.slice(0, 80)}`);
|
|
551
|
+
bytesProcessed += lineBytes;
|
|
479
552
|
}
|
|
480
553
|
}
|
|
481
554
|
const newOffset = offset + (bytesProcessed > 0 ? bytesProcessed : 0);
|
|
@@ -525,15 +598,15 @@ function deleteDrainSignal(teamName, workerName) {
|
|
|
525
598
|
|
|
526
599
|
// src/team/team-registration.ts
|
|
527
600
|
var import_fs5 = require("fs");
|
|
528
|
-
var
|
|
601
|
+
var import_path7 = require("path");
|
|
529
602
|
function configPath(teamName) {
|
|
530
|
-
const result = (0,
|
|
531
|
-
validateResolvedPath(result, (0,
|
|
603
|
+
const result = (0, import_path7.join)(getClaudeConfigDir(), "teams", sanitizeName(teamName), "config.json");
|
|
604
|
+
validateResolvedPath(result, (0, import_path7.join)(getClaudeConfigDir(), "teams"));
|
|
532
605
|
return result;
|
|
533
606
|
}
|
|
534
607
|
function shadowRegistryPath(workingDirectory) {
|
|
535
|
-
const result = (0,
|
|
536
|
-
validateResolvedPath(result, (0,
|
|
608
|
+
const result = (0, import_path7.join)(workingDirectory, ".omc", "state", "team-mcp-workers.json");
|
|
609
|
+
validateResolvedPath(result, (0, import_path7.join)(workingDirectory, ".omc", "state"));
|
|
537
610
|
return result;
|
|
538
611
|
}
|
|
539
612
|
function unregisterMcpWorker(teamName, workerName, workingDirectory) {
|
|
@@ -592,9 +665,9 @@ function listMcpWorkers(teamName, workingDirectory) {
|
|
|
592
665
|
|
|
593
666
|
// src/team/heartbeat.ts
|
|
594
667
|
var import_fs6 = require("fs");
|
|
595
|
-
var
|
|
668
|
+
var import_path8 = require("path");
|
|
596
669
|
function heartbeatPath(workingDirectory, teamName, workerName) {
|
|
597
|
-
return (0,
|
|
670
|
+
return (0, import_path8.join)(workingDirectory, ".omc", "state", "team-bridge", sanitizeName(teamName), `${sanitizeName(workerName)}.heartbeat.json`);
|
|
598
671
|
}
|
|
599
672
|
function writeHeartbeat(workingDirectory, data) {
|
|
600
673
|
const filePath = heartbeatPath(workingDirectory, data.teamName, data.workerName);
|
|
@@ -767,11 +840,96 @@ function findPermissionViolations(changedPaths, permissions, cwd) {
|
|
|
767
840
|
|
|
768
841
|
// src/team/team-status.ts
|
|
769
842
|
var import_fs7 = require("fs");
|
|
770
|
-
var
|
|
843
|
+
var import_path9 = require("path");
|
|
844
|
+
|
|
845
|
+
// src/team/usage-tracker.ts
|
|
846
|
+
var import_node_fs = require("node:fs");
|
|
847
|
+
var import_node_path4 = require("node:path");
|
|
848
|
+
function getUsageLogPath(workingDirectory, teamName) {
|
|
849
|
+
return (0, import_node_path4.join)(workingDirectory, ".omc", "logs", `team-usage-${teamName}.jsonl`);
|
|
850
|
+
}
|
|
851
|
+
function recordTaskUsage(workingDirectory, teamName, record) {
|
|
852
|
+
const logPath = getUsageLogPath(workingDirectory, teamName);
|
|
853
|
+
const dir = (0, import_node_path4.join)(workingDirectory, ".omc", "logs");
|
|
854
|
+
validateResolvedPath(logPath, workingDirectory);
|
|
855
|
+
ensureDirWithMode(dir);
|
|
856
|
+
appendFileWithMode(logPath, JSON.stringify(record) + "\n");
|
|
857
|
+
}
|
|
858
|
+
function measureCharCounts(promptFilePath, outputFilePath) {
|
|
859
|
+
let promptChars = 0;
|
|
860
|
+
let responseChars = 0;
|
|
861
|
+
try {
|
|
862
|
+
if ((0, import_node_fs.existsSync)(promptFilePath)) {
|
|
863
|
+
promptChars = (0, import_node_fs.statSync)(promptFilePath).size;
|
|
864
|
+
}
|
|
865
|
+
} catch {
|
|
866
|
+
}
|
|
867
|
+
try {
|
|
868
|
+
if ((0, import_node_fs.existsSync)(outputFilePath)) {
|
|
869
|
+
responseChars = (0, import_node_fs.statSync)(outputFilePath).size;
|
|
870
|
+
}
|
|
871
|
+
} catch {
|
|
872
|
+
}
|
|
873
|
+
return { promptChars, responseChars };
|
|
874
|
+
}
|
|
875
|
+
function readUsageRecords(workingDirectory, teamName) {
|
|
876
|
+
const logPath = getUsageLogPath(workingDirectory, teamName);
|
|
877
|
+
if (!(0, import_node_fs.existsSync)(logPath)) return [];
|
|
878
|
+
const content = (0, import_node_fs.readFileSync)(logPath, "utf-8");
|
|
879
|
+
const lines = content.split("\n").filter((l) => l.trim());
|
|
880
|
+
const records = [];
|
|
881
|
+
for (const line of lines) {
|
|
882
|
+
try {
|
|
883
|
+
records.push(JSON.parse(line));
|
|
884
|
+
} catch {
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
return records;
|
|
888
|
+
}
|
|
889
|
+
function generateUsageReport(workingDirectory, teamName) {
|
|
890
|
+
const records = readUsageRecords(workingDirectory, teamName);
|
|
891
|
+
const workerMap = /* @__PURE__ */ new Map();
|
|
892
|
+
for (const r of records) {
|
|
893
|
+
const existing = workerMap.get(r.workerName);
|
|
894
|
+
if (existing) {
|
|
895
|
+
existing.taskCount++;
|
|
896
|
+
existing.totalWallClockMs += r.wallClockMs;
|
|
897
|
+
existing.totalPromptChars += r.promptChars;
|
|
898
|
+
existing.totalResponseChars += r.responseChars;
|
|
899
|
+
} else {
|
|
900
|
+
workerMap.set(r.workerName, {
|
|
901
|
+
workerName: r.workerName,
|
|
902
|
+
provider: r.provider,
|
|
903
|
+
model: r.model,
|
|
904
|
+
taskCount: 1,
|
|
905
|
+
totalWallClockMs: r.wallClockMs,
|
|
906
|
+
totalPromptChars: r.promptChars,
|
|
907
|
+
totalResponseChars: r.responseChars
|
|
908
|
+
});
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
const workers = Array.from(workerMap.values());
|
|
912
|
+
return {
|
|
913
|
+
teamName,
|
|
914
|
+
totalWallClockMs: workers.reduce((sum, w) => sum + w.totalWallClockMs, 0),
|
|
915
|
+
taskCount: workers.reduce((sum, w) => sum + w.taskCount, 0),
|
|
916
|
+
workers
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
// src/team/team-status.ts
|
|
921
|
+
function emptyUsageReport(teamName) {
|
|
922
|
+
return {
|
|
923
|
+
teamName,
|
|
924
|
+
totalWallClockMs: 0,
|
|
925
|
+
taskCount: 0,
|
|
926
|
+
workers: []
|
|
927
|
+
};
|
|
928
|
+
}
|
|
771
929
|
function peekRecentOutboxMessages(teamName, workerName, maxMessages = 10) {
|
|
772
930
|
const safeName = sanitizeName(teamName);
|
|
773
931
|
const safeWorker = sanitizeName(workerName);
|
|
774
|
-
const outboxPath2 = (0,
|
|
932
|
+
const outboxPath2 = (0, import_path9.join)(getClaudeConfigDir(), "teams", safeName, "outbox", `${safeWorker}.jsonl`);
|
|
775
933
|
if (!(0, import_fs7.existsSync)(outboxPath2)) return [];
|
|
776
934
|
try {
|
|
777
935
|
const content = (0, import_fs7.readFileSync)(outboxPath2, "utf-8");
|
|
@@ -789,14 +947,18 @@ function peekRecentOutboxMessages(teamName, workerName, maxMessages = 10) {
|
|
|
789
947
|
return [];
|
|
790
948
|
}
|
|
791
949
|
}
|
|
792
|
-
function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4) {
|
|
950
|
+
function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4, options) {
|
|
951
|
+
const startedAt = Date.now();
|
|
793
952
|
const mcpWorkers = listMcpWorkers(teamName, workingDirectory);
|
|
794
|
-
const
|
|
953
|
+
const taskScanStartedAt = Date.now();
|
|
954
|
+
const taskIds = listTaskIds(teamName, { cwd: workingDirectory });
|
|
795
955
|
const tasks = [];
|
|
796
956
|
for (const id of taskIds) {
|
|
797
|
-
const task = readTask(teamName, id);
|
|
957
|
+
const task = readTask(teamName, id, { cwd: workingDirectory });
|
|
798
958
|
if (task) tasks.push(task);
|
|
799
959
|
}
|
|
960
|
+
const taskScanMs = Date.now() - taskScanStartedAt;
|
|
961
|
+
const workerScanStartedAt = Date.now();
|
|
800
962
|
const workers = mcpWorkers.map((w) => {
|
|
801
963
|
const heartbeat = readHeartbeat(workingDirectory, teamName, w.name);
|
|
802
964
|
const alive = isWorkerAlive(workingDirectory, teamName, w.name, heartbeatMaxAgeMs);
|
|
@@ -821,6 +983,15 @@ function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4) {
|
|
|
821
983
|
taskStats
|
|
822
984
|
};
|
|
823
985
|
});
|
|
986
|
+
const workerScanMs = Date.now() - workerScanStartedAt;
|
|
987
|
+
const includeUsage = options?.includeUsage ?? true;
|
|
988
|
+
let usage = emptyUsageReport(teamName);
|
|
989
|
+
let usageReadMs = 0;
|
|
990
|
+
if (includeUsage) {
|
|
991
|
+
const usageReadStartedAt = Date.now();
|
|
992
|
+
usage = generateUsageReport(workingDirectory, teamName);
|
|
993
|
+
usageReadMs = Date.now() - usageReadStartedAt;
|
|
994
|
+
}
|
|
824
995
|
const totalFailed = tasks.filter((t) => t.status === "completed" && t.metadata?.permanentlyFailed === true).length;
|
|
825
996
|
const taskSummary = {
|
|
826
997
|
total: tasks.length,
|
|
@@ -833,6 +1004,13 @@ function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4) {
|
|
|
833
1004
|
teamName,
|
|
834
1005
|
workers,
|
|
835
1006
|
taskSummary,
|
|
1007
|
+
usage,
|
|
1008
|
+
performance: {
|
|
1009
|
+
taskScanMs,
|
|
1010
|
+
workerScanMs,
|
|
1011
|
+
usageReadMs,
|
|
1012
|
+
totalMs: Date.now() - startedAt
|
|
1013
|
+
},
|
|
836
1014
|
lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
|
|
837
1015
|
};
|
|
838
1016
|
}
|
|
@@ -989,18 +1167,18 @@ function buildTaskPrompt(task, messages, config) {
|
|
|
989
1167
|
return result;
|
|
990
1168
|
}
|
|
991
1169
|
function writePromptFile(config, taskId, prompt) {
|
|
992
|
-
const dir = (0,
|
|
1170
|
+
const dir = (0, import_path10.join)(config.workingDirectory, ".omc", "prompts");
|
|
993
1171
|
ensureDirWithMode(dir);
|
|
994
1172
|
const filename = `team-${config.teamName}-task-${taskId}-${Date.now()}.md`;
|
|
995
|
-
const filePath = (0,
|
|
1173
|
+
const filePath = (0, import_path10.join)(dir, filename);
|
|
996
1174
|
writeFileWithMode(filePath, prompt);
|
|
997
1175
|
return filePath;
|
|
998
1176
|
}
|
|
999
1177
|
function getOutputPath(config, taskId) {
|
|
1000
|
-
const dir = (0,
|
|
1178
|
+
const dir = (0, import_path10.join)(config.workingDirectory, ".omc", "outputs");
|
|
1001
1179
|
ensureDirWithMode(dir);
|
|
1002
1180
|
const suffix = Math.random().toString(36).slice(2, 8);
|
|
1003
|
-
return (0,
|
|
1181
|
+
return (0, import_path10.join)(dir, `team-${config.teamName}-task-${taskId}-${Date.now()}-${suffix}.md`);
|
|
1004
1182
|
}
|
|
1005
1183
|
function readOutputSummary(outputFile) {
|
|
1006
1184
|
try {
|
|
@@ -1022,6 +1200,22 @@ function readOutputSummary(outputFile) {
|
|
|
1022
1200
|
return "(error reading output)";
|
|
1023
1201
|
}
|
|
1024
1202
|
}
|
|
1203
|
+
function recordTaskCompletionUsage(args) {
|
|
1204
|
+
const completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1205
|
+
const wallClockMs = Math.max(0, Date.now() - args.startedAt);
|
|
1206
|
+
const { promptChars, responseChars } = measureCharCounts(args.promptFile, args.outputFile);
|
|
1207
|
+
recordTaskUsage(args.config.workingDirectory, args.config.teamName, {
|
|
1208
|
+
taskId: args.taskId,
|
|
1209
|
+
workerName: args.config.workerName,
|
|
1210
|
+
provider: args.provider,
|
|
1211
|
+
model: args.config.model ?? "default",
|
|
1212
|
+
startedAt: args.startedAtIso,
|
|
1213
|
+
completedAt,
|
|
1214
|
+
wallClockMs,
|
|
1215
|
+
promptChars,
|
|
1216
|
+
responseChars
|
|
1217
|
+
});
|
|
1218
|
+
}
|
|
1025
1219
|
var MAX_CODEX_OUTPUT_SIZE = 1024 * 1024;
|
|
1026
1220
|
function parseCodexOutput(output) {
|
|
1027
1221
|
const lines = output.trim().split("\n").filter((l) => l.trim());
|
|
@@ -1065,7 +1259,7 @@ function spawnCliProcess(provider, prompt, model, cwd, timeoutMs) {
|
|
|
1065
1259
|
let cmd;
|
|
1066
1260
|
if (provider === "codex") {
|
|
1067
1261
|
cmd = "codex";
|
|
1068
|
-
args = ["exec", "-m", model || "gpt-5.3-codex", "--json", "--
|
|
1262
|
+
args = ["exec", "-m", model || "gpt-5.3-codex", "--json", "--dangerously-bypass-approvals-and-sandbox", "--skip-git-repo-check"];
|
|
1069
1263
|
} else {
|
|
1070
1264
|
cmd = "gemini";
|
|
1071
1265
|
args = ["--yolo"];
|
|
@@ -1240,8 +1434,10 @@ async function runBridge(config) {
|
|
|
1240
1434
|
await handleShutdown(config, shutdownBeforeSpawn, null);
|
|
1241
1435
|
return;
|
|
1242
1436
|
}
|
|
1437
|
+
const taskStartedAt = Date.now();
|
|
1438
|
+
const taskStartedAtIso = new Date(taskStartedAt).toISOString();
|
|
1243
1439
|
const prompt = buildTaskPrompt(task, messages, config);
|
|
1244
|
-
const
|
|
1440
|
+
const promptFile = writePromptFile(config, task.id, prompt);
|
|
1245
1441
|
const outputFile = getOutputPath(config, task.id);
|
|
1246
1442
|
log(`[bridge] Executing task ${task.id}: ${task.subject}`);
|
|
1247
1443
|
try {
|
|
@@ -1295,6 +1491,19 @@ ${violationSummary}`,
|
|
|
1295
1491
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1296
1492
|
});
|
|
1297
1493
|
log(`[bridge] Task ${task.id} failed: permission violations (enforce mode)`);
|
|
1494
|
+
try {
|
|
1495
|
+
recordTaskCompletionUsage({
|
|
1496
|
+
config,
|
|
1497
|
+
taskId: task.id,
|
|
1498
|
+
promptFile,
|
|
1499
|
+
outputFile,
|
|
1500
|
+
provider,
|
|
1501
|
+
startedAt: taskStartedAt,
|
|
1502
|
+
startedAtIso: taskStartedAtIso
|
|
1503
|
+
});
|
|
1504
|
+
} catch (usageErr) {
|
|
1505
|
+
log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
|
|
1506
|
+
}
|
|
1298
1507
|
consecutiveErrors = 0;
|
|
1299
1508
|
} else {
|
|
1300
1509
|
audit(config, "permission_audit", task.id, {
|
|
@@ -1314,6 +1523,19 @@ ${violationSummary}`);
|
|
|
1314
1523
|
[AUDIT WARNING: ${violations.length} permission violation(s) detected]`,
|
|
1315
1524
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1316
1525
|
});
|
|
1526
|
+
try {
|
|
1527
|
+
recordTaskCompletionUsage({
|
|
1528
|
+
config,
|
|
1529
|
+
taskId: task.id,
|
|
1530
|
+
promptFile,
|
|
1531
|
+
outputFile,
|
|
1532
|
+
provider,
|
|
1533
|
+
startedAt: taskStartedAt,
|
|
1534
|
+
startedAtIso: taskStartedAtIso
|
|
1535
|
+
});
|
|
1536
|
+
} catch (usageErr) {
|
|
1537
|
+
log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
|
|
1538
|
+
}
|
|
1317
1539
|
log(`[bridge] Task ${task.id} completed (with ${violations.length} audit warning(s))`);
|
|
1318
1540
|
}
|
|
1319
1541
|
} else {
|
|
@@ -1327,6 +1549,19 @@ ${violationSummary}`);
|
|
|
1327
1549
|
summary,
|
|
1328
1550
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1329
1551
|
});
|
|
1552
|
+
try {
|
|
1553
|
+
recordTaskCompletionUsage({
|
|
1554
|
+
config,
|
|
1555
|
+
taskId: task.id,
|
|
1556
|
+
promptFile,
|
|
1557
|
+
outputFile,
|
|
1558
|
+
provider,
|
|
1559
|
+
startedAt: taskStartedAt,
|
|
1560
|
+
startedAtIso: taskStartedAtIso
|
|
1561
|
+
});
|
|
1562
|
+
} catch (usageErr) {
|
|
1563
|
+
log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
|
|
1564
|
+
}
|
|
1330
1565
|
log(`[bridge] Task ${task.id} completed`);
|
|
1331
1566
|
}
|
|
1332
1567
|
} catch (err) {
|
|
@@ -1358,6 +1593,19 @@ ${violationSummary}`);
|
|
|
1358
1593
|
error: `Task permanently failed after ${attempt} attempts: ${errorMsg}`,
|
|
1359
1594
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1360
1595
|
});
|
|
1596
|
+
try {
|
|
1597
|
+
recordTaskCompletionUsage({
|
|
1598
|
+
config,
|
|
1599
|
+
taskId: task.id,
|
|
1600
|
+
promptFile,
|
|
1601
|
+
outputFile,
|
|
1602
|
+
provider,
|
|
1603
|
+
startedAt: taskStartedAt,
|
|
1604
|
+
startedAtIso: taskStartedAtIso
|
|
1605
|
+
});
|
|
1606
|
+
} catch (usageErr) {
|
|
1607
|
+
log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
|
|
1608
|
+
}
|
|
1361
1609
|
log(`[bridge] Task ${task.id} permanently failed after ${attempt} attempts`);
|
|
1362
1610
|
} else {
|
|
1363
1611
|
updateTask(teamName, task.id, { status: "pending" });
|
|
@@ -1382,7 +1630,7 @@ ${violationSummary}`);
|
|
|
1382
1630
|
idleNotified = true;
|
|
1383
1631
|
}
|
|
1384
1632
|
try {
|
|
1385
|
-
const teamStatus = getTeamStatus(teamName, workingDirectory);
|
|
1633
|
+
const teamStatus = getTeamStatus(teamName, workingDirectory, 3e4, { includeUsage: false });
|
|
1386
1634
|
if (teamStatus.taskSummary.total > 0 && teamStatus.taskSummary.pending === 0 && teamStatus.taskSummary.inProgress === 0) {
|
|
1387
1635
|
log(`[bridge] All team tasks complete. Auto-terminating worker.`);
|
|
1388
1636
|
appendOutbox(teamName, workerName, {
|
|
@@ -1410,14 +1658,19 @@ ${violationSummary}`);
|
|
|
1410
1658
|
}
|
|
1411
1659
|
|
|
1412
1660
|
// src/lib/worktree-paths.ts
|
|
1661
|
+
var import_crypto = require("crypto");
|
|
1413
1662
|
var import_child_process3 = require("child_process");
|
|
1414
1663
|
var import_fs9 = require("fs");
|
|
1415
|
-
var
|
|
1416
|
-
var
|
|
1664
|
+
var import_path11 = require("path");
|
|
1665
|
+
var MAX_WORKTREE_CACHE_SIZE = 8;
|
|
1666
|
+
var worktreeCacheMap = /* @__PURE__ */ new Map();
|
|
1417
1667
|
function getWorktreeRoot(cwd) {
|
|
1418
1668
|
const effectiveCwd = cwd || process.cwd();
|
|
1419
|
-
if (
|
|
1420
|
-
|
|
1669
|
+
if (worktreeCacheMap.has(effectiveCwd)) {
|
|
1670
|
+
const root = worktreeCacheMap.get(effectiveCwd);
|
|
1671
|
+
worktreeCacheMap.delete(effectiveCwd);
|
|
1672
|
+
worktreeCacheMap.set(effectiveCwd, root);
|
|
1673
|
+
return root || null;
|
|
1421
1674
|
}
|
|
1422
1675
|
try {
|
|
1423
1676
|
const root = (0, import_child_process3.execSync)("git rev-parse --show-toplevel", {
|
|
@@ -1425,7 +1678,13 @@ function getWorktreeRoot(cwd) {
|
|
|
1425
1678
|
encoding: "utf-8",
|
|
1426
1679
|
stdio: ["pipe", "pipe", "pipe"]
|
|
1427
1680
|
}).trim();
|
|
1428
|
-
|
|
1681
|
+
if (worktreeCacheMap.size >= MAX_WORKTREE_CACHE_SIZE) {
|
|
1682
|
+
const oldest = worktreeCacheMap.keys().next().value;
|
|
1683
|
+
if (oldest !== void 0) {
|
|
1684
|
+
worktreeCacheMap.delete(oldest);
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
worktreeCacheMap.set(effectiveCwd, root);
|
|
1429
1688
|
return root;
|
|
1430
1689
|
} catch {
|
|
1431
1690
|
return null;
|
|
@@ -1434,15 +1693,15 @@ function getWorktreeRoot(cwd) {
|
|
|
1434
1693
|
|
|
1435
1694
|
// src/team/bridge-entry.ts
|
|
1436
1695
|
function validateConfigPath(configPath2, homeDir, claudeConfigDir) {
|
|
1437
|
-
const resolved = (0,
|
|
1696
|
+
const resolved = (0, import_path12.resolve)(configPath2);
|
|
1438
1697
|
const isUnderHome = resolved.startsWith(homeDir + "/") || resolved === homeDir;
|
|
1439
|
-
const normalizedConfigDir = (0,
|
|
1440
|
-
const normalizedOmcDir = (0,
|
|
1698
|
+
const normalizedConfigDir = (0, import_path12.resolve)(claudeConfigDir);
|
|
1699
|
+
const normalizedOmcDir = (0, import_path12.resolve)(homeDir, ".omc");
|
|
1441
1700
|
const hasOmcComponent = resolved.includes("/.omc/") || resolved.endsWith("/.omc");
|
|
1442
1701
|
const isTrustedSubpath = resolved === normalizedConfigDir || resolved.startsWith(normalizedConfigDir + "/") || resolved === normalizedOmcDir || resolved.startsWith(normalizedOmcDir + "/") || hasOmcComponent;
|
|
1443
1702
|
if (!isUnderHome || !isTrustedSubpath) return false;
|
|
1444
1703
|
try {
|
|
1445
|
-
const parentDir = (0,
|
|
1704
|
+
const parentDir = (0, import_path12.resolve)(resolved, "..");
|
|
1446
1705
|
const realParent = (0, import_fs10.realpathSync)(parentDir);
|
|
1447
1706
|
if (!realParent.startsWith(homeDir + "/") && realParent !== homeDir) {
|
|
1448
1707
|
return false;
|
|
@@ -1477,7 +1736,7 @@ function main() {
|
|
|
1477
1736
|
console.error("Usage: node bridge-entry.js --config <path-to-config.json>");
|
|
1478
1737
|
process.exit(1);
|
|
1479
1738
|
}
|
|
1480
|
-
const configPath2 = (0,
|
|
1739
|
+
const configPath2 = (0, import_path12.resolve)(process.argv[configIdx + 1]);
|
|
1481
1740
|
const home = (0, import_os2.homedir)();
|
|
1482
1741
|
const claudeConfigDir = getClaudeConfigDir();
|
|
1483
1742
|
if (!validateConfigPath(configPath2, home, claudeConfigDir)) {
|