oh-my-opencode 4.16.3 → 4.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/command/omomomo.md +1 -1
- package/.agents/command/publish.md +31 -58
- package/.agents/skills/hyperplan/SKILL.md +3 -3
- package/.agents/skills/omomomo/SKILL.md +1 -1
- package/.agents/skills/pre-publish-review/SKILL.md +1 -1
- package/.agents/skills/publish/SKILL.md +32 -59
- package/.opencode/command/omomomo.md +1 -1
- package/.opencode/command/publish.md +31 -58
- package/.opencode/skills/hyperplan/SKILL.md +3 -3
- package/.opencode/skills/pre-publish-review/SKILL.md +4 -1
- package/README.ja.md +4 -4
- package/README.ko.md +4 -4
- package/README.md +2 -2
- package/README.ru.md +4 -4
- package/README.zh-cn.md +4 -4
- package/dist/cli/index.js +195 -76
- package/dist/cli-node/index.js +195 -76
- package/dist/features/team-mode/test-support/async-test-helpers.d.ts +2 -2
- package/dist/index.js +310 -299
- package/dist/plugin/chat-message/types.d.ts +4 -0
- package/dist/plugin/command-execute-before.d.ts +1 -0
- package/dist/plugin/stop-continuation.d.ts +17 -0
- package/dist/skills/remove-ai-slops/SKILL.md +2 -2
- package/dist/skills/review-work/SKILL.md +10 -2
- package/dist/skills/start-work/SKILL.md +6 -3
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/dist/skills/ulw-plan/SKILL.md +2 -1
- package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
- package/dist/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/dist/skills/visual-qa/SKILL.md +9 -5
- package/dist/tui.js +79 -32
- package/package.json +15 -14
- package/packages/git-bash-mcp/package.json +27 -0
- package/packages/lsp-daemon/dist/cli.js +7 -13
- package/packages/lsp-daemon/dist/daemon-client.js +3 -5
- package/packages/lsp-daemon/dist/index.js +12 -18
- package/packages/lsp-daemon/dist/request-routing.js +6 -8
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +1080 -1017
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +67 -2
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +14 -14
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +0 -13
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +3 -3
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +1 -79
- package/packages/omo-codex/plugin/components/teammode/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +33 -16
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +2 -1
- package/packages/omo-codex/plugin/components/teammode/test/v2-spawn-schema.test.ts +69 -0
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +6 -6
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +26 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/{lazycodex-executor.toml → lazycodex-worker-low.toml} +6 -4
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +26 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +7 -7
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +76 -37
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +76 -37
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +25 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -68
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +76 -37
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +405 -25
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +16 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.d.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +20 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +12 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +148 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +209 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +25 -2
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -15
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +30 -28
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +14 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +10 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +27 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +23 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +16 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +138 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +208 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +4 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +8 -35
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +24 -13
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +43 -8
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +55 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +228 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +193 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +18 -0
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +17 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -2
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +16 -7
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +8 -2
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +18 -4
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +6 -3
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +33 -16
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +2 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +76 -37
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -15
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +30 -28
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +11 -7
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +76 -16
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -2
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +4 -101
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +14 -14
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +11 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +5 -3
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +25 -0
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +24 -0
- package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +9 -40
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +4 -277
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
- package/packages/omo-codex/scripts/install-config.test.mjs +22 -3
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +98 -30
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +2 -2
- package/packages/shared-skills/skills/review-work/SKILL.md +10 -2
- package/packages/shared-skills/skills/start-work/SKILL.md +6 -3
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/shared-skills/skills/visual-qa/SKILL.md +9 -5
- package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
- package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +0 -70
- package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +0 -98
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
package/dist/index.js
CHANGED
|
@@ -13498,7 +13498,8 @@ async function listActiveTeams(config) {
|
|
|
13498
13498
|
teamName: runtimeState.teamName,
|
|
13499
13499
|
status: runtimeState.status,
|
|
13500
13500
|
memberCount: runtimeState.members.length,
|
|
13501
|
-
scope: runtimeState.specSource
|
|
13501
|
+
scope: runtimeState.specSource,
|
|
13502
|
+
...runtimeState.leadSessionId !== undefined ? { leadSessionId: runtimeState.leadSessionId } : {}
|
|
13502
13503
|
});
|
|
13503
13504
|
} catch (error) {
|
|
13504
13505
|
log5("team runtime state skipped", {
|
|
@@ -16584,7 +16585,7 @@ var require_compile = __commonJS((exports) => {
|
|
|
16584
16585
|
const schOrFunc = root.refs[ref];
|
|
16585
16586
|
if (schOrFunc)
|
|
16586
16587
|
return schOrFunc;
|
|
16587
|
-
let _sch =
|
|
16588
|
+
let _sch = resolve36.call(this, root, ref);
|
|
16588
16589
|
if (_sch === undefined) {
|
|
16589
16590
|
const schema = (_a = root.localRefs) === null || _a === undefined ? undefined : _a[ref];
|
|
16590
16591
|
const { schemaId } = this.opts;
|
|
@@ -16611,7 +16612,7 @@ var require_compile = __commonJS((exports) => {
|
|
|
16611
16612
|
function sameSchemaEnv(s1, s2) {
|
|
16612
16613
|
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
|
|
16613
16614
|
}
|
|
16614
|
-
function
|
|
16615
|
+
function resolve36(root, ref) {
|
|
16615
16616
|
let sch;
|
|
16616
16617
|
while (typeof (sch = this.refs[ref]) == "string")
|
|
16617
16618
|
ref = sch;
|
|
@@ -17197,55 +17198,55 @@ var require_fast_uri = __commonJS((exports, module) => {
|
|
|
17197
17198
|
}
|
|
17198
17199
|
return uri;
|
|
17199
17200
|
}
|
|
17200
|
-
function
|
|
17201
|
+
function resolve36(baseURI, relativeURI, options) {
|
|
17201
17202
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
17202
17203
|
const resolved = resolveComponent(parse3(baseURI, schemelessOptions), parse3(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
17203
17204
|
schemelessOptions.skipEscape = true;
|
|
17204
17205
|
return serialize(resolved, schemelessOptions);
|
|
17205
17206
|
}
|
|
17206
|
-
function resolveComponent(base,
|
|
17207
|
+
function resolveComponent(base, relative15, options, skipNormalization) {
|
|
17207
17208
|
const target = {};
|
|
17208
17209
|
if (!skipNormalization) {
|
|
17209
17210
|
base = parse3(serialize(base, options), options);
|
|
17210
|
-
|
|
17211
|
+
relative15 = parse3(serialize(relative15, options), options);
|
|
17211
17212
|
}
|
|
17212
17213
|
options = options || {};
|
|
17213
|
-
if (!options.tolerant &&
|
|
17214
|
-
target.scheme =
|
|
17215
|
-
target.userinfo =
|
|
17216
|
-
target.host =
|
|
17217
|
-
target.port =
|
|
17218
|
-
target.path = removeDotSegments(
|
|
17219
|
-
target.query =
|
|
17214
|
+
if (!options.tolerant && relative15.scheme) {
|
|
17215
|
+
target.scheme = relative15.scheme;
|
|
17216
|
+
target.userinfo = relative15.userinfo;
|
|
17217
|
+
target.host = relative15.host;
|
|
17218
|
+
target.port = relative15.port;
|
|
17219
|
+
target.path = removeDotSegments(relative15.path || "");
|
|
17220
|
+
target.query = relative15.query;
|
|
17220
17221
|
} else {
|
|
17221
|
-
if (
|
|
17222
|
-
target.userinfo =
|
|
17223
|
-
target.host =
|
|
17224
|
-
target.port =
|
|
17225
|
-
target.path = removeDotSegments(
|
|
17226
|
-
target.query =
|
|
17222
|
+
if (relative15.userinfo !== undefined || relative15.host !== undefined || relative15.port !== undefined) {
|
|
17223
|
+
target.userinfo = relative15.userinfo;
|
|
17224
|
+
target.host = relative15.host;
|
|
17225
|
+
target.port = relative15.port;
|
|
17226
|
+
target.path = removeDotSegments(relative15.path || "");
|
|
17227
|
+
target.query = relative15.query;
|
|
17227
17228
|
} else {
|
|
17228
|
-
if (!
|
|
17229
|
+
if (!relative15.path) {
|
|
17229
17230
|
target.path = base.path;
|
|
17230
|
-
if (
|
|
17231
|
-
target.query =
|
|
17231
|
+
if (relative15.query !== undefined) {
|
|
17232
|
+
target.query = relative15.query;
|
|
17232
17233
|
} else {
|
|
17233
17234
|
target.query = base.query;
|
|
17234
17235
|
}
|
|
17235
17236
|
} else {
|
|
17236
|
-
if (
|
|
17237
|
-
target.path = removeDotSegments(
|
|
17237
|
+
if (relative15.path[0] === "/") {
|
|
17238
|
+
target.path = removeDotSegments(relative15.path);
|
|
17238
17239
|
} else {
|
|
17239
17240
|
if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
|
|
17240
|
-
target.path = "/" +
|
|
17241
|
+
target.path = "/" + relative15.path;
|
|
17241
17242
|
} else if (!base.path) {
|
|
17242
|
-
target.path =
|
|
17243
|
+
target.path = relative15.path;
|
|
17243
17244
|
} else {
|
|
17244
|
-
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) +
|
|
17245
|
+
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative15.path;
|
|
17245
17246
|
}
|
|
17246
17247
|
target.path = removeDotSegments(target.path);
|
|
17247
17248
|
}
|
|
17248
|
-
target.query =
|
|
17249
|
+
target.query = relative15.query;
|
|
17249
17250
|
}
|
|
17250
17251
|
target.userinfo = base.userinfo;
|
|
17251
17252
|
target.host = base.host;
|
|
@@ -17253,7 +17254,7 @@ var require_fast_uri = __commonJS((exports, module) => {
|
|
|
17253
17254
|
}
|
|
17254
17255
|
target.scheme = base.scheme;
|
|
17255
17256
|
}
|
|
17256
|
-
target.fragment =
|
|
17257
|
+
target.fragment = relative15.fragment;
|
|
17257
17258
|
return target;
|
|
17258
17259
|
}
|
|
17259
17260
|
function equal(uriA, uriB, options) {
|
|
@@ -17456,7 +17457,7 @@ var require_fast_uri = __commonJS((exports, module) => {
|
|
|
17456
17457
|
var fastUri = {
|
|
17457
17458
|
SCHEMES,
|
|
17458
17459
|
normalize: normalize4,
|
|
17459
|
-
resolve:
|
|
17460
|
+
resolve: resolve36,
|
|
17460
17461
|
resolveComponent,
|
|
17461
17462
|
equal,
|
|
17462
17463
|
serialize,
|
|
@@ -20936,7 +20937,7 @@ var AGENT_MODEL_REQUIREMENTS = {
|
|
|
20936
20937
|
{
|
|
20937
20938
|
providers: ["openai", "vercel"],
|
|
20938
20939
|
model: "gpt-5.6-sol",
|
|
20939
|
-
variant: "
|
|
20940
|
+
variant: "high"
|
|
20940
20941
|
},
|
|
20941
20942
|
{
|
|
20942
20943
|
providers: ["openai", "github-copilot", "opencode", "vercel"],
|
|
@@ -21139,6 +21140,11 @@ var CATEGORY_MODEL_REQUIREMENTS = {
|
|
|
21139
21140
|
},
|
|
21140
21141
|
deep: {
|
|
21141
21142
|
fallbackChain: [
|
|
21143
|
+
{
|
|
21144
|
+
providers: ["openai", "vercel"],
|
|
21145
|
+
model: "gpt-5.6-terra",
|
|
21146
|
+
variant: "xhigh"
|
|
21147
|
+
},
|
|
21142
21148
|
{
|
|
21143
21149
|
providers: ["openai", "vercel"],
|
|
21144
21150
|
model: "gpt-5.6-sol",
|
|
@@ -21202,6 +21208,11 @@ var CATEGORY_MODEL_REQUIREMENTS = {
|
|
|
21202
21208
|
},
|
|
21203
21209
|
"unspecified-low": {
|
|
21204
21210
|
fallbackChain: [
|
|
21211
|
+
{
|
|
21212
|
+
providers: ["openai", "vercel"],
|
|
21213
|
+
model: "gpt-5.6-luna",
|
|
21214
|
+
variant: "xhigh"
|
|
21215
|
+
},
|
|
21205
21216
|
{
|
|
21206
21217
|
providers: ["anthropic", "github-copilot", "opencode", "vercel"],
|
|
21207
21218
|
model: "claude-sonnet-4-6"
|
|
@@ -21769,6 +21780,14 @@ var DEFAULT_MODEL_RESOLUTION_DEPS = {
|
|
|
21769
21780
|
fuzzyMatchModel,
|
|
21770
21781
|
transformModelForProvider
|
|
21771
21782
|
};
|
|
21783
|
+
function findFallbackVariantForModel(model, fallbackChain, transformModelForProvider2) {
|
|
21784
|
+
const [provider, ...modelParts] = model.split("/");
|
|
21785
|
+
if (!provider || modelParts.length === 0) {
|
|
21786
|
+
return;
|
|
21787
|
+
}
|
|
21788
|
+
const modelID = modelParts.join("/");
|
|
21789
|
+
return fallbackChain?.find((entry) => entry.providers.includes(provider) && transformModelForProvider2(provider, entry.model) === modelID && entry.variant)?.variant;
|
|
21790
|
+
}
|
|
21772
21791
|
function resolveModelPipeline(request, providerCache = {
|
|
21773
21792
|
readConnectedProvidersCache: () => null,
|
|
21774
21793
|
findProviderModelMetadata: () => {
|
|
@@ -21787,8 +21806,9 @@ function resolveModelPipeline(request, providerCache = {
|
|
|
21787
21806
|
}
|
|
21788
21807
|
const normalizedUserModel = normalizeModel(intent?.userModel);
|
|
21789
21808
|
if (normalizedUserModel) {
|
|
21809
|
+
const inheritedVariant = findFallbackVariantForModel(normalizedUserModel, fallbackChain, deps.transformModelForProvider);
|
|
21790
21810
|
log3("Model resolved via config override", { model: normalizedUserModel });
|
|
21791
|
-
return { model: normalizedUserModel, provenance: "override" };
|
|
21811
|
+
return inheritedVariant ? { model: normalizedUserModel, provenance: "override", variant: inheritedVariant } : { model: normalizedUserModel, provenance: "override" };
|
|
21792
21812
|
}
|
|
21793
21813
|
const normalizedCategoryDefault = normalizeModel(intent?.categoryDefaultModel);
|
|
21794
21814
|
if (normalizedCategoryDefault) {
|
|
@@ -22603,6 +22623,38 @@ var SUPPLEMENTAL_MODEL_CAPABILITIES = {
|
|
|
22603
22623
|
output: 128000
|
|
22604
22624
|
}
|
|
22605
22625
|
},
|
|
22626
|
+
"gpt-5.6-terra": {
|
|
22627
|
+
id: "gpt-5.6-terra",
|
|
22628
|
+
family: "gpt-mini",
|
|
22629
|
+
reasoning: true,
|
|
22630
|
+
temperature: false,
|
|
22631
|
+
toolCall: true,
|
|
22632
|
+
modalities: {
|
|
22633
|
+
input: ["text", "image", "pdf"],
|
|
22634
|
+
output: ["text"]
|
|
22635
|
+
},
|
|
22636
|
+
limit: {
|
|
22637
|
+
context: 1050000,
|
|
22638
|
+
input: 922000,
|
|
22639
|
+
output: 128000
|
|
22640
|
+
}
|
|
22641
|
+
},
|
|
22642
|
+
"gpt-5.6-luna": {
|
|
22643
|
+
id: "gpt-5.6-luna",
|
|
22644
|
+
family: "gpt-nano",
|
|
22645
|
+
reasoning: true,
|
|
22646
|
+
temperature: false,
|
|
22647
|
+
toolCall: true,
|
|
22648
|
+
modalities: {
|
|
22649
|
+
input: ["text", "image", "pdf"],
|
|
22650
|
+
output: ["text"]
|
|
22651
|
+
},
|
|
22652
|
+
limit: {
|
|
22653
|
+
context: 1050000,
|
|
22654
|
+
input: 922000,
|
|
22655
|
+
output: 128000
|
|
22656
|
+
}
|
|
22657
|
+
},
|
|
22606
22658
|
"gpt-5.5": {
|
|
22607
22659
|
id: "gpt-5.5",
|
|
22608
22660
|
family: "gpt",
|
|
@@ -23506,28 +23558,6 @@ function truncateDescription(description, maxLength = 120) {
|
|
|
23506
23558
|
}
|
|
23507
23559
|
|
|
23508
23560
|
// packages/omo-opencode/src/tools/delegate-task/anthropic-categories.ts
|
|
23509
|
-
var UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
|
23510
|
-
You are working on tasks that don't fit specific categories but require moderate effort.
|
|
23511
|
-
|
|
23512
|
-
<Selection_Gate>
|
|
23513
|
-
BEFORE selecting this category, VERIFY ALL conditions:
|
|
23514
|
-
1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
|
|
23515
|
-
2. Task requires more than trivial effort but is NOT system-wide
|
|
23516
|
-
3. Scope is contained within a few files/modules
|
|
23517
|
-
|
|
23518
|
-
If task fits ANY other category, DO NOT select unspecified-low.
|
|
23519
|
-
This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
|
|
23520
|
-
</Selection_Gate>
|
|
23521
|
-
</Category_Context>
|
|
23522
|
-
|
|
23523
|
-
<Caller_Warning>
|
|
23524
|
-
THIS CATEGORY USES A MID-TIER MODEL (claude-sonnet-4-6).
|
|
23525
|
-
|
|
23526
|
-
**PROVIDE CLEAR STRUCTURE:**
|
|
23527
|
-
1. MUST DO: Enumerate required actions explicitly
|
|
23528
|
-
2. MUST NOT DO: State forbidden actions to prevent scope creep
|
|
23529
|
-
3. EXPECTED OUTPUT: Define concrete success criteria
|
|
23530
|
-
</Caller_Warning>`;
|
|
23531
23561
|
var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
|
23532
23562
|
You are working on tasks that don't fit specific categories but require substantial effort.
|
|
23533
23563
|
|
|
@@ -23543,12 +23573,6 @@ If task is unclassifiable but moderate-effort, use unspecified-low instead.
|
|
|
23543
23573
|
</Selection_Gate>
|
|
23544
23574
|
</Category_Context>`;
|
|
23545
23575
|
var ANTHROPIC_CATEGORIES = [
|
|
23546
|
-
{
|
|
23547
|
-
name: "unspecified-low",
|
|
23548
|
-
config: { model: "anthropic/claude-sonnet-4-6" },
|
|
23549
|
-
description: "Tasks that don't fit other categories, low effort required",
|
|
23550
|
-
promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
|
|
23551
|
-
},
|
|
23552
23576
|
{
|
|
23553
23577
|
name: "unspecified-high",
|
|
23554
23578
|
config: { model: "anthropic/claude-opus-4-7", variant: "max" },
|
|
@@ -23856,6 +23880,28 @@ EXPECTED OUTPUT:
|
|
|
23856
23880
|
|
|
23857
23881
|
If your prompt lacks this structure, REWRITE IT before delegating.
|
|
23858
23882
|
</Caller_Warning>`;
|
|
23883
|
+
var UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
|
23884
|
+
You are working on tasks that don't fit specific categories but require moderate effort.
|
|
23885
|
+
|
|
23886
|
+
<Selection_Gate>
|
|
23887
|
+
BEFORE selecting this category, VERIFY ALL conditions:
|
|
23888
|
+
1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
|
|
23889
|
+
2. Task requires more than trivial effort but is NOT system-wide
|
|
23890
|
+
3. Scope is contained within a few files/modules
|
|
23891
|
+
|
|
23892
|
+
If task fits ANY other category, DO NOT select unspecified-low.
|
|
23893
|
+
This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
|
|
23894
|
+
</Selection_Gate>
|
|
23895
|
+
</Category_Context>
|
|
23896
|
+
|
|
23897
|
+
<Caller_Warning>
|
|
23898
|
+
THIS CATEGORY USES A LIGHTWEIGHT MODEL (gpt-5.6-luna).
|
|
23899
|
+
|
|
23900
|
+
**PROVIDE CLEAR STRUCTURE:**
|
|
23901
|
+
1. MUST DO: Enumerate required actions explicitly
|
|
23902
|
+
2. MUST NOT DO: State forbidden actions to prevent scope creep
|
|
23903
|
+
3. EXPECTED OUTPUT: Define concrete success criteria
|
|
23904
|
+
</Caller_Warning>`;
|
|
23859
23905
|
var OPENAI_CATEGORIES = [
|
|
23860
23906
|
{
|
|
23861
23907
|
name: "ultrabrain",
|
|
@@ -23865,7 +23911,7 @@ var OPENAI_CATEGORIES = [
|
|
|
23865
23911
|
},
|
|
23866
23912
|
{
|
|
23867
23913
|
name: "deep",
|
|
23868
|
-
config: { model: "openai/gpt-5.6-
|
|
23914
|
+
config: { model: "openai/gpt-5.6-terra", variant: "xhigh" },
|
|
23869
23915
|
description: "Goal-oriented autonomous problem-solving on hairy problems requiring deep research. ONE goal + ONE deliverable per call \u2014 multiple goals must fan out as parallel `deep` calls, never bundled into one.",
|
|
23870
23916
|
promptAppend: DEEP_CATEGORY_PROMPT_APPEND,
|
|
23871
23917
|
resolvePromptAppend: resolveDeepCategoryPromptAppend
|
|
@@ -23875,6 +23921,12 @@ var OPENAI_CATEGORIES = [
|
|
|
23875
23921
|
config: { model: "openai/gpt-5.4-mini" },
|
|
23876
23922
|
description: "Trivial tasks - single file changes, typo fixes, simple modifications",
|
|
23877
23923
|
promptAppend: QUICK_CATEGORY_PROMPT_APPEND
|
|
23924
|
+
},
|
|
23925
|
+
{
|
|
23926
|
+
name: "unspecified-low",
|
|
23927
|
+
config: { model: "openai/gpt-5.6-luna", variant: "xhigh" },
|
|
23928
|
+
description: "Tasks that don't fit other categories, low effort required",
|
|
23929
|
+
promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
|
|
23878
23930
|
}
|
|
23879
23931
|
];
|
|
23880
23932
|
|
|
@@ -79273,7 +79325,7 @@ $ARGUMENTS
|
|
|
79273
79325
|
import { existsSync as existsSync28, readdirSync as readdirSync7, readFileSync as readFileSync18 } from "fs";
|
|
79274
79326
|
import { join as join37 } from "path";
|
|
79275
79327
|
|
|
79276
|
-
// packages/
|
|
79328
|
+
// packages/utils/src/skill-path-resolver.ts
|
|
79277
79329
|
import { isAbsolute as isAbsolute6, posix as posix3, relative as relative4, resolve as resolve12, win32 as win324 } from "path";
|
|
79278
79330
|
function toDisplayPath(path8) {
|
|
79279
79331
|
return path8.replaceAll("\\", "/");
|
|
@@ -79322,7 +79374,6 @@ function resolveSkillPathReferences(content, basePath) {
|
|
|
79322
79374
|
return relativePath.endsWith("/") && !displayPath.endsWith("/") ? `${displayPath}/` : displayPath;
|
|
79323
79375
|
});
|
|
79324
79376
|
}
|
|
79325
|
-
|
|
79326
79377
|
// packages/claude-code-compat-core/src/features/claude-code-plugin-loader/skill-loader.ts
|
|
79327
79378
|
function loadPluginSkillsAsCommands(plugins) {
|
|
79328
79379
|
const skills = {};
|
|
@@ -89613,7 +89664,7 @@ function getCachedVersion(options = {}) {
|
|
|
89613
89664
|
// package.json
|
|
89614
89665
|
var package_default = {
|
|
89615
89666
|
name: "oh-my-opencode",
|
|
89616
|
-
version: "4.
|
|
89667
|
+
version: "4.17.1",
|
|
89617
89668
|
description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
89618
89669
|
main: "./dist/index.js",
|
|
89619
89670
|
types: "dist/index.d.ts",
|
|
@@ -89676,6 +89727,7 @@ var package_default = {
|
|
|
89676
89727
|
"packages/lsp-tools-mcp/dist",
|
|
89677
89728
|
"packages/lsp-daemon/package.json",
|
|
89678
89729
|
"packages/lsp-daemon/dist",
|
|
89730
|
+
"packages/git-bash-mcp/package.json",
|
|
89679
89731
|
"packages/git-bash-mcp/dist",
|
|
89680
89732
|
"packages/shared-skills/package.json",
|
|
89681
89733
|
"packages/shared-skills/index.mjs",
|
|
@@ -89741,7 +89793,7 @@ var package_default = {
|
|
|
89741
89793
|
"typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/pi-goal/tsconfig.json && tsgo --noEmit -p packages/pi-webfetch/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json",
|
|
89742
89794
|
"typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
|
|
89743
89795
|
test: "bun test",
|
|
89744
|
-
"test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
|
|
89796
|
+
"test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
|
|
89745
89797
|
"test:senpi": "node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check && bun test packages/omo-senpi",
|
|
89746
89798
|
"test:windows-codex": "bun run test:codex",
|
|
89747
89799
|
"build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build"
|
|
@@ -89823,18 +89875,18 @@ var package_default = {
|
|
|
89823
89875
|
typescript: "^6.0.3"
|
|
89824
89876
|
},
|
|
89825
89877
|
optionalDependencies: {
|
|
89826
|
-
"oh-my-opencode-darwin-arm64": "4.
|
|
89827
|
-
"oh-my-opencode-darwin-x64": "4.
|
|
89828
|
-
"oh-my-opencode-darwin-x64-baseline": "4.
|
|
89829
|
-
"oh-my-opencode-linux-arm64": "4.
|
|
89830
|
-
"oh-my-opencode-linux-arm64-musl": "4.
|
|
89831
|
-
"oh-my-opencode-linux-x64": "4.
|
|
89832
|
-
"oh-my-opencode-linux-x64-baseline": "4.
|
|
89833
|
-
"oh-my-opencode-linux-x64-musl": "4.
|
|
89834
|
-
"oh-my-opencode-linux-x64-musl-baseline": "4.
|
|
89835
|
-
"oh-my-opencode-windows-arm64": "4.
|
|
89836
|
-
"oh-my-opencode-windows-x64": "4.
|
|
89837
|
-
"oh-my-opencode-windows-x64-baseline": "4.
|
|
89878
|
+
"oh-my-opencode-darwin-arm64": "4.17.1",
|
|
89879
|
+
"oh-my-opencode-darwin-x64": "4.17.1",
|
|
89880
|
+
"oh-my-opencode-darwin-x64-baseline": "4.17.1",
|
|
89881
|
+
"oh-my-opencode-linux-arm64": "4.17.1",
|
|
89882
|
+
"oh-my-opencode-linux-arm64-musl": "4.17.1",
|
|
89883
|
+
"oh-my-opencode-linux-x64": "4.17.1",
|
|
89884
|
+
"oh-my-opencode-linux-x64-baseline": "4.17.1",
|
|
89885
|
+
"oh-my-opencode-linux-x64-musl": "4.17.1",
|
|
89886
|
+
"oh-my-opencode-linux-x64-musl-baseline": "4.17.1",
|
|
89887
|
+
"oh-my-opencode-windows-arm64": "4.17.1",
|
|
89888
|
+
"oh-my-opencode-windows-x64": "4.17.1",
|
|
89889
|
+
"oh-my-opencode-windows-x64-baseline": "4.17.1"
|
|
89838
89890
|
},
|
|
89839
89891
|
overrides: {
|
|
89840
89892
|
"@earendil-works/pi-agent-core": "0.80.3",
|
|
@@ -94916,10 +94968,10 @@ Trigger when ANY apply: user said "\uC5C4\uBC00" / "strictly" / "rigorously" / "
|
|
|
94916
94968
|
|
|
94917
94969
|
Procedure (non-negotiable):
|
|
94918
94970
|
1. Spawn a reviewer via \`task(category="ultrabrain", subagent_type="plan", load_skills=[...], run_in_background=false, prompt="<goal + scenarios + evidence + diff + notepad path>")\` \u2014 or any high-rigor reviewer agent available.
|
|
94919
|
-
2.
|
|
94920
|
-
3. Fix every
|
|
94921
|
-
4. Re-submit to the SAME reviewer
|
|
94922
|
-
5.
|
|
94971
|
+
2. Verify each reviewer concern yourself. A concern blocks only when it names a success criterion the evidence fails; record concerns that cite no criterion as notes with a one-line reason \u2014 fixed or declined at your judgment.
|
|
94972
|
+
3. Fix every criterion-cited blocker. Re-run ONLY the scenario QA affected by the fix; capture fresh evidence for the delta. Update notepad.
|
|
94973
|
+
4. Re-submit to the SAME reviewer at most twice, passing only the delta diff, the blockers it cited, and the already-approved criteria marked out-of-scope. An approval whose only remaining items are notes counts as approval.
|
|
94974
|
+
5. On approval, declare done. If criterion-cited blockers remain after two re-reviews, stop and surface them to the user \u2014 do not loop further.
|
|
94923
94975
|
|
|
94924
94976
|
## ZERO TOLERANCE FAILURES
|
|
94925
94977
|
- **NO Scope Reduction**: Never make "demo", "skeleton", "simplified", "basic" versions - deliver FULL implementation
|
|
@@ -95205,7 +95257,7 @@ If ANY answer is no \u2192 GO BACK AND DO IT. Do not claim completion.
|
|
|
95205
95257
|
|
|
95206
95258
|
### REVIEWER GATE (triggered, not optional)
|
|
95207
95259
|
|
|
95208
|
-
Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or refactor/migration/perf/security. Spawn a high-rigor reviewer via \`task\` with: goal, scenarios, evidence paths, full diff, notepad path.
|
|
95260
|
+
Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or refactor/migration/perf/security. Spawn a high-rigor reviewer via \`task\` with: goal, scenarios, evidence paths, full diff, notepad path. A concern blocks only when it names a success criterion the evidence fails; others are notes. Fix cited blockers, re-run the affected scenario QA, capture fresh delta evidence, and resubmit at most twice; an approval with only notes left counts as approval. Remaining cited blockers after two re-reviews go to the user.
|
|
95209
95261
|
|
|
95210
95262
|
<MANUAL_QA_MANDATE>
|
|
95211
95263
|
### YOU MUST EXECUTE MANUAL QA. THIS IS NOT OPTIONAL. DO NOT SKIP THIS.
|
|
@@ -95455,7 +95507,7 @@ If QA starts a server, browser, tmux session, port, temp dir, or background proc
|
|
|
95455
95507
|
|
|
95456
95508
|
Use a high-rigor reviewer when the task touches 3+ files, changes security/performance/migration behavior, lasts 30+ minutes, or the user asks for strict review.
|
|
95457
95509
|
|
|
95458
|
-
|
|
95510
|
+
A reviewer concern binds only when it cites a success criterion the evidence fails; other concerns are notes. Fix cited blockers, rerun the affected verification, and resubmit the delta at most twice; then surface remaining blockers to the user.
|
|
95459
95511
|
|
|
95460
95512
|
## ZERO TOLERANCE FAILURES
|
|
95461
95513
|
|
|
@@ -95546,7 +95598,7 @@ Before acting, survey the skills available in this system: scan their descriptio
|
|
|
95546
95598
|
| explore agent | Need codebase patterns you don't have | \`task(subagent_type="explore", load_skills=[], run_in_background=true, ...)\` |
|
|
95547
95599
|
| librarian agent | External library docs, OSS examples | \`task(subagent_type="librarian", load_skills=[], run_in_background=true, ...)\` |
|
|
95548
95600
|
| oracle agent | Stuck on architecture/debugging after 2+ attempts | \`task(subagent_type="oracle", load_skills=[], run_in_background=false, ...)\` |
|
|
95549
|
-
| plan agent |
|
|
95601
|
+
| plan agent | Discovery leaves unresolved design uncertainty: unclear boundaries, competing decompositions, or uncertain dependency order | \`task(subagent_type="plan", load_skills=[], run_in_background=false, ...)\` |
|
|
95550
95602
|
| task category | Specialized work matching a category | \`task(category="...", load_skills=[...], run_in_background=true)\` |
|
|
95551
95603
|
|
|
95552
95604
|
<tool_usage_rules>
|
|
@@ -95581,8 +95633,8 @@ deep_context = background_output(task_id=...)
|
|
|
95581
95633
|
// Merge ALL findings for comprehensive understanding
|
|
95582
95634
|
\`\`\`
|
|
95583
95635
|
|
|
95584
|
-
**Plan agent (size
|
|
95585
|
-
-
|
|
95636
|
+
**Plan agent (size by what is UNDECIDED, not by step count):**
|
|
95637
|
+
- Invoke only when open design decisions remain after context gathering \u2014 unclear boundaries, several viable decompositions, or a multi-file build whose dependency order is not obvious. A known procedure, however many steps, and work you are delegating to another session never justify it.
|
|
95586
95638
|
- Invoke AFTER gathering context from both tracks.
|
|
95587
95639
|
- Then execute in the plan's exact wave order + parallel grouping and run the verification it specifies.
|
|
95588
95640
|
|
|
@@ -95649,7 +95701,7 @@ Name the exact tool + exact invocation per scenario (literal \`curl\` / \`send-k
|
|
|
95649
95701
|
|
|
95650
95702
|
## REVIEWER GATE (triggered)
|
|
95651
95703
|
|
|
95652
|
-
Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or it's a refactor/migration/perf/security change. Spawn a high-rigor reviewer via \`task\` with goal + scenarios + evidence + diff.
|
|
95704
|
+
Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or it's a refactor/migration/perf/security change. Spawn a high-rigor reviewer via \`task\` with goal + scenarios + evidence + diff. A concern blocks only when it cites a success criterion the evidence fails \u2014 others are notes. Fix cited blockers, re-run only the affected QA, and re-submit the delta at most twice; an approval with only notes left counts as approval. If cited blockers remain after two re-reviews, surface them to the user before declaring done.
|
|
95653
95705
|
|
|
95654
95706
|
## COMPLETION CRITERIA
|
|
95655
95707
|
|
|
@@ -99254,19 +99306,7 @@ ${textPart.text ?? ""}`;
|
|
|
99254
99306
|
};
|
|
99255
99307
|
}
|
|
99256
99308
|
// packages/skills-loader-core/src/shared/internal-initiator-marker.ts
|
|
99257
|
-
|
|
99258
|
-
function hasInternalInitiatorMarker2(text) {
|
|
99259
|
-
return INTERNAL_INITIATOR_MARKER_DETECT_PATTERN2.test(text);
|
|
99260
|
-
}
|
|
99261
|
-
function isTextPartLike2(part) {
|
|
99262
|
-
return part.type === "text" && typeof part.text === "string";
|
|
99263
|
-
}
|
|
99264
|
-
function isSyntheticOrInternalTextPart2(part) {
|
|
99265
|
-
return isTextPartLike2(part) && (part.synthetic === true || hasInternalInitiatorMarker2(part.text));
|
|
99266
|
-
}
|
|
99267
|
-
function isRealUserTextPart2(part) {
|
|
99268
|
-
return isTextPartLike2(part) && !isSyntheticOrInternalTextPart2(part);
|
|
99269
|
-
}
|
|
99309
|
+
init_internal_initiator_marker();
|
|
99270
99310
|
|
|
99271
99311
|
// packages/skills-loader-core/src/hooks/auto-slash-command/constants.ts
|
|
99272
99312
|
var AUTO_SLASH_COMMAND_TAG_OPEN = "<auto-slash-command>";
|
|
@@ -99318,7 +99358,7 @@ function detectSlashCommand(text) {
|
|
|
99318
99358
|
return parsed;
|
|
99319
99359
|
}
|
|
99320
99360
|
function extractPromptText3(parts) {
|
|
99321
|
-
const textParts = parts.filter(
|
|
99361
|
+
const textParts = parts.filter(isRealUserTextPart);
|
|
99322
99362
|
const slashPart = textParts.find((p) => (p.text ?? "").trim().startsWith("/"));
|
|
99323
99363
|
if (slashPart?.text) {
|
|
99324
99364
|
return slashPart.text;
|
|
@@ -99328,7 +99368,7 @@ function extractPromptText3(parts) {
|
|
|
99328
99368
|
function findSlashCommandPartIndex(parts) {
|
|
99329
99369
|
for (let idx = 0;idx < parts.length; idx += 1) {
|
|
99330
99370
|
const part = parts[idx];
|
|
99331
|
-
if (!
|
|
99371
|
+
if (!isRealUserTextPart(part))
|
|
99332
99372
|
continue;
|
|
99333
99373
|
if ((part.text ?? "").trim().startsWith("/")) {
|
|
99334
99374
|
return idx;
|
|
@@ -99611,56 +99651,6 @@ function findProjectOpencodeSkillDirs(startDirectory, stopDirectory) {
|
|
|
99611
99651
|
[".opencode", "skill"]
|
|
99612
99652
|
], stopDirectory ?? detectWorktreePath2(startDirectory));
|
|
99613
99653
|
}
|
|
99614
|
-
// packages/skills-loader-core/src/shared/skill-path-resolver.ts
|
|
99615
|
-
import { isAbsolute as isAbsolute13, posix as posix5, relative as relative12, resolve as resolve22, win32 as win327 } from "path";
|
|
99616
|
-
function toDisplayPath2(path17) {
|
|
99617
|
-
return path17.replaceAll("\\", "/");
|
|
99618
|
-
}
|
|
99619
|
-
function isPosixAbsolutePath3(path17) {
|
|
99620
|
-
return path17.startsWith("/") && !/^[A-Za-z]:[\\/]/.test(path17);
|
|
99621
|
-
}
|
|
99622
|
-
function isWindowsAbsolutePath3(path17) {
|
|
99623
|
-
return /^[A-Za-z]:[\\/]/.test(path17);
|
|
99624
|
-
}
|
|
99625
|
-
function looksLikeFilePath2(path17) {
|
|
99626
|
-
if (path17.endsWith("/"))
|
|
99627
|
-
return true;
|
|
99628
|
-
const lastSegment = path17.split("/").pop() ?? "";
|
|
99629
|
-
return /\.[a-zA-Z0-9]+$/.test(lastSegment);
|
|
99630
|
-
}
|
|
99631
|
-
function resolveSkillPathReferences2(content, basePath) {
|
|
99632
|
-
const normalizedBase = basePath.replace(/[\\/]$/, "");
|
|
99633
|
-
return content.replace(/(?<![a-zA-Z0-9="\(])@([a-zA-Z0-9_-]+\/[a-zA-Z0-9_.\-\/]*)/g, (match, relativePath) => {
|
|
99634
|
-
if (!looksLikeFilePath2(relativePath))
|
|
99635
|
-
return match;
|
|
99636
|
-
if (isWindowsAbsolutePath3(normalizedBase)) {
|
|
99637
|
-
const resolvedPath2 = win327.resolve(normalizedBase, relativePath);
|
|
99638
|
-
const relativePathFromBase2 = win327.relative(normalizedBase, resolvedPath2);
|
|
99639
|
-
if (relativePathFromBase2.startsWith("..") || win327.isAbsolute(relativePathFromBase2)) {
|
|
99640
|
-
return match;
|
|
99641
|
-
}
|
|
99642
|
-
const displayPath2 = toDisplayPath2(resolvedPath2);
|
|
99643
|
-
return relativePath.endsWith("/") && !displayPath2.endsWith("/") ? `${displayPath2}/` : displayPath2;
|
|
99644
|
-
}
|
|
99645
|
-
if (isPosixAbsolutePath3(normalizedBase)) {
|
|
99646
|
-
const displayBase = toDisplayPath2(normalizedBase);
|
|
99647
|
-
const resolvedPath2 = posix5.resolve(displayBase, relativePath);
|
|
99648
|
-
const relativePathFromBase2 = posix5.relative(displayBase, resolvedPath2);
|
|
99649
|
-
if (relativePathFromBase2.startsWith("..") || posix5.isAbsolute(relativePathFromBase2)) {
|
|
99650
|
-
return match;
|
|
99651
|
-
}
|
|
99652
|
-
return relativePath.endsWith("/") && !resolvedPath2.endsWith("/") ? `${resolvedPath2}/` : resolvedPath2;
|
|
99653
|
-
}
|
|
99654
|
-
const resolvedPath = resolve22(normalizedBase, relativePath);
|
|
99655
|
-
const relativePathFromBase = relative12(normalizedBase, resolvedPath);
|
|
99656
|
-
if (relativePathFromBase.startsWith("..") || isAbsolute13(relativePathFromBase)) {
|
|
99657
|
-
return match;
|
|
99658
|
-
}
|
|
99659
|
-
const displayPath = toDisplayPath2(resolvedPath);
|
|
99660
|
-
return relativePath.endsWith("/") && !displayPath.endsWith("/") ? `${displayPath}/` : displayPath;
|
|
99661
|
-
});
|
|
99662
|
-
}
|
|
99663
|
-
|
|
99664
99654
|
// packages/skills-loader-core/src/shared/index.ts
|
|
99665
99655
|
function log6(_message, _context) {}
|
|
99666
99656
|
|
|
@@ -99851,7 +99841,7 @@ async function loadSkillFromPath(options) {
|
|
|
99851
99841
|
const originalDescription = data.description || "";
|
|
99852
99842
|
const isOpencodeSource = options.scope === "opencode" || options.scope === "opencode-project";
|
|
99853
99843
|
const formattedDescription = `(${options.scope} - Skill) ${originalDescription}`;
|
|
99854
|
-
const resolvedBody =
|
|
99844
|
+
const resolvedBody = resolveSkillPathReferences(body.trim(), options.resolvedPath);
|
|
99855
99845
|
const templateContent = `<skill-instruction>
|
|
99856
99846
|
Base directory for this skill: ${options.resolvedPath}/
|
|
99857
99847
|
File references (@path) in this skill are relative to this directory.
|
|
@@ -100158,7 +100148,7 @@ function builtinToLoadedSkill(builtin) {
|
|
|
100158
100148
|
// packages/skills-loader-core/src/features/opencode-skill-loader/merger/config-skill-entry-loader.ts
|
|
100159
100149
|
init_src();
|
|
100160
100150
|
import { existsSync as existsSync79, readFileSync as readFileSync50 } from "fs";
|
|
100161
|
-
import { dirname as dirname28, isAbsolute as
|
|
100151
|
+
import { dirname as dirname28, isAbsolute as isAbsolute13, resolve as resolve22 } from "path";
|
|
100162
100152
|
import { homedir as homedir25 } from "os";
|
|
100163
100153
|
function resolveFilePath5(from, configDir) {
|
|
100164
100154
|
let filePath = from;
|
|
@@ -100166,13 +100156,13 @@ function resolveFilePath5(from, configDir) {
|
|
|
100166
100156
|
filePath = filePath.slice(6, -1);
|
|
100167
100157
|
}
|
|
100168
100158
|
if (filePath.startsWith("~/")) {
|
|
100169
|
-
return
|
|
100159
|
+
return resolve22(homedir25(), filePath.slice(2));
|
|
100170
100160
|
}
|
|
100171
|
-
if (
|
|
100161
|
+
if (isAbsolute13(filePath)) {
|
|
100172
100162
|
return filePath;
|
|
100173
100163
|
}
|
|
100174
100164
|
const baseDir = configDir || process.cwd();
|
|
100175
|
-
return
|
|
100165
|
+
return resolve22(baseDir, filePath);
|
|
100176
100166
|
}
|
|
100177
100167
|
function loadSkillFromFile(filePath) {
|
|
100178
100168
|
try {
|
|
@@ -100215,7 +100205,7 @@ function configEntryToLoadedSkill(name, entry, configDir) {
|
|
|
100215
100205
|
}
|
|
100216
100206
|
const description = entry.description || fileMetadata.description || "";
|
|
100217
100207
|
const resolvedPath = sourcePath ? dirname28(sourcePath) : configDir || process.cwd();
|
|
100218
|
-
const resolvedTemplate =
|
|
100208
|
+
const resolvedTemplate = resolveSkillPathReferences(template.trim(), resolvedPath);
|
|
100219
100209
|
const wrappedTemplate = `<skill-instruction>
|
|
100220
100210
|
Base directory for this skill: ${resolvedPath}/
|
|
100221
100211
|
File references (@path) in this skill are relative to this directory.
|
|
@@ -102416,7 +102406,7 @@ EOF
|
|
|
102416
102406
|
// packages/skills-loader-core/src/features/builtin-skills/skills/review-work.ts
|
|
102417
102407
|
var reviewWorkSkill = {
|
|
102418
102408
|
name: "review-work",
|
|
102419
|
-
description: "Post-implementation review orchestrator. Launches 5 parallel background sub-agents: Oracle (goal/constraint verification), Oracle (code quality), Oracle (security), unspecified-high (hands-on QA execution), unspecified-high (context mining from GitHub/git/Slack/Notion). All must pass for review to pass. MUST USE
|
|
102409
|
+
description: "Post-implementation review orchestrator. Launches 5 parallel background sub-agents: Oracle (goal/constraint verification), Oracle (code quality), Oracle (security), unspecified-high (hands-on QA execution), unspecified-high (context mining from GitHub/git/Slack/Notion). All must pass for review to pass. MUST USE before a PR handoff or when the user explicitly asks to review completed work. Triggers: 'review work', 'review my work', 'review changes', 'QA my work', 'verify implementation', 'check my work', 'validate changes', 'post-implementation review'.",
|
|
102420
102410
|
template: loadSharedSkillTemplate("review-work")
|
|
102421
102411
|
};
|
|
102422
102412
|
// packages/skills-loader-core/src/features/builtin-skills/skills/remove-ai-slops.ts
|
|
@@ -103411,7 +103401,7 @@ init_src();
|
|
|
103411
103401
|
var import_picomatch2 = __toESM(require_picomatch2(), 1);
|
|
103412
103402
|
import * as fs20 from "fs/promises";
|
|
103413
103403
|
import { homedir as homedir26 } from "os";
|
|
103414
|
-
import { dirname as dirname30, extname as extname2, isAbsolute as
|
|
103404
|
+
import { dirname as dirname30, extname as extname2, isAbsolute as isAbsolute14, join as join97, relative as relative12 } from "path";
|
|
103415
103405
|
var MAX_RECURSIVE_DEPTH = 10;
|
|
103416
103406
|
function isHttpUrl(path17) {
|
|
103417
103407
|
return path17.startsWith("http://") || path17.startsWith("https://");
|
|
@@ -103423,7 +103413,7 @@ function toAbsolutePath(path17, configDir) {
|
|
|
103423
103413
|
if (path17.startsWith("~/")) {
|
|
103424
103414
|
return join97(homedir26(), path17.slice(2));
|
|
103425
103415
|
}
|
|
103426
|
-
if (
|
|
103416
|
+
if (isAbsolute14(path17)) {
|
|
103427
103417
|
return path17;
|
|
103428
103418
|
}
|
|
103429
103419
|
return join97(configDir, path17);
|
|
@@ -103440,7 +103430,7 @@ function filterByGlob(skills, sourceBaseDir, globPattern) {
|
|
|
103440
103430
|
return skills.filter((skill) => {
|
|
103441
103431
|
if (!skill.path)
|
|
103442
103432
|
return false;
|
|
103443
|
-
const rel = normalizePathForGlob(
|
|
103433
|
+
const rel = normalizePathForGlob(relative12(sourceBaseDir, skill.path));
|
|
103444
103434
|
return import_picomatch2.default.isMatch(rel, globPattern, { dot: true, bash: true });
|
|
103445
103435
|
});
|
|
103446
103436
|
}
|
|
@@ -105721,11 +105711,11 @@ function isPrometheusAgent(agentName) {
|
|
|
105721
105711
|
}
|
|
105722
105712
|
|
|
105723
105713
|
// packages/omo-opencode/src/hooks/prometheus-md-only/path-policy.ts
|
|
105724
|
-
import { relative as
|
|
105714
|
+
import { relative as relative13, resolve as resolve23, isAbsolute as isAbsolute15 } from "path";
|
|
105725
105715
|
function isAllowedFile(filePath, workspaceRoot) {
|
|
105726
|
-
const resolved =
|
|
105727
|
-
const rel =
|
|
105728
|
-
if (rel.startsWith("..") ||
|
|
105716
|
+
const resolved = resolve23(workspaceRoot, filePath);
|
|
105717
|
+
const rel = relative13(workspaceRoot, resolved);
|
|
105718
|
+
if (rel.startsWith("..") || isAbsolute15(rel)) {
|
|
105729
105719
|
return false;
|
|
105730
105720
|
}
|
|
105731
105721
|
if (!/(^|[/\\])\.omo([/\\]|$)/i.test(rel)) {
|
|
@@ -105874,9 +105864,9 @@ init_logger2();
|
|
|
105874
105864
|
// packages/omo-opencode/src/hooks/start-work/worktree-detector.ts
|
|
105875
105865
|
import { execFileSync as execFileSync5 } from "child_process";
|
|
105876
105866
|
import { existsSync as existsSync82, realpathSync as realpathSync14 } from "fs";
|
|
105877
|
-
import { resolve as
|
|
105867
|
+
import { resolve as resolve24, win32 as win327 } from "path";
|
|
105878
105868
|
function normalizePath5(path18) {
|
|
105879
|
-
const resolvedPath = process.platform !== "win32" &&
|
|
105869
|
+
const resolvedPath = process.platform !== "win32" && win327.isAbsolute(path18) ? path18 : resolve24(path18);
|
|
105880
105870
|
if (!existsSync82(resolvedPath)) {
|
|
105881
105871
|
return resolvedPath;
|
|
105882
105872
|
}
|
|
@@ -106421,24 +106411,24 @@ function buildSelectedContextInfo(params) {
|
|
|
106421
106411
|
}
|
|
106422
106412
|
|
|
106423
106413
|
// packages/omo-opencode/src/hooks/start-work/session-plan-affinity.ts
|
|
106424
|
-
import { posix as
|
|
106414
|
+
import { posix as posix5, win32 as win328 } from "path";
|
|
106425
106415
|
init_logger2();
|
|
106426
106416
|
var PLAN_PATH_PATTERN = /[A-Za-z0-9_./\\:~-]*\.(?:sisyphus|omo)[\\/]plans[\\/][A-Za-z0-9._/\\~-]+\.md/gi;
|
|
106427
106417
|
function normalizePlanPath(directory, candidate) {
|
|
106428
106418
|
const trimmedCandidate = candidate.trim().replace(/^["'`]+|["'`]+$/g, "");
|
|
106429
106419
|
if (looksLikeWindowsAbsolutePath(trimmedCandidate)) {
|
|
106430
|
-
return
|
|
106420
|
+
return win328.resolve(trimmedCandidate);
|
|
106431
106421
|
}
|
|
106432
106422
|
if (looksLikeWindowsAbsolutePath(directory)) {
|
|
106433
|
-
return
|
|
106423
|
+
return win328.resolve(directory, trimmedCandidate);
|
|
106434
106424
|
}
|
|
106435
|
-
if (
|
|
106436
|
-
return
|
|
106425
|
+
if (posix5.isAbsolute(trimmedCandidate)) {
|
|
106426
|
+
return posix5.resolve(trimmedCandidate);
|
|
106437
106427
|
}
|
|
106438
|
-
return
|
|
106428
|
+
return posix5.resolve(directory, trimmedCandidate);
|
|
106439
106429
|
}
|
|
106440
106430
|
function normalizePlanPathKey(planPath) {
|
|
106441
|
-
const resolvedPath = looksLikeWindowsAbsolutePath(planPath) ?
|
|
106431
|
+
const resolvedPath = looksLikeWindowsAbsolutePath(planPath) ? win328.resolve(planPath) : posix5.resolve(planPath);
|
|
106442
106432
|
return resolvedPath.replaceAll("\\", "/");
|
|
106443
106433
|
}
|
|
106444
106434
|
function looksLikeWindowsAbsolutePath(path18) {
|
|
@@ -107767,7 +107757,7 @@ async function validateSubagentSessionId(input) {
|
|
|
107767
107757
|
}
|
|
107768
107758
|
|
|
107769
107759
|
// packages/omo-opencode/src/hooks/atlas/tool-execute-after-direct-work.ts
|
|
107770
|
-
import { resolve as
|
|
107760
|
+
import { resolve as resolve25 } from "path";
|
|
107771
107761
|
init_logger2();
|
|
107772
107762
|
|
|
107773
107763
|
// packages/omo-opencode/src/hooks/atlas/omo-path.ts
|
|
@@ -107877,7 +107867,7 @@ async function handleDirectWorkToolAfter(input) {
|
|
|
107877
107867
|
const sessionWork = getWorkForSession(ctx.directory, toolInput.sessionID);
|
|
107878
107868
|
if (sessionWork) {
|
|
107879
107869
|
const planPath = resolveBoulderPlanPathForWork(ctx.directory, sessionWork);
|
|
107880
|
-
if (
|
|
107870
|
+
if (resolve25(filePath) === resolve25(planPath) && planSnapshot !== undefined) {
|
|
107881
107871
|
const beforeCheckedKeys = parseCheckedTopLevelTaskKeys(planSnapshot);
|
|
107882
107872
|
const afterCheckedKeys = readCheckedTaskKeysFromPlan(planPath);
|
|
107883
107873
|
for (const taskKey of afterCheckedKeys) {
|
|
@@ -108626,7 +108616,7 @@ function createToolExecuteAfterHandler2(input) {
|
|
|
108626
108616
|
// packages/omo-opencode/src/hooks/atlas/tool-execute-before.ts
|
|
108627
108617
|
init_logger2();
|
|
108628
108618
|
import { existsSync as existsSync85, readFileSync as readFileSync58 } from "fs";
|
|
108629
|
-
import { resolve as
|
|
108619
|
+
import { resolve as resolve26 } from "path";
|
|
108630
108620
|
var TASK_SECTION_HEADER_PATTERN = /^##\s*1\.\s*TASK\s*$/i;
|
|
108631
108621
|
var TODO_TASK_LINE_PATTERN = /^(?:[-*]\s*\[\s*\]\s*)?(\d+)\.\s+(.+)$/;
|
|
108632
108622
|
var FINAL_WAVE_TASK_LINE_PATTERN = /^(?:[-*]\s*\[\s*\]\s*)?(F\d+)\.\s+(.+)$/i;
|
|
@@ -108684,7 +108674,7 @@ function createToolExecuteBeforeHandler2(input) {
|
|
|
108684
108674
|
const sessionWork = sessionID ? getWorkForSession(ctx.directory, sessionID) : null;
|
|
108685
108675
|
const state3 = sessionWork ? null : readBoulderState(ctx.directory);
|
|
108686
108676
|
const planPath = sessionWork ? resolveBoulderPlanPathForWork(ctx.directory, sessionWork) : state3 ? resolveBoulderPlanPath(ctx.directory, state3) : null;
|
|
108687
|
-
if (planPath &&
|
|
108677
|
+
if (planPath && resolve26(filePath) === resolve26(planPath) && pendingPlanSnapshots) {
|
|
108688
108678
|
try {
|
|
108689
108679
|
if (existsSync85(planPath)) {
|
|
108690
108680
|
pendingPlanSnapshots.set(toolInput.callID, readFileSync58(planPath, "utf-8"));
|
|
@@ -112585,7 +112575,7 @@ function createRuntimeFallbackHook(ctx, options, factoryOverrides = {}) {
|
|
|
112585
112575
|
}
|
|
112586
112576
|
// packages/omo-opencode/src/hooks/write-existing-file-guard/hook.ts
|
|
112587
112577
|
import { existsSync as existsSync87, realpathSync as realpathSync15 } from "fs";
|
|
112588
|
-
import { basename as basename17, dirname as dirname32, isAbsolute as
|
|
112578
|
+
import { basename as basename17, dirname as dirname32, isAbsolute as isAbsolute16, join as join101, normalize as normalize2, relative as relative14, resolve as resolve27 } from "path";
|
|
112589
112579
|
|
|
112590
112580
|
// packages/omo-opencode/src/hooks/write-existing-file-guard/tool-execute-before-handler.ts
|
|
112591
112581
|
import { existsSync as existsSync86 } from "fs";
|
|
@@ -112757,11 +112747,11 @@ function getPathFromArgs(args) {
|
|
|
112757
112747
|
return args?.filePath ?? args?.path ?? args?.file_path;
|
|
112758
112748
|
}
|
|
112759
112749
|
function resolveInputPath(ctx, inputPath) {
|
|
112760
|
-
return normalize2(
|
|
112750
|
+
return normalize2(isAbsolute16(inputPath) ? inputPath : resolve27(ctx.directory, inputPath));
|
|
112761
112751
|
}
|
|
112762
112752
|
function isPathInsideDirectory(pathToCheck, directory) {
|
|
112763
|
-
const relativePath =
|
|
112764
|
-
return relativePath === "" || !relativePath.startsWith("..") && !
|
|
112753
|
+
const relativePath = relative14(directory, pathToCheck);
|
|
112754
|
+
return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute16(relativePath);
|
|
112765
112755
|
}
|
|
112766
112756
|
function toCanonicalPath2(absolutePath) {
|
|
112767
112757
|
let canonicalPath = absolutePath;
|
|
@@ -115745,7 +115735,7 @@ function createNotepadWriteGuardHook() {
|
|
|
115745
115735
|
}
|
|
115746
115736
|
// packages/omo-opencode/src/hooks/plan-format-validator/hook.ts
|
|
115747
115737
|
import { existsSync as existsSync89, readFileSync as readFileSync60 } from "fs";
|
|
115748
|
-
import { resolve as
|
|
115738
|
+
import { resolve as resolve28 } from "path";
|
|
115749
115739
|
init_logger2();
|
|
115750
115740
|
var WRITE_TOOLS = new Set(["Write", "Edit", "write", "edit"]);
|
|
115751
115741
|
var CHECKBOX_PATTERN = /^[-*]\s*\[[ xX]\]/m;
|
|
@@ -115827,7 +115817,7 @@ function createPlanFormatValidatorHook(_ctx) {
|
|
|
115827
115817
|
return;
|
|
115828
115818
|
if (!isPlanFilePath(filePath))
|
|
115829
115819
|
return;
|
|
115830
|
-
const resolvedPath =
|
|
115820
|
+
const resolvedPath = resolve28(_ctx.directory, filePath);
|
|
115831
115821
|
if (!existsSync89(resolvedPath))
|
|
115832
115822
|
return;
|
|
115833
115823
|
const content = readFileSync60(resolvedPath, "utf-8");
|
|
@@ -115929,7 +115919,7 @@ function createMonitorStatusInjectorHook(monitorManager, config) {
|
|
|
115929
115919
|
};
|
|
115930
115920
|
}
|
|
115931
115921
|
// packages/omo-opencode/src/tools/grep/tools.ts
|
|
115932
|
-
import { resolve as
|
|
115922
|
+
import { resolve as resolve29 } from "path";
|
|
115933
115923
|
|
|
115934
115924
|
// node_modules/.bun/@opencode-ai+plugin@1.15.13+8002cb46da36e070/node_modules/@opencode-ai/plugin/dist/tool.js
|
|
115935
115925
|
import { z as z3 } from "zod";
|
|
@@ -116176,10 +116166,10 @@ class Semaphore {
|
|
|
116176
116166
|
this.running++;
|
|
116177
116167
|
return;
|
|
116178
116168
|
}
|
|
116179
|
-
return new Promise((
|
|
116169
|
+
return new Promise((resolve29) => {
|
|
116180
116170
|
this.queue.push(() => {
|
|
116181
116171
|
this.running++;
|
|
116182
|
-
|
|
116172
|
+
resolve29();
|
|
116183
116173
|
});
|
|
116184
116174
|
});
|
|
116185
116175
|
}
|
|
@@ -116494,7 +116484,7 @@ function createGrepTools(ctx) {
|
|
|
116494
116484
|
const globs = args.include ? [args.include] : undefined;
|
|
116495
116485
|
const runtimeCtx = context;
|
|
116496
116486
|
const dir = typeof runtimeCtx.directory === "string" ? runtimeCtx.directory : ctx.directory;
|
|
116497
|
-
const searchPath = args.path ?
|
|
116487
|
+
const searchPath = args.path ? resolve29(dir, args.path) : dir;
|
|
116498
116488
|
const paths = [searchPath];
|
|
116499
116489
|
const outputMode = args.output_mode ?? "files_with_matches";
|
|
116500
116490
|
const headLimit = args.head_limit ?? 0;
|
|
@@ -116525,11 +116515,11 @@ function createGrepTools(ctx) {
|
|
|
116525
116515
|
return { grep };
|
|
116526
116516
|
}
|
|
116527
116517
|
// packages/omo-opencode/src/tools/glob/tools.ts
|
|
116528
|
-
import { resolve as
|
|
116518
|
+
import { resolve as resolve31 } from "path";
|
|
116529
116519
|
|
|
116530
116520
|
// packages/omo-opencode/src/tools/glob/cli.ts
|
|
116531
116521
|
init_bun_spawn_shim();
|
|
116532
|
-
import { resolve as
|
|
116522
|
+
import { resolve as resolve30 } from "path";
|
|
116533
116523
|
|
|
116534
116524
|
// packages/omo-opencode/src/tools/glob/constants.ts
|
|
116535
116525
|
var DEFAULT_TIMEOUT_MS3 = 60000;
|
|
@@ -116657,7 +116647,7 @@ async function runRgFilesInternal(options, resolvedCli, processSpawner = spawn)
|
|
|
116657
116647
|
}
|
|
116658
116648
|
let filePath;
|
|
116659
116649
|
if (isRg) {
|
|
116660
|
-
filePath = cwd ?
|
|
116650
|
+
filePath = cwd ? resolve30(cwd, line) : line;
|
|
116661
116651
|
} else if (isWindows2) {
|
|
116662
116652
|
filePath = line.trim();
|
|
116663
116653
|
} else {
|
|
@@ -116717,7 +116707,7 @@ function createGlobTools(ctx) {
|
|
|
116717
116707
|
const cli = await resolveGrepCliWithAutoInstall();
|
|
116718
116708
|
const runtimeCtx = context;
|
|
116719
116709
|
const dir = typeof runtimeCtx.directory === "string" ? runtimeCtx.directory : ctx.directory;
|
|
116720
|
-
const searchPath = args.path ?
|
|
116710
|
+
const searchPath = args.path ? resolve31(dir, args.path) : dir;
|
|
116721
116711
|
const result = await runRgFiles({
|
|
116722
116712
|
pattern: args.pattern,
|
|
116723
116713
|
paths: [searchPath]
|
|
@@ -118594,7 +118584,7 @@ init_logger2();
|
|
|
118594
118584
|
|
|
118595
118585
|
// packages/omo-opencode/src/tools/background-task/delay.ts
|
|
118596
118586
|
function delay5(ms) {
|
|
118597
|
-
return new Promise((
|
|
118587
|
+
return new Promise((resolve32) => setTimeout(resolve32, ms));
|
|
118598
118588
|
}
|
|
118599
118589
|
// packages/omo-opencode/src/tools/background-task/create-background-output.ts
|
|
118600
118590
|
init_logger2();
|
|
@@ -119452,7 +119442,7 @@ function getClaudeConfigDir3() {
|
|
|
119452
119442
|
// packages/claude-code-compat-core/src/shared/opencode-config-dir.ts
|
|
119453
119443
|
import { existsSync as existsSync93, realpathSync as realpathSync16 } from "fs";
|
|
119454
119444
|
import { homedir as homedir28 } from "os";
|
|
119455
|
-
import { join as join108, posix as
|
|
119445
|
+
import { join as join108, posix as posix6, resolve as resolve32, win32 as win329 } from "path";
|
|
119456
119446
|
var TAURI_APP_IDENTIFIER3 = "ai.opencode.desktop";
|
|
119457
119447
|
var TAURI_APP_IDENTIFIER_DEV3 = "ai.opencode.desktop.dev";
|
|
119458
119448
|
function isDevBuild3(version) {
|
|
@@ -119467,7 +119457,7 @@ function getTauriConfigDir3(identifier) {
|
|
|
119467
119457
|
return join108(homedir28(), "Library", "Application Support", identifier);
|
|
119468
119458
|
case "win32": {
|
|
119469
119459
|
const appData = process.env.APPDATA || join108(homedir28(), "AppData", "Roaming");
|
|
119470
|
-
return
|
|
119460
|
+
return win329.join(appData, identifier);
|
|
119471
119461
|
}
|
|
119472
119462
|
case "linux":
|
|
119473
119463
|
default: {
|
|
@@ -119478,9 +119468,9 @@ function getTauriConfigDir3(identifier) {
|
|
|
119478
119468
|
}
|
|
119479
119469
|
function resolveConfigPath3(pathValue) {
|
|
119480
119470
|
if (isWslEnvironment3() && pathValue.startsWith("/")) {
|
|
119481
|
-
return
|
|
119471
|
+
return posix6.normalize(pathValue);
|
|
119482
119472
|
}
|
|
119483
|
-
const resolvedPath =
|
|
119473
|
+
const resolvedPath = resolve32(pathValue);
|
|
119484
119474
|
if (!existsSync93(resolvedPath))
|
|
119485
119475
|
return resolvedPath;
|
|
119486
119476
|
try {
|
|
@@ -119510,13 +119500,13 @@ function getWslLinuxHomeDir3(windowsConfigRoot) {
|
|
|
119510
119500
|
return envHome;
|
|
119511
119501
|
}
|
|
119512
119502
|
const user = process.env.USER?.trim() || process.env.LOGNAME?.trim() || process.env.SUDO_USER?.trim() || (windowsConfigRoot ? getWindowsUserFromConfigRoot3(windowsConfigRoot) : undefined);
|
|
119513
|
-
return user ?
|
|
119503
|
+
return user ? posix6.join("/home", user) : null;
|
|
119514
119504
|
}
|
|
119515
119505
|
function getCliDefaultConfigDir3() {
|
|
119516
119506
|
const envXdgConfig = process.env.XDG_CONFIG_HOME?.trim();
|
|
119517
119507
|
const shouldIgnoreWindowsXdg = envXdgConfig !== undefined && envXdgConfig.length > 0 && isWslEnvironment3() && isWindowsUserConfigRoot3(envXdgConfig);
|
|
119518
|
-
const xdgConfig = shouldIgnoreWindowsXdg ?
|
|
119519
|
-
const configDir = isWslEnvironment3() ?
|
|
119508
|
+
const xdgConfig = shouldIgnoreWindowsXdg ? posix6.join(getWslLinuxHomeDir3(envXdgConfig) ?? "/home", ".config") : envXdgConfig || join108(homedir28(), ".config");
|
|
119509
|
+
const configDir = isWslEnvironment3() ? posix6.join(xdgConfig, "opencode") : join108(xdgConfig, "opencode");
|
|
119520
119510
|
return resolveConfigPath3(configDir);
|
|
119521
119511
|
}
|
|
119522
119512
|
function getCliCustomConfigDir3() {
|
|
@@ -119546,7 +119536,7 @@ function getOpenCodeConfigDir3(options) {
|
|
|
119546
119536
|
}
|
|
119547
119537
|
const identifier = isDevBuild3(version) ? TAURI_APP_IDENTIFIER_DEV3 : TAURI_APP_IDENTIFIER3;
|
|
119548
119538
|
const tauriDirBase = getTauriConfigDir3(identifier);
|
|
119549
|
-
const tauriDir = process.platform === "win32" ?
|
|
119539
|
+
const tauriDir = process.platform === "win32" ? win329.isAbsolute(tauriDirBase) ? win329.normalize(tauriDirBase) : win329.resolve(tauriDirBase) : resolveConfigPath3(tauriDirBase);
|
|
119550
119540
|
if (checkExisting) {
|
|
119551
119541
|
const legacyDir = getCliConfigDir3();
|
|
119552
119542
|
const legacyConfig = join108(legacyDir, "opencode.json");
|
|
@@ -119561,11 +119551,11 @@ function getOpenCodeConfigDir3(options) {
|
|
|
119561
119551
|
init_src();
|
|
119562
119552
|
// packages/claude-code-compat-core/src/shared/resolve-agent-definition-paths.ts
|
|
119563
119553
|
import { homedir as homedir29 } from "os";
|
|
119564
|
-
import { isAbsolute as
|
|
119554
|
+
import { isAbsolute as isAbsolute17, join as join109, resolve as resolve33 } from "path";
|
|
119565
119555
|
function resolveAgentDefinitionPaths2(paths, baseDir, containmentDir) {
|
|
119566
119556
|
return paths.flatMap((p) => {
|
|
119567
119557
|
const expanded = p.startsWith("~/") ? join109(homedir29(), p.slice(2)) : p;
|
|
119568
|
-
const resolved =
|
|
119558
|
+
const resolved = isAbsolute17(expanded) ? expanded : resolve33(baseDir, expanded);
|
|
119569
119559
|
if (containmentDir !== null && !isWithinProject(resolved, containmentDir)) {
|
|
119570
119560
|
log4(`agent_definitions path rejected (outside project boundary): ${p} -> ${resolved}`);
|
|
119571
119561
|
return [];
|
|
@@ -119616,10 +119606,10 @@ function getOpenCodeCommandDirs2(options) {
|
|
|
119616
119606
|
// packages/claude-code-compat-core/src/shared/project-discovery-dirs.ts
|
|
119617
119607
|
import { execFileSync as execFileSync6 } from "child_process";
|
|
119618
119608
|
import { existsSync as existsSync94, realpathSync as realpathSync17 } from "fs";
|
|
119619
|
-
import { dirname as dirname37, join as join111, resolve as
|
|
119609
|
+
import { dirname as dirname37, join as join111, resolve as resolve34, win32 as win3210 } from "path";
|
|
119620
119610
|
var worktreePathCache3 = new Map;
|
|
119621
119611
|
function normalizePath6(path18) {
|
|
119622
|
-
const resolvedPath = process.platform !== "win32" &&
|
|
119612
|
+
const resolvedPath = process.platform !== "win32" && win3210.isAbsolute(path18) ? path18 : resolve34(path18);
|
|
119623
119613
|
if (!existsSync94(resolvedPath)) {
|
|
119624
119614
|
return resolvedPath;
|
|
119625
119615
|
}
|
|
@@ -119644,7 +119634,7 @@ function pathKey3(path18) {
|
|
|
119644
119634
|
return process.platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
119645
119635
|
}
|
|
119646
119636
|
function detectWorktreePath4(directory) {
|
|
119647
|
-
const resolvedDirectory =
|
|
119637
|
+
const resolvedDirectory = resolve34(directory);
|
|
119648
119638
|
const cacheKey = pathKey3(normalizePath6(resolvedDirectory));
|
|
119649
119639
|
if (worktreePathCache3.has(cacheKey)) {
|
|
119650
119640
|
return worktreePathCache3.get(cacheKey);
|
|
@@ -120081,7 +120071,7 @@ Task ID: ${task.id}`;
|
|
|
120081
120071
|
if (toolContext.abort?.aborted) {
|
|
120082
120072
|
break;
|
|
120083
120073
|
}
|
|
120084
|
-
await new Promise((
|
|
120074
|
+
await new Promise((resolve35) => setTimeout(resolve35, WAIT_FOR_SESSION_INTERVAL_MS));
|
|
120085
120075
|
}
|
|
120086
120076
|
await toolContext.metadata?.({
|
|
120087
120077
|
title: args.description,
|
|
@@ -120161,7 +120151,7 @@ async function waitForCompletion(sessionID, toolContext, ctx) {
|
|
|
120161
120151
|
log2(`[call_omo_agent] Aborted by user`);
|
|
120162
120152
|
throw new Error("Task aborted.");
|
|
120163
120153
|
}
|
|
120164
|
-
await new Promise((
|
|
120154
|
+
await new Promise((resolve35) => setTimeout(resolve35, POLL_INTERVAL_MS));
|
|
120165
120155
|
const statusResult = await ctx.client.session.status();
|
|
120166
120156
|
const allStatuses = normalizeSDKResponse(statusResult, {});
|
|
120167
120157
|
const sessionStatus = allStatuses[sessionID];
|
|
@@ -121364,7 +121354,7 @@ async function waitForLookAtSessionResult(client3, sessionID, options) {
|
|
|
121364
121354
|
sawNonIdleStatus
|
|
121365
121355
|
});
|
|
121366
121356
|
}
|
|
121367
|
-
await new Promise((
|
|
121357
|
+
await new Promise((resolve35) => setTimeout(resolve35, pollInterval));
|
|
121368
121358
|
}
|
|
121369
121359
|
throw new Error(`[look_at] Polling timed out after ${timeout}ms waiting for session ${sessionID} to become idle`);
|
|
121370
121360
|
}
|
|
@@ -123078,7 +123068,7 @@ async function executeUnstableAgentTask(args, ctx, executorCtx, parentContext, a
|
|
|
123078
123068
|
|
|
123079
123069
|
Task ID: ${task.id}`;
|
|
123080
123070
|
}
|
|
123081
|
-
await new Promise((
|
|
123071
|
+
await new Promise((resolve35) => setTimeout(resolve35, timing.WAIT_FOR_SESSION_INTERVAL_MS));
|
|
123082
123072
|
const updated = manager.getTask(task.id);
|
|
123083
123073
|
sessionID = updated?.sessionId;
|
|
123084
123074
|
}
|
|
@@ -123140,7 +123130,7 @@ Session ID: ${sessionID}`;
|
|
|
123140
123130
|
}
|
|
123141
123131
|
const timeoutBudgetMs = syncPollTimeoutMs ?? DEFAULT_SYNC_POLL_TIMEOUT_MS;
|
|
123142
123132
|
const remainingBudgetMs = timeoutBudgetMs - (Date.now() - pollStart);
|
|
123143
|
-
await new Promise((
|
|
123133
|
+
await new Promise((resolve35) => setTimeout(resolve35, Math.min(timingCfg.POLL_INTERVAL_MS, Math.max(1, remainingBudgetMs))));
|
|
123144
123134
|
const statusResult = await client3.session.status();
|
|
123145
123135
|
const allStatuses = normalizeSDKResponse(statusResult, {});
|
|
123146
123136
|
const sessionStatus = allStatuses[sessionID];
|
|
@@ -123279,7 +123269,7 @@ function continueSessionSetup(args) {
|
|
|
123279
123269
|
(async () => {
|
|
123280
123270
|
const waitStart = Date.now();
|
|
123281
123271
|
while (Date.now() - waitStart < args.timing.WAIT_FOR_SESSION_TIMEOUT_MS) {
|
|
123282
|
-
await new Promise((
|
|
123272
|
+
await new Promise((resolve35) => setTimeout(resolve35, args.timing.WAIT_FOR_SESSION_INTERVAL_MS));
|
|
123283
123273
|
const updated = args.manager.getTask(args.taskID);
|
|
123284
123274
|
if (!updated) {
|
|
123285
123275
|
return;
|
|
@@ -123317,7 +123307,7 @@ async function waitForBackgroundSessionStart(args) {
|
|
|
123317
123307
|
args.onAbort();
|
|
123318
123308
|
return;
|
|
123319
123309
|
}
|
|
123320
|
-
await new Promise((
|
|
123310
|
+
await new Promise((resolve35) => setTimeout(resolve35, args.timing.WAIT_FOR_SESSION_INTERVAL_MS));
|
|
123321
123311
|
}
|
|
123322
123312
|
return sessionId;
|
|
123323
123313
|
}
|
|
@@ -125022,7 +125012,7 @@ var TaskDeleteInputSchema = z4.object({
|
|
|
125022
125012
|
});
|
|
125023
125013
|
|
|
125024
125014
|
// packages/omo-opencode/src/features/claude-tasks/storage.ts
|
|
125025
|
-
import { join as join115, dirname as dirname40, basename as basename21, isAbsolute as
|
|
125015
|
+
import { join as join115, dirname as dirname40, basename as basename21, isAbsolute as isAbsolute18 } from "path";
|
|
125026
125016
|
import { existsSync as existsSync100, mkdirSync as mkdirSync19, readFileSync as readFileSync66, writeFileSync as writeFileSync20, renameSync as renameSync7, unlinkSync as unlinkSync15, readdirSync as readdirSync24 } from "fs";
|
|
125027
125017
|
import { randomUUID as randomUUID7 } from "crypto";
|
|
125028
125018
|
function ignoreClaudeTaskStorageError(error) {
|
|
@@ -125034,7 +125024,7 @@ function getTaskDir(config = {}) {
|
|
|
125034
125024
|
const tasksConfig = config.sisyphus?.tasks;
|
|
125035
125025
|
const storagePath = tasksConfig?.storage_path;
|
|
125036
125026
|
if (storagePath) {
|
|
125037
|
-
return
|
|
125027
|
+
return isAbsolute18(storagePath) ? storagePath : join115(process.cwd(), storagePath);
|
|
125038
125028
|
}
|
|
125039
125029
|
const configDir = getOpenCodeConfigDir({ binary: "opencode" });
|
|
125040
125030
|
const listId = resolveTaskListId(config);
|
|
@@ -125934,6 +125924,9 @@ async function assertTeamAcceptsMessages(teamRunId, config) {
|
|
|
125934
125924
|
function resolveRecipients(message, context) {
|
|
125935
125925
|
if (message.to !== "*") {
|
|
125936
125926
|
const allowedRecipients = new Set([...context.activeMembers, ...context.reservedRecipients ?? []]);
|
|
125927
|
+
if (context.leadRecipient !== undefined) {
|
|
125928
|
+
allowedRecipients.add(context.leadRecipient);
|
|
125929
|
+
}
|
|
125937
125930
|
if (!allowedRecipients.has(message.to)) {
|
|
125938
125931
|
throw new InvalidRecipientError(message.to);
|
|
125939
125932
|
}
|
|
@@ -126003,7 +125996,7 @@ async function sendMessage(message, teamRunId, config, context) {
|
|
|
126003
125996
|
if (await fileExists(unreservedPath) || await fileExists(reservedPath)) {
|
|
126004
125997
|
throw new DuplicateMessageIdError;
|
|
126005
125998
|
}
|
|
126006
|
-
const targetPath = reservedRecipients.has(recipient) ? reservedPath : unreservedPath;
|
|
125999
|
+
const targetPath = recipient !== context.leadRecipient && reservedRecipients.has(recipient) ? reservedPath : unreservedPath;
|
|
126007
126000
|
await atomicWrite(targetPath, serializedMessage);
|
|
126008
126001
|
deliveredTo.push(recipient);
|
|
126009
126002
|
}, { ownerTag: `team-mailbox:${recipient}` });
|
|
@@ -127079,9 +127072,9 @@ async function abortWithTimeout(client3, sessionID, timeoutMs = 1e4) {
|
|
|
127079
127072
|
});
|
|
127080
127073
|
return "failed";
|
|
127081
127074
|
}),
|
|
127082
|
-
new Promise((
|
|
127075
|
+
new Promise((resolve35) => {
|
|
127083
127076
|
timeoutHandle = setTimeout(() => {
|
|
127084
|
-
|
|
127077
|
+
resolve35("timed_out");
|
|
127085
127078
|
}, timeoutMs);
|
|
127086
127079
|
})
|
|
127087
127080
|
]);
|
|
@@ -127483,7 +127476,7 @@ class ConcurrencyManager {
|
|
|
127483
127476
|
this.counts.set(key, current + 1);
|
|
127484
127477
|
return;
|
|
127485
127478
|
}
|
|
127486
|
-
return new Promise((
|
|
127479
|
+
return new Promise((resolve35, reject) => {
|
|
127487
127480
|
const queue = this.queues.get(key) ?? [];
|
|
127488
127481
|
const entry = {
|
|
127489
127482
|
taskId,
|
|
@@ -127491,7 +127484,7 @@ class ConcurrencyManager {
|
|
|
127491
127484
|
if (entry.settled)
|
|
127492
127485
|
return;
|
|
127493
127486
|
entry.settled = true;
|
|
127494
|
-
|
|
127487
|
+
resolve35();
|
|
127495
127488
|
},
|
|
127496
127489
|
rawReject: reject,
|
|
127497
127490
|
settled: false
|
|
@@ -132211,10 +132204,10 @@ The task was re-queued on a fallback model after a retryable failure.
|
|
|
132211
132204
|
return this.scheduledFlushSettledCounts.get(sessionID) ?? 0;
|
|
132212
132205
|
}
|
|
132213
132206
|
awaitScheduledFlush(sessionID, sinceCount) {
|
|
132214
|
-
return new Promise((
|
|
132207
|
+
return new Promise((resolve35) => {
|
|
132215
132208
|
const arm = () => {
|
|
132216
132209
|
if ((this.scheduledFlushSettledCounts.get(sessionID) ?? 0) > sinceCount) {
|
|
132217
|
-
|
|
132210
|
+
resolve35();
|
|
132218
132211
|
return;
|
|
132219
132212
|
}
|
|
132220
132213
|
const waiters = this.scheduledFlushSettledWaiters.get(sessionID) ?? [];
|
|
@@ -133321,8 +133314,8 @@ function spawnMonitoredProcess(opts, deps) {
|
|
|
133321
133314
|
let watchdogTimer;
|
|
133322
133315
|
let graceTimer;
|
|
133323
133316
|
let resolvePublicExit = () => {};
|
|
133324
|
-
const publicExit = new Promise((
|
|
133325
|
-
resolvePublicExit =
|
|
133317
|
+
const publicExit = new Promise((resolve35) => {
|
|
133318
|
+
resolvePublicExit = resolve35;
|
|
133326
133319
|
});
|
|
133327
133320
|
function clearWatchdog() {
|
|
133328
133321
|
if (watchdogTimer !== undefined) {
|
|
@@ -133812,9 +133805,9 @@ import { basename as basename22, dirname as dirname41, join as join124 } from "p
|
|
|
133812
133805
|
// packages/mcp-client-core/src/config-dir.ts
|
|
133813
133806
|
import { existsSync as existsSync102, realpathSync as realpathSync18 } from "fs";
|
|
133814
133807
|
import { homedir as homedir30 } from "os";
|
|
133815
|
-
import { join as join122, resolve as
|
|
133808
|
+
import { join as join122, resolve as resolve35 } from "path";
|
|
133816
133809
|
function resolveConfigPath4(pathValue) {
|
|
133817
|
-
const resolvedPath =
|
|
133810
|
+
const resolvedPath = resolve35(pathValue);
|
|
133818
133811
|
if (!existsSync102(resolvedPath))
|
|
133819
133812
|
return resolvedPath;
|
|
133820
133813
|
try {
|
|
@@ -134210,7 +134203,7 @@ function buildAuthorizationUrl(authorizationEndpoint, options) {
|
|
|
134210
134203
|
}
|
|
134211
134204
|
var CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;
|
|
134212
134205
|
function startCallbackServer(port) {
|
|
134213
|
-
return new Promise((
|
|
134206
|
+
return new Promise((resolve36, reject) => {
|
|
134214
134207
|
let timeoutId;
|
|
134215
134208
|
const server2 = createServer2((request, response) => {
|
|
134216
134209
|
clearTimeout(timeoutId);
|
|
@@ -134236,7 +134229,7 @@ function startCallbackServer(port) {
|
|
|
134236
134229
|
response.writeHead(200, { "content-type": "text/html" });
|
|
134237
134230
|
response.end("<html><body><h1>Authorization successful. You can close this tab.</h1></body></html>");
|
|
134238
134231
|
server2.close();
|
|
134239
|
-
|
|
134232
|
+
resolve36({ code, state: state3 });
|
|
134240
134233
|
});
|
|
134241
134234
|
timeoutId = setTimeout(() => {
|
|
134242
134235
|
server2.close();
|
|
@@ -136011,7 +136004,7 @@ class Protocol {
|
|
|
136011
136004
|
return;
|
|
136012
136005
|
}
|
|
136013
136006
|
const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1000;
|
|
136014
|
-
await new Promise((
|
|
136007
|
+
await new Promise((resolve36) => setTimeout(resolve36, pollInterval));
|
|
136015
136008
|
options?.signal?.throwIfAborted();
|
|
136016
136009
|
}
|
|
136017
136010
|
} catch (error) {
|
|
@@ -136023,7 +136016,7 @@ class Protocol {
|
|
|
136023
136016
|
}
|
|
136024
136017
|
request(request, resultSchema, options) {
|
|
136025
136018
|
const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {};
|
|
136026
|
-
return new Promise((
|
|
136019
|
+
return new Promise((resolve36, reject) => {
|
|
136027
136020
|
const earlyReject = (error) => {
|
|
136028
136021
|
reject(error);
|
|
136029
136022
|
};
|
|
@@ -136101,7 +136094,7 @@ class Protocol {
|
|
|
136101
136094
|
if (!parseResult.success) {
|
|
136102
136095
|
reject(parseResult.error);
|
|
136103
136096
|
} else {
|
|
136104
|
-
|
|
136097
|
+
resolve36(parseResult.data);
|
|
136105
136098
|
}
|
|
136106
136099
|
} catch (error) {
|
|
136107
136100
|
reject(error);
|
|
@@ -136292,12 +136285,12 @@ class Protocol {
|
|
|
136292
136285
|
interval = task.pollInterval;
|
|
136293
136286
|
}
|
|
136294
136287
|
} catch {}
|
|
136295
|
-
return new Promise((
|
|
136288
|
+
return new Promise((resolve36, reject) => {
|
|
136296
136289
|
if (signal.aborted) {
|
|
136297
136290
|
reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
|
|
136298
136291
|
return;
|
|
136299
136292
|
}
|
|
136300
|
-
const timeoutId = setTimeout(
|
|
136293
|
+
const timeoutId = setTimeout(resolve36, interval);
|
|
136301
136294
|
signal.addEventListener("abort", () => {
|
|
136302
136295
|
clearTimeout(timeoutId);
|
|
136303
136296
|
reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
|
|
@@ -138826,7 +138819,7 @@ class StdioClientTransport {
|
|
|
138826
138819
|
if (this._process) {
|
|
138827
138820
|
throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");
|
|
138828
138821
|
}
|
|
138829
|
-
return new Promise((
|
|
138822
|
+
return new Promise((resolve36, reject) => {
|
|
138830
138823
|
this._process = import_cross_spawn2.default(this._serverParams.command, this._serverParams.args ?? [], {
|
|
138831
138824
|
env: {
|
|
138832
138825
|
...getDefaultEnvironment(),
|
|
@@ -138842,7 +138835,7 @@ class StdioClientTransport {
|
|
|
138842
138835
|
this.onerror?.(error);
|
|
138843
138836
|
});
|
|
138844
138837
|
this._process.on("spawn", () => {
|
|
138845
|
-
|
|
138838
|
+
resolve36();
|
|
138846
138839
|
});
|
|
138847
138840
|
this._process.on("close", (_code) => {
|
|
138848
138841
|
this._process = undefined;
|
|
@@ -138889,20 +138882,20 @@ class StdioClientTransport {
|
|
|
138889
138882
|
if (this._process) {
|
|
138890
138883
|
const processToClose = this._process;
|
|
138891
138884
|
this._process = undefined;
|
|
138892
|
-
const closePromise = new Promise((
|
|
138885
|
+
const closePromise = new Promise((resolve36) => {
|
|
138893
138886
|
processToClose.once("close", () => {
|
|
138894
|
-
|
|
138887
|
+
resolve36();
|
|
138895
138888
|
});
|
|
138896
138889
|
});
|
|
138897
138890
|
try {
|
|
138898
138891
|
processToClose.stdin?.end();
|
|
138899
138892
|
} catch {}
|
|
138900
|
-
await Promise.race([closePromise, new Promise((
|
|
138893
|
+
await Promise.race([closePromise, new Promise((resolve36) => setTimeout(resolve36, 2000).unref())]);
|
|
138901
138894
|
if (processToClose.exitCode === null) {
|
|
138902
138895
|
try {
|
|
138903
138896
|
processToClose.kill("SIGTERM");
|
|
138904
138897
|
} catch {}
|
|
138905
|
-
await Promise.race([closePromise, new Promise((
|
|
138898
|
+
await Promise.race([closePromise, new Promise((resolve36) => setTimeout(resolve36, 2000).unref())]);
|
|
138906
138899
|
}
|
|
138907
138900
|
if (processToClose.exitCode === null) {
|
|
138908
138901
|
try {
|
|
@@ -138913,15 +138906,15 @@ class StdioClientTransport {
|
|
|
138913
138906
|
this._readBuffer.clear();
|
|
138914
138907
|
}
|
|
138915
138908
|
send(message) {
|
|
138916
|
-
return new Promise((
|
|
138909
|
+
return new Promise((resolve36) => {
|
|
138917
138910
|
if (!this._process?.stdin) {
|
|
138918
138911
|
throw new Error("Not connected");
|
|
138919
138912
|
}
|
|
138920
138913
|
const json = serializeMessage(message);
|
|
138921
138914
|
if (this._process.stdin.write(json)) {
|
|
138922
|
-
|
|
138915
|
+
resolve36();
|
|
138923
138916
|
} else {
|
|
138924
|
-
this._process.stdin.once("drain",
|
|
138917
|
+
this._process.stdin.once("drain", resolve36);
|
|
138925
138918
|
}
|
|
138926
138919
|
});
|
|
138927
138920
|
}
|
|
@@ -139384,7 +139377,7 @@ import { dirname as dirname42 } from "path";
|
|
|
139384
139377
|
import { createHash as createHash8 } from "crypto";
|
|
139385
139378
|
import { realpathSync as realpathSync19 } from "fs";
|
|
139386
139379
|
import { homedir as homedir31 } from "os";
|
|
139387
|
-
import { join as join125, resolve as
|
|
139380
|
+
import { join as join125, resolve as resolve36 } from "path";
|
|
139388
139381
|
function mirrorStorageDir() {
|
|
139389
139382
|
return join125(process.env.XDG_DATA_HOME ?? join125(homedir31(), ".local", "share"), "opencode", "storage", "oh-my-openagent", MIRROR_DIR_NAME);
|
|
139390
139383
|
}
|
|
@@ -139393,7 +139386,7 @@ function canonicalProjectDir(projectDir) {
|
|
|
139393
139386
|
return realpathSync19.native(projectDir);
|
|
139394
139387
|
} catch (error) {
|
|
139395
139388
|
if (error instanceof Error) {
|
|
139396
|
-
return
|
|
139389
|
+
return resolve36(projectDir);
|
|
139397
139390
|
}
|
|
139398
139391
|
throw error;
|
|
139399
139392
|
}
|
|
@@ -140668,8 +140661,8 @@ async function waitForSessionReady(params) {
|
|
|
140668
140661
|
} catch (error) {
|
|
140669
140662
|
log2("[tmux-session-manager] session status check error", { error: String(error) });
|
|
140670
140663
|
}
|
|
140671
|
-
await new Promise((
|
|
140672
|
-
setTimeout(
|
|
140664
|
+
await new Promise((resolve37) => {
|
|
140665
|
+
setTimeout(resolve37, SESSION_READY_POLL_INTERVAL_MS);
|
|
140673
140666
|
});
|
|
140674
140667
|
}
|
|
140675
140668
|
log2("[tmux-session-manager] session ready timeout", {
|
|
@@ -142788,7 +142781,7 @@ function markReplyListenerStopped(state3, error) {
|
|
|
142788
142781
|
|
|
142789
142782
|
// packages/openclaw-core/src/reply-listener-sleep.ts
|
|
142790
142783
|
function sleep3(ms) {
|
|
142791
|
-
return new Promise((
|
|
142784
|
+
return new Promise((resolve37) => setTimeout(resolve37, ms));
|
|
142792
142785
|
}
|
|
142793
142786
|
|
|
142794
142787
|
// packages/openclaw-core/src/reply-listener-signature.ts
|
|
@@ -143431,11 +143424,11 @@ async function createRuntimeSkillSourceServer(options, runtimeEnv = runtime6) {
|
|
|
143431
143424
|
response.end(error instanceof Error ? error.message : String(error));
|
|
143432
143425
|
}
|
|
143433
143426
|
});
|
|
143434
|
-
await new Promise((
|
|
143427
|
+
await new Promise((resolve37, reject) => {
|
|
143435
143428
|
const onError = (error) => reject(error);
|
|
143436
143429
|
const onListening = () => {
|
|
143437
143430
|
server3.off("error", onError);
|
|
143438
|
-
|
|
143431
|
+
resolve37();
|
|
143439
143432
|
};
|
|
143440
143433
|
server3.once("error", onError);
|
|
143441
143434
|
server3.once("listening", onListening);
|
|
@@ -148675,7 +148668,6 @@ call_omo_agent(subagent_type="librarian", prompt="I'm implementing [technology]
|
|
|
148675
148668
|
**Questions to Ask** (AFTER exploration):
|
|
148676
148669
|
1. Found pattern X in codebase. Should new code follow this, or deviate? Why?
|
|
148677
148670
|
2. What should explicitly NOT be built? (scope boundaries)
|
|
148678
|
-
3. What's the minimum viable version vs full vision?
|
|
148679
148671
|
|
|
148680
148672
|
**Directives for Prometheus**:
|
|
148681
148673
|
- MUST: Follow patterns from \`[discovered file:lines]\`
|
|
@@ -148762,7 +148754,6 @@ Task(
|
|
|
148762
148754
|
**Directives for Prometheus**:
|
|
148763
148755
|
- MUST: Consult Oracle before finalizing plan
|
|
148764
148756
|
- MUST: Document architectural decisions with rationale
|
|
148765
|
-
- MUST: Define "minimum viable architecture"
|
|
148766
148757
|
- MUST NOT: Introduce complexity without justification
|
|
148767
148758
|
|
|
148768
148759
|
---
|
|
@@ -148838,6 +148829,8 @@ call_omo_agent(subagent_type="librarian", prompt="I'm looking for proven impleme
|
|
|
148838
148829
|
- MUST NOT: Create criteria requiring "user clicks/interacts..."
|
|
148839
148830
|
- MUST NOT: Use placeholders without concrete examples (bad: "[endpoint]", good: "/api/users")
|
|
148840
148831
|
- MUST NOT: Write vague QA scenarios ("verify it works", "check the page loads", "test the API returns data")
|
|
148832
|
+
- MUST: For a PROSE deliverable (a prompt, \`SKILL.md\`, rule, or markdown/instruction file), make QA a human/agent READ against the intended behavior, or assert only a machine-consumed value (a parsed field, a sentinel a runtime greps, a doc JSON sample through its real validator) \u2014 the file's wording has no behavioral seam
|
|
148833
|
+
- MUST NOT: Turn a prompt/doc change into a text-grep acceptance criterion (\`grep "<sentence>" SKILL.md\`, word/char counts, phrase presence/absence) \u2014 that pins a diff, not behavior, and blocks every legitimate edit
|
|
148841
148834
|
|
|
148842
148835
|
## Recommended Approach
|
|
148843
148836
|
[1-2 sentence summary of how to proceed]
|
|
@@ -148904,13 +148897,13 @@ If the type is genuinely ambiguous between two of these, ask before proceeding;
|
|
|
148904
148897
|
|
|
148905
148898
|
**Refactoring** \u2014 protect behavior. Recommend the tools that make changes safe: \`lsp_find_references\` to map usages, \`lsp_rename\` / \`lsp_prepare_rename\` for safe renames, and the \`ast-grep\` skill or \`sg --pattern '...' --rewrite '...' --lang ts\` to preview structural transforms. Ask what behavior must be preserved and with which test command, what the rollback is, and whether the change propagates or stays isolated. Direct Prometheus to define pre-refactor verification (exact commands and expected outputs), verify after each change rather than only at the end, never change behavior while restructuring, and never touch adjacent out-of-scope code.
|
|
148906
148899
|
|
|
148907
|
-
**Build from scratch** \u2014 discover before asking. Fire explore/librarian first to learn the codebase's patterns and the library's best practices, then ask only what the code could not answer: follow the found pattern or deviate; what must explicitly NOT be built
|
|
148900
|
+
**Build from scratch** \u2014 discover before asking. Fire explore/librarian first to learn the codebase's patterns and the library's best practices, then ask only what the code could not answer: follow the found pattern or deviate; what must explicitly NOT be built. Direct Prometheus to follow the discovered patterns by \`file:lines\`, define a "Must NOT Have" section against over-engineering, and add nothing unrequested.
|
|
148908
148901
|
|
|
148909
148902
|
**Mid-sized task** \u2014 define exact boundaries; this is where AI slop creeps in. Ask for the exact outputs (files, endpoints, UI), the explicit exclusions, the hard boundaries, and the done-criteria. Turn the slop patterns into questions: scope inflation ("tests for adjacent modules too?"), premature abstraction ("abstraction or inline?"), over-validation ("minimal or comprehensive error handling?"), documentation bloat ("how much documentation?"). Direct Prometheus to write Must-Have and Must-NOT-Have sections with per-task guardrails.
|
|
148910
148903
|
|
|
148911
148904
|
**Collaborative** \u2014 build understanding through dialogue, no rush. Start from the problem, not the proposed solution; gather context with explore/librarian as the user gives direction; refine incrementally; do not finalize until the user confirms. Ask what problem they are solving, what constraints exist, and what tradeoffs are acceptable. Direct Prometheus to record every decision and flag every assumption.
|
|
148912
148905
|
|
|
148913
|
-
**Architecture** \u2014 strategic and long-term. Recommend Prometheus consult Oracle with the request and the gathered context for options, tradeoffs, and risks. Ask the expected lifespan, the scale and load, the non-negotiable constraints, and the systems it must integrate with. Guard against over-engineering for hypothetical futures and unnecessary abstraction layers; direct Prometheus to document decisions with rationale
|
|
148906
|
+
**Architecture** \u2014 strategic and long-term. Recommend Prometheus consult Oracle with the request and the gathered context for options, tradeoffs, and risks. Ask the expected lifespan, the scale and load, the non-negotiable constraints, and the systems it must integrate with. Guard against over-engineering for hypothetical futures and unnecessary abstraction layers; direct Prometheus to document decisions with rationale.
|
|
148914
148907
|
|
|
148915
148908
|
**Research** \u2014 bound the investigation. Ask the decision the research informs, the exit criteria, the time box, and the expected output. Structure parallel probes via explore/librarian. Direct Prometheus to define clear exit criteria, parallel tracks, and a synthesis format, and never to research without convergence.
|
|
148916
148909
|
|
|
@@ -150653,7 +150646,7 @@ createHephaestusAgent.mode = MODE9;
|
|
|
150653
150646
|
// packages/omo-opencode/src/agents/builtin-agents/resolve-file-uri.ts
|
|
150654
150647
|
import { existsSync as existsSync111, readFileSync as readFileSync77 } from "fs";
|
|
150655
150648
|
import { homedir as homedir34 } from "os";
|
|
150656
|
-
import { isAbsolute as
|
|
150649
|
+
import { isAbsolute as isAbsolute19, join as join131, resolve as resolve37 } from "path";
|
|
150657
150650
|
init_logger2();
|
|
150658
150651
|
var ALLOWED_HOME_SUBDIRS = [
|
|
150659
150652
|
join131(homedir34(), ".config", "opencode"),
|
|
@@ -150678,7 +150671,7 @@ function resolvePromptAppend(promptAppend, configDir) {
|
|
|
150678
150671
|
try {
|
|
150679
150672
|
const decoded = decodeURIComponent(encoded);
|
|
150680
150673
|
const expanded = decoded.startsWith("~/") ? decoded.replace(/^~\//, `${homedir34()}/`) : decoded;
|
|
150681
|
-
filePath =
|
|
150674
|
+
filePath = isAbsolute19(expanded) ? expanded : resolve37(configDir ?? process.cwd(), expanded);
|
|
150682
150675
|
} catch (error) {
|
|
150683
150676
|
if (!(error instanceof Error)) {
|
|
150684
150677
|
throw error;
|
|
@@ -153765,7 +153758,7 @@ function createCodegraphMcpConfig(options = {}) {
|
|
|
153765
153758
|
|
|
153766
153759
|
// packages/omo-opencode/src/mcp/lsp.ts
|
|
153767
153760
|
import { existsSync as existsSync113 } from "fs";
|
|
153768
|
-
import { delimiter as delimiter2, dirname as dirname45, resolve as
|
|
153761
|
+
import { delimiter as delimiter2, dirname as dirname45, resolve as resolve39 } from "path";
|
|
153769
153762
|
import { fileURLToPath as fileURLToPath8 } from "url";
|
|
153770
153763
|
|
|
153771
153764
|
// packages/omo-opencode/src/mcp/cli-suffix.ts
|
|
@@ -153777,7 +153770,7 @@ function hasCliSuffix(candidatePath, suffix) {
|
|
|
153777
153770
|
}
|
|
153778
153771
|
|
|
153779
153772
|
// packages/omo-opencode/src/mcp/shared/ancestor-cli-resolver.ts
|
|
153780
|
-
import { resolve as
|
|
153773
|
+
import { resolve as resolve38 } from "path";
|
|
153781
153774
|
function resolveJavaScriptRuntime(resolveExecutable) {
|
|
153782
153775
|
const node = resolveExecutable("node");
|
|
153783
153776
|
return node.available ? node : resolveExecutable("bun");
|
|
@@ -153785,9 +153778,9 @@ function resolveJavaScriptRuntime(resolveExecutable) {
|
|
|
153785
153778
|
function createAncestorCliCandidates(options) {
|
|
153786
153779
|
const candidates = [];
|
|
153787
153780
|
const seenPaths = new Set;
|
|
153788
|
-
let currentDirectory =
|
|
153781
|
+
let currentDirectory = resolve38(options.startDirectory);
|
|
153789
153782
|
while (true) {
|
|
153790
|
-
const distCliPath =
|
|
153783
|
+
const distCliPath = resolve38(currentDirectory, options.packageRel, options.distCliRel);
|
|
153791
153784
|
if (!seenPaths.has(distCliPath)) {
|
|
153792
153785
|
const runtime7 = resolveJavaScriptRuntime(options.resolveExecutable);
|
|
153793
153786
|
seenPaths.add(distCliPath);
|
|
@@ -153799,7 +153792,7 @@ function createAncestorCliCandidates(options) {
|
|
|
153799
153792
|
runtimeAvailable: runtime7.available
|
|
153800
153793
|
});
|
|
153801
153794
|
}
|
|
153802
|
-
const sourceCliPath =
|
|
153795
|
+
const sourceCliPath = resolve38(currentDirectory, options.packageRel, options.sourceCliRel);
|
|
153803
153796
|
if (!seenPaths.has(sourceCliPath)) {
|
|
153804
153797
|
const runtime7 = options.resolveExecutable("bun");
|
|
153805
153798
|
const sourceCandidateAvailable = options.isSourceCandidateAvailable?.({
|
|
@@ -153816,7 +153809,7 @@ function createAncestorCliCandidates(options) {
|
|
|
153816
153809
|
runtimeAvailable: runtime7.available
|
|
153817
153810
|
});
|
|
153818
153811
|
}
|
|
153819
|
-
const parentDirectory =
|
|
153812
|
+
const parentDirectory = resolve38(currentDirectory, "..");
|
|
153820
153813
|
if (parentDirectory === currentDirectory)
|
|
153821
153814
|
return candidates;
|
|
153822
153815
|
currentDirectory = parentDirectory;
|
|
@@ -153860,17 +153853,17 @@ function getModuleDirectory(moduleUrl) {
|
|
|
153860
153853
|
}
|
|
153861
153854
|
}
|
|
153862
153855
|
function findBootstrapRoot(candidates, pathExists) {
|
|
153863
|
-
return candidates.find((candidate) => pathExists(
|
|
153856
|
+
return candidates.find((candidate) => pathExists(resolve39(candidate.root, "package.json")))?.root ?? process.cwd();
|
|
153864
153857
|
}
|
|
153865
153858
|
function createBootstrapCandidate(root, pathExists, resolveExecutable) {
|
|
153866
153859
|
const runtime7 = resolveJavaScriptRuntime(resolveExecutable);
|
|
153867
153860
|
const bun = resolveExecutable("bun");
|
|
153868
153861
|
const npm = resolveExecutable("npm");
|
|
153869
|
-
const packageManifestPath =
|
|
153862
|
+
const packageManifestPath = resolve39(root, PACKAGE_REL, "package.json");
|
|
153870
153863
|
return {
|
|
153871
153864
|
command: [runtime7.command, "-e", LSP_BOOTSTRAP_SCRIPT, root, npm.command, bun.command],
|
|
153872
153865
|
root,
|
|
153873
|
-
path:
|
|
153866
|
+
path: resolve39(root, PACKAGE_REL, DIST_CLI_REL),
|
|
153874
153867
|
exists: runtime7.available && npm.available && pathExists(packageManifestPath),
|
|
153875
153868
|
runtimeAvailable: runtime7.available
|
|
153876
153869
|
};
|
|
@@ -153886,7 +153879,7 @@ function resolveLspCommand(options = {}) {
|
|
|
153886
153879
|
sourceCliRel: SOURCE_CLI_REL,
|
|
153887
153880
|
pathExists,
|
|
153888
153881
|
resolveExecutable,
|
|
153889
|
-
isSourceCandidateAvailable: ({ root }) => pathExists(
|
|
153882
|
+
isSourceCandidateAvailable: ({ root }) => pathExists(resolve39(root, LSP_TOOLS_PACKAGE_REL, DIST_CLI_REL))
|
|
153890
153883
|
}) : [];
|
|
153891
153884
|
const distCandidate = candidates.find((candidate) => hasCliSuffix(candidate.path, DIST_CLI_REL) && candidate.exists);
|
|
153892
153885
|
if (distCandidate) {
|
|
@@ -154516,7 +154509,7 @@ function createTeamModeToolsRecord(args) {
|
|
|
154516
154509
|
// node_modules/.bun/@opencode-ai+sdk@1.15.13/node_modules/@opencode-ai/sdk/dist/v2/gen/core/serverSentEvents.gen.js
|
|
154517
154510
|
var createSseClient2 = ({ onRequest, onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url: url2, ...options }) => {
|
|
154518
154511
|
let lastEventId;
|
|
154519
|
-
const sleep4 = sseSleepFn ?? ((ms) => new Promise((
|
|
154512
|
+
const sleep4 = sseSleepFn ?? ((ms) => new Promise((resolve40) => setTimeout(resolve40, ms)));
|
|
154520
154513
|
const createStream = async function* () {
|
|
154521
154514
|
let retryDelay = sseDefaultRetryDelay ?? 3000;
|
|
154522
154515
|
let attempt = 0;
|
|
@@ -158065,7 +158058,7 @@ async function readRuntimeHostSkills(client5) {
|
|
|
158065
158058
|
function createRuntimeSkillsResolver(args) {
|
|
158066
158059
|
const { baseSkills, readRuntimeHostSkills: readHostSkills, buildMergedSkills } = args;
|
|
158067
158060
|
let inflight;
|
|
158068
|
-
const
|
|
158061
|
+
const resolve40 = async () => {
|
|
158069
158062
|
const hostSkills = await readHostSkills();
|
|
158070
158063
|
if (!hostSkills)
|
|
158071
158064
|
return baseSkills;
|
|
@@ -158077,7 +158070,7 @@ function createRuntimeSkillsResolver(args) {
|
|
|
158077
158070
|
};
|
|
158078
158071
|
return () => {
|
|
158079
158072
|
if (!inflight)
|
|
158080
|
-
inflight =
|
|
158073
|
+
inflight = resolve40();
|
|
158081
158074
|
return inflight;
|
|
158082
158075
|
};
|
|
158083
158076
|
}
|
|
@@ -158917,7 +158910,7 @@ async function waitForTaskSessionId(bgMgr, task, deadlineAt) {
|
|
|
158917
158910
|
}
|
|
158918
158911
|
sessionId = updatedTask?.sessionId;
|
|
158919
158912
|
if (!sessionId)
|
|
158920
|
-
await new Promise((
|
|
158913
|
+
await new Promise((resolve40) => setTimeout(resolve40, SESSION_ID_POLL_MS));
|
|
158921
158914
|
}
|
|
158922
158915
|
return sessionId;
|
|
158923
158916
|
}
|
|
@@ -160405,13 +160398,13 @@ function logCaughtDbError(message, metadata, error) {
|
|
|
160405
160398
|
log2(message, { ...metadata, error: String(error) });
|
|
160406
160399
|
}
|
|
160407
160400
|
function nextMicrotask() {
|
|
160408
|
-
return new Promise((
|
|
160409
|
-
queueMicrotask(
|
|
160401
|
+
return new Promise((resolve40) => {
|
|
160402
|
+
queueMicrotask(resolve40);
|
|
160410
160403
|
});
|
|
160411
160404
|
}
|
|
160412
160405
|
function nextTimerTick() {
|
|
160413
|
-
return new Promise((
|
|
160414
|
-
setTimeout(
|
|
160406
|
+
return new Promise((resolve40) => {
|
|
160407
|
+
setTimeout(resolve40, 0);
|
|
160415
160408
|
});
|
|
160416
160409
|
}
|
|
160417
160410
|
function closeDbWithLog(db, message, metadata) {
|
|
@@ -160695,6 +160688,18 @@ function parseRalphLoopArguments(rawArguments) {
|
|
|
160695
160688
|
|
|
160696
160689
|
// packages/omo-opencode/src/plugin/command-execute-before.ts
|
|
160697
160690
|
init_logger2();
|
|
160691
|
+
|
|
160692
|
+
// packages/omo-opencode/src/plugin/stop-continuation.ts
|
|
160693
|
+
function stopContinuation(args) {
|
|
160694
|
+
const { directory, hooks, sessionID } = args;
|
|
160695
|
+
hooks.stopContinuationGuard?.stop?.(sessionID);
|
|
160696
|
+
hooks.todoContinuationEnforcer?.cancelAllCountdowns();
|
|
160697
|
+
hooks.ralphLoop?.cancelLoop(sessionID);
|
|
160698
|
+
clearBoulderState(directory);
|
|
160699
|
+
log2("[stop-continuation] All continuation mechanisms stopped", { sessionID });
|
|
160700
|
+
}
|
|
160701
|
+
|
|
160702
|
+
// packages/omo-opencode/src/plugin/command-execute-before.ts
|
|
160698
160703
|
var NATIVE_LOOP_TRIGGERED_FLAG = "__omoNativeLoopTriggered";
|
|
160699
160704
|
function hasPartsOutput(value) {
|
|
160700
160705
|
if (typeof value !== "object" || value === null)
|
|
@@ -160704,11 +160709,14 @@ function hasPartsOutput(value) {
|
|
|
160704
160709
|
return Array.isArray(parts);
|
|
160705
160710
|
}
|
|
160706
160711
|
function createCommandExecuteBeforeHandler(args) {
|
|
160707
|
-
const { hooks } = args;
|
|
160712
|
+
const { directory, hooks } = args;
|
|
160708
160713
|
return async (input, output) => {
|
|
160709
160714
|
await hooks.autoSlashCommand?.["command.execute.before"]?.(input, output);
|
|
160710
160715
|
const normalizedCommand = input.command.toLowerCase();
|
|
160711
160716
|
const sessionID = input.sessionID;
|
|
160717
|
+
if (normalizedCommand === "stop-continuation" && sessionID) {
|
|
160718
|
+
stopContinuation({ directory, hooks, sessionID });
|
|
160719
|
+
}
|
|
160712
160720
|
if (hooks.ralphLoop && sessionID) {
|
|
160713
160721
|
if (normalizedCommand === "ralph-loop" || normalizedCommand === "ulw-loop") {
|
|
160714
160722
|
const parsedArguments = parseRalphLoopArguments(input.arguments || "");
|
|
@@ -160954,6 +160962,14 @@ function createChatMessageHandler3(args) {
|
|
|
160954
160962
|
if (input.agent) {
|
|
160955
160963
|
updateSessionAgent(input.sessionID, input.agent);
|
|
160956
160964
|
}
|
|
160965
|
+
const slashCommand = detectSlashCommand(extractPromptText3(output.parts));
|
|
160966
|
+
if (slashCommand?.command === "stop-continuation") {
|
|
160967
|
+
stopContinuation({
|
|
160968
|
+
directory: ctx.directory,
|
|
160969
|
+
hooks,
|
|
160970
|
+
sessionID: input.sessionID
|
|
160971
|
+
});
|
|
160972
|
+
}
|
|
160957
160973
|
const isFirstMessage = firstMessageVariantGate.shouldOverride(input.sessionID);
|
|
160958
160974
|
if (isFirstMessage) {
|
|
160959
160975
|
firstMessageVariantGate.markApplied(input.sessionID);
|
|
@@ -162941,13 +162957,7 @@ function createToolExecuteBeforeHandler3(args) {
|
|
|
162941
162957
|
const command = rawName?.replace(/^\//, "").toLowerCase();
|
|
162942
162958
|
const sessionID = input.sessionID || getMainSessionID();
|
|
162943
162959
|
if (command === "stop-continuation" && sessionID) {
|
|
162944
|
-
hooks
|
|
162945
|
-
hooks.todoContinuationEnforcer?.cancelAllCountdowns();
|
|
162946
|
-
hooks.ralphLoop?.cancelLoop(sessionID);
|
|
162947
|
-
clearBoulderState(ctx.directory);
|
|
162948
|
-
log2("[stop-continuation] All continuation mechanisms stopped", {
|
|
162949
|
-
sessionID
|
|
162950
|
-
});
|
|
162960
|
+
stopContinuation({ directory: ctx.directory, hooks, sessionID });
|
|
162951
162961
|
}
|
|
162952
162962
|
const workStartingCommands = ["start-work", "ralph-loop", "ulw-loop"];
|
|
162953
162963
|
if (workStartingCommands.includes(command ?? "") && sessionID) {
|
|
@@ -162981,6 +162991,7 @@ function createPluginInterface(args) {
|
|
|
162981
162991
|
},
|
|
162982
162992
|
"chat.headers": createChatHeadersHandler({ ctx }),
|
|
162983
162993
|
"command.execute.before": createCommandExecuteBeforeHandler({
|
|
162994
|
+
directory: ctx.directory,
|
|
162984
162995
|
hooks
|
|
162985
162996
|
}),
|
|
162986
162997
|
"chat.message": createChatMessageHandler3({
|
|
@@ -164273,7 +164284,7 @@ function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetr
|
|
|
164273
164284
|
}
|
|
164274
164285
|
|
|
164275
164286
|
// node_modules/.bun/posthog-node@5.35.12/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
|
|
164276
|
-
import { dirname as dirname47, posix as
|
|
164287
|
+
import { dirname as dirname47, posix as posix7, sep as sep3 } from "path";
|
|
164277
164288
|
function createModulerModifier() {
|
|
164278
164289
|
const getModuleFromFileName = createGetModuleFromFilename();
|
|
164279
164290
|
return async (frames) => {
|
|
@@ -164288,7 +164299,7 @@ function createGetModuleFromFilename(basePath = process.argv[1] ? dirname47(proc
|
|
|
164288
164299
|
if (!filename)
|
|
164289
164300
|
return;
|
|
164290
164301
|
const normalizedFilename = isWindows2 ? normalizeWindowsPath(filename) : filename;
|
|
164291
|
-
let { dir, base: file2, ext } =
|
|
164302
|
+
let { dir, base: file2, ext } = posix7.parse(normalizedFilename);
|
|
164292
164303
|
if (ext === ".js" || ext === ".mjs" || ext === ".cjs")
|
|
164293
164304
|
file2 = file2.slice(0, -1 * ext.length);
|
|
164294
164305
|
const decodedFile = decodeURIComponent(file2);
|
|
@@ -166969,14 +166980,14 @@ async function addSourceContext(frames) {
|
|
|
166969
166980
|
return frames;
|
|
166970
166981
|
}
|
|
166971
166982
|
function getContextLinesFromFile(path28, ranges, output) {
|
|
166972
|
-
return new Promise((
|
|
166983
|
+
return new Promise((resolve40) => {
|
|
166973
166984
|
const stream = createReadStream(path28);
|
|
166974
166985
|
const lineReaded = createInterface({
|
|
166975
166986
|
input: stream
|
|
166976
166987
|
});
|
|
166977
166988
|
function destroyStreamAndResolve() {
|
|
166978
166989
|
stream.destroy();
|
|
166979
|
-
|
|
166990
|
+
resolve40();
|
|
166980
166991
|
}
|
|
166981
166992
|
let lineNumber = 0;
|
|
166982
166993
|
let currentRangeIndex = 0;
|
|
@@ -167144,7 +167155,7 @@ function snipLine(line, colno) {
|
|
|
167144
167155
|
}
|
|
167145
167156
|
|
|
167146
167157
|
// node_modules/.bun/posthog-node@5.35.12/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/relative-path.node.mjs
|
|
167147
|
-
import { isAbsolute as
|
|
167158
|
+
import { isAbsolute as isAbsolute20, relative as relative15, sep as sep4 } from "path";
|
|
167148
167159
|
function createRelativePathModifier(basePath = process.cwd()) {
|
|
167149
167160
|
const isWindows2 = sep4 === "\\";
|
|
167150
167161
|
const toUnix = (p) => isWindows2 ? p.replace(/\\/g, "/") : p;
|
|
@@ -167152,8 +167163,8 @@ function createRelativePathModifier(basePath = process.cwd()) {
|
|
|
167152
167163
|
return async (frames) => {
|
|
167153
167164
|
for (const frame of frames)
|
|
167154
167165
|
if (!(!frame.filename || frame.filename.startsWith("node:") || frame.filename.startsWith("data:"))) {
|
|
167155
|
-
if (
|
|
167156
|
-
frame.filename = toUnix(
|
|
167166
|
+
if (isAbsolute20(frame.filename))
|
|
167167
|
+
frame.filename = toUnix(relative15(normalizedBase, toUnix(frame.filename)));
|
|
167157
167168
|
}
|
|
167158
167169
|
return frames;
|
|
167159
167170
|
};
|
|
@@ -168427,9 +168438,9 @@ class PostHogBackendClient extends PostHogCoreStateless {
|
|
|
168427
168438
|
if (this.disabled || this.optedOut)
|
|
168428
168439
|
return;
|
|
168429
168440
|
if (!this._waitUntilCycle) {
|
|
168430
|
-
let
|
|
168441
|
+
let resolve40;
|
|
168431
168442
|
const promise2 = new Promise((r) => {
|
|
168432
|
-
|
|
168443
|
+
resolve40 = r;
|
|
168433
168444
|
});
|
|
168434
168445
|
try {
|
|
168435
168446
|
waitUntil(promise2);
|
|
@@ -168437,7 +168448,7 @@ class PostHogBackendClient extends PostHogCoreStateless {
|
|
|
168437
168448
|
return;
|
|
168438
168449
|
}
|
|
168439
168450
|
this._waitUntilCycle = {
|
|
168440
|
-
resolve:
|
|
168451
|
+
resolve: resolve40,
|
|
168441
168452
|
startedAt: Date.now(),
|
|
168442
168453
|
timer: undefined
|
|
168443
168454
|
};
|
|
@@ -168463,11 +168474,11 @@ class PostHogBackendClient extends PostHogCoreStateless {
|
|
|
168463
168474
|
return cycle?.resolve;
|
|
168464
168475
|
}
|
|
168465
168476
|
async resolveWaitUntilFlush() {
|
|
168466
|
-
const
|
|
168477
|
+
const resolve40 = this._consumeWaitUntilCycle();
|
|
168467
168478
|
try {
|
|
168468
168479
|
await super.flush();
|
|
168469
168480
|
} catch {} finally {
|
|
168470
|
-
|
|
168481
|
+
resolve40?.();
|
|
168471
168482
|
}
|
|
168472
168483
|
}
|
|
168473
168484
|
getPersistedProperty(key) {
|
|
@@ -168567,15 +168578,15 @@ class PostHogBackendClient extends PostHogCoreStateless {
|
|
|
168567
168578
|
return true;
|
|
168568
168579
|
if (this.featureFlagsPoller === undefined)
|
|
168569
168580
|
return false;
|
|
168570
|
-
return new Promise((
|
|
168581
|
+
return new Promise((resolve40) => {
|
|
168571
168582
|
const timeout = setTimeout(() => {
|
|
168572
168583
|
cleanup();
|
|
168573
|
-
|
|
168584
|
+
resolve40(false);
|
|
168574
168585
|
}, timeoutMs);
|
|
168575
168586
|
const cleanup = this._events.on("localEvaluationFlagsLoaded", (count) => {
|
|
168576
168587
|
clearTimeout(timeout);
|
|
168577
168588
|
cleanup();
|
|
168578
|
-
|
|
168589
|
+
resolve40(count > 0);
|
|
168579
168590
|
});
|
|
168580
168591
|
});
|
|
168581
168592
|
}
|
|
@@ -169081,13 +169092,13 @@ class PostHogBackendClient extends PostHogCoreStateless {
|
|
|
169081
169092
|
this.context?.enter(data, options);
|
|
169082
169093
|
}
|
|
169083
169094
|
async _shutdown(shutdownTimeoutMs) {
|
|
169084
|
-
const
|
|
169095
|
+
const resolve40 = this._consumeWaitUntilCycle();
|
|
169085
169096
|
await this.featureFlagsPoller?.stopPoller(shutdownTimeoutMs);
|
|
169086
169097
|
this.errorTracking.shutdown();
|
|
169087
169098
|
try {
|
|
169088
169099
|
return await super._shutdown(shutdownTimeoutMs);
|
|
169089
169100
|
} finally {
|
|
169090
|
-
|
|
169101
|
+
resolve40?.();
|
|
169091
169102
|
}
|
|
169092
169103
|
}
|
|
169093
169104
|
async _requestRemoteConfigPayload(flagKey) {
|