open-multi-agent-kit 0.95.2 → 0.96.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.
Files changed (259) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +37 -4
  3. package/dist/approvals/approval-receipt-store.d.ts.map +1 -1
  4. package/dist/approvals/approval-receipt-store.js +25 -0
  5. package/dist/approvals/approval-receipt-store.js.map +1 -1
  6. package/dist/commands/doctor-provider.d.ts.map +1 -1
  7. package/dist/commands/doctor-provider.js +15 -20
  8. package/dist/commands/doctor-provider.js.map +1 -1
  9. package/dist/commands/sdk-session-cli.d.ts +24 -0
  10. package/dist/commands/sdk-session-cli.d.ts.map +1 -0
  11. package/dist/commands/sdk-session-cli.js +225 -0
  12. package/dist/commands/sdk-session-cli.js.map +1 -0
  13. package/dist/core/advisory-judge-model.d.ts +18 -0
  14. package/dist/core/advisory-judge-model.d.ts.map +1 -0
  15. package/dist/core/advisory-judge-model.js +168 -0
  16. package/dist/core/advisory-judge-model.js.map +1 -0
  17. package/dist/core/advisory-judge-response.d.ts +8 -0
  18. package/dist/core/advisory-judge-response.d.ts.map +1 -0
  19. package/dist/core/advisory-judge-response.js +61 -0
  20. package/dist/core/advisory-judge-response.js.map +1 -0
  21. package/dist/core/advisory-judge-types.d.ts +53 -0
  22. package/dist/core/advisory-judge-types.d.ts.map +1 -0
  23. package/dist/core/advisory-judge-types.js +2 -0
  24. package/dist/core/advisory-judge-types.js.map +1 -0
  25. package/dist/core/advisory-judge.d.ts +8 -0
  26. package/dist/core/advisory-judge.d.ts.map +1 -0
  27. package/dist/core/advisory-judge.js +178 -0
  28. package/dist/core/advisory-judge.js.map +1 -0
  29. package/dist/core/agent-session-services.d.ts +1 -0
  30. package/dist/core/agent-session-services.d.ts.map +1 -1
  31. package/dist/core/agent-session-services.js +1 -0
  32. package/dist/core/agent-session-services.js.map +1 -1
  33. package/dist/core/agent-session.d.ts +6 -3
  34. package/dist/core/agent-session.d.ts.map +1 -1
  35. package/dist/core/agent-session.js +141 -184
  36. package/dist/core/agent-session.js.map +1 -1
  37. package/dist/core/auth-storage.d.ts.map +1 -1
  38. package/dist/core/auth-storage.js +28 -4
  39. package/dist/core/auth-storage.js.map +1 -1
  40. package/dist/core/compaction-gate.d.ts +28 -0
  41. package/dist/core/compaction-gate.d.ts.map +1 -0
  42. package/dist/core/compaction-gate.js +34 -0
  43. package/dist/core/compaction-gate.js.map +1 -0
  44. package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -1
  45. package/dist/core/context-budget-system-prompt-items.js +5 -3
  46. package/dist/core/context-budget-system-prompt-items.js.map +1 -1
  47. package/dist/core/domain-loadouts.d.ts.map +1 -1
  48. package/dist/core/domain-loadouts.js +2 -2
  49. package/dist/core/domain-loadouts.js.map +1 -1
  50. package/dist/core/durable-goal-checkpoint.d.ts +6 -0
  51. package/dist/core/durable-goal-checkpoint.d.ts.map +1 -0
  52. package/dist/core/durable-goal-checkpoint.js +195 -0
  53. package/dist/core/durable-goal-checkpoint.js.map +1 -0
  54. package/dist/core/durable-goal-parse.d.ts +3 -0
  55. package/dist/core/durable-goal-parse.d.ts.map +1 -0
  56. package/dist/core/durable-goal-parse.js +86 -0
  57. package/dist/core/durable-goal-parse.js.map +1 -0
  58. package/dist/core/durable-goal-reducer.d.ts +3 -0
  59. package/dist/core/durable-goal-reducer.d.ts.map +1 -0
  60. package/dist/core/durable-goal-reducer.js +175 -0
  61. package/dist/core/durable-goal-reducer.js.map +1 -0
  62. package/dist/core/durable-goal-store.d.ts +19 -0
  63. package/dist/core/durable-goal-store.d.ts.map +1 -0
  64. package/dist/core/durable-goal-store.js +126 -0
  65. package/dist/core/durable-goal-store.js.map +1 -0
  66. package/dist/core/durable-goal.d.ts +92 -0
  67. package/dist/core/durable-goal.d.ts.map +1 -0
  68. package/dist/core/durable-goal.js +62 -0
  69. package/dist/core/durable-goal.js.map +1 -0
  70. package/dist/core/extensions/builtin/goal-controller.d.ts +3 -0
  71. package/dist/core/extensions/builtin/goal-controller.d.ts.map +1 -0
  72. package/dist/core/extensions/builtin/goal-controller.js +125 -0
  73. package/dist/core/extensions/builtin/goal-controller.js.map +1 -0
  74. package/dist/core/extensions/builtin/identical-loop.d.ts +3 -0
  75. package/dist/core/extensions/builtin/identical-loop.d.ts.map +1 -0
  76. package/dist/core/extensions/builtin/identical-loop.js +31 -0
  77. package/dist/core/extensions/builtin/identical-loop.js.map +1 -0
  78. package/dist/core/extensions/builtin/prompt-preset.d.ts +3 -0
  79. package/dist/core/extensions/builtin/prompt-preset.d.ts.map +1 -0
  80. package/dist/core/extensions/builtin/prompt-preset.js +13 -0
  81. package/dist/core/extensions/builtin/prompt-preset.js.map +1 -0
  82. package/dist/core/extensions/builtin/tool-pair-repair.d.ts +3 -0
  83. package/dist/core/extensions/builtin/tool-pair-repair.d.ts.map +1 -0
  84. package/dist/core/extensions/builtin/tool-pair-repair.js +12 -0
  85. package/dist/core/extensions/builtin/tool-pair-repair.js.map +1 -0
  86. package/dist/core/extensions/types.d.ts +6 -2
  87. package/dist/core/extensions/types.d.ts.map +1 -1
  88. package/dist/core/extensions/types.js.map +1 -1
  89. package/dist/core/goal-continuation.d.ts +13 -0
  90. package/dist/core/goal-continuation.d.ts.map +1 -0
  91. package/dist/core/goal-continuation.js +10 -0
  92. package/dist/core/goal-continuation.js.map +1 -0
  93. package/dist/core/grok-harness.d.ts +1 -1
  94. package/dist/core/grok-harness.d.ts.map +1 -1
  95. package/dist/core/grok-harness.js +1 -1
  96. package/dist/core/grok-harness.js.map +1 -1
  97. package/dist/core/grok-playbook.d.ts +1 -1
  98. package/dist/core/grok-playbook.d.ts.map +1 -1
  99. package/dist/core/grok-playbook.js +1 -1
  100. package/dist/core/grok-playbook.js.map +1 -1
  101. package/dist/core/identical-loop.d.ts +15 -0
  102. package/dist/core/identical-loop.d.ts.map +1 -0
  103. package/dist/core/identical-loop.js +34 -0
  104. package/dist/core/identical-loop.js.map +1 -0
  105. package/dist/core/index.d.ts +1 -1
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/core/index.js +1 -1
  108. package/dist/core/index.js.map +1 -1
  109. package/dist/core/model-prompt-policy.d.ts +11 -0
  110. package/dist/core/model-prompt-policy.d.ts.map +1 -0
  111. package/dist/core/model-prompt-policy.js +17 -0
  112. package/dist/core/model-prompt-policy.js.map +1 -0
  113. package/dist/core/model-registry.d.ts.map +1 -1
  114. package/dist/core/model-registry.js +16 -4
  115. package/dist/core/model-registry.js.map +1 -1
  116. package/dist/core/model-resolver.d.ts.map +1 -1
  117. package/dist/core/model-resolver.js +2 -2
  118. package/dist/core/model-resolver.js.map +1 -1
  119. package/dist/core/prompt-budget.d.ts +21 -0
  120. package/dist/core/prompt-budget.d.ts.map +1 -0
  121. package/dist/core/prompt-budget.js +51 -0
  122. package/dist/core/prompt-budget.js.map +1 -0
  123. package/dist/core/prompt-cache.d.ts +14 -0
  124. package/dist/core/prompt-cache.d.ts.map +1 -0
  125. package/dist/core/prompt-cache.js +16 -0
  126. package/dist/core/prompt-cache.js.map +1 -0
  127. package/dist/core/prompt-preset.d.ts +8 -0
  128. package/dist/core/prompt-preset.d.ts.map +1 -0
  129. package/dist/core/prompt-preset.js +56 -0
  130. package/dist/core/prompt-preset.js.map +1 -0
  131. package/dist/core/provider-resilience.d.ts +23 -0
  132. package/dist/core/provider-resilience.d.ts.map +1 -1
  133. package/dist/core/provider-resilience.js +34 -1
  134. package/dist/core/provider-resilience.js.map +1 -1
  135. package/dist/core/provider-retry.d.ts +29 -0
  136. package/dist/core/provider-retry.d.ts.map +1 -0
  137. package/dist/core/provider-retry.js +49 -0
  138. package/dist/core/provider-retry.js.map +1 -0
  139. package/dist/core/provider-usage.d.ts +2 -1
  140. package/dist/core/provider-usage.d.ts.map +1 -1
  141. package/dist/core/provider-usage.js +40 -6
  142. package/dist/core/provider-usage.js.map +1 -1
  143. package/dist/core/resource-loader.d.ts.map +1 -1
  144. package/dist/core/resource-loader.js +32 -0
  145. package/dist/core/resource-loader.js.map +1 -1
  146. package/dist/core/sandbox/backend.d.ts +12 -0
  147. package/dist/core/sandbox/backend.d.ts.map +1 -1
  148. package/dist/core/sandbox/backend.js +52 -42
  149. package/dist/core/sandbox/backend.js.map +1 -1
  150. package/dist/core/sandbox/policy.d.ts +2 -0
  151. package/dist/core/sandbox/policy.d.ts.map +1 -1
  152. package/dist/core/sandbox/policy.js +2 -1
  153. package/dist/core/sandbox/policy.js.map +1 -1
  154. package/dist/core/sdk.d.ts +2 -0
  155. package/dist/core/sdk.d.ts.map +1 -1
  156. package/dist/core/sdk.js +1 -0
  157. package/dist/core/sdk.js.map +1 -1
  158. package/dist/core/session-system-prompt.d.ts +28 -0
  159. package/dist/core/session-system-prompt.d.ts.map +1 -0
  160. package/dist/core/session-system-prompt.js +37 -0
  161. package/dist/core/session-system-prompt.js.map +1 -0
  162. package/dist/core/strict-record.d.ts +2 -0
  163. package/dist/core/strict-record.d.ts.map +1 -0
  164. package/dist/core/strict-record.js +9 -0
  165. package/dist/core/strict-record.js.map +1 -0
  166. package/dist/core/subagent-orchestration.d.ts.map +1 -1
  167. package/dist/core/subagent-orchestration.js +4 -2
  168. package/dist/core/subagent-orchestration.js.map +1 -1
  169. package/dist/core/tool-pair-repair.d.ts +11 -0
  170. package/dist/core/tool-pair-repair.d.ts.map +1 -0
  171. package/dist/core/tool-pair-repair.js +38 -0
  172. package/dist/core/tool-pair-repair.js.map +1 -0
  173. package/dist/core/tools/artifact-spill.d.ts +13 -0
  174. package/dist/core/tools/artifact-spill.d.ts.map +1 -0
  175. package/dist/core/tools/artifact-spill.js +26 -0
  176. package/dist/core/tools/artifact-spill.js.map +1 -0
  177. package/dist/core/tools/bash.d.ts +7 -4
  178. package/dist/core/tools/bash.d.ts.map +1 -1
  179. package/dist/core/tools/bash.js +8 -7
  180. package/dist/core/tools/bash.js.map +1 -1
  181. package/dist/core/tools/diagnostics.d.ts.map +1 -1
  182. package/dist/core/tools/diagnostics.js +8 -2
  183. package/dist/core/tools/diagnostics.js.map +1 -1
  184. package/dist/core/tools/index.d.ts +1 -1
  185. package/dist/core/tools/index.d.ts.map +1 -1
  186. package/dist/core/tools/index.js.map +1 -1
  187. package/dist/core/tools/read.d.ts +1 -0
  188. package/dist/core/tools/read.d.ts.map +1 -1
  189. package/dist/core/tools/read.js +10 -1
  190. package/dist/core/tools/read.js.map +1 -1
  191. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  192. package/dist/core/tools/tool-definition-wrapper.js +2 -0
  193. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  194. package/dist/guardrails/evidence-protocol.d.ts +10 -0
  195. package/dist/guardrails/evidence-protocol.d.ts.map +1 -0
  196. package/dist/guardrails/evidence-protocol.js +34 -0
  197. package/dist/guardrails/evidence-protocol.js.map +1 -0
  198. package/dist/guardrails/evidence-system.d.ts +3 -1
  199. package/dist/guardrails/evidence-system.d.ts.map +1 -1
  200. package/dist/guardrails/evidence-system.js +22 -14
  201. package/dist/guardrails/evidence-system.js.map +1 -1
  202. package/dist/guardrails/replay-ledger-lock-owner.d.ts.map +1 -1
  203. package/dist/guardrails/replay-ledger-lock-owner.js +3 -1
  204. package/dist/guardrails/replay-ledger-lock-owner.js.map +1 -1
  205. package/dist/guardrails/replay-payload-hash.d.ts +6 -0
  206. package/dist/guardrails/replay-payload-hash.d.ts.map +1 -0
  207. package/dist/guardrails/replay-payload-hash.js +24 -0
  208. package/dist/guardrails/replay-payload-hash.js.map +1 -0
  209. package/dist/index.d.ts +20 -2
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +19 -0
  212. package/dist/index.js.map +1 -1
  213. package/dist/main.d.ts.map +1 -1
  214. package/dist/main.js +8 -0
  215. package/dist/main.js.map +1 -1
  216. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  217. package/dist/modes/interactive/theme/theme.js +14 -3
  218. package/dist/modes/interactive/theme/theme.js.map +1 -1
  219. package/dist/types/evidence.d.ts +11 -3
  220. package/dist/types/evidence.d.ts.map +1 -1
  221. package/dist/types/evidence.js.map +1 -1
  222. package/docs/adaptorch-preview-spec.md +1 -1
  223. package/docs/adaptorch-preview.md +2 -2
  224. package/docs/book-to-skill.md +79 -0
  225. package/docs/compaction.md +10 -0
  226. package/docs/containerization.md +9 -0
  227. package/docs/docs.json +18 -2
  228. package/docs/environment-variables.md +11 -4
  229. package/docs/extensions.md +14 -1
  230. package/docs/grok-harness.md +35 -12
  231. package/docs/index.md +9 -5
  232. package/docs/loadout-domains/grok-harness.md +2 -2
  233. package/docs/models.md +21 -8
  234. package/docs/provider-resilience.md +42 -55
  235. package/docs/providers.md +13 -4
  236. package/docs/run-protocol.md +104 -0
  237. package/docs/sdk.md +111 -5
  238. package/docs/security.md +22 -32
  239. package/docs/sessions.md +20 -0
  240. package/docs/settings.md +2 -0
  241. package/docs/skills.md +9 -1
  242. package/docs/usage.md +38 -16
  243. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  244. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  245. package/examples/extensions/custom-provider-gitlab-duo/index.ts +6 -1
  246. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  247. package/examples/extensions/gondolin/package-lock.json +2 -2
  248. package/examples/extensions/gondolin/package.json +1 -1
  249. package/examples/extensions/sandbox/package-lock.json +2 -2
  250. package/examples/extensions/sandbox/package.json +1 -1
  251. package/examples/extensions/with-deps/package-lock.json +2 -2
  252. package/examples/extensions/with-deps/package.json +1 -1
  253. package/npm-shrinkwrap.json +37 -15
  254. package/package.json +8 -5
  255. package/dist/core/context-budget-compressors.d.ts +0 -50
  256. package/dist/core/context-budget-compressors.d.ts.map +0 -1
  257. package/dist/core/context-budget-compressors.js +0 -166
  258. package/dist/core/context-budget-compressors.js.map +0 -1
  259. package/dist/core/extensions/loader.js.bak-sharedjiti-20260812-111246 +0 -553
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-judge-response.js","sourceRoot":"","sources":["../../src/core/advisory-judge-response.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdvisoryJudgeCriterion } from \"./advisory-judge-types.ts\";\nimport { isExactRecord } from \"./strict-record.ts\";\n\nexport interface ParsedAdvisoryCandidateScore {\n\treadonly candidateId: string;\n\treadonly criteria: ReadonlyMap<string, number>;\n}\n\nexport function parseAdvisoryJudgeResponse(\n\tresponse: unknown,\n\tcandidateIds: readonly string[],\n\trubric: readonly AdvisoryJudgeCriterion[],\n): readonly ParsedAdvisoryCandidateScore[] | null {\n\tif (typeof response !== \"string\" || response.length === 0 || response.length > 65_536) return null;\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(response);\n\t} catch {\n\t\treturn null;\n\t}\n\tif (\n\t\t!isExactRecord(value, [\"scores\"]) ||\n\t\t!Array.isArray(value.scores) ||\n\t\tvalue.scores.length !== candidateIds.length\n\t) {\n\t\treturn null;\n\t}\n\tconst expectedCandidates = new Set(candidateIds);\n\tconst expectedCriteria = new Set(rubric.map((criterion) => criterion.id));\n\tconst seenCandidates = new Set<string>();\n\tconst parsed: ParsedAdvisoryCandidateScore[] = [];\n\tfor (const score of value.scores) {\n\t\tconst candidate = parseCandidateScore(score, expectedCandidates, expectedCriteria, rubric.length);\n\t\tif (candidate === null || seenCandidates.has(candidate.candidateId)) return null;\n\t\tseenCandidates.add(candidate.candidateId);\n\t\tparsed.push(candidate);\n\t}\n\treturn parsed;\n}\n\nexport function advisoryWeightedScore(\n\tcandidate: ParsedAdvisoryCandidateScore,\n\trubric: readonly AdvisoryJudgeCriterion[],\n): number {\n\tconst totalWeight = rubric.reduce((sum, criterion) => sum + criterion.weight, 0);\n\treturn (\n\t\trubric.reduce((sum, criterion) => sum + (candidate.criteria.get(criterion.id) ?? 0) * criterion.weight, 0) /\n\t\ttotalWeight\n\t);\n}\n\nfunction parseCandidateScore(\n\tvalue: unknown,\n\texpectedCandidates: ReadonlySet<string>,\n\texpectedCriteria: ReadonlySet<string>,\n\tcriterionCount: number,\n): ParsedAdvisoryCandidateScore | null {\n\tif (!isExactRecord(value, [\"candidateId\", \"criteria\"]) || typeof value.candidateId !== \"string\") return null;\n\tif (\n\t\t!expectedCandidates.has(value.candidateId) ||\n\t\t!Array.isArray(value.criteria) ||\n\t\tvalue.criteria.length !== criterionCount\n\t) {\n\t\treturn null;\n\t}\n\tconst criteria = new Map<string, number>();\n\tfor (const criterion of value.criteria) {\n\t\tif (!addCriterionScore(criterion, expectedCriteria, criteria)) return null;\n\t}\n\treturn { candidateId: value.candidateId, criteria };\n}\n\nfunction addCriterionScore(\n\tvalue: unknown,\n\texpectedCriteria: ReadonlySet<string>,\n\tcriteria: Map<string, number>,\n): boolean {\n\tif (!isExactRecord(value, [\"criterionId\", \"score\"]) || typeof value.criterionId !== \"string\") return false;\n\tif (!expectedCriteria.has(value.criterionId) || criteria.has(value.criterionId)) return false;\n\tif (typeof value.score !== \"number\" || !Number.isSafeInteger(value.score) || value.score < 0 || value.score > 4) {\n\t\treturn false;\n\t}\n\tcriteria.set(value.criterionId, value.score);\n\treturn true;\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import type { EvaluationResult } from "omk-protocol";
2
+ export declare const ADVISORY_JUDGE_PROMPT_VERSION: "omk.advisory-judge.v1";
3
+ export interface AdvisoryJudgeCriterion {
4
+ readonly id: string;
5
+ readonly description: string;
6
+ readonly weight: number;
7
+ }
8
+ export interface AdvisoryJudgeCandidate {
9
+ readonly id: string;
10
+ readonly deterministicRank: number;
11
+ readonly material: string;
12
+ readonly evaluation: EvaluationResult;
13
+ }
14
+ export interface AdvisoryJudgeRequestCandidate {
15
+ readonly id: string;
16
+ readonly material: string;
17
+ readonly materialSha256: string;
18
+ readonly evaluationSha256: string;
19
+ }
20
+ export interface AdvisoryJudgeRequest {
21
+ readonly promptVersion: typeof ADVISORY_JUDGE_PROMPT_VERSION;
22
+ readonly taskId: string;
23
+ readonly taskGoal: string;
24
+ readonly rubric: readonly AdvisoryJudgeCriterion[];
25
+ readonly candidates: readonly AdvisoryJudgeRequestCandidate[];
26
+ }
27
+ export type AdvisoryJudge = (request: AdvisoryJudgeRequest, signal?: AbortSignal) => Promise<unknown>;
28
+ export interface AdvisoryJudgeCandidateScore {
29
+ readonly candidateId: string;
30
+ readonly score: number;
31
+ }
32
+ export type AdvisoryJudgeDecisionStatus = "selected" | "fallback" | "skipped";
33
+ export type AdvisoryJudgeDecisionReason = "judge-ranked" | "judge-unavailable" | "judge-response-invalid" | "single-eligible" | "no-eligible";
34
+ export interface AdvisoryJudgeDecision {
35
+ readonly status: AdvisoryJudgeDecisionStatus;
36
+ readonly reason: AdvisoryJudgeDecisionReason;
37
+ readonly source: "llm-judge" | "deterministic" | "none";
38
+ readonly judgeId: string;
39
+ readonly taskId: string;
40
+ readonly eligibleCandidateIds: readonly string[];
41
+ readonly selectedCandidateId?: string;
42
+ readonly candidateScores: readonly AdvisoryJudgeCandidateScore[];
43
+ readonly requestSha256?: string;
44
+ }
45
+ export interface AdvisoryJudgeInput {
46
+ readonly taskGoal: string;
47
+ readonly judgeId: string;
48
+ readonly judge: AdvisoryJudge;
49
+ readonly rubric: readonly AdvisoryJudgeCriterion[];
50
+ readonly candidates: readonly AdvisoryJudgeCandidate[];
51
+ readonly signal?: AbortSignal;
52
+ }
53
+ //# sourceMappingURL=advisory-judge-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-judge-types.d.ts","sourceRoot":"","sources":["../../src/core/advisory-judge-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,eAAO,MAAM,6BAA6B,yBAAmC,CAAC;AAE9E,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;CACtC;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,aAAa,EAAE,OAAO,6BAA6B,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC9D;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtG,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAC9E,MAAM,MAAM,2BAA2B,GACpC,cAAc,GACd,mBAAmB,GACnB,wBAAwB,GACxB,iBAAiB,GACjB,aAAa,CAAC;AAEjB,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,MAAM,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACjE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC9B","sourcesContent":["import type { EvaluationResult } from \"omk-protocol\";\n\nexport const ADVISORY_JUDGE_PROMPT_VERSION = \"omk.advisory-judge.v1\" as const;\n\nexport interface AdvisoryJudgeCriterion {\n\treadonly id: string;\n\treadonly description: string;\n\treadonly weight: number;\n}\n\nexport interface AdvisoryJudgeCandidate {\n\treadonly id: string;\n\treadonly deterministicRank: number;\n\treadonly material: string;\n\treadonly evaluation: EvaluationResult;\n}\n\nexport interface AdvisoryJudgeRequestCandidate {\n\treadonly id: string;\n\treadonly material: string;\n\treadonly materialSha256: string;\n\treadonly evaluationSha256: string;\n}\n\nexport interface AdvisoryJudgeRequest {\n\treadonly promptVersion: typeof ADVISORY_JUDGE_PROMPT_VERSION;\n\treadonly taskId: string;\n\treadonly taskGoal: string;\n\treadonly rubric: readonly AdvisoryJudgeCriterion[];\n\treadonly candidates: readonly AdvisoryJudgeRequestCandidate[];\n}\n\nexport type AdvisoryJudge = (request: AdvisoryJudgeRequest, signal?: AbortSignal) => Promise<unknown>;\n\nexport interface AdvisoryJudgeCandidateScore {\n\treadonly candidateId: string;\n\treadonly score: number;\n}\n\nexport type AdvisoryJudgeDecisionStatus = \"selected\" | \"fallback\" | \"skipped\";\nexport type AdvisoryJudgeDecisionReason =\n\t| \"judge-ranked\"\n\t| \"judge-unavailable\"\n\t| \"judge-response-invalid\"\n\t| \"single-eligible\"\n\t| \"no-eligible\";\n\nexport interface AdvisoryJudgeDecision {\n\treadonly status: AdvisoryJudgeDecisionStatus;\n\treadonly reason: AdvisoryJudgeDecisionReason;\n\treadonly source: \"llm-judge\" | \"deterministic\" | \"none\";\n\treadonly judgeId: string;\n\treadonly taskId: string;\n\treadonly eligibleCandidateIds: readonly string[];\n\treadonly selectedCandidateId?: string;\n\treadonly candidateScores: readonly AdvisoryJudgeCandidateScore[];\n\treadonly requestSha256?: string;\n}\n\nexport interface AdvisoryJudgeInput {\n\treadonly taskGoal: string;\n\treadonly judgeId: string;\n\treadonly judge: AdvisoryJudge;\n\treadonly rubric: readonly AdvisoryJudgeCriterion[];\n\treadonly candidates: readonly AdvisoryJudgeCandidate[];\n\treadonly signal?: AbortSignal;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export const ADVISORY_JUDGE_PROMPT_VERSION = "omk.advisory-judge.v1";
2
+ //# sourceMappingURL=advisory-judge-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-judge-types.js","sourceRoot":"","sources":["../../src/core/advisory-judge-types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,6BAA6B,GAAG,uBAAgC,CAAC","sourcesContent":["import type { EvaluationResult } from \"omk-protocol\";\n\nexport const ADVISORY_JUDGE_PROMPT_VERSION = \"omk.advisory-judge.v1\" as const;\n\nexport interface AdvisoryJudgeCriterion {\n\treadonly id: string;\n\treadonly description: string;\n\treadonly weight: number;\n}\n\nexport interface AdvisoryJudgeCandidate {\n\treadonly id: string;\n\treadonly deterministicRank: number;\n\treadonly material: string;\n\treadonly evaluation: EvaluationResult;\n}\n\nexport interface AdvisoryJudgeRequestCandidate {\n\treadonly id: string;\n\treadonly material: string;\n\treadonly materialSha256: string;\n\treadonly evaluationSha256: string;\n}\n\nexport interface AdvisoryJudgeRequest {\n\treadonly promptVersion: typeof ADVISORY_JUDGE_PROMPT_VERSION;\n\treadonly taskId: string;\n\treadonly taskGoal: string;\n\treadonly rubric: readonly AdvisoryJudgeCriterion[];\n\treadonly candidates: readonly AdvisoryJudgeRequestCandidate[];\n}\n\nexport type AdvisoryJudge = (request: AdvisoryJudgeRequest, signal?: AbortSignal) => Promise<unknown>;\n\nexport interface AdvisoryJudgeCandidateScore {\n\treadonly candidateId: string;\n\treadonly score: number;\n}\n\nexport type AdvisoryJudgeDecisionStatus = \"selected\" | \"fallback\" | \"skipped\";\nexport type AdvisoryJudgeDecisionReason =\n\t| \"judge-ranked\"\n\t| \"judge-unavailable\"\n\t| \"judge-response-invalid\"\n\t| \"single-eligible\"\n\t| \"no-eligible\";\n\nexport interface AdvisoryJudgeDecision {\n\treadonly status: AdvisoryJudgeDecisionStatus;\n\treadonly reason: AdvisoryJudgeDecisionReason;\n\treadonly source: \"llm-judge\" | \"deterministic\" | \"none\";\n\treadonly judgeId: string;\n\treadonly taskId: string;\n\treadonly eligibleCandidateIds: readonly string[];\n\treadonly selectedCandidateId?: string;\n\treadonly candidateScores: readonly AdvisoryJudgeCandidateScore[];\n\treadonly requestSha256?: string;\n}\n\nexport interface AdvisoryJudgeInput {\n\treadonly taskGoal: string;\n\treadonly judgeId: string;\n\treadonly judge: AdvisoryJudge;\n\treadonly rubric: readonly AdvisoryJudgeCriterion[];\n\treadonly candidates: readonly AdvisoryJudgeCandidate[];\n\treadonly signal?: AbortSignal;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { type AdvisoryJudgeDecision, type AdvisoryJudgeInput } from "./advisory-judge-types.ts";
2
+ export type { AdvisoryJudge, AdvisoryJudgeCandidate, AdvisoryJudgeCandidateScore, AdvisoryJudgeCriterion, AdvisoryJudgeDecision, AdvisoryJudgeDecisionReason, AdvisoryJudgeDecisionStatus, AdvisoryJudgeInput, AdvisoryJudgeRequest, AdvisoryJudgeRequestCandidate, } from "./advisory-judge-types.ts";
3
+ export { ADVISORY_JUDGE_PROMPT_VERSION } from "./advisory-judge-types.ts";
4
+ export declare class AdvisoryJudgeInputError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export declare function chooseWithAdvisoryJudge(input: AdvisoryJudgeInput): Promise<AdvisoryJudgeDecision>;
8
+ //# sourceMappingURL=advisory-judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-judge.d.ts","sourceRoot":"","sources":["../../src/core/advisory-judge.ts"],"names":[],"mappings":"AAGA,OAAO,EAIN,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAEvB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EACX,aAAa,EACb,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,EACpB,6BAA6B,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAS1E,qBAAa,uBAAwB,SAAQ,KAAK;IACjD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAyDvG","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { type EvaluationResult, parseEvaluationResult } from \"omk-protocol\";\nimport { advisoryWeightedScore, parseAdvisoryJudgeResponse } from \"./advisory-judge-response.ts\";\nimport {\n\tADVISORY_JUDGE_PROMPT_VERSION,\n\ttype AdvisoryJudgeCandidate,\n\ttype AdvisoryJudgeCriterion,\n\ttype AdvisoryJudgeDecision,\n\ttype AdvisoryJudgeInput,\n\ttype AdvisoryJudgeRequest,\n} from \"./advisory-judge-types.ts\";\nimport { redactSensitiveTextForced } from \"./redaction.ts\";\n\nexport type {\n\tAdvisoryJudge,\n\tAdvisoryJudgeCandidate,\n\tAdvisoryJudgeCandidateScore,\n\tAdvisoryJudgeCriterion,\n\tAdvisoryJudgeDecision,\n\tAdvisoryJudgeDecisionReason,\n\tAdvisoryJudgeDecisionStatus,\n\tAdvisoryJudgeInput,\n\tAdvisoryJudgeRequest,\n\tAdvisoryJudgeRequestCandidate,\n} from \"./advisory-judge-types.ts\";\nexport { ADVISORY_JUDGE_PROMPT_VERSION } from \"./advisory-judge-types.ts\";\n\nconst MAX_CANDIDATES = 8;\nconst MAX_CRITERIA = 8;\nconst MAX_MATERIAL_CHARS = 16_384;\nconst MAX_DESCRIPTION_CHARS = 512;\nconst MAX_GOAL_CHARS = 2_048;\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;\n\nexport class AdvisoryJudgeInputError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"AdvisoryJudgeInputError\";\n\t}\n}\n\nexport async function chooseWithAdvisoryJudge(input: AdvisoryJudgeInput): Promise<AdvisoryJudgeDecision> {\n\tconst validated = validateInput(input);\n\tconst eligible = validated.candidates.filter((candidate) => candidate.evaluation.semanticVerdict === \"pass\");\n\tconst eligibleCandidateIds = eligible.map((candidate) => candidate.id);\n\tconst base = {\n\t\tjudgeId: validated.judgeId,\n\t\ttaskId: validated.taskId,\n\t\teligibleCandidateIds,\n\t\tcandidateScores: [] as const,\n\t};\n\tif (eligible.length === 0) return { ...base, status: \"skipped\", reason: \"no-eligible\", source: \"none\" };\n\tconst fallbackId = eligible[0]?.id;\n\tif (fallbackId === undefined) throw new AdvisoryJudgeInputError(\"eligible candidate invariant failed\");\n\tif (eligible.length === 1) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"skipped\",\n\t\t\treason: \"single-eligible\",\n\t\t\tsource: \"deterministic\",\n\t\t\tselectedCandidateId: fallbackId,\n\t\t};\n\t}\n\n\tconst request = buildRequest(validated.taskId, validated.taskGoal, validated.rubric, eligible);\n\tconst requestSha256 = sha256(JSON.stringify(request));\n\tlet response: unknown;\n\ttry {\n\t\tresponse = await input.judge(request, input.signal);\n\t} catch {\n\t\treturn fallback(base, fallbackId, \"judge-unavailable\", requestSha256);\n\t}\n\tconst parsed = parseAdvisoryJudgeResponse(response, eligibleCandidateIds, validated.rubric);\n\tif (parsed === null) return fallback(base, fallbackId, \"judge-response-invalid\", requestSha256);\n\tconst rankById = new Map(eligible.map((candidate) => [candidate.id, candidate.deterministicRank]));\n\tconst candidateScores = parsed\n\t\t.map((candidate) => ({\n\t\t\tcandidateId: candidate.candidateId,\n\t\t\tscore: advisoryWeightedScore(candidate, validated.rubric),\n\t\t}))\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\tright.score - left.score ||\n\t\t\t\t(rankById.get(left.candidateId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t\t(rankById.get(right.candidateId) ?? Number.MAX_SAFE_INTEGER) ||\n\t\t\t\tleft.candidateId.localeCompare(right.candidateId),\n\t\t);\n\tconst selectedCandidateId = candidateScores[0]?.candidateId;\n\tif (selectedCandidateId === undefined) return fallback(base, fallbackId, \"judge-response-invalid\", requestSha256);\n\treturn {\n\t\t...base,\n\t\tstatus: \"selected\",\n\t\treason: \"judge-ranked\",\n\t\tsource: \"llm-judge\",\n\t\tselectedCandidateId,\n\t\tcandidateScores,\n\t\trequestSha256,\n\t};\n}\n\nfunction validateInput(input: AdvisoryJudgeInput): {\n\treadonly taskId: string;\n\treadonly taskGoal: string;\n\treadonly judgeId: string;\n\treadonly rubric: readonly AdvisoryJudgeCriterion[];\n\treadonly candidates: readonly AdvisoryJudgeCandidate[];\n} {\n\tif (input.candidates.length === 0 || input.candidates.length > MAX_CANDIDATES) {\n\t\tthrow new AdvisoryJudgeInputError(`candidates must contain 1-${MAX_CANDIDATES} entries`);\n\t}\n\tconst ids = new Set<string>();\n\tconst ranks = new Set<number>();\n\tconst taskIds = new Set<string>();\n\tconst candidates = input.candidates.map((candidate) => {\n\t\tconst id = identifier(candidate.id, \"candidate id\");\n\t\tif (ids.has(id)) throw new AdvisoryJudgeInputError(\"candidate IDs must be unique\");\n\t\tids.add(id);\n\t\tif (!Number.isSafeInteger(candidate.deterministicRank) || candidate.deterministicRank < 0) {\n\t\t\tthrow new AdvisoryJudgeInputError(\"deterministicRank must be a non-negative safe integer\");\n\t\t}\n\t\tif (ranks.has(candidate.deterministicRank))\n\t\t\tthrow new AdvisoryJudgeInputError(\"deterministic ranks must be unique\");\n\t\tranks.add(candidate.deterministicRank);\n\t\tconst evaluation = parsedEvaluation(candidate.evaluation);\n\t\ttaskIds.add(identifier(evaluation.taskId, \"taskId\"));\n\t\treturn { ...candidate, id, evaluation };\n\t});\n\tif (taskIds.size !== 1) throw new AdvisoryJudgeInputError(\"candidate evaluations must reference one taskId\");\n\tconst taskId = candidates[0]?.evaluation.taskId;\n\tif (taskId === undefined) throw new AdvisoryJudgeInputError(\"candidate taskId is missing\");\n\treturn {\n\t\ttaskId,\n\t\ttaskGoal: boundedRedactedText(input.taskGoal, MAX_GOAL_CHARS, \"taskGoal\"),\n\t\tjudgeId: identifier(input.judgeId, \"judgeId\"),\n\t\trubric: validateRubric(input.rubric),\n\t\tcandidates: candidates.sort(\n\t\t\t(left, right) => left.deterministicRank - right.deterministicRank || left.id.localeCompare(right.id),\n\t\t),\n\t};\n}\n\nfunction parsedEvaluation(value: EvaluationResult): EvaluationResult {\n\ttry {\n\t\treturn parseEvaluationResult(value);\n\t} catch {\n\t\tthrow new AdvisoryJudgeInputError(\"candidate evaluation is invalid\");\n\t}\n}\n\nfunction validateRubric(rubric: readonly AdvisoryJudgeCriterion[]): readonly AdvisoryJudgeCriterion[] {\n\tif (rubric.length === 0 || rubric.length > MAX_CRITERIA) {\n\t\tthrow new AdvisoryJudgeInputError(`rubric must contain 1-${MAX_CRITERIA} criteria`);\n\t}\n\tconst ids = new Set<string>();\n\treturn rubric.map((criterion) => {\n\t\tconst id = identifier(criterion.id, \"criterion id\");\n\t\tif (ids.has(id)) throw new AdvisoryJudgeInputError(\"criterion IDs must be unique\");\n\t\tids.add(id);\n\t\tif (!Number.isSafeInteger(criterion.weight) || criterion.weight < 1 || criterion.weight > 100) {\n\t\t\tthrow new AdvisoryJudgeInputError(\"criterion weight must be an integer from 1 to 100\");\n\t\t}\n\t\treturn {\n\t\t\tid,\n\t\t\tdescription: boundedRedactedText(criterion.description, MAX_DESCRIPTION_CHARS, \"criterion description\"),\n\t\t\tweight: criterion.weight,\n\t\t};\n\t});\n}\n\nfunction buildRequest(\n\ttaskId: string,\n\ttaskGoal: string,\n\trubric: readonly AdvisoryJudgeCriterion[],\n\tcandidates: readonly AdvisoryJudgeCandidate[],\n): AdvisoryJudgeRequest {\n\treturn {\n\t\tpromptVersion: ADVISORY_JUDGE_PROMPT_VERSION,\n\t\ttaskId,\n\t\ttaskGoal,\n\t\trubric,\n\t\tcandidates: candidates.map((candidate) => {\n\t\t\tconst material = boundedRedactedText(candidate.material, MAX_MATERIAL_CHARS, \"candidate material\");\n\t\t\treturn {\n\t\t\t\tid: candidate.id,\n\t\t\t\tmaterial,\n\t\t\t\tmaterialSha256: sha256(material),\n\t\t\t\tevaluationSha256: sha256(JSON.stringify(candidate.evaluation)),\n\t\t\t};\n\t\t}),\n\t};\n}\n\nfunction fallback(\n\tbase: Pick<AdvisoryJudgeDecision, \"judgeId\" | \"taskId\" | \"eligibleCandidateIds\" | \"candidateScores\">,\n\tselectedCandidateId: string,\n\treason: \"judge-unavailable\" | \"judge-response-invalid\",\n\trequestSha256: string,\n): AdvisoryJudgeDecision {\n\treturn { ...base, status: \"fallback\", reason, source: \"deterministic\", selectedCandidateId, requestSha256 };\n}\n\nfunction boundedRedactedText(value: string, maxChars: number, label: string): string {\n\tif (typeof value !== \"string\") throw new AdvisoryJudgeInputError(`${label} must be a string`);\n\tconst redacted = redactSensitiveTextForced(value).trim();\n\tif (redacted.length === 0) throw new AdvisoryJudgeInputError(`${label} must not be empty`);\n\treturn redacted.length <= maxChars ? redacted : `${redacted.slice(0, maxChars - 12)}[TRUNCATED]`;\n}\n\nfunction identifier(value: string, label: string): string {\n\tif (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value) || redactSensitiveTextForced(value) !== value) {\n\t\tthrow new AdvisoryJudgeInputError(`${label} is invalid`);\n\t}\n\treturn value;\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n"]}
@@ -0,0 +1,178 @@
1
+ import { createHash } from "node:crypto";
2
+ import { parseEvaluationResult } from "omk-protocol";
3
+ import { advisoryWeightedScore, parseAdvisoryJudgeResponse } from "./advisory-judge-response.js";
4
+ import { ADVISORY_JUDGE_PROMPT_VERSION, } from "./advisory-judge-types.js";
5
+ import { redactSensitiveTextForced } from "./redaction.js";
6
+ export { ADVISORY_JUDGE_PROMPT_VERSION } from "./advisory-judge-types.js";
7
+ const MAX_CANDIDATES = 8;
8
+ const MAX_CRITERIA = 8;
9
+ const MAX_MATERIAL_CHARS = 16_384;
10
+ const MAX_DESCRIPTION_CHARS = 512;
11
+ const MAX_GOAL_CHARS = 2_048;
12
+ const IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
13
+ export class AdvisoryJudgeInputError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = "AdvisoryJudgeInputError";
17
+ }
18
+ }
19
+ export async function chooseWithAdvisoryJudge(input) {
20
+ const validated = validateInput(input);
21
+ const eligible = validated.candidates.filter((candidate) => candidate.evaluation.semanticVerdict === "pass");
22
+ const eligibleCandidateIds = eligible.map((candidate) => candidate.id);
23
+ const base = {
24
+ judgeId: validated.judgeId,
25
+ taskId: validated.taskId,
26
+ eligibleCandidateIds,
27
+ candidateScores: [],
28
+ };
29
+ if (eligible.length === 0)
30
+ return { ...base, status: "skipped", reason: "no-eligible", source: "none" };
31
+ const fallbackId = eligible[0]?.id;
32
+ if (fallbackId === undefined)
33
+ throw new AdvisoryJudgeInputError("eligible candidate invariant failed");
34
+ if (eligible.length === 1) {
35
+ return {
36
+ ...base,
37
+ status: "skipped",
38
+ reason: "single-eligible",
39
+ source: "deterministic",
40
+ selectedCandidateId: fallbackId,
41
+ };
42
+ }
43
+ const request = buildRequest(validated.taskId, validated.taskGoal, validated.rubric, eligible);
44
+ const requestSha256 = sha256(JSON.stringify(request));
45
+ let response;
46
+ try {
47
+ response = await input.judge(request, input.signal);
48
+ }
49
+ catch {
50
+ return fallback(base, fallbackId, "judge-unavailable", requestSha256);
51
+ }
52
+ const parsed = parseAdvisoryJudgeResponse(response, eligibleCandidateIds, validated.rubric);
53
+ if (parsed === null)
54
+ return fallback(base, fallbackId, "judge-response-invalid", requestSha256);
55
+ const rankById = new Map(eligible.map((candidate) => [candidate.id, candidate.deterministicRank]));
56
+ const candidateScores = parsed
57
+ .map((candidate) => ({
58
+ candidateId: candidate.candidateId,
59
+ score: advisoryWeightedScore(candidate, validated.rubric),
60
+ }))
61
+ .sort((left, right) => right.score - left.score ||
62
+ (rankById.get(left.candidateId) ?? Number.MAX_SAFE_INTEGER) -
63
+ (rankById.get(right.candidateId) ?? Number.MAX_SAFE_INTEGER) ||
64
+ left.candidateId.localeCompare(right.candidateId));
65
+ const selectedCandidateId = candidateScores[0]?.candidateId;
66
+ if (selectedCandidateId === undefined)
67
+ return fallback(base, fallbackId, "judge-response-invalid", requestSha256);
68
+ return {
69
+ ...base,
70
+ status: "selected",
71
+ reason: "judge-ranked",
72
+ source: "llm-judge",
73
+ selectedCandidateId,
74
+ candidateScores,
75
+ requestSha256,
76
+ };
77
+ }
78
+ function validateInput(input) {
79
+ if (input.candidates.length === 0 || input.candidates.length > MAX_CANDIDATES) {
80
+ throw new AdvisoryJudgeInputError(`candidates must contain 1-${MAX_CANDIDATES} entries`);
81
+ }
82
+ const ids = new Set();
83
+ const ranks = new Set();
84
+ const taskIds = new Set();
85
+ const candidates = input.candidates.map((candidate) => {
86
+ const id = identifier(candidate.id, "candidate id");
87
+ if (ids.has(id))
88
+ throw new AdvisoryJudgeInputError("candidate IDs must be unique");
89
+ ids.add(id);
90
+ if (!Number.isSafeInteger(candidate.deterministicRank) || candidate.deterministicRank < 0) {
91
+ throw new AdvisoryJudgeInputError("deterministicRank must be a non-negative safe integer");
92
+ }
93
+ if (ranks.has(candidate.deterministicRank))
94
+ throw new AdvisoryJudgeInputError("deterministic ranks must be unique");
95
+ ranks.add(candidate.deterministicRank);
96
+ const evaluation = parsedEvaluation(candidate.evaluation);
97
+ taskIds.add(identifier(evaluation.taskId, "taskId"));
98
+ return { ...candidate, id, evaluation };
99
+ });
100
+ if (taskIds.size !== 1)
101
+ throw new AdvisoryJudgeInputError("candidate evaluations must reference one taskId");
102
+ const taskId = candidates[0]?.evaluation.taskId;
103
+ if (taskId === undefined)
104
+ throw new AdvisoryJudgeInputError("candidate taskId is missing");
105
+ return {
106
+ taskId,
107
+ taskGoal: boundedRedactedText(input.taskGoal, MAX_GOAL_CHARS, "taskGoal"),
108
+ judgeId: identifier(input.judgeId, "judgeId"),
109
+ rubric: validateRubric(input.rubric),
110
+ candidates: candidates.sort((left, right) => left.deterministicRank - right.deterministicRank || left.id.localeCompare(right.id)),
111
+ };
112
+ }
113
+ function parsedEvaluation(value) {
114
+ try {
115
+ return parseEvaluationResult(value);
116
+ }
117
+ catch {
118
+ throw new AdvisoryJudgeInputError("candidate evaluation is invalid");
119
+ }
120
+ }
121
+ function validateRubric(rubric) {
122
+ if (rubric.length === 0 || rubric.length > MAX_CRITERIA) {
123
+ throw new AdvisoryJudgeInputError(`rubric must contain 1-${MAX_CRITERIA} criteria`);
124
+ }
125
+ const ids = new Set();
126
+ return rubric.map((criterion) => {
127
+ const id = identifier(criterion.id, "criterion id");
128
+ if (ids.has(id))
129
+ throw new AdvisoryJudgeInputError("criterion IDs must be unique");
130
+ ids.add(id);
131
+ if (!Number.isSafeInteger(criterion.weight) || criterion.weight < 1 || criterion.weight > 100) {
132
+ throw new AdvisoryJudgeInputError("criterion weight must be an integer from 1 to 100");
133
+ }
134
+ return {
135
+ id,
136
+ description: boundedRedactedText(criterion.description, MAX_DESCRIPTION_CHARS, "criterion description"),
137
+ weight: criterion.weight,
138
+ };
139
+ });
140
+ }
141
+ function buildRequest(taskId, taskGoal, rubric, candidates) {
142
+ return {
143
+ promptVersion: ADVISORY_JUDGE_PROMPT_VERSION,
144
+ taskId,
145
+ taskGoal,
146
+ rubric,
147
+ candidates: candidates.map((candidate) => {
148
+ const material = boundedRedactedText(candidate.material, MAX_MATERIAL_CHARS, "candidate material");
149
+ return {
150
+ id: candidate.id,
151
+ material,
152
+ materialSha256: sha256(material),
153
+ evaluationSha256: sha256(JSON.stringify(candidate.evaluation)),
154
+ };
155
+ }),
156
+ };
157
+ }
158
+ function fallback(base, selectedCandidateId, reason, requestSha256) {
159
+ return { ...base, status: "fallback", reason, source: "deterministic", selectedCandidateId, requestSha256 };
160
+ }
161
+ function boundedRedactedText(value, maxChars, label) {
162
+ if (typeof value !== "string")
163
+ throw new AdvisoryJudgeInputError(`${label} must be a string`);
164
+ const redacted = redactSensitiveTextForced(value).trim();
165
+ if (redacted.length === 0)
166
+ throw new AdvisoryJudgeInputError(`${label} must not be empty`);
167
+ return redacted.length <= maxChars ? redacted : `${redacted.slice(0, maxChars - 12)}[TRUNCATED]`;
168
+ }
169
+ function identifier(value, label) {
170
+ if (typeof value !== "string" || !IDENTIFIER_PATTERN.test(value) || redactSensitiveTextForced(value) !== value) {
171
+ throw new AdvisoryJudgeInputError(`${label} is invalid`);
172
+ }
173
+ return value;
174
+ }
175
+ function sha256(value) {
176
+ return createHash("sha256").update(value).digest("hex");
177
+ }
178
+ //# sourceMappingURL=advisory-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-judge.js","sourceRoot":"","sources":["../../src/core/advisory-judge.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { type EvaluationResult, parseEvaluationResult } from \"omk-protocol\";\nimport { advisoryWeightedScore, parseAdvisoryJudgeResponse } from \"./advisory-judge-response.ts\";\nimport {\n\tADVISORY_JUDGE_PROMPT_VERSION,\n\ttype AdvisoryJudgeCandidate,\n\ttype AdvisoryJudgeCriterion,\n\ttype AdvisoryJudgeDecision,\n\ttype AdvisoryJudgeInput,\n\ttype AdvisoryJudgeRequest,\n} from \"./advisory-judge-types.ts\";\nimport { redactSensitiveTextForced } from \"./redaction.ts\";\n\nexport type {\n\tAdvisoryJudge,\n\tAdvisoryJudgeCandidate,\n\tAdvisoryJudgeCandidateScore,\n\tAdvisoryJudgeCriterion,\n\tAdvisoryJudgeDecision,\n\tAdvisoryJudgeDecisionReason,\n\tAdvisoryJudgeDecisionStatus,\n\tAdvisoryJudgeInput,\n\tAdvisoryJudgeRequest,\n\tAdvisoryJudgeRequestCandidate,\n} from \"./advisory-judge-types.ts\";\nexport { ADVISORY_JUDGE_PROMPT_VERSION } from \"./advisory-judge-types.ts\";\n\nconst MAX_CANDIDATES = 8;\nconst MAX_CRITERIA = 8;\nconst MAX_MATERIAL_CHARS = 16_384;\nconst MAX_DESCRIPTION_CHARS = 512;\nconst MAX_GOAL_CHARS = 2_048;\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;\n\nexport class AdvisoryJudgeInputError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"AdvisoryJudgeInputError\";\n\t}\n}\n\nexport async function chooseWithAdvisoryJudge(input: AdvisoryJudgeInput): Promise<AdvisoryJudgeDecision> {\n\tconst validated = validateInput(input);\n\tconst eligible = validated.candidates.filter((candidate) => candidate.evaluation.semanticVerdict === \"pass\");\n\tconst eligibleCandidateIds = eligible.map((candidate) => candidate.id);\n\tconst base = {\n\t\tjudgeId: validated.judgeId,\n\t\ttaskId: validated.taskId,\n\t\teligibleCandidateIds,\n\t\tcandidateScores: [] as const,\n\t};\n\tif (eligible.length === 0) return { ...base, status: \"skipped\", reason: \"no-eligible\", source: \"none\" };\n\tconst fallbackId = eligible[0]?.id;\n\tif (fallbackId === undefined) throw new AdvisoryJudgeInputError(\"eligible candidate invariant failed\");\n\tif (eligible.length === 1) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"skipped\",\n\t\t\treason: \"single-eligible\",\n\t\t\tsource: \"deterministic\",\n\t\t\tselectedCandidateId: fallbackId,\n\t\t};\n\t}\n\n\tconst request = buildRequest(validated.taskId, validated.taskGoal, validated.rubric, eligible);\n\tconst requestSha256 = sha256(JSON.stringify(request));\n\tlet response: unknown;\n\ttry {\n\t\tresponse = await input.judge(request, input.signal);\n\t} catch {\n\t\treturn fallback(base, fallbackId, \"judge-unavailable\", requestSha256);\n\t}\n\tconst parsed = parseAdvisoryJudgeResponse(response, eligibleCandidateIds, validated.rubric);\n\tif (parsed === null) return fallback(base, fallbackId, \"judge-response-invalid\", requestSha256);\n\tconst rankById = new Map(eligible.map((candidate) => [candidate.id, candidate.deterministicRank]));\n\tconst candidateScores = parsed\n\t\t.map((candidate) => ({\n\t\t\tcandidateId: candidate.candidateId,\n\t\t\tscore: advisoryWeightedScore(candidate, validated.rubric),\n\t\t}))\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\tright.score - left.score ||\n\t\t\t\t(rankById.get(left.candidateId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t\t(rankById.get(right.candidateId) ?? Number.MAX_SAFE_INTEGER) ||\n\t\t\t\tleft.candidateId.localeCompare(right.candidateId),\n\t\t);\n\tconst selectedCandidateId = candidateScores[0]?.candidateId;\n\tif (selectedCandidateId === undefined) return fallback(base, fallbackId, \"judge-response-invalid\", requestSha256);\n\treturn {\n\t\t...base,\n\t\tstatus: \"selected\",\n\t\treason: \"judge-ranked\",\n\t\tsource: \"llm-judge\",\n\t\tselectedCandidateId,\n\t\tcandidateScores,\n\t\trequestSha256,\n\t};\n}\n\nfunction validateInput(input: AdvisoryJudgeInput): {\n\treadonly taskId: string;\n\treadonly taskGoal: string;\n\treadonly judgeId: string;\n\treadonly rubric: readonly AdvisoryJudgeCriterion[];\n\treadonly candidates: readonly AdvisoryJudgeCandidate[];\n} {\n\tif (input.candidates.length === 0 || input.candidates.length > MAX_CANDIDATES) {\n\t\tthrow new AdvisoryJudgeInputError(`candidates must contain 1-${MAX_CANDIDATES} entries`);\n\t}\n\tconst ids = new Set<string>();\n\tconst ranks = new Set<number>();\n\tconst taskIds = new Set<string>();\n\tconst candidates = input.candidates.map((candidate) => {\n\t\tconst id = identifier(candidate.id, \"candidate id\");\n\t\tif (ids.has(id)) throw new AdvisoryJudgeInputError(\"candidate IDs must be unique\");\n\t\tids.add(id);\n\t\tif (!Number.isSafeInteger(candidate.deterministicRank) || candidate.deterministicRank < 0) {\n\t\t\tthrow new AdvisoryJudgeInputError(\"deterministicRank must be a non-negative safe integer\");\n\t\t}\n\t\tif (ranks.has(candidate.deterministicRank))\n\t\t\tthrow new AdvisoryJudgeInputError(\"deterministic ranks must be unique\");\n\t\tranks.add(candidate.deterministicRank);\n\t\tconst evaluation = parsedEvaluation(candidate.evaluation);\n\t\ttaskIds.add(identifier(evaluation.taskId, \"taskId\"));\n\t\treturn { ...candidate, id, evaluation };\n\t});\n\tif (taskIds.size !== 1) throw new AdvisoryJudgeInputError(\"candidate evaluations must reference one taskId\");\n\tconst taskId = candidates[0]?.evaluation.taskId;\n\tif (taskId === undefined) throw new AdvisoryJudgeInputError(\"candidate taskId is missing\");\n\treturn {\n\t\ttaskId,\n\t\ttaskGoal: boundedRedactedText(input.taskGoal, MAX_GOAL_CHARS, \"taskGoal\"),\n\t\tjudgeId: identifier(input.judgeId, \"judgeId\"),\n\t\trubric: validateRubric(input.rubric),\n\t\tcandidates: candidates.sort(\n\t\t\t(left, right) => left.deterministicRank - right.deterministicRank || left.id.localeCompare(right.id),\n\t\t),\n\t};\n}\n\nfunction parsedEvaluation(value: EvaluationResult): EvaluationResult {\n\ttry {\n\t\treturn parseEvaluationResult(value);\n\t} catch {\n\t\tthrow new AdvisoryJudgeInputError(\"candidate evaluation is invalid\");\n\t}\n}\n\nfunction validateRubric(rubric: readonly AdvisoryJudgeCriterion[]): readonly AdvisoryJudgeCriterion[] {\n\tif (rubric.length === 0 || rubric.length > MAX_CRITERIA) {\n\t\tthrow new AdvisoryJudgeInputError(`rubric must contain 1-${MAX_CRITERIA} criteria`);\n\t}\n\tconst ids = new Set<string>();\n\treturn rubric.map((criterion) => {\n\t\tconst id = identifier(criterion.id, \"criterion id\");\n\t\tif (ids.has(id)) throw new AdvisoryJudgeInputError(\"criterion IDs must be unique\");\n\t\tids.add(id);\n\t\tif (!Number.isSafeInteger(criterion.weight) || criterion.weight < 1 || criterion.weight > 100) {\n\t\t\tthrow new AdvisoryJudgeInputError(\"criterion weight must be an integer from 1 to 100\");\n\t\t}\n\t\treturn {\n\t\t\tid,\n\t\t\tdescription: boundedRedactedText(criterion.description, MAX_DESCRIPTION_CHARS, \"criterion description\"),\n\t\t\tweight: criterion.weight,\n\t\t};\n\t});\n}\n\nfunction buildRequest(\n\ttaskId: string,\n\ttaskGoal: string,\n\trubric: readonly AdvisoryJudgeCriterion[],\n\tcandidates: readonly AdvisoryJudgeCandidate[],\n): AdvisoryJudgeRequest {\n\treturn {\n\t\tpromptVersion: ADVISORY_JUDGE_PROMPT_VERSION,\n\t\ttaskId,\n\t\ttaskGoal,\n\t\trubric,\n\t\tcandidates: candidates.map((candidate) => {\n\t\t\tconst material = boundedRedactedText(candidate.material, MAX_MATERIAL_CHARS, \"candidate material\");\n\t\t\treturn {\n\t\t\t\tid: candidate.id,\n\t\t\t\tmaterial,\n\t\t\t\tmaterialSha256: sha256(material),\n\t\t\t\tevaluationSha256: sha256(JSON.stringify(candidate.evaluation)),\n\t\t\t};\n\t\t}),\n\t};\n}\n\nfunction fallback(\n\tbase: Pick<AdvisoryJudgeDecision, \"judgeId\" | \"taskId\" | \"eligibleCandidateIds\" | \"candidateScores\">,\n\tselectedCandidateId: string,\n\treason: \"judge-unavailable\" | \"judge-response-invalid\",\n\trequestSha256: string,\n): AdvisoryJudgeDecision {\n\treturn { ...base, status: \"fallback\", reason, source: \"deterministic\", selectedCandidateId, requestSha256 };\n}\n\nfunction boundedRedactedText(value: string, maxChars: number, label: string): string {\n\tif (typeof value !== \"string\") throw new AdvisoryJudgeInputError(`${label} must be a string`);\n\tconst redacted = redactSensitiveTextForced(value).trim();\n\tif (redacted.length === 0) throw new AdvisoryJudgeInputError(`${label} must not be empty`);\n\treturn redacted.length <= maxChars ? redacted : `${redacted.slice(0, maxChars - 12)}[TRUNCATED]`;\n}\n\nfunction identifier(value: string, label: string): string {\n\tif (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value) || redactSensitiveTextForced(value) !== value) {\n\t\tthrow new AdvisoryJudgeInputError(`${label} is invalid`);\n\t}\n\treturn value;\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n"]}
@@ -50,6 +50,7 @@ export interface CreateAgentSessionFromServicesOptions {
50
50
  model: Model<any>;
51
51
  thinkingLevel?: ThinkingLevel;
52
52
  }>;
