open-multi-agent-kit 0.80.8 → 0.90.3

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 (208) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +21 -31
  3. package/dist/cli/args.d.ts +0 -2
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +2 -7
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/core/agent-session.d.ts +2 -0
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +41 -5
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/automation/index.d.ts +359 -0
  12. package/dist/core/automation/index.d.ts.map +1 -0
  13. package/dist/core/automation/index.js +665 -0
  14. package/dist/core/automation/index.js.map +1 -0
  15. package/dist/core/bang-skill-invocation.d.ts +26 -0
  16. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  17. package/dist/core/bang-skill-invocation.js +59 -0
  18. package/dist/core/bang-skill-invocation.js.map +1 -0
  19. package/dist/core/browser-use.d.ts +8 -0
  20. package/dist/core/browser-use.d.ts.map +1 -1
  21. package/dist/core/browser-use.js +61 -23
  22. package/dist/core/browser-use.js.map +1 -1
  23. package/dist/core/compactor.d.ts.map +1 -1
  24. package/dist/core/compactor.js +0 -3
  25. package/dist/core/compactor.js.map +1 -1
  26. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  27. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  28. package/dist/core/context-budget-governor-v2.js +1 -0
  29. package/dist/core/context-budget-governor-v2.js.map +1 -1
  30. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  31. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  32. package/dist/core/context-budget-headroom-types.js.map +1 -1
  33. package/dist/core/context-budget-headroom.d.ts +1 -1
  34. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  35. package/dist/core/context-budget-headroom.js +17 -4
  36. package/dist/core/context-budget-headroom.js.map +1 -1
  37. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  38. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  39. package/dist/core/context-budget-system-prompt.js +6 -1
  40. package/dist/core/context-budget-system-prompt.js.map +1 -1
  41. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  42. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  43. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  44. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  45. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  46. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  47. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  48. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  49. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  50. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  51. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  52. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  53. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  54. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  55. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  56. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  57. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  58. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  59. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  60. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  61. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  62. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  63. package/dist/core/context-budget-v2-cache.js +50 -0
  64. package/dist/core/context-budget-v2-cache.js.map +1 -0
  65. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  66. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  67. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  68. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  69. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  70. package/dist/core/context-budget-v2-planner.js +55 -2
  71. package/dist/core/context-budget-v2-planner.js.map +1 -1
  72. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  73. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  74. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  75. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  76. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  77. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  78. package/dist/core/context-budget-v2-selection.js +12 -2
  79. package/dist/core/context-budget-v2-selection.js.map +1 -1
  80. package/dist/core/context-budget-v2-types.d.ts +107 -1
  81. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  82. package/dist/core/context-budget-v2-types.js.map +1 -1
  83. package/dist/core/diagnostics.d.ts +2 -0
  84. package/dist/core/diagnostics.d.ts.map +1 -1
  85. package/dist/core/diagnostics.js.map +1 -1
  86. package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/todo-checklist.js +3 -0
  88. package/dist/core/extensions/builtin/todo-checklist.js.map +1 -1
  89. package/dist/core/footer-data-provider.d.ts +3 -1
  90. package/dist/core/footer-data-provider.d.ts.map +1 -1
  91. package/dist/core/footer-data-provider.js +4 -0
  92. package/dist/core/footer-data-provider.js.map +1 -1
  93. package/dist/core/headroom.d.ts.map +1 -1
  94. package/dist/core/headroom.js +0 -4
  95. package/dist/core/headroom.js.map +1 -1
  96. package/dist/core/hook-inventory.d.ts.map +1 -1
  97. package/dist/core/hook-inventory.js +6 -0
  98. package/dist/core/hook-inventory.js.map +1 -1
  99. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  100. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  101. package/dist/core/mcp-computer-use-presets.js +158 -0
  102. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  103. package/dist/core/mcp-public-presets.d.ts +578 -0
  104. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  105. package/dist/core/mcp-public-presets.js +647 -0
  106. package/dist/core/mcp-public-presets.js.map +1 -0
  107. package/dist/core/model-registry.d.ts.map +1 -1
  108. package/dist/core/model-registry.js +1 -0
  109. package/dist/core/model-registry.js.map +1 -1
  110. package/dist/core/model-resolver.d.ts.map +1 -1
  111. package/dist/core/model-resolver.js +1 -0
  112. package/dist/core/model-resolver.js.map +1 -1
  113. package/dist/core/pi-package-intake-candidates.d.ts +34 -0
  114. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -0
  115. package/dist/core/pi-package-intake-candidates.js +291 -0
  116. package/dist/core/pi-package-intake-candidates.js.map +1 -0
  117. package/dist/core/pi-package-intake.d.ts +50 -0
  118. package/dist/core/pi-package-intake.d.ts.map +1 -0
  119. package/dist/core/pi-package-intake.js +132 -0
  120. package/dist/core/pi-package-intake.js.map +1 -0
  121. package/dist/core/provider-display-names.d.ts.map +1 -1
  122. package/dist/core/provider-display-names.js +1 -0
  123. package/dist/core/provider-display-names.js.map +1 -1
  124. package/dist/core/resource-loader.d.ts.map +1 -1
  125. package/dist/core/resource-loader.js +1 -0
  126. package/dist/core/resource-loader.js.map +1 -1
  127. package/dist/core/reverse-skill.d.ts +2 -0
  128. package/dist/core/reverse-skill.d.ts.map +1 -0
  129. package/dist/core/reverse-skill.js +7 -0
  130. package/dist/core/reverse-skill.js.map +1 -0
  131. package/dist/core/settings-manager.d.ts +3 -3
  132. package/dist/core/settings-manager.d.ts.map +1 -1
  133. package/dist/core/settings-manager.js.map +1 -1
  134. package/dist/core/skills.d.ts +4 -0
  135. package/dist/core/skills.d.ts.map +1 -1
  136. package/dist/core/skills.js +115 -43
  137. package/dist/core/skills.js.map +1 -1
  138. package/dist/core/system-prompt.d.ts +2 -0
  139. package/dist/core/system-prompt.d.ts.map +1 -1
  140. package/dist/core/system-prompt.js +58 -5
  141. package/dist/core/system-prompt.js.map +1 -1
  142. package/dist/core/todo-runtime-state.d.ts +5 -0
  143. package/dist/core/todo-runtime-state.d.ts.map +1 -0
  144. package/dist/core/todo-runtime-state.js +12 -0
  145. package/dist/core/todo-runtime-state.js.map +1 -0
  146. package/dist/index.d.ts +2 -0
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +2 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/migrations.d.ts +19 -0
  151. package/dist/migrations.d.ts.map +1 -1
  152. package/dist/migrations.js +39 -15
  153. package/dist/migrations.js.map +1 -1
  154. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  155. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  156. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  157. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  158. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  159. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  160. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  161. package/dist/modes/interactive/components/control-panel-layout.d.ts +22 -1
  162. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  163. package/dist/modes/interactive/components/control-panel-layout.js +244 -68
  164. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  165. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +2 -1
  166. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  167. package/dist/modes/interactive/components/control-panel-runtime-status.js +20 -1
  168. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  169. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  170. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  171. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  172. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  173. package/dist/modes/interactive/components/control-panel.d.ts +9 -0
  174. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/control-panel.js +50 -6
  176. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  177. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  178. package/dist/modes/interactive/components/footer.js +6 -0
  179. package/dist/modes/interactive/components/footer.js.map +1 -1
  180. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/settings-selector.js +2 -1
  182. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  183. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  184. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  185. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  186. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  187. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  188. package/dist/modes/interactive/interactive-mode.js +70 -15
  189. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  190. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  191. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  192. package/dist/modes/interactive/theme/theme.js +5 -0
  193. package/dist/modes/interactive/theme/theme.js.map +1 -1
  194. package/docs/providers.md +12 -0
  195. package/docs/skills.md +8 -4
  196. package/docs/usage.md +4 -3
  197. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  198. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  199. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  200. package/examples/extensions/gondolin/package-lock.json +2 -2
  201. package/examples/extensions/gondolin/package.json +1 -1
  202. package/examples/extensions/preset.ts +2 -2
  203. package/examples/extensions/sandbox/package-lock.json +2 -2
  204. package/examples/extensions/sandbox/package.json +1 -1
  205. package/examples/extensions/with-deps/package-lock.json +2 -2
  206. package/examples/extensions/with-deps/package.json +1 -1
  207. package/npm-shrinkwrap.json +27 -34
  208. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/automation/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFile, stat } from \"node:fs/promises\";\n\nexport type RiskLevel = \"R0\" | \"R1\" | \"R2\" | \"R3\";\n\nexport type Capability =\n\t| \"fs.read\"\n\t| \"fs.write\"\n\t| \"process.exec\"\n\t| \"network.read\"\n\t| \"network.write\"\n\t| \"browser.observe\"\n\t| \"browser.mutate\"\n\t| \"browser.credentialed\"\n\t| \"mcp.call\"\n\t| \"extension.run\"\n\t| \"api.call\"\n\t| \"secrets.resolve\"\n\t| \"subagent.spawn\";\n\nexport type EnvMode = \"secret-ref-only\" | \"passthrough-audited\" | \"passthrough-full\";\nexport type Sensitivity = \"public\" | \"internal\" | \"credential\" | \"payment\" | \"session\" | \"admin\";\nexport type ApiMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface AutonomyProfile {\n\tid: \"autopilot-max\" | \"trusted-dev\" | \"ci-agent\" | \"public-safe\";\n\thumanPromptBudget: { maxPromptsPerTask: number; maxPromptRate: number };\n\tcapabilities: Capability[];\n\tenv: {\n\t\tmode: EnvMode;\n\t\tallowPatterns: string[];\n\t\tdenyPatterns: string[];\n\t\tredactPatterns: string[];\n\t\texposeToModel: false;\n\t};\n\tapi: {\n\t\tallowOrigins: string[];\n\t\tallowMethods: ApiMethod[];\n\t\tmutationDefault: \"auto\";\n\t\trequireIdempotencyForMethods: ApiMethod[];\n\t};\n\tbrowser: {\n\t\tpersistentProfile: boolean;\n\t\tcredentialedSessions: boolean;\n\t\tautoSubmit: boolean;\n\t\tautoDownload: boolean;\n\t\tmaxUnknownOutcomeReconciliations: number;\n\t};\n\tverification: {\n\t\tminVerifiabilityByRisk: Record<RiskLevel, number>;\n\t\trequireEvidenceByRisk: Record<RiskLevel, boolean>;\n\t\trequirePostconditionsByRisk: Record<RiskLevel, boolean>;\n\t};\n\trecovery: {\n\t\tautoRetry: boolean;\n\t\tautoRollback: boolean;\n\t\tautoCompensate: boolean;\n\t\tduplicateMutationSuppression: boolean;\n\t};\n\tbudgets: {\n\t\tmaxWallClockMs: number;\n\t\tmaxToolCalls: number;\n\t\tmaxBrowserActions: number;\n\t\tmaxNetworkCalls: number;\n\t\tmaxCostUsd: number;\n\t\triskBudget: Record<RiskLevel, number>;\n\t};\n}\n\nexport const AUTOPILOT_MAX: AutonomyProfile = {\n\tid: \"autopilot-max\",\n\thumanPromptBudget: { maxPromptsPerTask: 0, maxPromptRate: 0 },\n\tcapabilities: [\n\t\t\"fs.read\",\n\t\t\"fs.write\",\n\t\t\"process.exec\",\n\t\t\"network.read\",\n\t\t\"network.write\",\n\t\t\"browser.observe\",\n\t\t\"browser.mutate\",\n\t\t\"browser.credentialed\",\n\t\t\"mcp.call\",\n\t\t\"extension.run\",\n\t\t\"api.call\",\n\t\t\"secrets.resolve\",\n\t\t\"subagent.spawn\",\n\t],\n\tenv: {\n\t\tmode: \"passthrough-audited\",\n\t\tallowPatterns: [\"*\"],\n\t\tdenyPatterns: [],\n\t\tredactPatterns: [\n\t\t\t\"*KEY*\",\n\t\t\t\"*TOKEN*\",\n\t\t\t\"*SECRET*\",\n\t\t\t\"*PASSWORD*\",\n\t\t\t\"AWS_*\",\n\t\t\t\"GCP_*\",\n\t\t\t\"AZURE_*\",\n\t\t\t\"OPENAI_*\",\n\t\t\t\"ANTHROPIC_*\",\n\t\t\t\"GITHUB_*\",\n\t\t\t\"NPM_*\",\n\t\t],\n\t\texposeToModel: false,\n\t},\n\tapi: {\n\t\tallowOrigins: [\"*\"],\n\t\tallowMethods: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n\t\tmutationDefault: \"auto\",\n\t\trequireIdempotencyForMethods: [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n\t},\n\tbrowser: {\n\t\tpersistentProfile: true,\n\t\tcredentialedSessions: true,\n\t\tautoSubmit: true,\n\t\tautoDownload: true,\n\t\tmaxUnknownOutcomeReconciliations: 5,\n\t},\n\tverification: {\n\t\tminVerifiabilityByRisk: { R0: 0.1, R1: 0.25, R2: 0.45, R3: 0.65 },\n\t\trequireEvidenceByRisk: { R0: false, R1: true, R2: true, R3: true },\n\t\trequirePostconditionsByRisk: { R0: false, R1: true, R2: true, R3: true },\n\t},\n\trecovery: {\n\t\tautoRetry: true,\n\t\tautoRollback: true,\n\t\tautoCompensate: true,\n\t\tduplicateMutationSuppression: true,\n\t},\n\tbudgets: {\n\t\tmaxWallClockMs: 30 * 60 * 1000,\n\t\tmaxToolCalls: 500,\n\t\tmaxBrowserActions: 250,\n\t\tmaxNetworkCalls: 1000,\n\t\tmaxCostUsd: 10,\n\t\triskBudget: { R0: 10000, R1: 2000, R2: 500, R3: 100 },\n\t},\n};\n\nexport interface EnvRecord {\n\tkey: string;\n\tvalue: string;\n\tsensitivity: Sensitivity;\n\tsource: \"process\" | \"profile\" | \"workspace\" | \"task\" | \"tool\";\n\tfingerprint: string;\n}\n\nexport interface EnvUseEvent {\n\tactionId: string;\n\ttoolId: string;\n\tkey: string;\n\tsensitivity: Sensitivity;\n\tfingerprint: string;\n\tpurpose: string;\n\tpassedToProcess: boolean;\n\texposedToModel: false;\n\ttimestamp: string;\n}\n\nexport interface EnvResolutionRequest {\n\tactionId: string;\n\ttoolId: string;\n\tpurpose: string;\n\tprofile: AutonomyProfile;\n\trequestedKeys?: string[];\n\trequestedPatterns?: string[];\n\textraEnv?: Record<string, string>;\n}\n\nexport interface EnvBrokerLedger {\n\tappend(event: EnvUseEvent): Promise<unknown>;\n}\n\nexport class EnvBroker {\n\tprivate readonly processEnv: Record<string, string | undefined>;\n\tprivate readonly ledger: EnvBrokerLedger;\n\n\tconstructor(args: { processEnv: Record<string, string | undefined>; ledger: EnvBrokerLedger }) {\n\t\tthis.processEnv = args.processEnv;\n\t\tthis.ledger = args.ledger;\n\t}\n\n\tasync createChildEnv(req: EnvResolutionRequest): Promise<Record<string, string>> {\n\t\tconst selected = this.collect(req).filter((record) => this.isAllowed(record, req));\n\t\tconst childEnv: Record<string, string> = {};\n\t\tfor (const record of selected) {\n\t\t\tchildEnv[record.key] = record.value;\n\t\t\tawait this.ledger.append({\n\t\t\t\tactionId: req.actionId,\n\t\t\t\ttoolId: req.toolId,\n\t\t\t\tkey: record.key,\n\t\t\t\tsensitivity: record.sensitivity,\n\t\t\t\tfingerprint: record.fingerprint,\n\t\t\t\tpurpose: req.purpose,\n\t\t\t\tpassedToProcess: true,\n\t\t\t\texposedToModel: false,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t});\n\t\t}\n\t\treturn childEnv;\n\t}\n\n\tredactEnvForModel(env: Record<string, string>): Record<string, string> {\n\t\tconst out: Record<string, string> = {};\n\t\tfor (const [key, value] of Object.entries(env)) {\n\t\t\tconst sensitivity = classifyEnvKey(key, value);\n\t\t\tout[key] = sensitivity === \"public\" ? value : `[REDACTED:${sha256(value).slice(0, 12)}]`;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate collect(req: EnvResolutionRequest): EnvRecord[] {\n\t\tconst records: EnvRecord[] = [];\n\t\tfor (const [key, value] of Object.entries(this.processEnv)) {\n\t\t\tif (typeof value !== \"string\") continue;\n\t\t\trecords.push({\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\tsensitivity: classifyEnvKey(key, value),\n\t\t\t\tsource: \"process\",\n\t\t\t\tfingerprint: sha256(value),\n\t\t\t});\n\t\t}\n\t\tfor (const [key, value] of Object.entries(req.extraEnv ?? {})) {\n\t\t\trecords.push({\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\tsensitivity: classifyEnvKey(key, value),\n\t\t\t\tsource: \"tool\",\n\t\t\t\tfingerprint: sha256(value),\n\t\t\t});\n\t\t}\n\t\treturn records;\n\t}\n\n\tprivate isAllowed(record: EnvRecord, req: EnvResolutionRequest): boolean {\n\t\tif (req.profile.env.mode === \"passthrough-full\") return true;\n\t\tif (req.profile.env.mode === \"secret-ref-only\" && record.sensitivity !== \"public\") return false;\n\t\tconst allowedByPattern = matchesAny(record.key, req.profile.env.allowPatterns);\n\t\tconst deniedByPattern = matchesAny(record.key, req.profile.env.denyPatterns);\n\t\tif (deniedByPattern || !allowedByPattern) return false;\n\t\tif (req.requestedKeys?.includes(record.key)) return true;\n\t\tif (req.requestedPatterns?.some((pattern) => globMatch(record.key, pattern))) return true;\n\t\treturn req.profile.env.allowPatterns.includes(\"*\");\n\t}\n}\n\nexport type EvidenceActor = \"agent\" | \"tool\" | \"browser\" | \"extension-host\" | \"mcp\" | \"api\" | \"verifier\" | \"recovery\";\nexport type EvidenceOutcome =\n\t| \"planned\"\n\t| \"executed\"\n\t| \"verified\"\n\t| \"failed_before_commit\"\n\t| \"unknown_after_dispatch\"\n\t| \"reconciled\"\n\t| \"compensated\";\n\nexport interface EvidenceEvent {\n\tsequence: number;\n\tpreviousHash: string;\n\teventHash: string;\n\ttimestamp: string;\n\tsessionId: string;\n\ttaskId: string;\n\tactionId?: string;\n\tactor: EvidenceActor;\n\tkind: string;\n\tinputHash?: string;\n\toutputHash?: string;\n\tredactedOutputHash?: string;\n\tenvUseHash?: string;\n\tpolicyHash?: string;\n\tprofileHash?: string;\n\tschemaHash?: string;\n\toutcome?: EvidenceOutcome;\n}\n\nexport type EvidenceEventInput = Omit<\n\tEvidenceEvent,\n\t\"sequence\" | \"previousHash\" | \"eventHash\" | \"timestamp\" | \"sessionId\" | \"taskId\"\n>;\n\nexport class EvidenceLedger {\n\tprivate readonly sessionId: string;\n\tprivate readonly taskId: string;\n\tprivate readonly events: EvidenceEvent[] = [];\n\tprivate previousHash = \"genesis\";\n\n\tconstructor(args: { sessionId: string; taskId: string }) {\n\t\tthis.sessionId = args.sessionId;\n\t\tthis.taskId = args.taskId;\n\t}\n\n\tasync append(event: EvidenceEventInput): Promise<EvidenceEvent> {\n\t\tconst fullWithoutHash = {\n\t\t\t...event,\n\t\t\tsequence: this.events.length + 1,\n\t\t\tpreviousHash: this.previousHash,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsessionId: this.sessionId,\n\t\t\ttaskId: this.taskId,\n\t\t};\n\t\tconst eventHash = canonicalHash(fullWithoutHash);\n\t\tconst full: EvidenceEvent = { ...fullWithoutHash, eventHash };\n\t\tthis.events.push(full);\n\t\tthis.previousHash = eventHash;\n\t\treturn full;\n\t}\n\n\tsnapshot(): EvidenceEvent[] {\n\t\treturn this.events.map((event) => ({ ...event }));\n\t}\n}\n\nexport type Postcondition =\n\t| { kind: \"url\"; origin?: string; path?: string; pattern?: string }\n\t| { kind: \"text\"; exact?: string; pattern?: string }\n\t| { kind: \"element-visible\"; ref?: string; role?: string; name?: string }\n\t| { kind: \"element-value\"; ref: string; expected: string }\n\t| { kind: \"api-status\"; status: number }\n\t| { kind: \"api-json\"; jsonPath: string; expected: unknown }\n\t| { kind: \"file-exists\"; path: string; sha256?: string }\n\t| { kind: \"download\"; path: string; sha256?: string; mimeType?: string }\n\t| { kind: \"receipt\"; idPattern: string }\n\t| { kind: \"database\"; queryId: string; expectedHash: string };\n\nexport interface VerificationContext {\n\tcurrentUrl?: string;\n\ttext?: string;\n\telements?: Array<{ ref?: string; role?: string; name?: string; value?: string; visible?: boolean }>;\n\tapiStatus?: number;\n\tapiBody?: unknown;\n\treceiptId?: string;\n\tdatabaseHashes?: Record<string, string>;\n}\n\nexport interface EvidencePointer {\n\tkind: string;\n\tdescription: string;\n\tsha256?: string;\n}\n\nexport interface VerificationResult {\n\tpass: boolean;\n\tconfidence: number;\n\tevidencePointers: EvidencePointer[];\n\tfailures: string[];\n\treceiptId?: string;\n}\n\nexport class PostconditionVerifier {\n\tasync verify(conditions: Postcondition[], ctx: VerificationContext): Promise<VerificationResult> {\n\t\tif (conditions.length === 0) {\n\t\t\treturn { pass: false, confidence: 0, evidencePointers: [], failures: [\"no postconditions\"] };\n\t\t}\n\t\tconst results: VerificationResult[] = [];\n\t\tfor (const condition of conditions) {\n\t\t\tresults.push(await this.verifyOne(condition, ctx));\n\t\t}\n\t\treturn {\n\t\t\tpass: results.every((result) => result.pass),\n\t\t\tconfidence: Math.min(...results.map((result) => result.confidence)),\n\t\t\tevidencePointers: results.flatMap((result) => result.evidencePointers),\n\t\t\tfailures: results.flatMap((result) => result.failures),\n\t\t\treceiptId: results.find((result) => result.receiptId)?.receiptId,\n\t\t};\n\t}\n\n\tprivate async verifyOne(condition: Postcondition, ctx: VerificationContext): Promise<VerificationResult> {\n\t\tswitch (condition.kind) {\n\t\t\tcase \"api-status\":\n\t\t\t\treturn booleanResult(ctx.apiStatus === condition.status, \"api-status\", `status ${condition.status}`);\n\t\t\tcase \"api-json\": {\n\t\t\t\tconst actual = readJsonPath(ctx.apiBody, condition.jsonPath);\n\t\t\t\treturn booleanResult(deepEqual(actual, condition.expected), \"api-json\", condition.jsonPath);\n\t\t\t}\n\t\t\tcase \"text\": {\n\t\t\t\tconst text = ctx.text ?? \"\";\n\t\t\t\tconst pass =\n\t\t\t\t\tcondition.exact !== undefined\n\t\t\t\t\t\t? text.includes(condition.exact)\n\t\t\t\t\t\t: condition.pattern !== undefined && new RegExp(condition.pattern).test(text);\n\t\t\t\treturn booleanResult(pass, \"text\", condition.exact ?? condition.pattern ?? \"<missing>\");\n\t\t\t}\n\t\t\tcase \"url\": {\n\t\t\t\tconst currentUrl = ctx.currentUrl;\n\t\t\t\tif (typeof currentUrl !== \"string\") {\n\t\t\t\t\treturn booleanResult(false, \"url\", \"<missing>\");\n\t\t\t\t}\n\t\t\t\tconst parsedUrl = new URL(currentUrl);\n\t\t\t\tlet pass = true;\n\t\t\t\tif (condition.origin) pass = parsedUrl.origin === condition.origin;\n\t\t\t\tif (pass && condition.path) pass = parsedUrl.pathname === condition.path;\n\t\t\t\tif (pass && condition.pattern) pass = new RegExp(condition.pattern).test(currentUrl);\n\t\t\t\treturn booleanResult(pass, \"url\", currentUrl ?? \"<missing>\");\n\t\t\t}\n\t\t\tcase \"file-exists\":\n\t\t\t\treturn verifyFile(condition.path, condition.sha256, \"file-exists\");\n\t\t\tcase \"download\":\n\t\t\t\treturn verifyFile(condition.path, condition.sha256, \"download\");\n\t\t\tcase \"receipt\": {\n\t\t\t\tconst receiptId = ctx.receiptId;\n\t\t\t\tconst pass = typeof receiptId === \"string\" && new RegExp(condition.idPattern).test(receiptId);\n\t\t\t\treturn { ...booleanResult(pass, \"receipt\", receiptId ?? \"<missing>\"), receiptId };\n\t\t\t}\n\t\t\tcase \"database\": {\n\t\t\t\tconst actualHash = ctx.databaseHashes?.[condition.queryId];\n\t\t\t\treturn booleanResult(actualHash === condition.expectedHash, \"database\", condition.queryId);\n\t\t\t}\n\t\t\tcase \"element-visible\": {\n\t\t\t\tconst pass = (ctx.elements ?? []).some(\n\t\t\t\t\t(element) =>\n\t\t\t\t\t\telement.visible === true &&\n\t\t\t\t\t\t(condition.ref === undefined || element.ref === condition.ref) &&\n\t\t\t\t\t\t(condition.role === undefined || element.role === condition.role) &&\n\t\t\t\t\t\t(condition.name === undefined || element.name === condition.name),\n\t\t\t\t);\n\t\t\t\treturn booleanResult(pass, \"element-visible\", condition.ref ?? condition.role ?? condition.name ?? \"<any>\");\n\t\t\t}\n\t\t\tcase \"element-value\": {\n\t\t\t\tconst pass = (ctx.elements ?? []).some(\n\t\t\t\t\t(element) => element.ref === condition.ref && element.value === condition.expected,\n\t\t\t\t);\n\t\t\t\treturn booleanResult(pass, \"element-value\", condition.ref);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface ApiAction {\n\tactionId: string;\n\tmethod: ApiMethod;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody?: unknown;\n\tcredentialRefs: string[];\n\texpectedPostconditions: Postcondition[];\n\tidempotencyKey?: string;\n}\n\nexport interface ApiOutcome {\n\tkind: \"succeeded\" | \"failed_before_commit\" | \"succeeded_unverified\" | \"unknown_after_dispatch\";\n\tstatus?: number;\n\tbodyHash?: string;\n\treceiptId?: string;\n\tredactedBody?: unknown;\n}\n\nexport interface BrokerFetchRequest {\n\tmethod: ApiMethod;\n\theaders: Record<string, string>;\n\tbody?: string;\n\tsignal?: AbortSignal;\n}\n\nexport interface BrokerFetchResponse {\n\tstatus: number;\n\tjson(): Promise<unknown>;\n\ttext(): Promise<string>;\n}\n\nexport type BrokerFetcher = (url: string, init: BrokerFetchRequest) => Promise<BrokerFetchResponse>;\n\nexport class ApiBroker {\n\tprivate readonly ledger: EvidenceLedger;\n\tprivate readonly verifier: PostconditionVerifier;\n\tprivate readonly fetcher: BrokerFetcher;\n\n\tconstructor(args: { ledger: EvidenceLedger; verifier: PostconditionVerifier; fetcher?: BrokerFetcher }) {\n\t\tthis.ledger = args.ledger;\n\t\tthis.verifier = args.verifier;\n\t\tthis.fetcher = args.fetcher ?? defaultFetcher;\n\t}\n\n\tasync execute(\n\t\taction: ApiAction,\n\t\tctx: { signal?: AbortSignal; profile?: AutonomyProfile } = {},\n\t): Promise<ApiOutcome> {\n\t\tconst idempotencyKey = action.idempotencyKey ?? deriveIdempotencyKey(action);\n\t\tconst headers = { ...action.headers, \"Idempotency-Key\": idempotencyKey, \"X-OMK-Action-Id\": action.actionId };\n\t\tawait this.ledger.append({\n\t\t\tactor: \"api\",\n\t\t\tkind: \"api.dispatch.planned\",\n\t\t\tactionId: action.actionId,\n\t\t\tinputHash: canonicalHash({ method: action.method, url: action.url, headers, body: action.body }),\n\t\t\toutcome: \"planned\",\n\t\t});\n\n\t\tlet response: BrokerFetchResponse;\n\t\ttry {\n\t\t\tresponse = await this.fetcher(action.url, {\n\t\t\t\tmethod: action.method,\n\t\t\t\theaders,\n\t\t\t\tbody: action.body === undefined ? undefined : JSON.stringify(action.body),\n\t\t\t\tsignal: ctx.signal,\n\t\t\t});\n\t\t} catch {\n\t\t\treturn this.reconcileUnknown(action, idempotencyKey, ctx.profile ?? AUTOPILOT_MAX);\n\t\t}\n\n\t\tconst rawBody = await safeReadJsonOrText(response);\n\t\tconst redactedBody = redactForModel(rawBody);\n\t\tawait this.ledger.append({\n\t\t\tactor: \"api\",\n\t\t\tkind: \"api.response\",\n\t\t\tactionId: action.actionId,\n\t\t\toutputHash: canonicalHash(rawBody),\n\t\t\tredactedOutputHash: canonicalHash(redactedBody),\n\t\t\toutcome: \"executed\",\n\t\t});\n\t\tconst verification = await this.verifier.verify(action.expectedPostconditions, {\n\t\t\tapiStatus: response.status,\n\t\t\tapiBody: rawBody,\n\t\t\treceiptId: readReceiptId(rawBody),\n\t\t});\n\t\tif (!verification.pass) {\n\t\t\treturn {\n\t\t\t\tkind: \"succeeded_unverified\",\n\t\t\t\tstatus: response.status,\n\t\t\t\tbodyHash: canonicalHash(rawBody),\n\t\t\t\tredactedBody,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"succeeded\",\n\t\t\tstatus: response.status,\n\t\t\tbodyHash: canonicalHash(rawBody),\n\t\t\treceiptId: verification.receiptId,\n\t\t\tredactedBody,\n\t\t};\n\t}\n\n\tprivate async reconcileUnknown(\n\t\taction: ApiAction,\n\t\tidempotencyKey: string,\n\t\tprofile: AutonomyProfile,\n\t): Promise<ApiOutcome> {\n\t\tfor (let attempt = 0; attempt < profile.browser.maxUnknownOutcomeReconciliations; attempt++) {\n\t\t\tconst verification = await this.verifier.verify(action.expectedPostconditions, { receiptId: idempotencyKey });\n\t\t\tif (verification.pass) {\n\t\t\t\tawait this.ledger.append({\n\t\t\t\t\tactor: \"recovery\",\n\t\t\t\t\tkind: \"api.unknown.reconciled\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\toutcome: \"reconciled\",\n\t\t\t\t});\n\t\t\t\treturn { kind: \"succeeded\", receiptId: verification.receiptId };\n\t\t\t}\n\t\t}\n\t\tawait this.ledger.append({\n\t\t\tactor: \"recovery\",\n\t\t\tkind: \"api.unknown.unresolved\",\n\t\t\tactionId: action.actionId,\n\t\t\toutcome: \"unknown_after_dispatch\",\n\t\t});\n\t\treturn { kind: \"unknown_after_dispatch\" };\n\t}\n}\n\nexport interface ExecutionStrategy {\n\texecute: boolean;\n\trequirePostcondition: boolean;\n\trequireIdempotency: boolean;\n\trecovery: \"retry\" | \"repair\" | \"reconcile-and-compensate\";\n\tevidenceDepth: \"minimal\" | \"normal\" | \"deep\" | \"forensic\";\n}\n\nexport function strategyForRisk(risk: RiskLevel): ExecutionStrategy {\n\tif (risk === \"R0\") {\n\t\treturn {\n\t\t\texecute: true,\n\t\t\trequirePostcondition: false,\n\t\t\trequireIdempotency: false,\n\t\t\trecovery: \"retry\",\n\t\t\tevidenceDepth: \"minimal\",\n\t\t};\n\t}\n\tif (risk === \"R1\") {\n\t\treturn {\n\t\t\texecute: true,\n\t\t\trequirePostcondition: true,\n\t\t\trequireIdempotency: false,\n\t\t\trecovery: \"retry\",\n\t\t\tevidenceDepth: \"normal\",\n\t\t};\n\t}\n\tif (risk === \"R2\") {\n\t\treturn {\n\t\t\texecute: true,\n\t\t\trequirePostcondition: true,\n\t\t\trequireIdempotency: true,\n\t\t\trecovery: \"repair\",\n\t\t\tevidenceDepth: \"deep\",\n\t\t};\n\t}\n\treturn {\n\t\texecute: true,\n\t\trequirePostcondition: true,\n\t\trequireIdempotency: true,\n\t\trecovery: \"reconcile-and-compensate\",\n\t\tevidenceDepth: \"forensic\",\n\t};\n}\n\nexport interface ToolExecutionNeed {\n\tactionId: string;\n\trequiredCapability: Capability;\n\trisk: RiskLevel;\n\trequiredPostconditions: Postcondition[];\n\tcontextFingerprint?: string;\n}\n\nexport interface ToolExecutionCandidate {\n\ttoolId: string;\n\tcapability: Capability;\n\tschemaHash: string;\n\treliability: number;\n\tverificationStrength: number;\n\tavgLatencyMs: number;\n\tcostUsd: number;\n\tsupportsIdempotency: boolean;\n\tenabled: boolean;\n\tcontextFingerprint?: string;\n}\n\nexport interface ToolExecutionChoice {\n\tcandidate: ToolExecutionCandidate;\n\tscore: number;\n\tstrategy: ExecutionStrategy;\n\treasons: string[];\n}\n\nexport class DynamicToolPortfolioOptimizer {\n\trank(candidates: ToolExecutionCandidate[], need: ToolExecutionNeed): ToolExecutionChoice[] {\n\t\treturn candidates\n\t\t\t.filter((candidate) => candidate.enabled && candidate.capability === need.requiredCapability)\n\t\t\t.map((candidate) => this.scoreCandidate(candidate, need))\n\t\t\t.sort((left, right) => right.score - left.score);\n\t}\n\n\tscoreCandidate(candidate: ToolExecutionCandidate, need: ToolExecutionNeed): ToolExecutionChoice {\n\t\tconst strategy = strategyForRisk(need.risk);\n\t\tconst contextMatch =\n\t\t\tneed.contextFingerprint === undefined || candidate.contextFingerprint === need.contextFingerprint ? 1 : 0;\n\t\tconst idempotency = !strategy.requireIdempotency || candidate.supportsIdempotency ? 1 : 0;\n\t\tconst latency = Math.max(0, 1 - candidate.avgLatencyMs / 30000);\n\t\tconst cost = Math.max(0, 1 - candidate.costUsd / Math.max(1, AUTOPILOT_MAX.budgets.maxCostUsd));\n\t\tconst postconditionCoverage = need.requiredPostconditions.length > 0 ? candidate.verificationStrength : 1;\n\t\tconst score =\n\t\t\t0.32 * candidate.reliability +\n\t\t\t0.26 * postconditionCoverage +\n\t\t\t0.16 * idempotency +\n\t\t\t0.12 * contextMatch +\n\t\t\t0.08 * latency +\n\t\t\t0.06 * cost;\n\t\treturn {\n\t\t\tcandidate,\n\t\t\tscore: Number(score.toFixed(4)),\n\t\t\tstrategy,\n\t\t\treasons: [\n\t\t\t\t`reliability=${candidate.reliability}`,\n\t\t\t\t`verification=${postconditionCoverage}`,\n\t\t\t\t`idempotency=${idempotency}`,\n\t\t\t\t`context=${contextMatch}`,\n\t\t\t],\n\t\t};\n\t}\n}\n\nexport class ToolExecutionBroker {\n\tprivate readonly ledger: EvidenceLedger;\n\tprivate readonly profile: AutonomyProfile;\n\tprivate readonly optimizer: DynamicToolPortfolioOptimizer;\n\n\tconstructor(args: {\n\t\tledger: EvidenceLedger;\n\t\tprofile?: AutonomyProfile;\n\t\toptimizer?: DynamicToolPortfolioOptimizer;\n\t}) {\n\t\tthis.ledger = args.ledger;\n\t\tthis.profile = args.profile ?? AUTOPILOT_MAX;\n\t\tthis.optimizer = args.optimizer ?? new DynamicToolPortfolioOptimizer();\n\t}\n\n\tasync select(need: ToolExecutionNeed, candidates: ToolExecutionCandidate[]): Promise<ToolExecutionChoice> {\n\t\tconst choices = this.optimizer.rank(candidates, need);\n\t\tconst choice = choices[0];\n\t\tif (choice === undefined) {\n\t\t\tthrow new Error(`No enabled tool candidate for ${need.requiredCapability}`);\n\t\t}\n\t\tawait this.ledger.append({\n\t\t\tactor: \"tool\",\n\t\t\tkind: \"tool.execution.planned\",\n\t\t\tactionId: need.actionId,\n\t\t\tinputHash: canonicalHash(need),\n\t\t\tpolicyHash: canonicalHash(this.profile),\n\t\t\tschemaHash: choice.candidate.schemaHash,\n\t\t\toutcome: \"planned\",\n\t\t});\n\t\treturn choice;\n\t}\n\n\tasync recordResult(choice: ToolExecutionChoice, result: VerificationResult): Promise<EvidenceEvent> {\n\t\treturn this.ledger.append({\n\t\t\tactor: \"tool\",\n\t\t\tkind: \"tool.execution.result\",\n\t\t\tactionId: choice.candidate.toolId,\n\t\t\toutputHash: canonicalHash(result),\n\t\t\tschemaHash: choice.candidate.schemaHash,\n\t\t\toutcome: result.pass ? \"verified\" : \"unknown_after_dispatch\",\n\t\t});\n\t}\n}\n\nexport interface AutomationTraceAction {\n\tkind: \"tool\" | \"browser\" | \"api\" | \"mcp\" | \"extension\";\n\tverificationPass: boolean;\n\tschemaHashMatched?: boolean;\n\tenvUseLedgered?: boolean;\n\ttargetFingerprintMatched?: boolean;\n\toutcome?: \"unknown_after_dispatch\" | \"succeeded\" | \"failed\";\n\treconciled?: boolean;\n}\n\nexport interface AutomationTraceEnvApiUse {\n\tledgered: boolean;\n\texposedToModel: boolean;\n\texposedToLogs: boolean;\n}\n\nexport interface AutomationTraceContextPlan {\n\trenderedTokens: number;\n\tresourceBudget: number;\n\tplanHash: string;\n\trenderedHashLinkedPlanHash: string;\n\toutputReserveCountedOnce: boolean;\n}\n\nexport interface AutomationTrace {\n\tactions: AutomationTraceAction[];\n\tverifications: Array<{ conditionHash: string; pass: boolean }>;\n\thumanPrompts: number;\n\tenvApiUses: AutomationTraceEnvApiUse[];\n\tfailures: number;\n\tunknownOutcomes: number;\n\trecoveredFailures: number;\n\treconciledUnknowns: number;\n\tsecretLeaks: number;\n\tduplicateIrreversibleMutations: number;\n\tunledgeredEnvUses: number;\n\treplayMatches: boolean;\n\tcontextPlans: AutomationTraceContextPlan[];\n}\n\nexport interface AutomationHarnessScoreInput {\n\trequiredPostconditions: Postcondition[];\n\ttrace: AutomationTrace;\n}\n\nexport interface AutomationScoreBreakdown {\n\tscore: number;\n\tverifiedSuccess: boolean;\n\tenvApiUseCorrectness: number;\n\tduplicateMutations: number;\n\tsecretLeaks: number;\n\tcritical: boolean;\n}\n\nexport class AutomationHarnessScorer {\n\tscore(input: AutomationHarnessScoreInput): AutomationScoreBreakdown {\n\t\tconst verifiedSuccess = this.verifiedSuccess(input);\n\t\tconst autonomy = 1 - input.trace.humanPrompts / Math.max(1, input.trace.actions.length);\n\t\tconst toolUse = this.toolUseScore(input.trace);\n\t\tconst browserUse = this.browserUseScore(input.trace);\n\t\tconst envApi = this.envApiScore(input.trace);\n\t\tconst recovery = this.recoveryScore(input.trace);\n\t\tconst determinism = input.trace.replayMatches ? 1 : 0;\n\t\tconst context = this.contextScore(input.trace);\n\t\tconst critical =\n\t\t\tinput.trace.secretLeaks > 0 ||\n\t\t\tinput.trace.duplicateIrreversibleMutations > 0 ||\n\t\t\t(input.requiredPostconditions.length > 0 && verifiedSuccess < 1) ||\n\t\t\t!input.trace.replayMatches ||\n\t\t\tinput.trace.unledgeredEnvUses > 0 ||\n\t\t\tinput.trace.envApiUses.some((use) => !use.ledgered) ||\n\t\t\tinput.trace.actions.some(\n\t\t\t\t(action) =>\n\t\t\t\t\taction.schemaHashMatched === false ||\n\t\t\t\t\t(action.kind === \"browser\" && action.targetFingerprintMatched === false),\n\t\t\t);\n\t\tconst raw =\n\t\t\t20 * verifiedSuccess +\n\t\t\t15 * autonomy +\n\t\t\t15 * toolUse +\n\t\t\t15 * browserUse +\n\t\t\t10 * envApi +\n\t\t\t10 * recovery +\n\t\t\t10 * determinism +\n\t\t\t5 * context;\n\t\treturn {\n\t\t\tscore: critical ? Math.min(79, raw) : raw,\n\t\t\tverifiedSuccess: verifiedSuccess >= 0.93,\n\t\t\tenvApiUseCorrectness: envApi,\n\t\t\tduplicateMutations: input.trace.duplicateIrreversibleMutations,\n\t\t\tsecretLeaks: input.trace.secretLeaks,\n\t\t\tcritical,\n\t\t};\n\t}\n\n\tprivate verifiedSuccess(input: AutomationHarnessScoreInput): number {\n\t\tconst passed = input.requiredPostconditions.filter((condition) =>\n\t\t\tinput.trace.verifications.some(\n\t\t\t\t(verification) => verification.conditionHash === canonicalHash(condition) && verification.pass,\n\t\t\t),\n\t\t);\n\t\treturn passed.length / Math.max(1, input.requiredPostconditions.length);\n\t}\n\n\tprivate toolUseScore(trace: AutomationTrace): number {\n\t\tconst calls = trace.actions.filter((action) => action.kind === \"tool\");\n\t\tif (calls.length === 0) return 1;\n\t\tconst verified = calls.filter((action) => action.verificationPass).length;\n\t\tconst schemaStable = calls.filter((action) => action.schemaHashMatched === true).length;\n\t\tconst envLedgered = calls.filter((action) => action.envUseLedgered === true).length;\n\t\treturn (verified + schemaStable + envLedgered) / (3 * calls.length);\n\t}\n\n\tprivate browserUseScore(trace: AutomationTrace): number {\n\t\tconst actions = trace.actions.filter((action) => action.kind === \"browser\");\n\t\tif (actions.length === 0) return 1;\n\t\tconst verified = actions.filter((action) => action.verificationPass).length;\n\t\tconst targetStable = actions.filter((action) => action.targetFingerprintMatched === true).length;\n\t\tconst unknownResolved = actions.filter(\n\t\t\t(action) => action.outcome !== \"unknown_after_dispatch\" || action.reconciled === true,\n\t\t).length;\n\t\treturn (verified + targetStable + unknownResolved) / (3 * actions.length);\n\t}\n\n\tprivate envApiScore(trace: AutomationTrace): number {\n\t\tif (trace.envApiUses.length === 0) return 1;\n\t\tconst ledgered = trace.envApiUses.filter((use) => use.ledgered).length;\n\t\tconst notLeaked = trace.envApiUses.filter((use) => !use.exposedToModel && !use.exposedToLogs).length;\n\t\treturn (ledgered + notLeaked) / (2 * trace.envApiUses.length);\n\t}\n\n\tprivate recoveryScore(trace: AutomationTrace): number {\n\t\tconst failures = trace.failures + trace.unknownOutcomes;\n\t\tif (failures === 0) return 1;\n\t\treturn (trace.recoveredFailures + trace.reconciledUnknowns) / failures;\n\t}\n\n\tprivate contextScore(trace: AutomationTrace): number {\n\t\tif (trace.contextPlans.length === 0) return 1;\n\t\tconst valid = trace.contextPlans.filter(\n\t\t\t(plan) =>\n\t\t\t\tplan.renderedTokens <= plan.resourceBudget &&\n\t\t\t\tplan.planHash === plan.renderedHashLinkedPlanHash &&\n\t\t\t\tplan.outputReserveCountedOnce,\n\t\t).length;\n\t\treturn valid / trace.contextPlans.length;\n\t}\n}\n\nexport function classifyEnvKey(key: string, value: string): Sensitivity {\n\tconst normalizedKey = key.toUpperCase();\n\tif (\n\t\tnormalizedKey.includes(\"TOKEN\") ||\n\t\tnormalizedKey.includes(\"SECRET\") ||\n\t\tnormalizedKey.includes(\"PASSWORD\") ||\n\t\tnormalizedKey.includes(\"API_KEY\") ||\n\t\tnormalizedKey.endsWith(\"_KEY\") ||\n\t\tnormalizedKey.startsWith(\"AWS_\") ||\n\t\tnormalizedKey.startsWith(\"GCP_\") ||\n\t\tnormalizedKey.startsWith(\"AZURE_\") ||\n\t\tnormalizedKey.startsWith(\"OPENAI_\") ||\n\t\tnormalizedKey.startsWith(\"ANTHROPIC_\") ||\n\t\tnormalizedKey.startsWith(\"GITHUB_\") ||\n\t\tnormalizedKey.startsWith(\"NPM_\")\n\t) {\n\t\treturn \"credential\";\n\t}\n\tif (looksLikePaymentCredential(value)) return \"payment\";\n\tif (looksLikeSessionCookie(value)) return \"session\";\n\treturn \"public\";\n}\n\nexport function canonicalHash(value: unknown): string {\n\treturn sha256(stableStringify(value));\n}\n\nexport function redactForModel(value: unknown): unknown {\n\tif (typeof value === \"string\") return redactString(value);\n\tif (Array.isArray(value)) return value.map((item) => redactForModel(item));\n\tif (isRecord(value)) {\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [key, child] of Object.entries(value)) {\n\t\t\tout[key] =\n\t\t\t\tclassifyEnvKey(key, typeof child === \"string\" ? child : \"\") === \"public\"\n\t\t\t\t\t? redactForModel(child)\n\t\t\t\t\t: \"[REDACTED]\";\n\t\t}\n\t\treturn out;\n\t}\n\treturn value;\n}\n\nfunction booleanResult(pass: boolean, kind: string, description: string): VerificationResult {\n\treturn {\n\t\tpass,\n\t\tconfidence: pass ? 1 : 0,\n\t\tevidencePointers: pass ? [{ kind, description }] : [],\n\t\tfailures: pass ? [] : [`${kind} postcondition failed: ${description}`],\n\t};\n}\n\nasync function verifyFile(path: string, expectedHash: string | undefined, kind: string): Promise<VerificationResult> {\n\ttry {\n\t\tawait stat(path);\n\t\tconst content = await readFile(path);\n\t\tconst actualHash = createHash(\"sha256\").update(content).digest(\"hex\");\n\t\tconst pass = expectedHash === undefined || expectedHash === actualHash;\n\t\treturn {\n\t\t\tpass,\n\t\t\tconfidence: pass ? 1 : 0,\n\t\t\tevidencePointers: pass ? [{ kind, description: path, sha256: actualHash }] : [],\n\t\t\tfailures: pass ? [] : [`${kind} hash mismatch for ${path}`],\n\t\t};\n\t} catch {\n\t\treturn { pass: false, confidence: 0, evidencePointers: [], failures: [`${kind} missing: ${path}`] };\n\t}\n}\n\nfunction readJsonPath(value: unknown, path: string): unknown {\n\tif (path === \"$\") return value;\n\tif (!path.startsWith(\"$.\")) return undefined;\n\tlet current = value;\n\tfor (const segment of path.slice(2).split(\".\")) {\n\t\tif (!isRecord(current)) return undefined;\n\t\tcurrent = current[segment];\n\t}\n\treturn current;\n}\n\nfunction readReceiptId(value: unknown): string | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst receipt = value.receiptId ?? value.id;\n\treturn typeof receipt === \"string\" ? receipt : undefined;\n}\n\nasync function safeReadJsonOrText(response: BrokerFetchResponse): Promise<unknown> {\n\ttry {\n\t\treturn await response.json();\n\t} catch {\n\t\treturn response.text();\n\t}\n}\n\nfunction deriveIdempotencyKey(action: ApiAction): string {\n\treturn `omk-${canonicalHash({ method: action.method, url: action.url, body: action.body, actionId: action.actionId }).slice(0, 24)}`;\n}\n\nasync function defaultFetcher(url: string, init: BrokerFetchRequest): Promise<BrokerFetchResponse> {\n\tconst response = await fetch(url, init);\n\treturn {\n\t\tstatus: response.status,\n\t\tjson: () => response.json() as Promise<unknown>,\n\t\ttext: () => response.text(),\n\t};\n}\n\nfunction redactString(value: string): string {\n\treturn value\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]{8,}/g, \"Bearer [REDACTED]\")\n\t\t.replace(/([?&]?(?:access_)?token=)[^&\\s]+/gi, \"$1[REDACTED]\")\n\t\t.replace(/((?:api[_-]?key|password|secret)=)[^&\\s]+/gi, \"$1[REDACTED]\");\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n\treturn stableStringify(left) === stableStringify(right);\n}\n\nfunction stableStringify(value: unknown): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value);\n\tif (Array.isArray(value)) return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n\tconst record = value as Record<string, unknown>;\n\treturn `{${Object.keys(record)\n\t\t.sort()\n\t\t.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n\t\t.join(\",\")}}`;\n}\n\nfunction matchesAny(value: string, patterns: string[]): boolean {\n\treturn patterns.some((pattern) => pattern === \"*\" || globMatch(value, pattern));\n}\n\nfunction globMatch(value: string, pattern: string): boolean {\n\tconst escaped = pattern\n\t\t.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\t\t.replace(/\\*/g, \".*\")\n\t\t.replace(/\\?/g, \".\");\n\treturn new RegExp(`^${escaped}$`, \"i\").test(value);\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction looksLikePaymentCredential(value: string): boolean {\n\treturn /\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\\b/.test(value);\n}\n\nfunction looksLikeSessionCookie(value: string): boolean {\n\treturn value.length >= 32 && /[A-Za-z0-9+/=_-]{32,}/.test(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,26 @@
