oh-my-codex 0.11.11 → 0.11.13
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/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/README.de.md +12 -6
- package/README.el.md +223 -0
- package/README.es.md +12 -6
- package/README.fr.md +11 -5
- package/README.it.md +12 -6
- package/README.ja.md +12 -6
- package/README.ko.md +12 -6
- package/README.md +56 -28
- package/README.pl.md +216 -0
- package/README.pt.md +12 -6
- package/README.ru.md +12 -6
- package/README.tr.md +12 -6
- package/README.vi.md +148 -183
- package/README.zh-TW.md +14 -17
- package/README.zh.md +12 -6
- package/crates/omx-runtime-core/src/engine.rs +122 -4
- package/crates/omx-runtime-core/src/lib.rs +17 -0
- package/dist/autoresearch/contracts.d.ts.map +1 -1
- package/dist/autoresearch/contracts.js +1 -0
- package/dist/autoresearch/contracts.js.map +1 -1
- package/dist/autoresearch/runtime.d.ts.map +1 -1
- package/dist/autoresearch/runtime.js +7 -1
- package/dist/autoresearch/runtime.js.map +1 -1
- package/dist/cli/__tests__/agents.test.js +24 -1
- package/dist/cli/__tests__/agents.test.js.map +1 -1
- package/dist/cli/__tests__/autoresearch.test.js +11 -0
- package/dist/cli/__tests__/autoresearch.test.js.map +1 -1
- package/dist/cli/__tests__/cleanup.test.js +117 -4
- package/dist/cli/__tests__/cleanup.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +33 -3
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/error-handling-warnings.test.js +13 -0
- package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -1
- package/dist/cli/__tests__/exec.test.js +6 -0
- package/dist/cli/__tests__/exec.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +101 -1
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +3 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +10 -0
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/packaged-script-resolution.test.js +4 -3
- package/dist/cli/__tests__/packaged-script-resolution.test.js.map +1 -1
- package/dist/cli/__tests__/resume.test.js +6 -0
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +29 -12
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.js +1 -1
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/star-prompt.test.js +16 -0
- package/dist/cli/__tests__/star-prompt.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.js +112 -1
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts +2 -0
- package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts.map +1 -0
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js +30 -0
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -0
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +9 -3
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/autoresearch-guided.d.ts.map +1 -1
- package/dist/cli/autoresearch-guided.js +9 -3
- package/dist/cli/autoresearch-guided.js.map +1 -1
- package/dist/cli/autoresearch.d.ts.map +1 -1
- package/dist/cli/autoresearch.js +8 -2
- package/dist/cli/autoresearch.js.map +1 -1
- package/dist/cli/cleanup.d.ts +2 -0
- package/dist/cli/cleanup.d.ts.map +1 -1
- package/dist/cli/cleanup.js +27 -1
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/doctor.js +7 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +9 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +171 -55
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +18 -15
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/star-prompt.d.ts.map +1 -1
- package/dist/cli/star-prompt.js +2 -0
- package/dist/cli/star-prompt.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +5 -1
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/tmux-hook.d.ts.map +1 -1
- package/dist/cli/tmux-hook.js +4 -1
- package/dist/cli/tmux-hook.js.map +1 -1
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +26 -0
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +1 -0
- package/dist/cli/update.js.map +1 -1
- package/dist/compat/__tests__/rust-runtime-compat.test.js +84 -1
- package/dist/compat/__tests__/rust-runtime-compat.test.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +4 -4
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/mcp-registry.test.js +13 -16
- package/dist/config/__tests__/mcp-registry.test.js.map +1 -1
- package/dist/config/mcp-registry.d.ts +1 -0
- package/dist/config/mcp-registry.d.ts.map +1 -1
- package/dist/config/mcp-registry.js +4 -4
- package/dist/config/mcp-registry.js.map +1 -1
- package/dist/config/models.d.ts +1 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +39 -1
- package/dist/config/models.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +12 -1
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +554 -18
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +347 -16
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-modules.test.js +5 -0
- package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts +2 -0
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +597 -0
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -0
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js +19 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js +73 -53
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +193 -2
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +183 -0
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +255 -97
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +46 -0
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-team-routing.test.js +34 -0
- package/dist/hooks/__tests__/prompt-team-routing.test.js.map +1 -1
- package/dist/hooks/__tests__/tmux-hook-engine.test.js +32 -1
- package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -1
- package/dist/hooks/code-simplifier/index.d.ts.map +1 -1
- package/dist/hooks/code-simplifier/index.js +1 -0
- package/dist/hooks/code-simplifier/index.js.map +1 -1
- package/dist/hooks/codebase-map.d.ts.map +1 -1
- package/dist/hooks/codebase-map.js +1 -0
- package/dist/hooks/codebase-map.js.map +1 -1
- package/dist/hooks/extensibility/sdk/tmux.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/tmux.js +3 -1
- package/dist/hooks/extensibility/sdk/tmux.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +1 -0
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +48 -0
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
- package/dist/hooks/prompt-guidance-contract.js +6 -0
- package/dist/hooks/prompt-guidance-contract.js.map +1 -1
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +1 -0
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +70 -1
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/authority.d.ts.map +1 -1
- package/dist/hud/authority.js +1 -0
- package/dist/hud/authority.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +52 -0
- package/dist/hud/state.js.map +1 -1
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +5 -0
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/modes/__tests__/base-session-scope.test.js +46 -0
- package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +4 -0
- package/dist/modes/base.js.map +1 -1
- package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts +2 -0
- package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/custom-alias-enablement.test.js +84 -0
- package/dist/notifications/__tests__/custom-alias-enablement.test.js.map +1 -0
- package/dist/notifications/__tests__/idle-cooldown.test.js +55 -0
- package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -1
- package/dist/notifications/idle-cooldown.d.ts +8 -6
- package/dist/notifications/idle-cooldown.d.ts.map +1 -1
- package/dist/notifications/idle-cooldown.js +53 -22
- package/dist/notifications/idle-cooldown.js.map +1 -1
- package/dist/notifications/notifier.js +1 -1
- package/dist/notifications/notifier.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/tmux.d.ts.map +1 -1
- package/dist/notifications/tmux.js +4 -0
- package/dist/notifications/tmux.js.map +1 -1
- package/dist/openclaw/config.js +2 -2
- package/dist/openclaw/config.js.map +1 -1
- package/dist/runtime/bridge.d.ts +2 -0
- package/dist/runtime/bridge.d.ts.map +1 -1
- package/dist/runtime/bridge.js +8 -0
- package/dist/runtime/bridge.js.map +1 -1
- package/dist/scripts/notify-fallback-watcher.js +103 -53
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.d.ts +2 -1
- package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.js +90 -104
- package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.d.ts +19 -0
- package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -0
- package/dist/scripts/notify-hook/managed-tmux.js +320 -0
- package/dist/scripts/notify-hook/managed-tmux.js.map +1 -0
- package/dist/scripts/notify-hook/operational-events.d.ts.map +1 -1
- package/dist/scripts/notify-hook/operational-events.js +2 -0
- package/dist/scripts/notify-hook/operational-events.js.map +1 -1
- package/dist/scripts/notify-hook/ralph-session-resume.d.ts +22 -0
- package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -0
- package/dist/scripts/notify-hook/ralph-session-resume.js +277 -0
- package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -0
- package/dist/scripts/notify-hook/state-io.d.ts +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +2 -10
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +123 -72
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts +2 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +13 -5
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +1 -19
- package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker.js +4 -4
- package/dist/scripts/notify-hook/team-worker.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +102 -35
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/notify-hook.js +144 -20
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/run-provider-advisor.js +2 -0
- package/dist/scripts/run-provider-advisor.js.map +1 -1
- package/dist/scripts/run-test-files.d.ts +2 -0
- package/dist/scripts/run-test-files.d.ts.map +1 -0
- package/dist/scripts/run-test-files.js +41 -0
- package/dist/scripts/run-test-files.js.map +1 -0
- package/dist/scripts/tmux-hook-engine.d.ts +2 -0
- package/dist/scripts/tmux-hook-engine.d.ts.map +1 -1
- package/dist/scripts/tmux-hook-engine.js +15 -0
- package/dist/scripts/tmux-hook-engine.js.map +1 -1
- package/dist/team/__tests__/api-interop.test.js +136 -4
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/leader-activity.test.js +107 -2
- package/dist/team/__tests__/leader-activity.test.js.map +1 -1
- package/dist/team/__tests__/runtime-cli.test.js +32 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +148 -0
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/shutdown-fallback.test.js +13 -0
- package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.js +11 -1
- package/dist/team/__tests__/state-root.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +237 -0
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +521 -2
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +41 -31
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/commit-hygiene.d.ts +60 -0
- package/dist/team/commit-hygiene.d.ts.map +1 -0
- package/dist/team/commit-hygiene.js +232 -0
- package/dist/team/commit-hygiene.js.map +1 -0
- package/dist/team/leader-activity.d.ts.map +1 -1
- package/dist/team/leader-activity.js +56 -4
- package/dist/team/leader-activity.js.map +1 -1
- package/dist/team/runtime-cli.d.ts +9 -1
- package/dist/team/runtime-cli.d.ts.map +1 -1
- package/dist/team/runtime-cli.js +15 -6
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime.d.ts +7 -2
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +392 -171
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +6 -2
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/dispatch.d.ts +2 -0
- package/dist/team/state/dispatch.d.ts.map +1 -1
- package/dist/team/state/dispatch.js +86 -40
- package/dist/team/state/dispatch.js.map +1 -1
- package/dist/team/state/mailbox.d.ts +3 -0
- package/dist/team/state/mailbox.d.ts.map +1 -1
- package/dist/team/state/mailbox.js +93 -19
- package/dist/team/state/mailbox.js.map +1 -1
- package/dist/team/state-root.d.ts +1 -1
- package/dist/team/state-root.d.ts.map +1 -1
- package/dist/team/state-root.js +8 -3
- package/dist/team/state-root.js.map +1 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +96 -2
- package/dist/team/state.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +81 -29
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +4 -0
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +9 -0
- package/dist/team/worktree.js.map +1 -1
- package/dist/utils/__tests__/paths.test.js +98 -11
- package/dist/utils/__tests__/paths.test.js.map +1 -1
- package/dist/utils/__tests__/platform-command.test.js +101 -2
- package/dist/utils/__tests__/platform-command.test.js.map +1 -1
- package/dist/utils/git-layout.d.ts +8 -0
- package/dist/utils/git-layout.d.ts.map +1 -0
- package/dist/utils/git-layout.js +58 -0
- package/dist/utils/git-layout.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +14 -4
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/platform-command.d.ts.map +1 -1
- package/dist/utils/platform-command.js +35 -3
- package/dist/utils/platform-command.js.map +1 -1
- package/package.json +9 -5
- package/src/scripts/notify-fallback-watcher.ts +103 -53
- package/src/scripts/notify-hook/auto-nudge.ts +97 -103
- package/src/scripts/notify-hook/managed-tmux.ts +324 -0
- package/src/scripts/notify-hook/operational-events.ts +2 -0
- package/src/scripts/notify-hook/ralph-session-resume.ts +337 -0
- package/src/scripts/notify-hook/state-io.ts +2 -10
- package/src/scripts/notify-hook/team-dispatch.ts +131 -66
- package/src/scripts/notify-hook/team-leader-nudge.ts +19 -5
- package/src/scripts/notify-hook/team-tmux-guard.ts +0 -20
- package/src/scripts/notify-hook/team-worker.ts +4 -4
- package/src/scripts/notify-hook/tmux-injection.ts +103 -33
- package/src/scripts/notify-hook.ts +150 -21
- package/src/scripts/run-provider-advisor.ts +4 -2
- package/src/scripts/run-test-files.ts +48 -0
- package/src/scripts/tmux-hook-engine.ts +16 -0
- package/templates/AGENTS.md +51 -43
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface GitLayout {
|
|
2
|
+
gitDir: string;
|
|
3
|
+
commonDir: string;
|
|
4
|
+
worktreeRoot: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function findGitLayout(startCwd: string): GitLayout | null;
|
|
7
|
+
export declare function readGitLayoutFile(baseDir: string, ...parts: string[]): string | null;
|
|
8
|
+
//# sourceMappingURL=git-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-layout.d.ts","sourceRoot":"","sources":["../../src/utils/git-layout.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAyBD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CA8BhE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAEpF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
function readTrimmedFile(path) {
|
|
4
|
+
try {
|
|
5
|
+
return readFileSync(path, 'utf-8').trim() || null;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function resolveGitDirPointer(path) {
|
|
12
|
+
const raw = readTrimmedFile(path);
|
|
13
|
+
if (!raw)
|
|
14
|
+
return null;
|
|
15
|
+
const match = raw.match(/^gitdir:\s*(.+)$/i);
|
|
16
|
+
if (!match)
|
|
17
|
+
return null;
|
|
18
|
+
return resolve(dirname(path), match[1].trim());
|
|
19
|
+
}
|
|
20
|
+
function resolveGitCommonDir(gitDir) {
|
|
21
|
+
const commonDir = readTrimmedFile(join(gitDir, 'commondir'));
|
|
22
|
+
return commonDir ? resolve(gitDir, commonDir) : gitDir;
|
|
23
|
+
}
|
|
24
|
+
export function findGitLayout(startCwd) {
|
|
25
|
+
let dir = startCwd;
|
|
26
|
+
for (;;) {
|
|
27
|
+
const candidate = join(dir, '.git');
|
|
28
|
+
try {
|
|
29
|
+
const stat = statSync(candidate);
|
|
30
|
+
if (stat.isDirectory()) {
|
|
31
|
+
return {
|
|
32
|
+
gitDir: candidate,
|
|
33
|
+
commonDir: resolveGitCommonDir(candidate),
|
|
34
|
+
worktreeRoot: dir,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (stat.isFile()) {
|
|
38
|
+
const gitDir = resolveGitDirPointer(candidate);
|
|
39
|
+
if (gitDir) {
|
|
40
|
+
return {
|
|
41
|
+
gitDir,
|
|
42
|
+
commonDir: resolveGitCommonDir(gitDir),
|
|
43
|
+
worktreeRoot: dir,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch { /* not found, walk up */ }
|
|
49
|
+
const parent = dirname(dir);
|
|
50
|
+
if (parent === dir)
|
|
51
|
+
return null;
|
|
52
|
+
dir = parent;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function readGitLayoutFile(baseDir, ...parts) {
|
|
56
|
+
return readTrimmedFile(join(baseDir, ...parts));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=git-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-layout.js","sourceRoot":"","sources":["../../src/utils/git-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQnD,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,GAAG,GAAG,QAAQ,CAAC;IAEnB,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,mBAAmB,CAAC,SAAS,CAAC;oBACzC,YAAY,EAAE,GAAG;iBAClB,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO;wBACL,MAAM;wBACN,SAAS,EAAE,mBAAmB,CAAC,MAAM,CAAC;wBACtC,YAAY,EAAE,GAAG;qBAClB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,GAAG,KAAe;IACnE,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/utils/paths.d.ts
CHANGED
|
@@ -29,6 +29,9 @@ export interface SkillRootOverlapReport {
|
|
|
29
29
|
legacyDir: string;
|
|
30
30
|
canonicalExists: boolean;
|
|
31
31
|
legacyExists: boolean;
|
|
32
|
+
canonicalResolvedDir: string | null;
|
|
33
|
+
legacyResolvedDir: string | null;
|
|
34
|
+
sameResolvedTarget: boolean;
|
|
32
35
|
canonicalSkillCount: number;
|
|
33
36
|
legacySkillCount: number;
|
|
34
37
|
overlappingSkillNames: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,2CAA2C;AAC3C,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,oDAAoD;AACpD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,qFAAqF;AACrF,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAoBD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAmBpC;AAED,wBAAsB,4BAA4B,CAChD,YAAY,SAAkB,EAC9B,SAAS,SAAwB,GAChC,OAAO,CAAC,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,2CAA2C;AAC3C,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,oDAAoD;AACpD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,qFAAqF;AACrF,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAoBD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAmBpC;AAED,wBAAsB,4BAA4B,CAChD,YAAY,SAAkB,EAC9B,SAAS,SAAwB,GAChC,OAAO,CAAC,sBAAsB,CAAC,CAsCjC;AAmBD,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,IAAI,MAAM,CAgBpC"}
|
package/dist/utils/paths.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { createHash } from "crypto";
|
|
6
6
|
import { existsSync } from "fs";
|
|
7
|
-
import { readdir, readFile } from "fs/promises";
|
|
7
|
+
import { readdir, readFile, realpath } from "fs/promises";
|
|
8
8
|
import { dirname, join } from "path";
|
|
9
9
|
import { homedir } from "os";
|
|
10
10
|
import { fileURLToPath } from "url";
|
|
@@ -77,9 +77,13 @@ export async function listInstalledSkillDirectories(projectRoot) {
|
|
|
77
77
|
return deduped;
|
|
78
78
|
}
|
|
79
79
|
export async function detectLegacySkillRootOverlap(canonicalDir = userSkillsDir(), legacyDir = legacyUserSkillsDir()) {
|
|
80
|
-
const
|
|
80
|
+
const canonicalExists = existsSync(canonicalDir);
|
|
81
|
+
const legacyExists = existsSync(legacyDir);
|
|
82
|
+
const [canonicalSkills, legacySkills, canonicalResolvedDir, legacyResolvedDir] = await Promise.all([
|
|
81
83
|
readInstalledSkillsFromDir(canonicalDir, "user"),
|
|
82
84
|
readInstalledSkillsFromDir(legacyDir, "user"),
|
|
85
|
+
canonicalExists ? realpath(canonicalDir).catch(() => null) : Promise.resolve(null),
|
|
86
|
+
legacyExists ? realpath(legacyDir).catch(() => null) : Promise.resolve(null),
|
|
83
87
|
]);
|
|
84
88
|
const canonicalHashes = await hashSkillDirectory(canonicalSkills);
|
|
85
89
|
const legacyHashes = await hashSkillDirectory(legacySkills);
|
|
@@ -89,11 +93,17 @@ export async function detectLegacySkillRootOverlap(canonicalDir = userSkillsDir(
|
|
|
89
93
|
.filter((name) => legacyNames.has(name))
|
|
90
94
|
.sort((a, b) => a.localeCompare(b));
|
|
91
95
|
const mismatchedSkillNames = overlappingSkillNames.filter((name) => canonicalHashes.get(name) !== legacyHashes.get(name));
|
|
96
|
+
const sameResolvedTarget = canonicalResolvedDir !== null &&
|
|
97
|
+
legacyResolvedDir !== null &&
|
|
98
|
+
canonicalResolvedDir === legacyResolvedDir;
|
|
92
99
|
return {
|
|
93
100
|
canonicalDir,
|
|
94
101
|
legacyDir,
|
|
95
|
-
canonicalExists
|
|
96
|
-
legacyExists
|
|
102
|
+
canonicalExists,
|
|
103
|
+
legacyExists,
|
|
104
|
+
canonicalResolvedDir,
|
|
105
|
+
legacyResolvedDir,
|
|
106
|
+
sameResolvedTarget,
|
|
97
107
|
canonicalSkillCount: canonicalSkills.length,
|
|
98
108
|
legacySkillCount: legacySkills.length,
|
|
99
109
|
overlappingSkillNames,
|
package/dist/utils/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-command.d.ts","sourceRoot":"","sources":["../../src/utils/platform-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,kCAAkC,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG1G,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAChD,KAAK,aAAa,GAAG,OAAO,SAAS,CAAC;AAEtC,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"platform-command.d.ts","sourceRoot":"","sources":["../../src/utils/platform-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,kCAAkC,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG1G,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAChD,KAAK,aAAa,GAAG,OAAO,SAAS,CAAC;AAEtC,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;CAClC;AAoJD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,CAKzG;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,UAAU,GAAE,cAA2B,GACtC,MAAM,GAAG,IAAI,CAKf;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,UAAU,GAAE,cAA2B,GACtC,mBAAmB,CAmCrB;AAQD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,kCAA0D,EACnE,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,UAAU,GAAE,cAA2B,EACvC,SAAS,GAAE,aAAyB,GACnC,qBAAqB,CAkBvB"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
2
|
import { spawnSync } from 'child_process';
|
|
3
|
-
import { delimiter, extname, join, resolve } from 'path';
|
|
3
|
+
import { basename, delimiter, dirname, extname, join, resolve } from 'path';
|
|
4
4
|
const WINDOWS_DEFAULT_PATHEXT = ['.com', '.exe', '.bat', '.cmd', '.ps1'];
|
|
5
5
|
const WINDOWS_DIRECT_EXTENSIONS = new Set(['.com', '.exe']);
|
|
6
6
|
const WINDOWS_CMD_EXTENSIONS = new Set(['.bat', '.cmd']);
|
|
7
7
|
const WINDOWS_EXTENSION_PRIORITY = ['.exe', '.com', '.ps1', '.cmd', '.bat'];
|
|
8
8
|
const NODE_HOSTED_SCRIPT_EXTENSIONS = new Set(['.js', '.mjs', '.cjs']);
|
|
9
|
+
const WINDOWS_NODE_HOSTED_COMMANDS = {
|
|
10
|
+
codex: ['node_modules', '@openai', 'codex', 'bin', 'codex.js'],
|
|
11
|
+
};
|
|
9
12
|
function isWindowsPathLike(command) {
|
|
10
13
|
return /^[A-Za-z]:/.test(command) || /[\\/]/.test(command);
|
|
11
14
|
}
|
|
@@ -30,6 +33,26 @@ function classifyWindowsCommandPath(path) {
|
|
|
30
33
|
return 'direct';
|
|
31
34
|
return 'direct';
|
|
32
35
|
}
|
|
36
|
+
function normalizeWindowsCommandName(command) {
|
|
37
|
+
return basename(command, extname(command)).toLowerCase();
|
|
38
|
+
}
|
|
39
|
+
function resolveWindowsNodeHostedCommandPath(command, resolvedPath, existsImpl) {
|
|
40
|
+
const relativeSegments = WINDOWS_NODE_HOSTED_COMMANDS[normalizeWindowsCommandName(command)];
|
|
41
|
+
if (!relativeSegments)
|
|
42
|
+
return null;
|
|
43
|
+
if (classifyWindowsCommandPath(resolvedPath) === 'direct')
|
|
44
|
+
return null;
|
|
45
|
+
const candidates = [
|
|
46
|
+
join(dirname(resolvedPath), ...relativeSegments),
|
|
47
|
+
join(dirname(resolvedPath), '..', ...relativeSegments.slice(1)),
|
|
48
|
+
join(dirname(resolvedPath), '..', ...relativeSegments),
|
|
49
|
+
];
|
|
50
|
+
for (const candidate of candidates) {
|
|
51
|
+
if (existsImpl(candidate))
|
|
52
|
+
return candidate;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
33
56
|
function resolveWindowsCommandPath(command, env, existsImpl) {
|
|
34
57
|
const candidates = [];
|
|
35
58
|
const extension = extname(command).toLowerCase();
|
|
@@ -124,6 +147,14 @@ export function buildPlatformCommandSpec(command, args, platform = process.platf
|
|
|
124
147
|
return { command, args: [...args] };
|
|
125
148
|
}
|
|
126
149
|
const kind = classifyWindowsCommandPath(resolvedPath);
|
|
150
|
+
const nodeHostedPath = resolveWindowsNodeHostedCommandPath(command, resolvedPath, existsImpl);
|
|
151
|
+
if (nodeHostedPath) {
|
|
152
|
+
return {
|
|
153
|
+
command: process.execPath,
|
|
154
|
+
args: [nodeHostedPath, ...args],
|
|
155
|
+
resolvedPath: nodeHostedPath,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
127
158
|
if (kind === 'cmd') {
|
|
128
159
|
return buildCmdLaunch(resolvedPath, args, env);
|
|
129
160
|
}
|
|
@@ -149,9 +180,10 @@ function shouldRetryWithNodeHost(spec, error, platform) {
|
|
|
149
180
|
}
|
|
150
181
|
export function spawnPlatformCommandSync(command, args, options = { encoding: 'utf-8' }, platform = process.platform, env = process.env, existsImpl = existsSync, spawnImpl = spawnSync) {
|
|
151
182
|
const spec = buildPlatformCommandSpec(command, args, platform, env, existsImpl);
|
|
183
|
+
const baseOptions = platform === 'win32' ? { ...options, windowsHide: true } : options;
|
|
152
184
|
const spawnOptions = shouldUseWindowsVerbatimArguments(platform, spec)
|
|
153
|
-
? { ...
|
|
154
|
-
:
|
|
185
|
+
? { ...baseOptions, windowsVerbatimArguments: true }
|
|
186
|
+
: baseOptions;
|
|
155
187
|
const result = spawnImpl(spec.command, spec.args, spawnOptions);
|
|
156
188
|
if (!shouldRetryWithNodeHost(spec, result.error, platform)) {
|
|
157
189
|
return { spec, result };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-command.js","sourceRoot":"","sources":["../../src/utils/platform-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,SAAS,EAAkE,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"platform-command.js","sourceRoot":"","sources":["../../src/utils/platform-command.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-codex",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.13",
|
|
4
4
|
"description": "Multi-agent orchestration layer for OpenAI Codex CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,11 +23,15 @@
|
|
|
23
23
|
"ask:gemini": "./src/scripts/ask-gemini.sh",
|
|
24
24
|
"test:explore": "cargo test -p omx-explore-harness && node --test dist/cli/__tests__/explore.test.js dist/hooks/__tests__/explore-routing.test.js dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.js",
|
|
25
25
|
"test:team:cross-rebase-smoke": "npm run build && node --test dist/team/__tests__/cross-rebase-smoke.test.js",
|
|
26
|
-
"test:node": "node
|
|
26
|
+
"test:node": "node dist/scripts/run-test-files.js dist",
|
|
27
|
+
"test:node:cross-platform": "npm run test:node",
|
|
27
28
|
"test": "npm run build && npm run test:node && node dist/scripts/generate-catalog-docs.js --check",
|
|
28
|
-
"coverage:team-critical": "npm run build && c8 --all --src dist/team --src dist/state --include 'dist/team/**/*.js' --include 'dist/state/**/*.js' --exclude '**/__tests__/**' --reporter=text-summary --reporter=lcov --reporter=json-summary --report-dir coverage/team --check-coverage --lines=78 --functions=90 --branches=70 --statements=78 node
|
|
29
|
-
"coverage:
|
|
30
|
-
"
|
|
29
|
+
"coverage:team-critical": "npm run build && c8 --all --src dist/team --src dist/state --include 'dist/team/**/*.js' --include 'dist/state/**/*.js' --exclude '**/__tests__/**' --reporter=text-summary --reporter=lcov --reporter=json-summary --report-dir coverage/team --check-coverage --lines=78 --functions=90 --branches=70 --statements=78 node dist/scripts/run-test-files.js dist/team/__tests__ dist/state/__tests__",
|
|
30
|
+
"coverage:team-critical:cross-platform": "npm run build && c8 --all --src dist/team --src dist/state --include 'dist/team/**/*.js' --include 'dist/state/**/*.js' --exclude '**/__tests__/**' --reporter=text-summary --reporter=lcov --reporter=json-summary --report-dir coverage/team --check-coverage --lines=78 --functions=90 --branches=70 --statements=78 node dist/scripts/run-test-files.js dist/team/__tests__ dist/state/__tests__",
|
|
31
|
+
"coverage:ts:full": "npm run build && c8 --all --src dist --exclude '**/__tests__/**' --exclude 'dist/bin/**' --exclude 'dist/**/*.d.ts' --reporter=text-summary --reporter=lcov --reporter=json-summary --report-dir coverage/ts-full node dist/scripts/run-test-files.js dist",
|
|
32
|
+
"coverage:ts:full:cross-platform": "npm run build && c8 --all --src dist --exclude '**/__tests__/**' --exclude 'dist/bin/**' --exclude 'dist/**/*.d.ts' --reporter=text-summary --reporter=lcov --reporter=json-summary --report-dir coverage/ts-full node dist/scripts/run-test-files.js dist",
|
|
33
|
+
"test:compat:node": "npm run build && node dist/scripts/run-test-files.js dist/compat/__tests__",
|
|
34
|
+
"test:compat:node:cross-platform": "npm run build && node dist/scripts/run-test-files.js dist/compat/__tests__",
|
|
31
35
|
"test:compat:rust": "cargo build && OMX_COMPAT_TARGET=./target/debug/omx npm run test:compat:node",
|
|
32
36
|
"build:sparkshell": "node dist/scripts/build-sparkshell.js",
|
|
33
37
|
"smoke:packed-install": "node dist/scripts/smoke-packed-install.js",
|
|
@@ -5,9 +5,11 @@ import { appendFile, mkdir, open, readFile, readdir, rename, stat, unlink, write
|
|
|
5
5
|
import { spawnSync } from 'child_process';
|
|
6
6
|
import { dirname, join, resolve } from 'path';
|
|
7
7
|
import { homedir } from 'os';
|
|
8
|
+
import { spawnPlatformCommandSync } from '../utils/platform-command.js';
|
|
8
9
|
import { drainPendingTeamDispatch } from './notify-hook/team-dispatch.js';
|
|
9
10
|
import {
|
|
10
11
|
maybeAutoNudge,
|
|
12
|
+
isDeepInterviewInputLockActive,
|
|
11
13
|
isDeepInterviewStateActive,
|
|
12
14
|
loadAutoNudgeConfig,
|
|
13
15
|
normalizeAutoNudgeSignatureText,
|
|
@@ -39,6 +41,11 @@ function safeString(v: unknown): string {
|
|
|
39
41
|
return typeof v === 'string' ? v : '';
|
|
40
42
|
}
|
|
41
43
|
|
|
44
|
+
function parsePositivePid(value: unknown): number | null {
|
|
45
|
+
const pid = Math.trunc(asNumber(value as string | number | undefined, 0));
|
|
46
|
+
return pid > 0 ? pid : null;
|
|
47
|
+
}
|
|
48
|
+
|
|
42
49
|
function parseIsoMillis(value: string | null | undefined): number | null {
|
|
43
50
|
const parsed = Date.parse(safeString(value).trim());
|
|
44
51
|
return Number.isFinite(parsed) ? parsed : null;
|
|
@@ -70,6 +77,7 @@ async function waitForPidExit(pid: number, timeoutMs = 3000, stepMs = 50): Promi
|
|
|
70
77
|
const cwd = resolve(argValue('--cwd', process.cwd()));
|
|
71
78
|
const notifyScript = resolve(argValue('--notify-script', join(cwd, 'dist', 'scripts', 'notify-hook.js')));
|
|
72
79
|
const runOnce = process.argv.includes('--once');
|
|
80
|
+
const authorityOnly = process.argv.includes('--authority-only');
|
|
73
81
|
// Keep fallback control-plane ticks comfortably below the default dispatch
|
|
74
82
|
// ack budget so leaderless team dispatch + stale-alert recovery do not feel
|
|
75
83
|
// laggy between native notify-hook turns.
|
|
@@ -252,6 +260,21 @@ function eventLog(event: Record<string, unknown>): Promise<void> {
|
|
|
252
260
|
return appendFile(logPath, `${JSON.stringify({ timestamp: new Date().toISOString(), ...event })}\n`).catch(() => {});
|
|
253
261
|
}
|
|
254
262
|
|
|
263
|
+
function shouldLogLeaderNudgeTick(reason: string): boolean {
|
|
264
|
+
return reason === 'leader_nudge_checked' || reason === 'leader_nudge_failed';
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function shouldLogDispatchDrainTick(result: unknown): boolean {
|
|
268
|
+
if (!result || typeof result !== 'object') return false;
|
|
269
|
+
const record = result as Record<string, unknown>;
|
|
270
|
+
const processed = asNumber(record.processed as string | number | undefined, 0);
|
|
271
|
+
const skipped = asNumber(record.skipped as string | number | undefined, 0);
|
|
272
|
+
const failed = asNumber(record.failed as string | number | undefined, 0);
|
|
273
|
+
if (processed > 0 || skipped > 0 || failed > 0) return true;
|
|
274
|
+
const reason = safeString(record.reason).trim();
|
|
275
|
+
return reason !== '' && reason !== 'worker_context';
|
|
276
|
+
}
|
|
277
|
+
|
|
255
278
|
function normalizeRalphContinueSteerState(raw: Record<string, unknown> | null | undefined): RalphContinueSteerState {
|
|
256
279
|
if (!raw || typeof raw !== 'object') return { ...lastRalphContinueSteer };
|
|
257
280
|
return {
|
|
@@ -448,16 +471,19 @@ async function resolveActiveTeamState(): Promise<ActiveTeamResult> {
|
|
|
448
471
|
async function emitRalphContinueSteer(paneId: string, message: string): Promise<void> {
|
|
449
472
|
const markedText = `${message} ${DEFAULT_MARKER}`;
|
|
450
473
|
await new Promise<void>((resolve) => {
|
|
451
|
-
const typed =
|
|
474
|
+
const { result: typed } = spawnPlatformCommandSync('tmux', ['send-keys', '-t', paneId, '-l', markedText], { encoding: 'utf-8' });
|
|
475
|
+
if (typed.error) throw new Error(typed.error.message);
|
|
452
476
|
if (typed.status !== 0) throw new Error((typed.stderr || typed.stdout || '').trim() || 'tmux send-keys failed');
|
|
453
477
|
setTimeout(resolve, 100);
|
|
454
478
|
});
|
|
455
479
|
await new Promise<void>((resolve) => {
|
|
456
|
-
const submitA =
|
|
480
|
+
const { result: submitA } = spawnPlatformCommandSync('tmux', ['send-keys', '-t', paneId, 'C-m'], { encoding: 'utf-8' });
|
|
481
|
+
if (submitA.error) throw new Error(submitA.error.message);
|
|
457
482
|
if (submitA.status !== 0) throw new Error((submitA.stderr || submitA.stdout || '').trim() || 'tmux send-keys C-m failed');
|
|
458
483
|
setTimeout(resolve, 100);
|
|
459
484
|
});
|
|
460
|
-
const submitB =
|
|
485
|
+
const { result: submitB } = spawnPlatformCommandSync('tmux', ['send-keys', '-t', paneId, 'C-m'], { encoding: 'utf-8' });
|
|
486
|
+
if (submitB.error) throw new Error(submitB.error.message);
|
|
461
487
|
if (submitB.status !== 0) {
|
|
462
488
|
throw new Error((submitB.stderr || submitB.stdout || '').trim() || 'tmux send-keys C-m failed');
|
|
463
489
|
}
|
|
@@ -481,9 +507,9 @@ async function readRalphSteerLock(path: string): Promise<RalphSteerLockRecord |
|
|
|
481
507
|
if (!raw.trim()) return null;
|
|
482
508
|
try {
|
|
483
509
|
const parsed = JSON.parse(raw) as Record<string, unknown>;
|
|
484
|
-
const pid =
|
|
510
|
+
const pid = parsePositivePid(parsed.pid);
|
|
485
511
|
const acquiredAt = safeString(parsed.acquired_at).trim();
|
|
486
|
-
if (
|
|
512
|
+
if (pid === null || !acquiredAt) return null;
|
|
487
513
|
return { pid, acquired_at: acquiredAt };
|
|
488
514
|
} catch {
|
|
489
515
|
return null;
|
|
@@ -583,19 +609,19 @@ async function readPidFileRecord(path: string): Promise<PidFileRecord | null> {
|
|
|
583
609
|
if (!trimmed) return null;
|
|
584
610
|
try {
|
|
585
611
|
const parsed = JSON.parse(trimmed) as Record<string, unknown>;
|
|
586
|
-
const pid =
|
|
587
|
-
if (pid
|
|
612
|
+
const pid = parsePositivePid(parsed.pid);
|
|
613
|
+
if (pid === null) return null;
|
|
588
614
|
return {
|
|
589
615
|
pid,
|
|
590
|
-
parent_pid:
|
|
616
|
+
parent_pid: parsePositivePid(parsed.parent_pid) ?? undefined,
|
|
591
617
|
cwd: safeString(parsed.cwd) || undefined,
|
|
592
618
|
started_at: safeString(parsed.started_at) || undefined,
|
|
593
619
|
max_lifetime_ms: asNumber(parsed.max_lifetime_ms as string | number | undefined, 0) || undefined,
|
|
594
620
|
owner_token: safeString(parsed.owner_token) || undefined,
|
|
595
621
|
};
|
|
596
622
|
} catch {
|
|
597
|
-
const pid =
|
|
598
|
-
return
|
|
623
|
+
const pid = parsePositivePid(trimmed);
|
|
624
|
+
return pid === null ? null : { pid };
|
|
599
625
|
}
|
|
600
626
|
}
|
|
601
627
|
|
|
@@ -616,6 +642,7 @@ async function runRalphContinueSteerTick(): Promise<void> {
|
|
|
616
642
|
const nowIso = new Date(now).toISOString();
|
|
617
643
|
const startupIso = new Date(startedAt).toISOString();
|
|
618
644
|
const activeRalph = await resolveActiveRalphState();
|
|
645
|
+
const activePaneId = safeString(activeRalph.state?.tmux_pane_id).trim();
|
|
619
646
|
lastRalphContinueSteer = {
|
|
620
647
|
...lastRalphContinueSteer,
|
|
621
648
|
active: activeRalph.active,
|
|
@@ -624,6 +651,7 @@ async function runRalphContinueSteerTick(): Promise<void> {
|
|
|
624
651
|
last_reason: activeRalph.reason,
|
|
625
652
|
last_error: null,
|
|
626
653
|
state_path: activeRalph.path,
|
|
654
|
+
pane_id: activePaneId,
|
|
627
655
|
pane_current_command: '',
|
|
628
656
|
shared_timestamp_path: ralphSteerTimestampPath,
|
|
629
657
|
singleton_lock_path: ralphSteerLockPath,
|
|
@@ -781,6 +809,7 @@ async function writeState(extra: Record<string, unknown> = {}): Promise<void> {
|
|
|
781
809
|
started_at: new Date(startedAt).toISOString(),
|
|
782
810
|
cwd,
|
|
783
811
|
notify_script: notifyScript,
|
|
812
|
+
authority_only: authorityOnly,
|
|
784
813
|
poll_ms: pollMs,
|
|
785
814
|
pid_file: runOnce ? null : pidFilePath,
|
|
786
815
|
max_lifetime_ms: maxLifetimeMs,
|
|
@@ -881,6 +910,11 @@ async function runFallbackAutoNudgeTick(): Promise<void> {
|
|
|
881
910
|
const persistedAutoNudgeState = await readAutoNudgeState();
|
|
882
911
|
const autoNudgeConfig = await loadAutoNudgeConfig();
|
|
883
912
|
const semanticSignature = normalizeAutoNudgeSignatureText(lastMessage);
|
|
913
|
+
if (signature && safeString(persistedAutoNudgeState?.lastSignature) === signature) {
|
|
914
|
+
lastFallbackAutoNudge.last_reason = 'already_nudged_for_signature';
|
|
915
|
+
lastFallbackAutoNudge.last_nudged_signature = signature;
|
|
916
|
+
return;
|
|
917
|
+
}
|
|
884
918
|
const lastNudgeAtMs = parseIsoMillis(safeString(persistedAutoNudgeState?.lastNudgeAt));
|
|
885
919
|
if (
|
|
886
920
|
semanticSignature
|
|
@@ -1096,7 +1130,8 @@ async function invokeNotifyHook(payload: Record<string, unknown>, filePath: stri
|
|
|
1096
1130
|
const result = spawnSync(process.execPath, [notifyScript, JSON.stringify(payload)], {
|
|
1097
1131
|
cwd,
|
|
1098
1132
|
encoding: 'utf-8',
|
|
1099
|
-
|
|
1133
|
+
windowsHide: true,
|
|
1134
|
+
});
|
|
1100
1135
|
const ok = result.status === 0;
|
|
1101
1136
|
await eventLog({
|
|
1102
1137
|
type: 'fallback_notify',
|
|
@@ -1193,21 +1228,18 @@ async function runLeaderNudgeTick(): Promise<void> {
|
|
|
1193
1228
|
last_tick_at: startedIso,
|
|
1194
1229
|
last_error: 'worker_context',
|
|
1195
1230
|
};
|
|
1196
|
-
await eventLog({
|
|
1197
|
-
type: 'leader_nudge_tick',
|
|
1198
|
-
leader_only: false,
|
|
1199
|
-
run_count: leaderNudgeRuns,
|
|
1200
|
-
reason: 'worker_context',
|
|
1201
|
-
stale_threshold_ms: staleThresholdMs,
|
|
1202
|
-
});
|
|
1203
1231
|
return;
|
|
1204
1232
|
}
|
|
1205
1233
|
|
|
1206
1234
|
try {
|
|
1207
1235
|
const preComputedLeaderStale = await isLeaderStale(stateDir, staleThresholdMs, Date.now());
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1236
|
+
await maybeNudgeTeamLeader({
|
|
1237
|
+
cwd,
|
|
1238
|
+
stateDir,
|
|
1239
|
+
logsDir,
|
|
1240
|
+
preComputedLeaderStale,
|
|
1241
|
+
allowFreshMailboxNudges: false,
|
|
1242
|
+
});
|
|
1211
1243
|
leaderNudgeRuns += 1;
|
|
1212
1244
|
lastLeaderNudge = {
|
|
1213
1245
|
enabled: true,
|
|
@@ -1217,14 +1249,17 @@ async function runLeaderNudgeTick(): Promise<void> {
|
|
|
1217
1249
|
last_tick_at: startedIso,
|
|
1218
1250
|
last_error: null,
|
|
1219
1251
|
};
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1252
|
+
const reason = preComputedLeaderStale ? 'leader_nudge_checked' : 'leader_nudge_skipped_not_stale';
|
|
1253
|
+
if (shouldLogLeaderNudgeTick(reason)) {
|
|
1254
|
+
await eventLog({
|
|
1255
|
+
type: 'leader_nudge_tick',
|
|
1256
|
+
leader_only: true,
|
|
1257
|
+
run_count: leaderNudgeRuns,
|
|
1258
|
+
stale_threshold_ms: staleThresholdMs,
|
|
1259
|
+
precomputed_leader_stale: preComputedLeaderStale,
|
|
1260
|
+
reason,
|
|
1261
|
+
});
|
|
1262
|
+
}
|
|
1228
1263
|
} catch (err) {
|
|
1229
1264
|
leaderNudgeRuns += 1;
|
|
1230
1265
|
lastLeaderNudge = {
|
|
@@ -1257,13 +1292,15 @@ async function runDispatchDrainTick(): Promise<void> {
|
|
|
1257
1292
|
last_result: result,
|
|
1258
1293
|
last_error: null,
|
|
1259
1294
|
};
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1295
|
+
if (shouldLogDispatchDrainTick(result)) {
|
|
1296
|
+
await eventLog({
|
|
1297
|
+
type: 'dispatch_drain_tick',
|
|
1298
|
+
leader_only: lastDispatchDrain.leader_only,
|
|
1299
|
+
dispatch_max_per_tick: dispatchTickMax,
|
|
1300
|
+
run_count: dispatchDrainRuns,
|
|
1301
|
+
...(result && typeof result === 'object' ? result as Record<string, unknown> : {}),
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1267
1304
|
} catch (err) {
|
|
1268
1305
|
dispatchDrainRuns += 1;
|
|
1269
1306
|
lastDispatchDrain = {
|
|
@@ -1283,21 +1320,29 @@ async function runDispatchDrainTick(): Promise<void> {
|
|
|
1283
1320
|
}
|
|
1284
1321
|
}
|
|
1285
1322
|
|
|
1323
|
+
async function shouldSuppressInteractiveFallbackTicks(): Promise<boolean> {
|
|
1324
|
+
const [deepInterviewStateActive, deepInterviewInputLockActive] = await Promise.all([
|
|
1325
|
+
isDeepInterviewStateActive(stateDir),
|
|
1326
|
+
isDeepInterviewInputLockActive(stateDir),
|
|
1327
|
+
]);
|
|
1328
|
+
return deepInterviewStateActive || deepInterviewInputLockActive;
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1286
1331
|
async function pumpTeamControlPlaneTick(): Promise<void> {
|
|
1287
1332
|
await runDispatchDrainTick();
|
|
1288
|
-
|
|
1289
|
-
if (deepInterviewStateActive) return;
|
|
1333
|
+
if (await shouldSuppressInteractiveFallbackTicks()) return;
|
|
1290
1334
|
await runLeaderNudgeTick();
|
|
1291
1335
|
await runFallbackAutoNudgeTick();
|
|
1292
1336
|
}
|
|
1293
1337
|
|
|
1294
1338
|
|
|
1295
1339
|
async function runWatcherCycle(): Promise<void> {
|
|
1296
|
-
|
|
1297
|
-
|
|
1340
|
+
if (!authorityOnly) {
|
|
1341
|
+
await ensureTrackedFiles();
|
|
1342
|
+
await pollFiles();
|
|
1343
|
+
}
|
|
1298
1344
|
await pumpTeamControlPlaneTick();
|
|
1299
|
-
|
|
1300
|
-
if (!deepInterviewStateActive) {
|
|
1345
|
+
if (!authorityOnly && !(await shouldSuppressInteractiveFallbackTicks())) {
|
|
1301
1346
|
await runRalphWatcherBehaviorTick();
|
|
1302
1347
|
}
|
|
1303
1348
|
await writeState();
|
|
@@ -1327,16 +1372,19 @@ async function main(): Promise<void> {
|
|
|
1327
1372
|
|
|
1328
1373
|
await registerPidFile();
|
|
1329
1374
|
await loadPersistedWatcherState();
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1375
|
+
if (!(runOnce && authorityOnly)) {
|
|
1376
|
+
await eventLog({
|
|
1377
|
+
type: 'watcher_start',
|
|
1378
|
+
cwd,
|
|
1379
|
+
notify_script: notifyScript,
|
|
1380
|
+
authority_only: authorityOnly,
|
|
1381
|
+
poll_ms: pollMs,
|
|
1382
|
+
once: runOnce,
|
|
1383
|
+
parent_pid: parentPid,
|
|
1384
|
+
pid_file: runOnce ? null : pidFilePath,
|
|
1385
|
+
max_lifetime_ms: maxLifetimeMs,
|
|
1386
|
+
});
|
|
1387
|
+
}
|
|
1340
1388
|
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
1341
1389
|
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
1342
1390
|
process.on('SIGHUP', () => shutdown('SIGHUP'));
|
|
@@ -1345,7 +1393,9 @@ async function main(): Promise<void> {
|
|
|
1345
1393
|
|
|
1346
1394
|
if (runOnce) {
|
|
1347
1395
|
await runWatcherCycle();
|
|
1348
|
-
|
|
1396
|
+
if (!authorityOnly) {
|
|
1397
|
+
await eventLog({ type: 'watcher_once_complete', authority_only: authorityOnly, seen_turns: seenTurnKeys.size });
|
|
1398
|
+
}
|
|
1349
1399
|
process.exit(0);
|
|
1350
1400
|
}
|
|
1351
1401
|
|