53
+ modelPinned?: boolean;
53
54
  tools?: string[];
54
55
  excludeTools?: CreateAgentSessionOptions["excludeTools"];
55
56
  noTools?: CreateAgentSessionOptions["noTools"];
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-services.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAyB,KAAK,4BAA4B,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrH,OAAO,EAAE,KAAK,yBAAyB,EAAE,KAAK,wBAAwB,EAAsB,MAAM,UAAU,CAAC;AAC7G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iCAAiC;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,IAAI,CAAC,4BAA4B,EAAE,KAAK,GAAG,UAAU,GAAG,iBAAiB,CAAC,CAAC;CACnG;AAED;;;;;GAKG;AACH,MAAM,WAAW,qCAAqC;IACrD,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;CACzD;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,6BAA6B,EAAE,CAAC;CAC7C;AAkDD;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC/C,OAAO,EAAE,iCAAiC,GACxC,OAAO,CAAC,oBAAoB,CAAC,CAuC/B;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CACnD,OAAO,EAAE,qCAAqC,GAC5C,OAAO,CAAC,wBAAwB,CAAC,CAqBnC","sourcesContent":["import { join } from \"node:path\";\nimport type { ThinkingLevel } from \"omk-agent-core\";\nimport type { Model } from \"omk-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\treplayLedger?: CreateAgentSessionOptions[\"replayLedger\"];\n\treplayGoalId?: CreateAgentSessionOptions[\"replayGoalId\"];\n\treplayLaneId?: CreateAgentSessionOptions[\"replayLaneId\"];\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, join(agentDir, \"models.json\"));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload();\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tauthStorage,\n\t\tsettingsManager,\n\t\tmodelRegistry,\n\t\tresourceLoader,\n\t\tdiagnostics,\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tauthStorage: options.services.authStorage,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tmodelRegistry: options.services.modelRegistry,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\treplayLedger: options.replayLedger,\n\t\treplayGoalId: options.replayGoalId,\n\t\treplayLaneId: options.replayLaneId,\n\t});\n}\n"]}
1
+ {"version":3,"file":"agent-session-services.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAyB,KAAK,4BAA4B,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrH,OAAO,EAAE,KAAK,yBAAyB,EAAE,KAAK,wBAAwB,EAAsB,MAAM,UAAU,CAAC;AAC7G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iCAAiC;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,IAAI,CAAC,4BAA4B,EAAE,KAAK,GAAG,UAAU,GAAG,iBAAiB,CAAC,CAAC;CACnG;AAED;;;;;GAKG;AACH,MAAM,WAAW,qCAAqC;IACrD,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC;CACzD;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,6BAA6B,EAAE,CAAC;CAC7C;AAkDD;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC/C,OAAO,EAAE,iCAAiC,GACxC,OAAO,CAAC,oBAAoB,CAAC,CAuC/B;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CACnD,OAAO,EAAE,qCAAqC,GAC5C,OAAO,CAAC,wBAAwB,CAAC,CAsBnC","sourcesContent":["import { join } from \"node:path\";\nimport type { ThinkingLevel } from \"omk-agent-core\";\nimport type { Model } from \"omk-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\tmodelPinned?: boolean;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\treplayLedger?: CreateAgentSessionOptions[\"replayLedger\"];\n\treplayGoalId?: CreateAgentSessionOptions[\"replayGoalId\"];\n\treplayLaneId?: CreateAgentSessionOptions[\"replayLaneId\"];\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, join(agentDir, \"models.json\"));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload();\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tauthStorage,\n\t\tsettingsManager,\n\t\tmodelRegistry,\n\t\tresourceLoader,\n\t\tdiagnostics,\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tauthStorage: options.services.authStorage,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tmodelRegistry: options.services.modelRegistry,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tmodelPinned: options.modelPinned,\n\t\treplayLedger: options.replayLedger,\n\t\treplayGoalId: options.replayGoalId,\n\t\treplayLaneId: options.replayLaneId,\n\t});\n}\n"]}
@@ -114,6 +114,7 @@ export async function createAgentSessionFromServices(options) {
114
114
  noTools: options.noTools,
115
115
  customTools: options.customTools,
116
116
  sessionStartEvent: options.sessionStartEvent,
117
+ modelPinned: options.modelPinned,
117
118
  replayLedger: options.replayLedger,
118
119
  replayGoalId: options.replayGoalId,
119
120
  replayLaneId: options.replayLaneId,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-services.js","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { ThinkingLevel } from \"omk-agent-core\";\nimport type { Model } from \"omk-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\treplayLedger?: CreateAgentSessionOptions[\"replayLedger\"];\n\treplayGoalId?: CreateAgentSessionOptions[\"replayGoalId\"];\n\treplayLaneId?: CreateAgentSessionOptions[\"replayLaneId\"];\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, join(agentDir, \"models.json\"));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload();\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tauthStorage,\n\t\tsettingsManager,\n\t\tmodelRegistry,\n\t\tresourceLoader,\n\t\tdiagnostics,\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tauthStorage: options.services.authStorage,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tmodelRegistry: options.services.modelRegistry,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\treplayLedger: options.replayLedger,\n\t\treplayGoalId: options.replayGoalId,\n\t\treplayLaneId: options.replayLaneId,\n\t});\n}\n"]}