1
+ export interface BangSkillRegistry {
2
+ hasSkill(name: string): boolean;
3
+ }
4
+ export type BangInvocation = {
5
+ kind: "plain";
6
+ prompt: string;
7
+ } | {
8
+ kind: "empty";
9
+ } | {
10
+ kind: "bash";
11
+ command: string;
12
+ includeContext: boolean;
13
+ } | {
14
+ kind: "skill";
15
+ skillName: string;
16
+ prompt: string;
17
+ activeSkillNames: readonly string[];
18
+ source: "bang";
19
+ } | {
20
+ kind: "unknownSkill";
21
+ skillName: string;
22
+ prompt: string;
23
+ source: "bang";
24
+ };
25
+ export declare function parseBangInvocation(input: string, registry: BangSkillRegistry): BangInvocation;
26
+ //# sourceMappingURL=bang-skill-invocation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bang-skill-invocation.d.ts","sourceRoot":"","sources":["../../src/core/bang-skill-invocation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,cAAc,CAuD9F","sourcesContent":["export interface BangSkillRegistry {\n\thasSkill(name: string): boolean;\n}\n\nexport type BangInvocation =\n\t| { kind: \"plain\"; prompt: string }\n\t| { kind: \"empty\" }\n\t| { kind: \"bash\"; command: string; includeContext: boolean }\n\t| { kind: \"skill\"; skillName: string; prompt: string; activeSkillNames: readonly string[]; source: \"bang\" }\n\t| { kind: \"unknownSkill\"; skillName: string; prompt: string; source: \"bang\" };\n\nexport function parseBangInvocation(input: string, registry: BangSkillRegistry): BangInvocation {\n\tif (!input.startsWith(\"!\")) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (input.startsWith(\"!!\")) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: false } : { kind: \"empty\" };\n\t}\n\n\tconst second = input[1];\n\tif (second === undefined) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (/\\s/.test(second)) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n\t}\n\n\tconst body = input.slice(1);\n\tif (body.startsWith(\"skill:\")) {\n\t\tconst explicit = body.slice(\"skill:\".length);\n\t\tconst { token: skillName, rest } = splitFirstToken(explicit);\n\t\tif (!skillName) {\n\t\t\treturn { kind: \"plain\", prompt: input };\n\t\t}\n\t\tif (!registry.hasSkill(skillName)) {\n\t\t\treturn { kind: \"unknownSkill\", skillName, prompt: rest, source: \"bang\" };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst { token: skillName, rest } = splitFirstToken(body);\n\tif (!skillName) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\tif (registry.hasSkill(skillName)) {\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst command = body.trim();\n\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n}\n\nfunction splitFirstToken(input: string): { token: string; rest: string } {\n\tconst trimmed = input.trimStart();\n\tconst match = /^([^\\s]+)(?:\\s+([\\s\\S]*))?$/.exec(trimmed);\n\tif (!match) {\n\t\treturn { token: \"\", rest: \"\" };\n\t}\n\treturn { token: match[1] ?? \"\", rest: match[2]?.trimStart() ?? \"\" };\n}\n"]}
@@ -0,0 +1,59 @@
1
+ export function parseBangInvocation(input, registry) {
2
+ if (!input.startsWith("!")) {
3
+ return { kind: "plain", prompt: input };
4
+ }
5
+ if (input.startsWith("!!")) {
6
+ const command = input.slice(2).trim();
7
+ return command ? { kind: "bash", command, includeContext: false } : { kind: "empty" };
8
+ }
9
+ const second = input[1];
10
+ if (second === undefined) {
11
+ return { kind: "plain", prompt: input };
12
+ }
13
+ if (/\s/.test(second)) {
14
+ const command = input.slice(2).trim();
15
+ return command ? { kind: "bash", command, includeContext: true } : { kind: "empty" };
16
+ }
17
+ const body = input.slice(1);
18
+ if (body.startsWith("skill:")) {
19
+ const explicit = body.slice("skill:".length);
20
+ const { token: skillName, rest } = splitFirstToken(explicit);
21
+ if (!skillName) {
22
+ return { kind: "plain", prompt: input };
23
+ }
24
+ if (!registry.hasSkill(skillName)) {
25
+ return { kind: "unknownSkill", skillName, prompt: rest, source: "bang" };
26
+ }
27
+ return {
28
+ kind: "skill",
29
+ skillName,
30
+ prompt: rest,
31
+ activeSkillNames: [skillName],
32
+ source: "bang",
33
+ };
34
+ }
35
+ const { token: skillName, rest } = splitFirstToken(body);
36
+ if (!skillName) {
37
+ return { kind: "plain", prompt: input };
38
+ }
39
+ if (registry.hasSkill(skillName)) {
40
+ return {
41
+ kind: "skill",
42
+ skillName,
43
+ prompt: rest,
44
+ activeSkillNames: [skillName],
45
+ source: "bang",
46
+ };
47
+ }
48
+ const command = body.trim();
49
+ return command ? { kind: "bash", command, includeContext: true } : { kind: "empty" };
50
+ }
51
+ function splitFirstToken(input) {
52
+ const trimmed = input.trimStart();
53
+ const match = /^([^\s]+)(?:\s+([\s\S]*))?$/.exec(trimmed);
54
+ if (!match) {
55
+ return { token: "", rest: "" };
56
+ }
57
+ return { token: match[1] ?? "", rest: match[2]?.trimStart() ?? "" };
58
+ }
59
+ //# sourceMappingURL=bang-skill-invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bang-skill-invocation.js","sourceRoot":"","sources":["../../src/core/bang-skill-invocation.ts"],"names":[],"mappings":"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","sourcesContent":["export interface BangSkillRegistry {\n\thasSkill(name: string): boolean;\n}\n\nexport type BangInvocation =\n\t| { kind: \"plain\"; prompt: string }\n\t| { kind: \"empty\" }\n\t| { kind: \"bash\"; command: string; includeContext: boolean }\n\t| { kind: \"skill\"; skillName: string; prompt: string; activeSkillNames: readonly string[]; source: \"bang\" }\n\t| { kind: \"unknownSkill\"; skillName: string; prompt: string; source: \"bang\" };\n\nexport function parseBangInvocation(input: string, registry: BangSkillRegistry): BangInvocation {\n\tif (!input.startsWith(\"!\")) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (input.startsWith(\"!!\")) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: false } : { kind: \"empty\" };\n\t}\n\n\tconst second = input[1];\n\tif (second === undefined) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (/\\s/.test(second)) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n\t}\n\n\tconst body = input.slice(1);\n\tif (body.startsWith(\"skill:\")) {\n\t\tconst explicit = body.slice(\"skill:\".length);\n\t\tconst { token: skillName, rest } = splitFirstToken(explicit);\n\t\tif (!skillName) {\n\t\t\treturn { kind: \"plain\", prompt: input };\n\t\t}\n\t\tif (!registry.hasSkill(skillName)) {\n\t\t\treturn { kind: \"unknownSkill\", skillName, prompt: rest, source: \"bang\" };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst { token: skillName, rest } = splitFirstToken(body);\n\tif (!skillName) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\tif (registry.hasSkill(skillName)) {\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst command = body.trim();\n\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n}\n\nfunction splitFirstToken(input: string): { token: string; rest: string } {\n\tconst trimmed = input.trimStart();\n\tconst match = /^([^\\s]+)(?:\\s+([\\s\\S]*))?$/.exec(trimmed);\n\tif (!match) {\n\t\treturn { token: \"\", rest: \"\" };\n\t}\n\treturn { token: match[1] ?? \"\", rest: match[2]?.trimStart() ?? \"\" };\n}\n"]}
@@ -1,8 +1,10 @@
1
1
  import { EventEmitter } from "events";
