@joshuafolkken/kit 1.1471.0 → 1.1514.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +2 -14
- package/.claude/skills/epic-commands/epic-bundle.md +9 -5
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +7 -9
- package/.claude/skills/workflow-commands/background-commands.md +3 -7
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -10
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +6 -15
- package/.claude/skills/workflow-commands/backlogrun-park.md +2 -8
- package/.claude/skills/workflow-commands/backlogrun-progress.md +10 -19
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +8 -8
- package/.claude/skills/workflow-commands/backlogrun-steps.md +2 -10
- package/.claude/skills/workflow-commands/backlogrun.md +31 -50
- package/.claude/skills/workflow-commands/chain-rule.md +7 -6
- package/.claude/skills/workflow-commands/delegation.md +12 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +1 -3
- package/.claude/skills/workflow-commands/followup.md +3 -6
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -5
- package/.claude/skills/workflow-commands/fullrun.md +4 -6
- package/.claude/skills/workflow-commands/halfrun.md +3 -7
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +3 -3
- package/.claude/skills/workflow-commands/issue-scout.md +3 -2
- package/.claude/skills/workflow-commands/latest-gate.md +2 -6
- package/.claude/skills/workflow-commands/needs-human-review.md +2 -5
- package/.claude/skills/workflow-commands/observation-filing.md +0 -14
- package/.claude/skills/workflow-commands/observation-ledger.md +4 -9
- package/.claude/skills/workflow-commands/pre-gate-cut.md +11 -16
- package/.claude/skills/workflow-commands/prerequisite.md +1 -2
- package/.claude/skills/workflow-commands/progress-watcher.md +2 -7
- package/.claude/skills/workflow-commands/prrun.md +3 -5
- package/.claude/skills/workflow-commands/retrospective.md +4 -4
- package/.claude/skills/workflow-commands/split-assessment.md +1 -3
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +2 -4
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +1 -1
- package/.github/workflows/ci.yml +1 -1
- package/.github/workflows/publish.yml +2 -2
- package/CLAUDE.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +1 -1
- package/dist/commands/document-section-cli.js +67 -34
- package/dist/hooks/batch-guard.js +6 -6
- package/dist/hooks/chunk-4KKD2UTK.js +66 -0
- package/dist/hooks/{chunk-J47HU5H5.js → chunk-6TS2JD6D.js} +3 -3
- package/dist/hooks/chunk-7DSBJVFH.js +50 -0
- package/dist/hooks/{chunk-YHBZAJSV.js → chunk-A65Y4YOR.js} +3 -3
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-APUO6U4J.js} +85 -7
- package/dist/hooks/{chunk-IX6TTTI6.js → chunk-EFXE6C37.js} +8 -22
- package/dist/hooks/chunk-GP4IEC4O.js +20 -0
- package/dist/hooks/{chunk-SHGPANFB.js → chunk-JP45SOCJ.js} +3 -3
- package/dist/hooks/{chunk-K4EOONYM.js → chunk-LAOV7NLM.js} +1 -1
- package/dist/hooks/chunk-M4HGZV7U.js +83 -0
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-O6GDRNJB.js} +3 -3
- package/dist/hooks/{chunk-YYPI7SJZ.js → chunk-PF2NZL2A.js} +5 -5
- package/dist/hooks/{chunk-H5HVWYXK.js → chunk-PTICX4OL.js} +3 -4
- package/dist/hooks/{chunk-IIGFYXKC.js → chunk-RT27QRJW.js} +581 -1438
- package/dist/hooks/{chunk-43ZHT22P.js → chunk-SYOTDYCI.js} +1127 -1089
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-TNUMY6NL.js} +1507 -1336
- package/dist/hooks/chunk-UPUZF3AN.js +279 -0
- package/dist/hooks/{chunk-EUMACUK2.js → chunk-WK6SMBIC.js} +1948 -806
- package/dist/hooks/codex-hook-adapter.js +17 -14
- package/dist/hooks/duplicate-read-guard.js +7 -7
- package/dist/hooks/format-edited.js +5 -4
- package/dist/hooks/inputs.json +317 -264
- package/dist/hooks/investigation-guard.js +8 -11
- package/dist/hooks/pretool-guard.js +16 -13
- package/dist/hooks/session-lang.js +370 -25
- package/dist/hooks/stop-guard.js +2576 -176
- package/dist/josh.js +2124 -277
- package/lefthook/base.yml +5 -3
- package/package.json +12 -10
- package/prompts/collaboration-workflow/file-edits.md +1 -3
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +10 -2
- package/prompts/collaboration-workflow/lane-instructions.md +35 -0
- package/prompts/collaboration-workflow/operating-rules.md +2 -6
- package/prompts/collaboration-workflow/output-bounds.md +3 -3
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/principles.md +14 -8
- package/prompts/collaboration-workflow/report-format.md +9 -0
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +6 -6
- package/prompts/collaboration-workflow/turn-batching.md +5 -5
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +6 -6
- package/prompts/collaboration-workflow.md +1 -0
- package/prompts/review.md +4 -5
- package/prompts/testing-guide.md +2 -2
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/backlog/backlog-budget.ts +4 -4
- package/scripts/backlog/backlog-drive-named.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +9 -1
- package/scripts/backlog/backlog-occupied.ts +56 -0
- package/scripts/backlog/backlog-ready.ts +47 -10
- package/scripts/delegation/duplicate-read-guard.ts +2 -2
- package/scripts/delegation/investigation-guard.ts +15 -65
- package/scripts/delegation/investigation-reads.ts +0 -1
- package/scripts/document/document-byte-budget.ts +6 -5
- package/scripts/document/document-section-cli.ts +17 -5
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/followup/git-followup-workflow.ts +19 -1
- package/scripts/gate/check-inputs.ts +129 -0
- package/scripts/gate/check-reuse.ts +162 -0
- package/scripts/gate/core-budget.ts +93 -44
- package/scripts/gate/core-wait.ts +130 -0
- package/scripts/gate/free-cores.ts +49 -0
- package/scripts/gate/gate-ledger.ts +17 -3
- package/scripts/gate/gate-plan.ts +23 -1
- package/scripts/gate/gate-report.ts +15 -2
- package/scripts/gate/gate-run-steps.ts +150 -0
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/machine-capacity.ts +70 -11
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/verification-gate.ts +58 -125
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +24 -2
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +14 -5
- package/scripts/hooks/batch-guard.ts +5 -8
- package/scripts/hooks/pre-commit-lint.ts +91 -0
- package/scripts/hooks/pre-push-unit.ts +1 -1
- package/scripts/hooks/pretool-guard.ts +27 -52
- package/scripts/hooks/reserved-run.ts +1 -0
- package/scripts/hooks/run-hook.sh +10 -12
- package/scripts/hooks/stop-actions.ts +204 -0
- package/scripts/hooks/stop-guard.ts +62 -21
- package/scripts/init/hook-launch.ts +12 -7
- package/scripts/issue/expected-effect-lint.ts +59 -0
- package/scripts/issue/issue-cite-cli.ts +35 -15
- package/scripts/issue/issue-classification.ts +1 -1
- package/scripts/issue/issue-lint-cli.ts +5 -3
- package/scripts/issue/issue-scout-cli.ts +19 -14
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/josh/command-usage.ts +110 -0
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-command-types.ts +55 -9
- package/scripts/josh/josh-commands-ai.ts +13 -0
- package/scripts/josh/josh-commands-development.ts +1 -1
- package/scripts/josh/josh-commands-hooks.ts +6 -0
- package/scripts/josh/josh-commands-lane.ts +10 -1
- package/scripts/josh/josh-commands-workflow.ts +5 -0
- package/scripts/josh/josh-logic.ts +6 -15
- package/scripts/josh/josh-usage-automation.ts +121 -0
- package/scripts/josh/josh-usage-backlog.ts +180 -0
- package/scripts/josh/josh-usage-developer.ts +230 -0
- package/scripts/josh/josh-usage-hooks.ts +38 -0
- package/scripts/josh/josh-usage-issue.ts +205 -0
- package/scripts/josh/josh-usage-review.ts +101 -0
- package/scripts/josh/josh-usage-run.ts +252 -0
- package/scripts/josh/josh-usage-session.ts +238 -0
- package/scripts/josh/josh-usage-workflow.ts +212 -0
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +20 -0
- package/scripts/lane/lane-capacity.ts +8 -2
- package/scripts/lane/lane-check-stats.ts +56 -0
- package/scripts/lane/lane-child-invocation.ts +35 -4
- package/scripts/lane/lane-dispatch.ts +3 -3
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +8 -1
- package/scripts/lane/lane-install.ts +12 -4
- package/scripts/lane/lane-ledger.ts +43 -1
- package/scripts/lane/lane-limit-cli.ts +8 -9
- package/scripts/lane/lane-measure-cli.ts +2 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-registry.ts +9 -7
- package/scripts/lane/lane-restart.ts +5 -26
- package/scripts/lane/lane-session-action.ts +146 -0
- package/scripts/lane/lane-session-broker.ts +57 -138
- package/scripts/lane/lane-withdraw-cli.ts +71 -0
- package/scripts/lane/lane-withdraw.ts +182 -0
- package/scripts/lint/format.ts +4 -4
- package/scripts/lint/lint-parallel.ts +10 -3
- package/scripts/lint/lint-related-scope.ts +4 -1
- package/scripts/notify/telegram-test.ts +10 -5
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +205 -0
- package/scripts/review/review-brief-cli.ts +1 -1
- package/scripts/rules/agent-model.ts +59 -0
- package/scripts/rules/delivered-rules.ts +11 -2
- package/scripts/rules/filing-cap.ts +1 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/guard-remedy.ts +117 -0
- package/scripts/rules/issue-comments.ts +67 -6
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/piped-verification.ts +3 -1
- package/scripts/rules/rule-list.ts +4 -1
- package/scripts/rules/rule-registry-rows.ts +10 -0
- package/scripts/rules/rule-registry.ts +7 -4
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value.ts +7 -1
- package/scripts/rules/shell-segments.ts +15 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rules.ts +147 -47
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/run/board/run-board-cli.ts +2 -0
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-github.ts +9 -1
- package/scripts/run/board/run-board-header.ts +4 -1
- package/scripts/run/board/run-board-labels.ts +2 -0
- package/scripts/run/board/run-board-layout.ts +1 -1
- package/scripts/run/board/run-board-read.ts +16 -0
- package/scripts/run/board/run-board-reason.ts +10 -1
- package/scripts/run/board/run-board-render-legend.ts +1 -0
- package/scripts/run/board/run-board-render-slot.ts +1 -1
- package/scripts/run/board/run-board-render-waits.ts +41 -0
- package/scripts/run/board/run-board-render.ts +6 -1
- package/scripts/run/board/run-board-row-yield.ts +1 -0
- package/scripts/run/board/run-board-state.ts +5 -0
- package/scripts/run/board/run-board-status.ts +72 -21
- package/scripts/run/board/run-board-tick.ts +5 -1
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-render.ts +1 -0
- package/scripts/run/event/run-event-scope.ts +19 -1
- package/scripts/run/event/run-event-stream-emit.ts +13 -6
- package/scripts/run/event/run-event-stream.ts +4 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-cli.ts +16 -65
- package/scripts/run/merge/run-merge-signals.ts +99 -0
- package/scripts/run/merge/run-merge-steps.ts +11 -1
- package/scripts/run/merge/run-merge.ts +21 -9
- package/scripts/run/run-liveness.ts +1 -1
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/ship/run-ship-cli.ts +5 -12
- package/scripts/run/ship/run-ship-detach.ts +9 -0
- package/scripts/run/ship/run-ship-next.ts +10 -2
- package/scripts/run/ship/run-ship-overlap.ts +195 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +33 -15
- package/scripts/run/ship/run-ship-preflight.ts +28 -2
- package/scripts/run/ship/run-ship-return.ts +31 -7
- package/scripts/run/ship/run-ship-review-steps.ts +12 -10
- package/scripts/run/ship/run-ship-steps.ts +1 -1
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-sync.ts +14 -6
- package/scripts/test/test-e2e-guard.ts +30 -5
- package/scripts/test/test-unit-guard.ts +16 -1
- package/scripts/test/unit-worker-share.ts +26 -4
- package/scripts/time-runtime/time-shell.ts +29 -4
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/templates/gitignore +6 -2
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import {
|
|
2
|
+
agent_session_environment
|
|
3
|
+
} from "./chunk-APUO6U4J.js";
|
|
4
|
+
|
|
5
|
+
// scripts/agent/agent-role-profile.ts
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
// scripts/agent/agent-safe-text.ts
|
|
9
|
+
var FIRST_PRINTABLE_CODE = 32;
|
|
10
|
+
var DELETE_CODE = 127;
|
|
11
|
+
var FIRST_CODE_POINT = 0;
|
|
12
|
+
var EMPTY_LENGTH = 0;
|
|
13
|
+
var MAX_VALUE_LENGTH = 4096;
|
|
14
|
+
var LINE_FEED = "\n";
|
|
15
|
+
var SPACE = " ";
|
|
16
|
+
function is_control_character(character) {
|
|
17
|
+
const code = character.codePointAt(FIRST_CODE_POINT) ?? FIRST_PRINTABLE_CODE;
|
|
18
|
+
return code < FIRST_PRINTABLE_CODE || code === DELETE_CODE;
|
|
19
|
+
}
|
|
20
|
+
function is_line_feed(character) {
|
|
21
|
+
return character === LINE_FEED;
|
|
22
|
+
}
|
|
23
|
+
function is_never_allowed() {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
function is_refused(character, is_allowed) {
|
|
27
|
+
return is_control_character(character) && !is_allowed(character);
|
|
28
|
+
}
|
|
29
|
+
function is_safe_text(value, is_allowed) {
|
|
30
|
+
if (value.length === EMPTY_LENGTH || value.length > MAX_VALUE_LENGTH) return false;
|
|
31
|
+
for (const character of value) if (is_refused(character, is_allowed)) return false;
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
function is_safe_value(value) {
|
|
35
|
+
return is_safe_text(value, is_never_allowed);
|
|
36
|
+
}
|
|
37
|
+
function is_safe_prompt(value) {
|
|
38
|
+
return is_safe_text(value, is_line_feed);
|
|
39
|
+
}
|
|
40
|
+
function printable_character(character) {
|
|
41
|
+
return is_refused(character, is_line_feed) ? SPACE : character;
|
|
42
|
+
}
|
|
43
|
+
function printable(text) {
|
|
44
|
+
return Array.from(text, printable_character).join("");
|
|
45
|
+
}
|
|
46
|
+
var agent_safe_text = { MAX_VALUE_LENGTH, is_safe_prompt, is_safe_value, printable };
|
|
47
|
+
|
|
48
|
+
// scripts/agent/agent-role-profile.ts
|
|
49
|
+
var EMPTY_LENGTH2 = 0;
|
|
50
|
+
var ROLE_SCHEMA = z.enum(["scheduler", "worker", "reviewer"]);
|
|
51
|
+
var PROVIDER_SCHEMA = z.enum(["anthropic", "openai"]);
|
|
52
|
+
var EFFORT_SCHEMA = z.enum(["low", "medium", "high", "xhigh", "max"]);
|
|
53
|
+
var PHASE_SCHEMA = z.enum(["implementation", "pre-gate"]);
|
|
54
|
+
var PROFILE_SCHEMA = z.object({
|
|
55
|
+
provider: PROVIDER_SCHEMA.default("anthropic"),
|
|
56
|
+
role: ROLE_SCHEMA,
|
|
57
|
+
model: z.string(),
|
|
58
|
+
effort: EFFORT_SCHEMA
|
|
59
|
+
});
|
|
60
|
+
var SCHEDULER = "scheduler";
|
|
61
|
+
var WORKER = "worker";
|
|
62
|
+
var REVIEWER = "reviewer";
|
|
63
|
+
var IMPLEMENTATION_PHASE = "implementation";
|
|
64
|
+
var PRE_GATE_PHASE = "pre-gate";
|
|
65
|
+
var ANTHROPIC_PROVIDER = "anthropic";
|
|
66
|
+
var OPENAI_PROVIDER = "openai";
|
|
67
|
+
var OPENAI_MODEL = "gpt-6.1-sol";
|
|
68
|
+
var ANTHROPIC_MODEL = "claude-opus-5-5";
|
|
69
|
+
var CODEX_SESSION_KEY = "CODEX_THREAD_ID";
|
|
70
|
+
var DEFAULT_PROFILES = {
|
|
71
|
+
scheduler: {
|
|
72
|
+
provider: ANTHROPIC_PROVIDER,
|
|
73
|
+
role: SCHEDULER,
|
|
74
|
+
model: ANTHROPIC_MODEL,
|
|
75
|
+
effort: "medium"
|
|
76
|
+
},
|
|
77
|
+
worker: { provider: ANTHROPIC_PROVIDER, role: WORKER, model: ANTHROPIC_MODEL, effort: "medium" },
|
|
78
|
+
reviewer: {
|
|
79
|
+
provider: ANTHROPIC_PROVIDER,
|
|
80
|
+
role: REVIEWER,
|
|
81
|
+
model: ANTHROPIC_MODEL,
|
|
82
|
+
effort: "high"
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var OPENAI_PROFILES = {
|
|
86
|
+
scheduler: { provider: OPENAI_PROVIDER, role: SCHEDULER, model: OPENAI_MODEL, effort: "medium" },
|
|
87
|
+
worker: { provider: OPENAI_PROVIDER, role: WORKER, model: OPENAI_MODEL, effort: "medium" },
|
|
88
|
+
reviewer: { provider: OPENAI_PROVIDER, role: REVIEWER, model: OPENAI_MODEL, effort: "high" }
|
|
89
|
+
};
|
|
90
|
+
var PROVIDER_PROFILES = { anthropic: DEFAULT_PROFILES, openai: OPENAI_PROFILES };
|
|
91
|
+
var FIRST_REVIEW_ROUND = 1;
|
|
92
|
+
var VERIFICATION_MODEL = "claude-sonnet-5-5";
|
|
93
|
+
var VERIFICATION_PROFILES = {
|
|
94
|
+
anthropic: { ...DEFAULT_PROFILES.reviewer, model: VERIFICATION_MODEL },
|
|
95
|
+
openai: OPENAI_PROFILES.reviewer
|
|
96
|
+
};
|
|
97
|
+
var VERIFICATION_KEYS = {
|
|
98
|
+
model: "JOSH_REVIEWER_VERIFICATION_MODEL",
|
|
99
|
+
effort: "JOSH_REVIEWER_VERIFICATION_EFFORT"
|
|
100
|
+
};
|
|
101
|
+
var SHIP_EFFORT = "low";
|
|
102
|
+
var PHASE_EFFORT = {
|
|
103
|
+
worker: { [PRE_GATE_PHASE]: SHIP_EFFORT }
|
|
104
|
+
};
|
|
105
|
+
var ENV_KEYS = {
|
|
106
|
+
scheduler: { model: "JOSH_SCHEDULER_MODEL", effort: "JOSH_SCHEDULER_EFFORT" },
|
|
107
|
+
worker: { model: "JOSH_WORKER_MODEL", effort: "JOSH_WORKER_EFFORT" },
|
|
108
|
+
reviewer: { model: "JOSH_REVIEWER_MODEL", effort: "JOSH_REVIEWER_EFFORT" }
|
|
109
|
+
};
|
|
110
|
+
var LEGACY_WORKER_KEYS = { model: "JOSH_LANE_MODEL", effort: "JOSH_LANE_EFFORT" };
|
|
111
|
+
var { MAX_VALUE_LENGTH: MAX_VALUE_LENGTH2, is_safe_prompt: is_safe_prompt2, is_safe_value: is_safe_value2, printable: printable2 } = agent_safe_text;
|
|
112
|
+
function trimmed(value) {
|
|
113
|
+
const result = value?.trim();
|
|
114
|
+
return result === void 0 || result.length === EMPTY_LENGTH2 ? void 0 : result;
|
|
115
|
+
}
|
|
116
|
+
function is_verification(role, round) {
|
|
117
|
+
return role === REVIEWER && round !== void 0 && round > FIRST_REVIEW_ROUND;
|
|
118
|
+
}
|
|
119
|
+
function override_keys(role, field, round) {
|
|
120
|
+
const key = ENV_KEYS[role][field];
|
|
121
|
+
if (role === WORKER) return [key, LEGACY_WORKER_KEYS[field]];
|
|
122
|
+
return is_verification(role, round) ? [VERIFICATION_KEYS[field], key] : [key];
|
|
123
|
+
}
|
|
124
|
+
function override_value(role, field, environment, round) {
|
|
125
|
+
const keys = override_keys(role, field, round);
|
|
126
|
+
const key = keys.find((candidate) => trimmed(environment[candidate]) !== void 0);
|
|
127
|
+
return key === void 0 ? { key: keys[0], value: void 0 } : { key, value: trimmed(environment[key]) };
|
|
128
|
+
}
|
|
129
|
+
function model_override(role, environment, provider, round) {
|
|
130
|
+
return provider === OPENAI_PROVIDER ? { key: ENV_KEYS[role].model, value: void 0 } : override_value(role, "model", environment, round);
|
|
131
|
+
}
|
|
132
|
+
function rejection(key, value, expected) {
|
|
133
|
+
return { kind: "rejected", note: `${key}=${value} ${expected}, so the agent was not started` };
|
|
134
|
+
}
|
|
135
|
+
function resolved_effort(override, fallback) {
|
|
136
|
+
const parsed = EFFORT_SCHEMA.safeParse(override.value ?? fallback);
|
|
137
|
+
return parsed.success ? { kind: "effort", effort: parsed.data } : rejection(override.key, override.value ?? "", "is not an allowed effort");
|
|
138
|
+
}
|
|
139
|
+
function has_session(environment, keys) {
|
|
140
|
+
return keys.some((key) => trimmed(environment[key]) !== void 0);
|
|
141
|
+
}
|
|
142
|
+
var CONFLICTING_SESSIONS = {
|
|
143
|
+
kind: "rejected",
|
|
144
|
+
note: "both Codex and Claude Code sessions were detected"
|
|
145
|
+
};
|
|
146
|
+
var HANDED_PROVIDER_KEY = "JOSH_AGENT_PROVIDER";
|
|
147
|
+
var DEFAULT_PROVIDER = {
|
|
148
|
+
kind: "provider",
|
|
149
|
+
provider: ANTHROPIC_PROVIDER,
|
|
150
|
+
is_default: true
|
|
151
|
+
};
|
|
152
|
+
var DEFAULT_NOTICE = ` No agent session or ${HANDED_PROVIDER_KEY} was found, so the provider defaulted to ${ANTHROPIC_PROVIDER} (Claude Code).`;
|
|
153
|
+
function handed_provider(environment) {
|
|
154
|
+
const value = trimmed(environment[HANDED_PROVIDER_KEY]);
|
|
155
|
+
if (value === void 0) return DEFAULT_PROVIDER;
|
|
156
|
+
const parsed = PROVIDER_SCHEMA.safeParse(value);
|
|
157
|
+
return parsed.success ? { kind: "provider", provider: parsed.data } : rejection(HANDED_PROVIDER_KEY, value, "is not an allowed provider");
|
|
158
|
+
}
|
|
159
|
+
function detected_provider(environment) {
|
|
160
|
+
const has_codex = has_session(environment, [CODEX_SESSION_KEY]);
|
|
161
|
+
const has_claude = has_session(environment, agent_session_environment.PARENT_SESSION_KEYS);
|
|
162
|
+
if (has_codex === has_claude) return has_codex ? CONFLICTING_SESSIONS : void 0;
|
|
163
|
+
return { kind: "provider", provider: has_codex ? OPENAI_PROVIDER : ANTHROPIC_PROVIDER };
|
|
164
|
+
}
|
|
165
|
+
function resolve_provider(environment = process.env) {
|
|
166
|
+
return detected_provider(environment) ?? handed_provider(environment);
|
|
167
|
+
}
|
|
168
|
+
function default_notice(environment = process.env) {
|
|
169
|
+
const selected = resolve_provider(environment);
|
|
170
|
+
return selected.kind === "provider" && selected.is_default === true ? DEFAULT_NOTICE : "";
|
|
171
|
+
}
|
|
172
|
+
function warn_of_default(environment = process.env) {
|
|
173
|
+
const notice = default_notice(environment).trim();
|
|
174
|
+
if (notice !== "") console.error(notice);
|
|
175
|
+
}
|
|
176
|
+
function has_completion_callback(environment = process.env) {
|
|
177
|
+
const selected = resolve_provider(environment);
|
|
178
|
+
return selected.kind !== "provider" || selected.provider !== OPENAI_PROVIDER;
|
|
179
|
+
}
|
|
180
|
+
function handoff_environment(environment = process.env) {
|
|
181
|
+
const selected = resolve_provider(environment);
|
|
182
|
+
return selected.kind === "provider" ? { [HANDED_PROVIDER_KEY]: selected.provider } : {};
|
|
183
|
+
}
|
|
184
|
+
function validate(profile, model_key) {
|
|
185
|
+
if (!is_safe_value2(profile.model)) {
|
|
186
|
+
return rejection(model_key, profile.model, "is not a safe model");
|
|
187
|
+
}
|
|
188
|
+
return { kind: "profile", profile };
|
|
189
|
+
}
|
|
190
|
+
function phase_effort(role, phase, fallback) {
|
|
191
|
+
const parsed = PHASE_SCHEMA.safeParse(phase);
|
|
192
|
+
if (!parsed.success) return fallback;
|
|
193
|
+
return PHASE_EFFORT[role]?.[parsed.data] ?? fallback;
|
|
194
|
+
}
|
|
195
|
+
function overridden_effort(profile, phase, environment) {
|
|
196
|
+
const parsed = EFFORT_SCHEMA.safeParse(override_value(profile.role, "effort", environment).value);
|
|
197
|
+
return parsed.success ? parsed.data : phase_effort(profile.role, phase, profile.effort);
|
|
198
|
+
}
|
|
199
|
+
function with_phase_effort(profile, phase, environment = process.env) {
|
|
200
|
+
return { ...profile, effort: overridden_effort(profile, phase, environment) };
|
|
201
|
+
}
|
|
202
|
+
function stage_defaults(provider, role, round) {
|
|
203
|
+
return is_verification(role, round) ? VERIFICATION_PROFILES[provider] : PROVIDER_PROFILES[provider][role];
|
|
204
|
+
}
|
|
205
|
+
function resolve_stage(role, environment, stage) {
|
|
206
|
+
const selected = resolve_provider(environment);
|
|
207
|
+
if (selected.kind === "rejected") return selected;
|
|
208
|
+
const defaults = stage_defaults(selected.provider, role, stage.round);
|
|
209
|
+
const model = model_override(role, environment, selected.provider, stage.round);
|
|
210
|
+
const effort = override_value(role, "effort", environment, stage.round);
|
|
211
|
+
const resolved = resolved_effort(effort, phase_effort(role, stage.phase, defaults.effort));
|
|
212
|
+
if (resolved.kind === "rejected") return resolved;
|
|
213
|
+
const profile = {
|
|
214
|
+
provider: selected.provider,
|
|
215
|
+
role,
|
|
216
|
+
model: model.value ?? defaults.model,
|
|
217
|
+
effort: resolved.effort
|
|
218
|
+
};
|
|
219
|
+
return validate(profile, model.key);
|
|
220
|
+
}
|
|
221
|
+
function resolve(role, environment = process.env, phase) {
|
|
222
|
+
return resolve_stage(role, environment, { phase });
|
|
223
|
+
}
|
|
224
|
+
function resolve_review(round, environment = process.env) {
|
|
225
|
+
return resolve_stage(REVIEWER, environment, { round });
|
|
226
|
+
}
|
|
227
|
+
function describe(profile) {
|
|
228
|
+
return `provider=${profile.provider} role=${profile.role} model=${profile.model} effort=${profile.effort}`;
|
|
229
|
+
}
|
|
230
|
+
function describe_review(round, profile) {
|
|
231
|
+
return `review round ${String(round)} \xB7 ${describe(profile)}`;
|
|
232
|
+
}
|
|
233
|
+
function parse(value) {
|
|
234
|
+
const parsed = PROFILE_SCHEMA.safeParse(value);
|
|
235
|
+
return parsed.success && is_safe_value2(parsed.data.model) ? parsed.data : void 0;
|
|
236
|
+
}
|
|
237
|
+
var agent_role_profile = {
|
|
238
|
+
CODEX_SESSION_KEY,
|
|
239
|
+
DEFAULT_PROFILES,
|
|
240
|
+
HANDED_PROVIDER_KEY,
|
|
241
|
+
IMPLEMENTATION_PHASE,
|
|
242
|
+
MAX_VALUE_LENGTH: MAX_VALUE_LENGTH2,
|
|
243
|
+
OPENAI_PROFILES,
|
|
244
|
+
PRE_GATE_PHASE,
|
|
245
|
+
PROFILE_SCHEMA,
|
|
246
|
+
REVIEWER,
|
|
247
|
+
SCHEDULER,
|
|
248
|
+
VERIFICATION_PROFILES,
|
|
249
|
+
WORKER,
|
|
250
|
+
default_notice,
|
|
251
|
+
describe,
|
|
252
|
+
describe_review,
|
|
253
|
+
handoff_environment,
|
|
254
|
+
has_completion_callback,
|
|
255
|
+
is_safe_prompt: is_safe_prompt2,
|
|
256
|
+
is_safe_value: is_safe_value2,
|
|
257
|
+
parse,
|
|
258
|
+
printable: printable2,
|
|
259
|
+
resolve,
|
|
260
|
+
resolve_provider,
|
|
261
|
+
resolve_review,
|
|
262
|
+
warn_of_default,
|
|
263
|
+
with_phase_effort
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// scripts/agent/agent-session-role.ts
|
|
267
|
+
var KEY = "JOSH_AGENT_ROLE";
|
|
268
|
+
function environment_for(role) {
|
|
269
|
+
return { [KEY]: role };
|
|
270
|
+
}
|
|
271
|
+
function is_reviewer(source = process.env) {
|
|
272
|
+
return source[KEY] === agent_role_profile.REVIEWER;
|
|
273
|
+
}
|
|
274
|
+
var agent_session_role = { KEY, env_for: environment_for, is_reviewer };
|
|
275
|
+
|
|
276
|
+
export {
|
|
277
|
+
agent_role_profile,
|
|
278
|
+
agent_session_role
|
|
279
|
+
};
|