1
+ {"version":3,"file":"agent-session-services.js","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { ThinkingLevel } from \"omk-agent-core\";\nimport type { Model } from \"omk-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\tmodelPinned?: boolean;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\treplayLedger?: CreateAgentSessionOptions[\"replayLedger\"];\n\treplayGoalId?: CreateAgentSessionOptions[\"replayGoalId\"];\n\treplayLaneId?: CreateAgentSessionOptions[\"replayLaneId\"];\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, join(agentDir, \"models.json\"));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload();\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tauthStorage,\n\t\tsettingsManager,\n\t\tmodelRegistry,\n\t\tresourceLoader,\n\t\tdiagnostics,\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tauthStorage: options.services.authStorage,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tmodelRegistry: options.services.modelRegistry,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tmodelPinned: options.modelPinned,\n\t\treplayLedger: options.replayLedger,\n\t\treplayGoalId: options.replayGoalId,\n\t\treplayLaneId: options.replayLaneId,\n\t});\n}\n"]}
@@ -174,6 +174,8 @@ export interface AgentSessionConfig {
174
174
  replayGoalId?: string;
175
175
  /** Optional lane binding for replay events. */
176
176
  replayLaneId?: string;
177
+ /** True when the user pinned `--model` / `--provider` for this process. */
178
+ modelPinned?: boolean;
177
179
  }