2
+ import { type Postcondition, type VerificationResult } from "./automation/index.ts";
2
3
  export interface BrowserTask {
3
4
  url: string;
4
5
  task: string;
5
6
  sessionId?: string;
7
+ postconditions?: Postcondition[];
6
8
  }
7
9
  export interface PageState {
8
10
  url: string;
@@ -12,6 +14,9 @@ export interface PageState {
12
14
  action: string;
13
15
  fields: string[];
14
16
  }[];
17
+ text?: string;
18
+ status?: number;
19
+ error?: string;
15
20
  }
16
21
  export interface BrowserUseResult {
17
22
  success: boolean;
@@ -22,6 +27,8 @@ export interface BrowserUseResult {
22
27
  safety: number;
23
28
  overallScore: number;
24
29
  screenshot?: string;
30
+ verification: VerificationResult;
31
+ repairsAttempted: number;
25
32
  }
26
33
  export declare class BrowserUseEngine extends EventEmitter {
27
34
  navigate(url: string): Promise<PageState>;
@@ -37,6 +44,7 @@ export declare class BrowserUseAgent extends EventEmitter {
37
44
  private engine;
38
45
  private evaluator;
39
46
  private sessions;
47
+ private verifier;
40
48
  constructor();
41
49
  execute(task: BrowserTask): Promise<BrowserUseResult>;
42
50
  getSession(sessionId: string): PageState | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"browser-use.d.ts","sourceRoot":"","sources":["../../src/core/browser-use.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAS9C;IAED,OAAO,CAAC,SAAS;CAejB;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACpD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAGrE;CACD;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAqC;IAErD,cAIC;IAEK,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkB1D;IAED,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEnD;CACD;AAED,eAAe,eAAe,CAAC","sourcesContent":["// OMK v6.2 Browser Use Agent (TypeScript)\n// ============================================\n// packages/coding-agent/src/core/browser-use.ts\n//\n// Browser Use 오픈소스 통합 에이전트.\n\nimport { EventEmitter } from \"events\";\n\nexport interface BrowserTask {\n\turl: string;\n\ttask: string;\n\tsessionId?: string;\n}\n\nexport interface PageState {\n\turl: string;\n\ttitle: string;\n\tlinks: string[];\n\tforms: { action: string; fields: string[] }[];\n}\n\nexport interface BrowserUseResult {\n\tsuccess: boolean;\n\tpageState: PageState;\n\ttaskCompletion: number;\n\tpageQuality: number;\n\tnavEfficiency: number;\n\tsafety: number;\n\toverallScore: number;\n\tscreenshot?: string;\n}\n\nexport class BrowserUseEngine extends EventEmitter {\n\tasync navigate(url: string): Promise<PageState> {\n\t\t// curl 기반 HTTP + 정규식 HTML 파싱\n\t\tconst { execSync } = require(\"child_process\");\n\t\ttry {\n\t\t\tconst html = execSync(`curl -sL \"${url}\" --max-time 10`, { encoding: \"utf-8\" });\n\t\t\treturn this.parseHTML(html, url);\n\t\t} catch {\n\t\t\treturn { url, title: \"Error\", links: [], forms: [] };\n\t\t}\n\t}\n\n\tprivate parseHTML(html: string, url: string): PageState {\n\t\tconst titleMatch = html.match(/<title>([^<]*)<\\/title>/i);\n\t\tconst links = [...html.matchAll(/href=\"([^\"]+)\"/gi)].map((m) => m[1]).filter((l) => l.startsWith(\"http\"));\n\t\tconst forms = [...html.matchAll(/<form[^>]*action=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/form>/gi)].map((m) => ({\n\t\t\taction: m[1] || url,\n\t\t\tfields: [...m[2].matchAll(/name=\"([^\"]*)\"/gi)].map((f) => f[1]),\n\t\t}));\n\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: titleMatch?.[1] || \"No Title\",\n\t\t\tlinks: [...new Set(links)].slice(0, 20),\n\t\t\tforms,\n\t\t};\n\t}\n}\n\nexport class BrowserUseEvaluator extends EventEmitter {\n\tevaluate(result: BrowserUseResult): { passed: boolean; score: number } {\n\t\tconst passed = result.overallScore >= 0.6 && result.safety >= 0.5;\n\t\treturn { passed, score: result.overallScore };\n\t}\n}\n\nexport class BrowserUseAgent extends EventEmitter {\n\tprivate engine: BrowserUseEngine;\n\tprivate evaluator: BrowserUseEvaluator;\n\tprivate sessions: Map<string, PageState> = new Map();\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.engine = new BrowserUseEngine();\n\t\tthis.evaluator = new BrowserUseEvaluator();\n\t}\n\n\tasync execute(task: BrowserTask): Promise<BrowserUseResult> {\n\t\tconst pageState = await this.engine.navigate(task.url);\n\t\tthis.sessions.set(task.sessionId || \"default\", pageState);\n\n\t\tconst result: BrowserUseResult = {\n\t\t\tsuccess: true,\n\t\t\tpageState,\n\t\t\ttaskCompletion: 0.8,\n\t\t\tpageQuality: 0.7,\n\t\t\tnavEfficiency: 0.9,\n\t\t\tsafety: 0.8,\n\t\t\toverallScore: 0.82,\n\t\t};\n\n\t\tconst evaluation = this.evaluator.evaluate(result);\n\t\tthis.emit(\"taskComplete\", { task, result, evaluation });\n\n\t\treturn result;\n\t}\n\n\tgetSession(sessionId: string): PageState | undefined {\n\t\treturn this.sessions.get(sessionId);\n\t}\n}\n\nexport default BrowserUseAgent;\n"]}
1
+ {"version":3,"file":"browser-use.d.ts","sourceRoot":"","sources":["../../src/core/browser-use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,KAAK,aAAa,EAAyB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3G,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,kBAAkB,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqB9C;IAED,OAAO,CAAC,SAAS;CAyBjB;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACpD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAGrE;CACD;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAwB;IAExC,cAKC;IAEK,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuC1D;IAED,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEnD;CACD;AAED,eAAe,eAAe,CAAC","sourcesContent":["import { EventEmitter } from \"events\";\nimport { type Postcondition, PostconditionVerifier, type VerificationResult } from \"./automation/index.ts\";\n\nexport interface BrowserTask {\n\turl: string;\n\ttask: string;\n\tsessionId?: string;\n\tpostconditions?: Postcondition[];\n}\n\nexport interface PageState {\n\turl: string;\n\ttitle: string;\n\tlinks: string[];\n\tforms: { action: string; fields: string[] }[];\n\ttext?: string;\n\tstatus?: number;\n\terror?: string;\n}\n\nexport interface BrowserUseResult {\n\tsuccess: boolean;\n\tpageState: PageState;\n\ttaskCompletion: number;\n\tpageQuality: number;\n\tnavEfficiency: number;\n\tsafety: number;\n\toverallScore: number;\n\tscreenshot?: string;\n\tverification: VerificationResult;\n\trepairsAttempted: number;\n}\n\nexport class BrowserUseEngine extends EventEmitter {\n\tasync navigate(url: string): Promise<PageState> {\n\t\ttry {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst timeout = setTimeout(() => controller.abort(), 10000);\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url, { signal: controller.signal });\n\t\t\t\tconst html = await response.text();\n\t\t\t\treturn this.parseHTML(html, response.url || url, response.status);\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\turl,\n\t\t\t\ttitle: \"Error\",\n\t\t\t\tlinks: [],\n\t\t\t\tforms: [],\n\t\t\t\ttext: \"\",\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate parseHTML(html: string, url: string, status: number): PageState {\n\t\tconst titleMatch = html.match(/<title>([^<]*)<\\/title>/i);\n\t\tconst links = [...html.matchAll(/href=\"([^\"]+)\"/gi)]\n\t\t\t.map((match) => match[1])\n\t\t\t.filter((link) => link.startsWith(\"http\"));\n\t\tconst forms = [...html.matchAll(/<form[^>]*action=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/form>/gi)].map((match) => ({\n\t\t\taction: match[1] || url,\n\t\t\tfields: [...match[2].matchAll(/name=\"([^\"]*)\"/gi)].map((field) => field[1]),\n\t\t}));\n\t\tconst text = html\n\t\t\t.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n\t\t\t.replace(/<style[\\s\\S]*?<\\/style>/gi, \"\")\n\t\t\t.replace(/<[^>]+>/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: titleMatch?.[1] || \"No Title\",\n\t\t\tlinks: [...new Set(links)].slice(0, 20),\n\t\t\tforms,\n\t\t\ttext,\n\t\t\tstatus,\n\t\t};\n\t}\n}\n\nexport class BrowserUseEvaluator extends EventEmitter {\n\tevaluate(result: BrowserUseResult): { passed: boolean; score: number } {\n\t\tconst passed = result.overallScore >= 0.6 && result.safety >= 0.5 && result.verification.pass;\n\t\treturn { passed, score: result.overallScore };\n\t}\n}\n\nexport class BrowserUseAgent extends EventEmitter {\n\tprivate engine: BrowserUseEngine;\n\tprivate evaluator: BrowserUseEvaluator;\n\tprivate sessions: Map<string, PageState> = new Map();\n\tprivate verifier: PostconditionVerifier;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.engine = new BrowserUseEngine();\n\t\tthis.evaluator = new BrowserUseEvaluator();\n\t\tthis.verifier = new PostconditionVerifier();\n\t}\n\n\tasync execute(task: BrowserTask): Promise<BrowserUseResult> {\n\t\tconst pageState = await this.engine.navigate(task.url);\n\t\tthis.sessions.set(task.sessionId || \"default\", pageState);\n\t\tconst verification = await this.verifier.verify(task.postconditions ?? [{ kind: \"text\", pattern: \"\\\\S\" }], {\n\t\t\tcurrentUrl: pageState.url,\n\t\t\ttext: pageState.text ?? \"\",\n\t\t\tapiStatus: pageState.status,\n\t\t});\n\t\tconst observed = pageState.error === undefined && (pageState.status === undefined || pageState.status < 500);\n\t\tconst taskCompletion = verification.pass ? 1 : observed ? 0.4 : 0;\n\t\tconst pageQuality = observed\n\t\t\t? Math.min(\n\t\t\t\t\t1,\n\t\t\t\t\t(pageState.links.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.forms.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.text ? 0.5 : 0),\n\t\t\t\t)\n\t\t\t: 0;\n\t\tconst navEfficiency = observed ? 0.9 : 0;\n\t\tconst safety = verification.failures.length === 0 ? 1 : 0.7;\n\t\tconst overallScore = Number(\n\t\t\t(taskCompletion * 0.45 + pageQuality * 0.2 + navEfficiency * 0.2 + safety * 0.15).toFixed(2),\n\t\t);\n\t\tconst result: BrowserUseResult = {\n\t\t\tsuccess: observed && verification.pass,\n\t\t\tpageState,\n\t\t\ttaskCompletion,\n\t\t\tpageQuality,\n\t\t\tnavEfficiency,\n\t\t\tsafety,\n\t\t\toverallScore,\n\t\t\tverification,\n\t\t\trepairsAttempted: verification.pass ? 0 : 1,\n\t\t};\n\n\t\tconst evaluation = this.evaluator.evaluate(result);\n\t\tthis.emit(\"taskComplete\", { task, result, evaluation });\n\n\t\treturn result;\n\t}\n\n\tgetSession(sessionId: string): PageState | undefined {\n\t\treturn this.sessions.get(sessionId);\n\t}\n}\n\nexport default BrowserUseAgent;\n"]}
@@ -1,39 +1,58 @@
1
- // OMK v6.2 — Browser Use Agent (TypeScript)
2
- // ============================================
3
- // packages/coding-agent/src/core/browser-use.ts
4
- //
5
- // Browser Use 오픈소스 통합 에이전트.
6
1
  import { EventEmitter } from "events";
2
+ import { PostconditionVerifier } from "./automation/index.js";
7
3
  export class BrowserUseEngine extends EventEmitter {
8
4
  async navigate(url) {
9
- // curl 기반 HTTP + 정규식 HTML 파싱
10
- const { execSync } = require("child_process");
11
5
  try {
12
- const html = execSync(`curl -sL "${url}" --max-time 10`, { encoding: "utf-8" });
13
- return this.parseHTML(html, url);
6
+ const controller = new AbortController();
7
+ const timeout = setTimeout(() => controller.abort(), 10000);
8
+ try {
9
+ const response = await fetch(url, { signal: controller.signal });
10
+ const html = await response.text();
11
+ return this.parseHTML(html, response.url || url, response.status);
12
+ }
13
+ finally {
14
+ clearTimeout(timeout);
15
+ }
14
16
  }
15
- catch {
16
- return { url, title: "Error", links: [], forms: [] };
17
+ catch (error) {
18
+ return {
19
+ url,
20
+ title: "Error",
21
+ links: [],
22
+ forms: [],
23
+ text: "",
24
+ error: error instanceof Error ? error.message : String(error),
25
+ };
17
26
  }
18
27
  }
19
- parseHTML(html, url) {
28
+ parseHTML(html, url, status) {
20
29
  const titleMatch = html.match(/<title>([^<]*)<\/title>/i);
21
- const links = [...html.matchAll(/href="([^"]+)"/gi)].map((m) => m[1]).filter((l) => l.startsWith("http"));
22
- const forms = [...html.matchAll(/<form[^>]*action="([^"]*)"[^>]*>([\s\S]*?)<\/form>/gi)].map((m) => ({
23
- action: m[1] || url,
24
- fields: [...m[2].matchAll(/name="([^"]*)"/gi)].map((f) => f[1]),
30
+ const links = [...html.matchAll(/href="([^"]+)"/gi)]
31
+ .map((match) => match[1])
32
+ .filter((link) => link.startsWith("http"));
33
+ const forms = [...html.matchAll(/<form[^>]*action="([^"]*)"[^>]*>([\s\S]*?)<\/form>/gi)].map((match) => ({
34
+ action: match[1] || url,
35
+ fields: [...match[2].matchAll(/name="([^"]*)"/gi)].map((field) => field[1]),
25
36
  }));
37
+ const text = html
38
+ .replace(/<script[\s\S]*?<\/script>/gi, "")
39
+ .replace(/<style[\s\S]*?<\/style>/gi, "")
40
+ .replace(/<[^>]+>/g, " ")
41
+ .replace(/\s+/g, " ")
42
+ .trim();
26
43
  return {
27
44
  url,
28
45
  title: titleMatch?.[1] || "No Title",
29
46
  links: [...new Set(links)].slice(0, 20),
30
47
  forms,
48
+ text,
49
+ status,
31
50
  };
32
51
  }
33
52
  }
34
53
  export class BrowserUseEvaluator extends EventEmitter {
35
54
  evaluate(result) {
36
- const passed = result.overallScore >= 0.6 && result.safety >= 0.5;
55
+ const passed = result.overallScore >= 0.6 && result.safety >= 0.5 && result.verification.pass;
37
56
  return { passed, score: result.overallScore };
38
57
  }
39
58
  }
@@ -41,22 +60,41 @@ export class BrowserUseAgent extends EventEmitter {
41
60
  engine;
42
61
  evaluator;
43
62
  sessions = new Map();
63
+ verifier;
44
64
  constructor() {
45
65
  super();
46
66
  this.engine = new BrowserUseEngine();
47
67
  this.evaluator = new BrowserUseEvaluator();
68
+ this.verifier = new PostconditionVerifier();
48
69
  }
49
70
  async execute(task) {
50
71
  const pageState = await this.engine.navigate(task.url);
51
72
  this.sessions.set(task.sessionId || "default", pageState);
73
+ const verification = await this.verifier.verify(task.postconditions ?? [{ kind: "text", pattern: "\\S" }], {
74
+ currentUrl: pageState.url,
75
+ text: pageState.text ?? "",
76
+ apiStatus: pageState.status,
77
+ });
78
+ const observed = pageState.error === undefined && (pageState.status === undefined || pageState.status < 500);
79
+ const taskCompletion = verification.pass ? 1 : observed ? 0.4 : 0;
80
+ const pageQuality = observed
81
+ ? Math.min(1, (pageState.links.length > 0 ? 0.25 : 0) +
82
+ (pageState.forms.length > 0 ? 0.25 : 0) +
83
+ (pageState.text ? 0.5 : 0))
84
+ : 0;
85
+ const navEfficiency = observed ? 0.9 : 0;
86
+ const safety = verification.failures.length === 0 ? 1 : 0.7;
87
+ const overallScore = Number((taskCompletion * 0.45 + pageQuality * 0.2 + navEfficiency * 0.2 + safety * 0.15).toFixed(2));
52
88
  const result = {
53
- success: true,
89
+ success: observed && verification.pass,
54
90
  pageState,
55
- taskCompletion: 0.8,
56
- pageQuality: 0.7,
57
- navEfficiency: 0.9,
58
- safety: 0.8,
59
- overallScore: 0.82,
91
+ taskCompletion,
92
+ pageQuality,
93
+ navEfficiency,
94
+ safety,
95
+ overallScore,
96
+ verification,
97
+ repairsAttempted: verification.pass ? 0 : 1,
60
98
  };
61
99
  const evaluation = this.evaluator.evaluate(result);
62
100
  this.emit("taskComplete", { task, result, evaluation });
@@ -1 +1 @@
1
- {"version":3,"file":"browser-use.js","sourceRoot":"","sources":["../../src/core/browser-use.ts"],"names":[],"mappings":"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","sourcesContent":["// OMK v6.2 Browser Use Agent (TypeScript)\n// ============================================\n// packages/coding-agent/src/core/browser-use.ts\n//\n// Browser Use 오픈소스 통합 에이전트.\n\nimport { EventEmitter } from \"events\";\n\nexport interface BrowserTask {\n\turl: string;\n\ttask: string;\n\tsessionId?: string;\n}\n\nexport interface PageState {\n\turl: string;\n\ttitle: string;\n\tlinks: string[];\n\tforms: { action: string; fields: string[] }[];\n}\n\nexport interface BrowserUseResult {\n\tsuccess: boolean;\n\tpageState: PageState;\n\ttaskCompletion: number;\n\tpageQuality: number;\n\tnavEfficiency: number;\n\tsafety: number;\n\toverallScore: number;\n\tscreenshot?: string;\n}\n\nexport class BrowserUseEngine extends EventEmitter {\n\tasync navigate(url: string): Promise<PageState> {\n\t\t// curl 기반 HTTP + 정규식 HTML 파싱\n\t\tconst { execSync } = require(\"child_process\");\n\t\ttry {\n\t\t\tconst html = execSync(`curl -sL \"${url}\" --max-time 10`, { encoding: \"utf-8\" });\n\t\t\treturn this.parseHTML(html, url);\n\t\t} catch {\n\t\t\treturn { url, title: \"Error\", links: [], forms: [] };\n\t\t}\n\t}\n\n\tprivate parseHTML(html: string, url: string): PageState {\n\t\tconst titleMatch = html.match(/<title>([^<]*)<\\/title>/i);\n\t\tconst links = [...html.matchAll(/href=\"([^\"]+)\"/gi)].map((m) => m[1]).filter((l) => l.startsWith(\"http\"));\n\t\tconst forms = [...html.matchAll(/<form[^>]*action=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/form>/gi)].map((m) => ({\n\t\t\taction: m[1] || url,\n\t\t\tfields: [...m[2].matchAll(/name=\"([^\"]*)\"/gi)].map((f) => f[1]),\n\t\t}));\n\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: titleMatch?.[1] || \"No Title\",\n\t\t\tlinks: [...new Set(links)].slice(0, 20),\n\t\t\tforms,\n\t\t};\n\t}\n}\n\nexport class BrowserUseEvaluator extends EventEmitter {\n\tevaluate(result: BrowserUseResult): { passed: boolean; score: number } {\n\t\tconst passed = result.overallScore >= 0.6 && result.safety >= 0.5;\n\t\treturn { passed, score: result.overallScore };\n\t}\n}\n\nexport class BrowserUseAgent extends EventEmitter {\n\tprivate engine: BrowserUseEngine;\n\tprivate evaluator: BrowserUseEvaluator;\n\tprivate sessions: Map<string, PageState> = new Map();\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.engine = new BrowserUseEngine();\n\t\tthis.evaluator = new BrowserUseEvaluator();\n\t}\n\n\tasync execute(task: BrowserTask): Promise<BrowserUseResult> {\n\t\tconst pageState = await this.engine.navigate(task.url);\n\t\tthis.sessions.set(task.sessionId || \"default\", pageState);\n\n\t\tconst result: BrowserUseResult = {\n\t\t\tsuccess: true,\n\t\t\tpageState,\n\t\t\ttaskCompletion: 0.8,\n\t\t\tpageQuality: 0.7,\n\t\t\tnavEfficiency: 0.9,\n\t\t\tsafety: 0.8,\n\t\t\toverallScore: 0.82,\n\t\t};\n\n\t\tconst evaluation = this.evaluator.evaluate(result);\n\t\tthis.emit(\"taskComplete\", { task, result, evaluation });\n\n\t\treturn result;\n\t}\n\n\tgetSession(sessionId: string): PageState | undefined {\n\t\treturn this.sessions.get(sessionId);\n\t}\n}\n\nexport default BrowserUseAgent;\n"]}
1
+ {"version":3,"file":"browser-use.js","sourceRoot":"","sources":["../../src/core/browser-use.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"events\";\nimport { type Postcondition, PostconditionVerifier, type VerificationResult } from \"./automation/index.ts\";\n\nexport interface BrowserTask {\n\turl: string;\n\ttask: string;\n\tsessionId?: string;\n\tpostconditions?: Postcondition[];\n}\n\nexport interface PageState {\n\turl: string;\n\ttitle: string;\n\tlinks: string[];\n\tforms: { action: string; fields: string[] }[];\n\ttext?: string;\n\tstatus?: number;\n\terror?: string;\n}\n\nexport interface BrowserUseResult {\n\tsuccess: boolean;\n\tpageState: PageState;\n\ttaskCompletion: number;\n\tpageQuality: number;\n\tnavEfficiency: number;\n\tsafety: number;\n\toverallScore: number;\n\tscreenshot?: string;\n\tverification: VerificationResult;\n\trepairsAttempted: number;\n}\n\nexport class BrowserUseEngine extends EventEmitter {\n\tasync navigate(url: string): Promise<PageState> {\n\t\ttry {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst timeout = setTimeout(() => controller.abort(), 10000);\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url, { signal: controller.signal });\n\t\t\t\tconst html = await response.text();\n\t\t\t\treturn this.parseHTML(html, response.url || url, response.status);\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\turl,\n\t\t\t\ttitle: \"Error\",\n\t\t\t\tlinks: [],\n\t\t\t\tforms: [],\n\t\t\t\ttext: \"\",\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate parseHTML(html: string, url: string, status: number): PageState {\n\t\tconst titleMatch = html.match(/<title>([^<]*)<\\/title>/i);\n\t\tconst links = [...html.matchAll(/href=\"([^\"]+)\"/gi)]\n\t\t\t.map((match) => match[1])\n\t\t\t.filter((link) => link.startsWith(\"http\"));\n\t\tconst forms = [...html.matchAll(/<form[^>]*action=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/form>/gi)].map((match) => ({\n\t\t\taction: match[1] || url,\n\t\t\tfields: [...match[2].matchAll(/name=\"([^\"]*)\"/gi)].map((field) => field[1]),\n\t\t}));\n\t\tconst text = html\n\t\t\t.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n\t\t\t.replace(/<style[\\s\\S]*?<\\/style>/gi, \"\")\n\t\t\t.replace(/<[^>]+>/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: titleMatch?.[1] || \"No Title\",\n\t\t\tlinks: [...new Set(links)].slice(0, 20),\n\t\t\tforms,\n\t\t\ttext,\n\t\t\tstatus,\n\t\t};\n\t}\n}\n\nexport class BrowserUseEvaluator extends EventEmitter {\n\tevaluate(result: BrowserUseResult): { passed: boolean; score: number } {\n\t\tconst passed = result.overallScore >= 0.6 && result.safety >= 0.5 && result.verification.pass;\n\t\treturn { passed, score: result.overallScore };\n\t}\n}\n\nexport class BrowserUseAgent extends EventEmitter {\n\tprivate engine: BrowserUseEngine;\n\tprivate evaluator: BrowserUseEvaluator;\n\tprivate sessions: Map<string, PageState> = new Map();\n\tprivate verifier: PostconditionVerifier;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.engine = new BrowserUseEngine();\n\t\tthis.evaluator = new BrowserUseEvaluator();\n\t\tthis.verifier = new PostconditionVerifier();\n\t}\n\n\tasync execute(task: BrowserTask): Promise<BrowserUseResult> {\n\t\tconst pageState = await this.engine.navigate(task.url);\n\t\tthis.sessions.set(task.sessionId || \"default\", pageState);\n\t\tconst verification = await this.verifier.verify(task.postconditions ?? [{ kind: \"text\", pattern: \"\\\\S\" }], {\n\t\t\tcurrentUrl: pageState.url,\n\t\t\ttext: pageState.text ?? \"\",\n\t\t\tapiStatus: pageState.status,\n\t\t});\n\t\tconst observed = pageState.error === undefined && (pageState.status === undefined || pageState.status < 500);\n\t\tconst taskCompletion = verification.pass ? 1 : observed ? 0.4 : 0;\n\t\tconst pageQuality = observed\n\t\t\t? Math.min(\n\t\t\t\t\t1,\n\t\t\t\t\t(pageState.links.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.forms.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.text ? 0.5 : 0),\n\t\t\t\t)\n\t\t\t: 0;\n\t\tconst navEfficiency = observed ? 0.9 : 0;\n\t\tconst safety = verification.failures.length === 0 ? 1 : 0.7;\n\t\tconst overallScore = Number(\n\t\t\t(taskCompletion * 0.45 + pageQuality * 0.2 + navEfficiency * 0.2 + safety * 0.15).toFixed(2),\n\t\t);\n\t\tconst result: BrowserUseResult = {\n\t\t\tsuccess: observed && verification.pass,\n\t\t\tpageState,\n\t\t\ttaskCompletion,\n\t\t\tpageQuality,\n\t\t\tnavEfficiency,\n\t\t\tsafety,\n\t\t\toverallScore,\n\t\t\tverification,\n\t\t\trepairsAttempted: verification.pass ? 0 : 1,\n\t\t};\n\n\t\tconst evaluation = this.evaluator.evaluate(result);\n\t\tthis.emit(\"taskComplete\", { task, result, evaluation });\n\n\t\treturn result;\n\t}\n\n\tgetSession(sessionId: string): PageState | undefined {\n\t\treturn this.sessions.get(sessionId);\n\t}\n}\n\nexport default BrowserUseAgent;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,sBAAuB,SAAQ,YAAY;IACvD,OAAO,CAAC,UAAU,CAAS;IAE3B,YAAY,UAAU,SAAK,EAG1B;IAED,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG;QAAE,SAAS,EAAE,cAAc,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,CAQ3F;CACD;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IACrD,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAarD;IAED,OAAO,CAAC,SAAS;CAGjB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAiE;IAEjF,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAYlC;CACD;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IACjD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAAmB;IAEjC,YAAY,UAAU,SAAK,EAK1B;IAED,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,MAAM,GAAE,QAAQ,GAAG,UAAU,GAAG,YAAyB,GAAG,gBAAgB,CAsC5G;IAED,OAAO,CAAC,SAAS;CASjB;AAED,eAAe,gBAAgB,CAAC","sourcesContent":["// [DEPRECATED — DEAD CODE] OMK v6.2 — Context Compactor (TypeScript)\n// ==================================================================\n// packages/coding-agent/src/core/compactor.ts\n//\n// STATUS: DEAD CODE — Not imported by any module at runtime.\n// This file is NOT wired into AgentSession or any active pipeline.\n//\n// WHY DEAD:\n// - agent-session.ts imports CompactionResult from compaction/index.ts,\n// NOT from this file. The CompactionResult interfaces are different.\n// - No other file in src/ imports from compactor.ts.\n// - All classes (SlidingWindowCompactor, SemanticDeduplicator,\n// ImportanceScorer, ContextCompactor) are only referenced within this file.\n//\n// ACTUAL COMPACTION SYSTEM:\n// - compaction/compaction.ts → real compaction with LLM summarization\n// - compaction/branch-summarization.ts → branch-specific summarization\n// - compaction/utils.ts → compaction utilities\n// - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()\n// from compaction/index.ts\n//\n// NOTE: types/jailbreak.ts also defines a CompactionResult interface (different shape).\n// Both are distinct from the real CompactionResult in compaction/compaction.ts.\n//\n// DO NOT MODIFY — preserved for reference only.\n\nimport { EventEmitter } from \"events\";\n\nexport interface CompactionTurn {\n\tindex: number;\n\trole: string;\n\tcontent: string;\n\ttimestamp: number;\n\timportance?: number;\n}\n\nexport interface CompactionResult {\n\tpreserved: CompactionTurn[];\n\tsummarized: CompactionTurn[];\n\tsummary: string;\n\toriginalCount: number;\n\tfinalCount: number;\n\tcompressionRatio: number;\n}\n\nexport class SlidingWindowCompactor extends EventEmitter {\n\tprivate windowSize: number;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.windowSize = windowSize;\n\t}\n\n\tcompact(turns: CompactionTurn[]): { preserved: CompactionTurn[]; evicted: CompactionTurn[] } {\n\t\tif (turns.length <= this.windowSize) {\n\t\t\treturn { preserved: turns, evicted: [] };\n\t\t}\n\t\treturn {\n\t\t\tpreserved: turns.slice(-this.windowSize),\n\t\t\tevicted: turns.slice(0, -this.windowSize),\n\t\t};\n\t}\n}\n\nexport class SemanticDeduplicator extends EventEmitter {\n\tdeduplicate(turns: CompactionTurn[]): CompactionTurn[] {\n\t\tconst seen = new Set<string>();\n\t\tconst unique: CompactionTurn[] = [];\n\n\t\tfor (const turn of turns) {\n\t\t\tconst key = this.normalize(turn.content);\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\tunique.push(turn);\n\t\t\t}\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\tprivate normalize(text: string): string {\n\t\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim().substring(0, 100);\n\t}\n}\n\nexport class ImportanceScorer extends EventEmitter {\n\tprivate keywords = [\"refusal\", \"error\", \"strategy\", \"phase\", \"decision\", \"goal\"];\n\n\tscore(turn: CompactionTurn): number {\n\t\tlet score = 0;\n\t\tconst content = turn.content.toLowerCase();\n\n\t\tfor (const kw of this.keywords) {\n\t\t\tif (content.includes(kw)) score += 2;\n\t\t}\n\n\t\tif (turn.role === \"system\") score += 1;\n\t\tif (turn.role === \"assistant\" && content.includes(\"refuse\")) score += 5;\n\n\t\treturn score;\n\t}\n}\n\nexport class ContextCompactor extends EventEmitter {\n\tprivate slidingWindow: SlidingWindowCompactor;\n\tprivate deduplicator: SemanticDeduplicator;\n\tprivate scorer: ImportanceScorer;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.slidingWindow = new SlidingWindowCompactor(windowSize);\n\t\tthis.deduplicator = new SemanticDeduplicator();\n\t\tthis.scorer = new ImportanceScorer();\n\t}\n\n\tcompact(turns: CompactionTurn[], _level: \"gentle\" | \"moderate\" | \"aggressive\" = \"moderate\"): CompactionResult {\n\t\tconst originalCount = turns.length;\n\n\t\t// 1. Importance scoring\n\t\tconst scored = turns.map((t) => ({ ...t, importance: this.scorer.score(t) }));\n\n\t\t// 2. Protect high-importance turns\n\t\tconst protectedTurns = scored.filter((t) => (t.importance ?? 0) >= 3);\n\t\tconst candidates = scored.filter((t) => (t.importance ?? 0) < 3);\n\n\t\t// 3. Sliding window\n\t\tconst { preserved, evicted } = this.slidingWindow.compact(candidates);\n\n\t\t// 4. Deduplicate evicted\n\t\tconst uniqueEvicted = this.deduplicator.deduplicate(evicted);\n\n\t\t// 5. Summarize evicted\n\t\tconst summary = this.summarize(uniqueEvicted);\n\n\t\t// 6. Assemble result\n\t\tconst finalTurns = [...protectedTurns, ...preserved];\n\t\tif (summary) {\n\t\t\tfinalTurns.push({\n\t\t\t\tindex: -1,\n\t\t\t\trole: \"system\",\n\t\t\t\tcontent: `[Summary]: ${summary}`,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tpreserved: protectedTurns,\n\t\t\tsummarized: uniqueEvicted,\n\t\t\tsummary,\n\t\t\toriginalCount,\n\t\t\tfinalCount: finalTurns.length,\n\t\t\tcompressionRatio: finalTurns.length / originalCount,\n\t\t};\n\t}\n\n\tprivate summarize(turns: CompactionTurn[]): string {\n\t\tif (turns.length === 0) return \"\";\n\t\tconst topics = new Set<string>();\n\t\tfor (const turn of turns) {\n\t\t\tconst words = turn.content.split(/\\s+/).filter((w) => w.length > 4);\n\t\t\tfor (const w of words.slice(0, 3)) topics.add(w);\n\t\t}\n\t\treturn `Topics: ${Array.from(topics).slice(0, 5).join(\", \")}`;\n\t}\n}\n\nexport default ContextCompactor;\n"]}
1
+ {"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,sBAAuB,SAAQ,YAAY;IACvD,OAAO,CAAC,UAAU,CAAS;IAE3B,YAAY,UAAU,SAAK,EAG1B;IAED,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG;QAAE,SAAS,EAAE,cAAc,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,CAQ3F;CACD;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IACrD,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAarD;IAED,OAAO,CAAC,SAAS;CAGjB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAiE;IAEjF,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAYlC;CACD;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IACjD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAAmB;IAEjC,YAAY,UAAU,SAAK,EAK1B;IAED,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,MAAM,GAAE,QAAQ,GAAG,UAAU,GAAG,YAAyB,GAAG,gBAAgB,CAsC5G;IAED,OAAO,CAAC,SAAS;CASjB;AAED,eAAe,gBAAgB,CAAC","sourcesContent":["// [DEPRECATED — DEAD CODE] OMK v6.2 — Context Compactor (TypeScript)\n// ==================================================================\n// packages/coding-agent/src/core/compactor.ts\n//\n// STATUS: DEAD CODE — Not imported by any module at runtime.\n// This file is NOT wired into AgentSession or any active pipeline.\n//\n// WHY DEAD:\n// - agent-session.ts imports CompactionResult from compaction/index.ts,\n// NOT from this file. The CompactionResult interfaces are different.\n// - No other file in src/ imports from compactor.ts.\n// - All classes (SlidingWindowCompactor, SemanticDeduplicator,\n// ImportanceScorer, ContextCompactor) are only referenced within this file.\n//\n// ACTUAL COMPACTION SYSTEM:\n// - compaction/compaction.ts → real compaction with LLM summarization\n// - compaction/branch-summarization.ts → branch-specific summarization\n// - compaction/utils.ts → compaction utilities\n// - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()\n// from compaction/index.ts\n//\n// DO NOT MODIFY — preserved for reference only.\n\nimport { EventEmitter } from \"events\";\n\nexport interface CompactionTurn {\n\tindex: number;\n\trole: string;\n\tcontent: string;\n\ttimestamp: number;\n\timportance?: number;\n}\n\nexport interface CompactionResult {\n\tpreserved: CompactionTurn[];\n\tsummarized: CompactionTurn[];\n\tsummary: string;\n\toriginalCount: number;\n\tfinalCount: number;\n\tcompressionRatio: number;\n}\n\nexport class SlidingWindowCompactor extends EventEmitter {\n\tprivate windowSize: number;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.windowSize = windowSize;\n\t}\n\n\tcompact(turns: CompactionTurn[]): { preserved: CompactionTurn[]; evicted: CompactionTurn[] } {\n\t\tif (turns.length <= this.windowSize) {\n\t\t\treturn { preserved: turns, evicted: [] };\n\t\t}\n\t\treturn {\n\t\t\tpreserved: turns.slice(-this.windowSize),\n\t\t\tevicted: turns.slice(0, -this.windowSize),\n\t\t};\n\t}\n}\n\nexport class SemanticDeduplicator extends EventEmitter {\n\tdeduplicate(turns: CompactionTurn[]): CompactionTurn[] {\n\t\tconst seen = new Set<string>();\n\t\tconst unique: CompactionTurn[] = [];\n\n\t\tfor (const turn of turns) {\n\t\t\tconst key = this.normalize(turn.content);\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\tunique.push(turn);\n\t\t\t}\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\tprivate normalize(text: string): string {\n\t\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim().substring(0, 100);\n\t}\n}\n\nexport class ImportanceScorer extends EventEmitter {\n\tprivate keywords = [\"refusal\", \"error\", \"strategy\", \"phase\", \"decision\", \"goal\"];\n\n\tscore(turn: CompactionTurn): number {\n\t\tlet score = 0;\n\t\tconst content = turn.content.toLowerCase();\n\n\t\tfor (const kw of this.keywords) {\n\t\t\tif (content.includes(kw)) score += 2;\n\t\t}\n\n\t\tif (turn.role === \"system\") score += 1;\n\t\tif (turn.role === \"assistant\" && content.includes(\"refuse\")) score += 5;\n\n\t\treturn score;\n\t}\n}\n\nexport class ContextCompactor extends EventEmitter {\n\tprivate slidingWindow: SlidingWindowCompactor;\n\tprivate deduplicator: SemanticDeduplicator;\n\tprivate scorer: ImportanceScorer;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.slidingWindow = new SlidingWindowCompactor(windowSize);\n\t\tthis.deduplicator = new SemanticDeduplicator();\n\t\tthis.scorer = new ImportanceScorer();\n\t}\n\n\tcompact(turns: CompactionTurn[], _level: \"gentle\" | \"moderate\" | \"aggressive\" = \"moderate\"): CompactionResult {\n\t\tconst originalCount = turns.length;\n\n\t\t// 1. Importance scoring\n\t\tconst scored = turns.map((t) => ({ ...t, importance: this.scorer.score(t) }));\n\n\t\t// 2. Protect high-importance turns\n\t\tconst protectedTurns = scored.filter((t) => (t.importance ?? 0) >= 3);\n\t\tconst candidates = scored.filter((t) => (t.importance ?? 0) < 3);\n\n\t\t// 3. Sliding window\n\t\tconst { preserved, evicted } = this.slidingWindow.compact(candidates);\n\n\t\t// 4. Deduplicate evicted\n\t\tconst uniqueEvicted = this.deduplicator.deduplicate(evicted);\n\n\t\t// 5. Summarize evicted\n\t\tconst summary = this.summarize(uniqueEvicted);\n\n\t\t// 6. Assemble result\n\t\tconst finalTurns = [...protectedTurns, ...preserved];\n\t\tif (summary) {\n\t\t\tfinalTurns.push({\n\t\t\t\tindex: -1,\n\t\t\t\trole: \"system\",\n\t\t\t\tcontent: `[Summary]: ${summary}`,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tpreserved: protectedTurns,\n\t\t\tsummarized: uniqueEvicted,\n\t\t\tsummary,\n\t\t\toriginalCount,\n\t\t\tfinalCount: finalTurns.length,\n\t\t\tcompressionRatio: finalTurns.length / originalCount,\n\t\t};\n\t}\n\n\tprivate summarize(turns: CompactionTurn[]): string {\n\t\tif (turns.length === 0) return \"\";\n\t\tconst topics = new Set<string>();\n\t\tfor (const turn of turns) {\n\t\t\tconst words = turn.content.split(/\\s+/).filter((w) => w.length > 4);\n\t\t\tfor (const w of words.slice(0, 3)) topics.add(w);\n\t\t}\n\t\treturn `Topics: ${Array.from(topics).slice(0, 5).join(\", \")}`;\n\t}\n}\n\nexport default ContextCompactor;\n"]}
@@ -19,9 +19,6 @@
19
19
  // - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()
20
20
  // from compaction/index.ts
21
21
  //
22
- // NOTE: types/jailbreak.ts also defines a CompactionResult interface (different shape).
23
- // Both are distinct from the real CompactionResult in compaction/compaction.ts.
24
- //
25
22
  // DO NOT MODIFY — preserved for reference only.
26
23
  import { EventEmitter } from "events";
27
24
  export class SlidingWindowCompactor extends EventEmitter {
@@ -1 +1 @@
1
- {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"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","sourcesContent":["// [DEPRECATED — DEAD CODE] OMK v6.2 — Context Compactor (TypeScript)\n// ==================================================================\n// packages/coding-agent/src/core/compactor.ts\n//\n// STATUS: DEAD CODE — Not imported by any module at runtime.\n// This file is NOT wired into AgentSession or any active pipeline.\n//\n// WHY DEAD:\n// - agent-session.ts imports CompactionResult from compaction/index.ts,\n// NOT from this file. The CompactionResult interfaces are different.\n// - No other file in src/ imports from compactor.ts.\n// - All classes (SlidingWindowCompactor, SemanticDeduplicator,\n// ImportanceScorer, ContextCompactor) are only referenced within this file.\n//\n// ACTUAL COMPACTION SYSTEM:\n// - compaction/compaction.ts → real compaction with LLM summarization\n// - compaction/branch-summarization.ts → branch-specific summarization\n// - compaction/utils.ts → compaction utilities\n// - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()\n// from compaction/index.ts\n//\n// NOTE: types/jailbreak.ts also defines a CompactionResult interface (different shape).\n// Both are distinct from the real CompactionResult in compaction/compaction.ts.\n//\n// DO NOT MODIFY — preserved for reference only.\n\nimport { EventEmitter } from \"events\";\n\nexport interface CompactionTurn {\n\tindex: number;\n\trole: string;\n\tcontent: string;\n\ttimestamp: number;\n\timportance?: number;\n}\n\nexport interface CompactionResult {\n\tpreserved: CompactionTurn[];\n\tsummarized: CompactionTurn[];\n\tsummary: string;\n\toriginalCount: number;\n\tfinalCount: number;\n\tcompressionRatio: number;\n}\n\nexport class SlidingWindowCompactor extends EventEmitter {\n\tprivate windowSize: number;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.windowSize = windowSize;\n\t}\n\n\tcompact(turns: CompactionTurn[]): { preserved: CompactionTurn[]; evicted: CompactionTurn[] } {\n\t\tif (turns.length <= this.windowSize) {\n\t\t\treturn { preserved: turns, evicted: [] };\n\t\t}\n\t\treturn {\n\t\t\tpreserved: turns.slice(-this.windowSize),\n\t\t\tevicted: turns.slice(0, -this.windowSize),\n\t\t};\n\t}\n}\n\nexport class SemanticDeduplicator extends EventEmitter {\n\tdeduplicate(turns: CompactionTurn[]): CompactionTurn[] {\n\t\tconst seen = new Set<string>();\n\t\tconst unique: CompactionTurn[] = [];\n\n\t\tfor (const turn of turns) {\n\t\t\tconst key = this.normalize(turn.content);\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\tunique.push(turn);\n\t\t\t}\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\tprivate normalize(text: string): string {\n\t\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim().substring(0, 100);\n\t}\n}\n\nexport class ImportanceScorer extends EventEmitter {\n\tprivate keywords = [\"refusal\", \"error\", \"strategy\", \"phase\", \"decision\", \"goal\"];\n\n\tscore(turn: CompactionTurn): number {\n\t\tlet score = 0;\n\t\tconst content = turn.content.toLowerCase();\n\n\t\tfor (const kw of this.keywords) {\n\t\t\tif (content.includes(kw)) score += 2;\n\t\t}\n\n\t\tif (turn.role === \"system\") score += 1;\n\t\tif (turn.role === \"assistant\" && content.includes(\"refuse\")) score += 5;\n\n\t\treturn score;\n\t}\n}\n\nexport class ContextCompactor extends EventEmitter {\n\tprivate slidingWindow: SlidingWindowCompactor;\n\tprivate deduplicator: SemanticDeduplicator;\n\tprivate scorer: ImportanceScorer;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.slidingWindow = new SlidingWindowCompactor(windowSize);\n\t\tthis.deduplicator = new SemanticDeduplicator();\n\t\tthis.scorer = new ImportanceScorer();\n\t}\n\n\tcompact(turns: CompactionTurn[], _level: \"gentle\" | \"moderate\" | \"aggressive\" = \"moderate\"): CompactionResult {\n\t\tconst originalCount = turns.length;\n\n\t\t// 1. Importance scoring\n\t\tconst scored = turns.map((t) => ({ ...t, importance: this.scorer.score(t) }));\n\n\t\t// 2. Protect high-importance turns\n\t\tconst protectedTurns = scored.filter((t) => (t.importance ?? 0) >= 3);\n\t\tconst candidates = scored.filter((t) => (t.importance ?? 0) < 3);\n\n\t\t// 3. Sliding window\n\t\tconst { preserved, evicted } = this.slidingWindow.compact(candidates);\n\n\t\t// 4. Deduplicate evicted\n\t\tconst uniqueEvicted = this.deduplicator.deduplicate(evicted);\n\n\t\t// 5. Summarize evicted\n\t\tconst summary = this.summarize(uniqueEvicted);\n\n\t\t// 6. Assemble result\n\t\tconst finalTurns = [...protectedTurns, ...preserved];\n\t\tif (summary) {\n\t\t\tfinalTurns.push({\n\t\t\t\tindex: -1,\n\t\t\t\trole: \"system\",\n\t\t\t\tcontent: `[Summary]: ${summary}`,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tpreserved: protectedTurns,\n\t\t\tsummarized: uniqueEvicted,\n\t\t\tsummary,\n\t\t\toriginalCount,\n\t\t\tfinalCount: finalTurns.length,\n\t\t\tcompressionRatio: finalTurns.length / originalCount,\n\t\t};\n\t}\n\n\tprivate summarize(turns: CompactionTurn[]): string {\n\t\tif (turns.length === 0) return \"\";\n\t\tconst topics = new Set<string>();\n\t\tfor (const turn of turns) {\n\t\t\tconst words = turn.content.split(/\\s+/).filter((w) => w.length > 4);\n\t\t\tfor (const w of words.slice(0, 3)) topics.add(w);\n\t\t}\n\t\treturn `Topics: ${Array.from(topics).slice(0, 5).join(\", \")}`;\n\t}\n}\n\nexport default ContextCompactor;\n"]}
1
+ {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"AAAA,yEAAqE;AACrE,qEAAqE;AACrE,8CAA8C;AAC9C,EAAE;AACF,+DAA6D;AAC7D,mEAAmE;AACnE,EAAE;AACF,YAAY;AACZ,0EAA0E;AAC1E,yEAAyE;AACzE,uDAAuD;AACvD,iEAAiE;AACjE,gFAAgF;AAChF,EAAE;AACF,4BAA4B;AAC5B,2EAAyE;AACzE,2EAAyE;AACzE,mDAAiD;AACjD,+EAA+E;AAC/E,+BAA+B;AAC/B,EAAE;AACF,kDAAgD;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAmBtC,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IAC/C,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,EAAE,EAAE;QAC5B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAAA,CAC7B;IAED,OAAO,CAAC,KAAuB,EAA8D;QAC5F,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO;YACN,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YACxC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;SACzC,CAAC;IAAA,CACF;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACrD,WAAW,CAAC,KAAuB,EAAoB;QACtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACF,CAAC;QAED,OAAO,MAAM,CAAC;IAAA,CACd;IAEO,SAAS,CAAC,IAAY,EAAU;QACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAAA,CACxE;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IACzC,QAAQ,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAEjF,KAAK,CAAC,IAAoB,EAAU;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,KAAK,IAAI,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;QAExE,OAAO,KAAK,CAAC;IAAA,CACb;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IACzC,aAAa,CAAyB;IACtC,YAAY,CAAuB;IACnC,MAAM,CAAmB;IAEjC,YAAY,UAAU,GAAG,EAAE,EAAE;QAC5B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAAA,CACrC;IAED,OAAO,CAAC,KAAuB,EAAE,MAAM,GAAyC,UAAU,EAAoB;QAC7G,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;QAEnC,wBAAwB;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9E,mCAAmC;QACnC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEjE,oBAAoB;QACpB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEtE,yBAAyB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE7D,uBAAuB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAE9C,qBAAqB;QACrB,MAAM,UAAU,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,SAAS,CAAC,CAAC;QACrD,IAAI,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,CAAC,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,cAAc,OAAO,EAAE;gBAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACrB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO;YACN,SAAS,EAAE,cAAc;YACzB,UAAU,EAAE,aAAa;YACzB,OAAO;YACP,aAAa;YACb,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,gBAAgB,EAAE,UAAU,CAAC,MAAM,GAAG,aAAa;SACnD,CAAC;IAAA,CACF;IAEO,SAAS,CAAC,KAAuB,EAAU;QAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,WAAW,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAAA,CAC9D;CACD;AAED,eAAe,gBAAgB,CAAC","sourcesContent":["// [DEPRECATED — DEAD CODE] OMK v6.2 — Context Compactor (TypeScript)\n// ==================================================================\n// packages/coding-agent/src/core/compactor.ts\n//\n// STATUS: DEAD CODE — Not imported by any module at runtime.\n// This file is NOT wired into AgentSession or any active pipeline.\n//\n// WHY DEAD:\n// - agent-session.ts imports CompactionResult from compaction/index.ts,\n// NOT from this file. The CompactionResult interfaces are different.\n// - No other file in src/ imports from compactor.ts.\n// - All classes (SlidingWindowCompactor, SemanticDeduplicator,\n// ImportanceScorer, ContextCompactor) are only referenced within this file.\n//\n// ACTUAL COMPACTION SYSTEM:\n// - compaction/compaction.ts → real compaction with LLM summarization\n// - compaction/branch-summarization.ts → branch-specific summarization\n// - compaction/utils.ts → compaction utilities\n// - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()\n// from compaction/index.ts\n//\n// DO NOT MODIFY — preserved for reference only.\n\nimport { EventEmitter } from \"events\";\n\nexport interface CompactionTurn {\n\tindex: number;\n\trole: string;\n\tcontent: string;\n\ttimestamp: number;\n\timportance?: number;\n}\n\nexport interface CompactionResult {\n\tpreserved: CompactionTurn[];\n\tsummarized: CompactionTurn[];\n\tsummary: string;\n\toriginalCount: number;\n\tfinalCount: number;\n\tcompressionRatio: number;\n}\n\nexport class SlidingWindowCompactor extends EventEmitter {\n\tprivate windowSize: number;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.windowSize = windowSize;\n\t}\n\n\tcompact(turns: CompactionTurn[]): { preserved: CompactionTurn[]; evicted: CompactionTurn[] } {\n\t\tif (turns.length <= this.windowSize) {\n\t\t\treturn { preserved: turns, evicted: [] };\n\t\t}\n\t\treturn {\n\t\t\tpreserved: turns.slice(-this.windowSize),\n\t\t\tevicted: turns.slice(0, -this.windowSize),\n\t\t};\n\t}\n}\n\nexport class SemanticDeduplicator extends EventEmitter {\n\tdeduplicate(turns: CompactionTurn[]): CompactionTurn[] {\n\t\tconst seen = new Set<string>();\n\t\tconst unique: CompactionTurn[] = [];\n\n\t\tfor (const turn of turns) {\n\t\t\tconst key = this.normalize(turn.content);\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\tunique.push(turn);\n\t\t\t}\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\tprivate normalize(text: string): string {\n\t\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim().substring(0, 100);\n\t}\n}\n\nexport class ImportanceScorer extends EventEmitter {\n\tprivate keywords = [\"refusal\", \"error\", \"strategy\", \"phase\", \"decision\", \"goal\"];\n\n\tscore(turn: CompactionTurn): number {\n\t\tlet score = 0;\n\t\tconst content = turn.content.toLowerCase();\n\n\t\tfor (const kw of this.keywords) {\n\t\t\tif (content.includes(kw)) score += 2;\n\t\t}\n\n\t\tif (turn.role === \"system\") score += 1;\n\t\tif (turn.role === \"assistant\" && content.includes(\"refuse\")) score += 5;\n\n\t\treturn score;\n\t}\n}\n\nexport class ContextCompactor extends EventEmitter {\n\tprivate slidingWindow: SlidingWindowCompactor;\n\tprivate deduplicator: SemanticDeduplicator;\n\tprivate scorer: ImportanceScorer;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.slidingWindow = new SlidingWindowCompactor(windowSize);\n\t\tthis.deduplicator = new SemanticDeduplicator();\n\t\tthis.scorer = new ImportanceScorer();\n\t}\n\n\tcompact(turns: CompactionTurn[], _level: \"gentle\" | \"moderate\" | \"aggressive\" = \"moderate\"): CompactionResult {\n\t\tconst originalCount = turns.length;\n\n\t\t// 1. Importance scoring\n\t\tconst scored = turns.map((t) => ({ ...t, importance: this.scorer.score(t) }));\n\n\t\t// 2. Protect high-importance turns\n\t\tconst protectedTurns = scored.filter((t) => (t.importance ?? 0) >= 3);\n\t\tconst candidates = scored.filter((t) => (t.importance ?? 0) < 3);\n\n\t\t// 3. Sliding window\n\t\tconst { preserved, evicted } = this.slidingWindow.compact(candidates);\n\n\t\t// 4. Deduplicate evicted\n\t\tconst uniqueEvicted = this.deduplicator.deduplicate(evicted);\n\n\t\t// 5. Summarize evicted\n\t\tconst summary = this.summarize(uniqueEvicted);\n\n\t\t// 6. Assemble result\n\t\tconst finalTurns = [...protectedTurns, ...preserved];\n\t\tif (summary) {\n\t\t\tfinalTurns.push({\n\t\t\t\tindex: -1,\n\t\t\t\trole: \"system\",\n\t\t\t\tcontent: `[Summary]: ${summary}`,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tpreserved: protectedTurns,\n\t\t\tsummarized: uniqueEvicted,\n\t\t\tsummary,\n\t\t\toriginalCount,\n\t\t\tfinalCount: finalTurns.length,\n\t\t\tcompressionRatio: finalTurns.length / originalCount,\n\t\t};\n\t}\n\n\tprivate summarize(turns: CompactionTurn[]): string {\n\t\tif (turns.length === 0) return \"\";\n\t\tconst topics = new Set<string>();\n\t\tfor (const turn of turns) {\n\t\t\tconst words = turn.content.split(/\\s+/).filter((w) => w.length > 4);\n\t\t\tfor (const w of words.slice(0, 3)) topics.add(w);\n\t\t}\n\t\treturn `Topics: ${Array.from(topics).slice(0, 5).join(\", \")}`;\n\t}\n}\n\nexport default ContextCompactor;\n"]}
@@ -1,7 +1,8 @@
1
1
  export { type ContextBudgetItemV2, type ContextBudgetPriorityV2, type ContextBudgetTierV2, type ContextEvidenceKindV2, type ContextRepresentationCandidateV2, type ContextRepresentationFidelityV2, type ContextRepresentationKindV2, type ContextSourceRefV2, chooseHeadroomRepresentation, DEFAULT_HEADROOM_QUALITY_POLICY, deriveRepresentationCandidates, estimatePointerTokens, fnv1aHex, fullTextTokens, getHeadroomRuntimeStatus, type HeadroomQualityPolicyV2, type HeadroomRuntimeStatusV2, heuristicTokenCount, type RepresentationBudgetContext, } from "./context-budget-headroom.ts";
2
+ export { buildContextBudgetExactRepresentationCacheKeyV2, buildContextBudgetMaterializedRepresentationCacheKeyV2, buildContextBudgetMaterializedRepresentationCandidateKeyV2, buildContextBudgetPlanCacheKeyV2, buildContextBudgetRepresentationCacheKeyV2, computeContextBudgetOutputTextHashV2, computeContextBudgetQueryIntentHashV2, computeContextBudgetRepresentationFingerprintV2, computeContextBudgetTargetTokenBucketV2, createMemoryContextBudgetCacheProviderV2, DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2, DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2, } from "./context-budget-v2-cache.ts";
2
3
  export { computeCoverageGap } from "./context-budget-v2-coverage.ts";
3
4
  export { computePlanHash, contentHashOf } from "./context-budget-v2-plan-hash.ts";
4
5
  export { planPromptContextBudgetV2 } from "./context-budget-v2-planner.ts";
5
6
  export { scoreContextBudgetItemV2 } from "./context-budget-v2-scoring.ts";
6
- export { ALL_TIERS_V2, CONTEXT_BUDGET_POLICY_VERSION_V2, type ContextBudgetObservabilityCountsV2, type ContextBudgetObservabilityTokensV2, DEFAULT_TIER_POLICY_V2, type PromptContextBudgetInputV2, type PromptContextBudgetObservabilityV2, type PromptContextBudgetPlanV2, type QualityDiagnosticReasonV2, type QualityDiagnosticV2, type SelectedRepresentationV2, type TierBudgetAllocationV2, type TierBudgetPolicyV2, } from "./context-budget-v2-types.ts";
7
+ export { ALL_TIERS_V2, CONTEXT_BUDGET_POLICY_VERSION_V2, type ContextBudgetCacheProviderV2, type ContextBudgetCacheTokenTelemetryV2, type ContextBudgetMaterializedVerificationV2, type ContextBudgetObservabilityCountsV2, type ContextBudgetObservabilityTokensV2, type ContextBudgetPlanCacheTelemetryV2, type ContextBudgetRepresentationCacheEntryV2, type ContextBudgetRepresentationCacheKeyKindV2, type ContextBudgetRepresentationCacheTelemetryV2, DEFAULT_TIER_POLICY_V2, type PromptContextBudgetInputV2, type PromptContextBudgetObservabilityV2, type PromptContextBudgetPlanV2, type QualityDiagnosticReasonV2, type QualityDiagnosticV2, type SelectedRepresentationV2, type TierBudgetAllocationV2, type TierBudgetPolicyV2, } from "./context-budget-v2-types.ts";
7
8
  //# sourceMappingURL=context-budget-governor-v2.d.ts.map