178
180
  /** Summary of a missing-only transcript auto-repair applied on session open/resume. */
179
181
  export interface SessionTranscriptRepair {
@@ -293,13 +295,15 @@ export declare class AgentSession {
293
295
  private _pendingNextTurnMessages;
294
296
  private _compactionAbortController;
295
297
  private _autoCompactionAbortController;
296
- private _overflowRecoveryAttempted;
298
+ private _overflowRecoveryAttempts;
297
299
  private _thresholdCompactionEmergency;
298
300
  private _compactionHysteresisState;
299
301
  private _branchSummaryAbortController;
300
302
  private _retryAbortController;
301
303
  private _retryAttempt;
302
304
  private _refusedModels;
305
+ /** True when `--model` / `--provider` pinned this process to one model. */
306
+ private readonly _modelPinned;
303
307
  private readonly _bashService;
304
308
  private readonly _compactionService;
305
309
  private _extensionRunner;
@@ -543,7 +547,6 @@ export declare class AgentSession {
543
547
  * Compute responseReserveTokens from contextWindow.
544
548
  * Prefers the model's own maxTokens when available, otherwise uses a ratio.
545
549
  */
546
- private _computeResponseReserve;
547
550
  private _recordPromptCachePlan;
548
551
  private _rebuildSystemPrompt;
549
552
  private _runAgentPrompt;
@@ -789,6 +792,7 @@ export declare class AgentSession {
789
792
  private _effectiveTurnContextWindow;
790
793
  private _checkProjectedCompaction;
791
794
  private _checkCompaction;
795
+ private _overflowCompactionSettings;
792
796
  private _runAutoCompaction;
793
797
  /**
794
798
  * Toggle auto-compaction setting.
@@ -832,7 +836,6 @@ export declare class AgentSession {
832
836
  private _refreshToolRegistry;
833
837
  private _buildRuntime;
834
838
  reload(): Promise<void>;
835
- private _isNonRetryableProviderLimitError;
836
839
  /**
837
840
  * Check if an error is retryable (overloaded, rate limit, server errors).
838
841
  * Context overflow errors are NOT retryable (handled by compaction instead).