@tangle-network/agent-runtime 0.95.0 → 0.97.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +64 -15
  2. package/dist/activation-B0ZD7nfX.d.ts +63 -0
  3. package/dist/agent.d.ts +5 -169
  4. package/dist/agent.js +8 -229
  5. package/dist/agent.js.map +1 -1
  6. package/dist/analyst-loop.d.ts +6 -9
  7. package/dist/analyst-loop.js +1 -2
  8. package/dist/candidate-execution/index.js +6 -7
  9. package/dist/chunk-3XKSBI2U.js +474 -0
  10. package/dist/chunk-3XKSBI2U.js.map +1 -0
  11. package/dist/{chunk-6YBA64Z2.js → chunk-6XKPVJAZ.js} +5 -18
  12. package/dist/chunk-6XKPVJAZ.js.map +1 -0
  13. package/dist/{chunk-MKGRLDWB.js → chunk-BLQIYRVR.js} +17 -2
  14. package/dist/chunk-BLQIYRVR.js.map +1 -0
  15. package/dist/{chunk-QDSOD7RC.js → chunk-FD2MBMOH.js} +13 -101
  16. package/dist/chunk-FD2MBMOH.js.map +1 -0
  17. package/dist/{chunk-YLUOTX6U.js → chunk-FXF2OL34.js} +7 -7
  18. package/dist/{chunk-EP6RVHMX.js → chunk-HZDEXTSL.js} +848 -2
  19. package/dist/chunk-HZDEXTSL.js.map +1 -0
  20. package/dist/chunk-PSOCBNM3.js +2069 -0
  21. package/dist/chunk-PSOCBNM3.js.map +1 -0
  22. package/dist/{chunk-BPGXIKK7.js → chunk-SGQ4YIQW.js} +4 -4
  23. package/dist/{chunk-IADLKE7I.js → chunk-UQ6PNNXM.js} +5 -7
  24. package/dist/{chunk-IADLKE7I.js.map → chunk-UQ6PNNXM.js.map} +1 -1
  25. package/dist/{chunk-Z5I642SY.js → chunk-WYC2XJF2.js} +2 -2
  26. package/dist/{chunk-ZEYAT33L.js → chunk-Y3SRWZMP.js} +2 -2
  27. package/dist/{chunk-WTZ37EQY.js → chunk-YOLKCWRV.js} +197 -90
  28. package/dist/chunk-YOLKCWRV.js.map +1 -0
  29. package/dist/conversation.js +0 -1
  30. package/dist/environment-provider.js +0 -1
  31. package/dist/{agentic-generator-hCaQRAes.d.ts → improve-g75IE2Cx.d.ts} +152 -3
  32. package/dist/{improvement-adapter-BieWeK5J.d.ts → improvement-adapter-HAZz-7vK.d.ts} +8 -31
  33. package/dist/index.d.ts +41 -11
  34. package/dist/index.js +180 -51
  35. package/dist/index.js.map +1 -1
  36. package/dist/intelligence.d.ts +16 -9
  37. package/dist/intelligence.js +13 -8
  38. package/dist/intelligence.js.map +1 -1
  39. package/dist/knowledge.d.ts +30 -13
  40. package/dist/knowledge.js +11 -10
  41. package/dist/{loop-runner-bin-BIQldFS8.d.ts → loop-runner-bin-Cn1N2rRo.d.ts} +1 -1
  42. package/dist/loop-runner-bin.d.ts +2 -2
  43. package/dist/loop-runner-bin.js +6 -8
  44. package/dist/loops.d.ts +1 -1
  45. package/dist/loops.js +4 -6
  46. package/dist/mcp/bin.js +3 -5
  47. package/dist/mcp/bin.js.map +1 -1
  48. package/dist/mcp/index.js +10 -12
  49. package/dist/mcp/index.js.map +1 -1
  50. package/dist/platform.js +0 -2
  51. package/dist/platform.js.map +1 -1
  52. package/dist/primeintellect/index.js +0 -1
  53. package/dist/primeintellect/index.js.map +1 -1
  54. package/dist/profiles.js +0 -1
  55. package/dist/profiles.js.map +1 -1
  56. package/dist/{types-BC3bZpH0.d.ts → types-CmYCMbFT.d.ts} +12 -54
  57. package/package.json +8 -13
  58. package/skills/build-with-agent-runtime/SKILL.md +122 -213
  59. package/dist/chunk-6O73TRHW.js +0 -142
  60. package/dist/chunk-6O73TRHW.js.map +0 -1
  61. package/dist/chunk-6YBA64Z2.js.map +0 -1
  62. package/dist/chunk-AP7CPGMZ.js +0 -334
  63. package/dist/chunk-AP7CPGMZ.js.map +0 -1
  64. package/dist/chunk-DGUM43GV.js +0 -11
  65. package/dist/chunk-DGUM43GV.js.map +0 -1
  66. package/dist/chunk-DHCHL6OG.js +0 -625
  67. package/dist/chunk-DHCHL6OG.js.map +0 -1
  68. package/dist/chunk-EP6RVHMX.js.map +0 -1
  69. package/dist/chunk-G55QE4IQ.js +0 -1137
  70. package/dist/chunk-G55QE4IQ.js.map +0 -1
  71. package/dist/chunk-ISTDY47H.js +0 -849
  72. package/dist/chunk-ISTDY47H.js.map +0 -1
  73. package/dist/chunk-MKGRLDWB.js.map +0 -1
  74. package/dist/chunk-QDSOD7RC.js.map +0 -1
  75. package/dist/chunk-WTZ37EQY.js.map +0 -1
  76. package/dist/generator-YkAQrOoD.d.ts +0 -382
  77. package/dist/improve-B-UYaEH5.d.ts +0 -172
  78. package/dist/lifecycle.d.ts +0 -870
  79. package/dist/lifecycle.js +0 -981
  80. package/dist/lifecycle.js.map +0 -1
  81. package/dist/mcp-serve-verifier-Bs_n0xPc.d.ts +0 -34
  82. package/skills/agent-runtime-adoption/SKILL.md +0 -246
  83. /package/dist/{chunk-YLUOTX6U.js.map → chunk-FXF2OL34.js.map} +0 -0
  84. /package/dist/{chunk-BPGXIKK7.js.map → chunk-SGQ4YIQW.js.map} +0 -0
  85. /package/dist/{chunk-Z5I642SY.js.map → chunk-WYC2XJF2.js.map} +0 -0
  86. /package/dist/{chunk-ZEYAT33L.js.map → chunk-Y3SRWZMP.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/candidate-execution/builder.ts","../src/candidate-execution/bundle.ts","../src/candidate-execution/claim-file-store.ts","../src/candidate-execution/dispose.ts","../src/candidate-execution/protected-model-port.ts","../src/candidate-execution/recover.ts"],"sourcesContent":["import type { CodeSurface } from '@tangle-network/agent-eval/campaign'\nimport { verifyCodeSurface } from '@tangle-network/agent-eval/campaign'\nimport type {\n AgentCandidateCodeDisabled,\n AgentCandidateCodeNoOp,\n AgentCandidateExecution,\n AgentCandidateGitHubRepository,\n AgentCandidateKnowledge,\n AgentCandidateMemoryPolicy,\n AgentCandidateProfile,\n AgentProfile,\n AgentProfileDiff,\n} from '@tangle-network/agent-interface'\nimport { type AgentCandidateBundleInput, sealAgentCandidateBundle } from './bundle'\nimport { embeddedCandidateArtifact } from './digest'\nimport {\n applyExactAgentProfileDiff,\n freezeGenericAgentCandidateProfile,\n parseExactAgentProfile,\n parseExactAgentProfileDiff,\n parseExactCandidateProfile,\n} from './profile'\n\n/** A complete profile that can be frozen without losing behavior. */\nexport type AgentCandidateProfileSource =\n | {\n kind: 'profile'\n profile: AgentProfile\n }\n | {\n kind: 'profile-diffs'\n base: AgentProfile\n /** Applied in order before the resulting profile is frozen into the bundle. */\n diffs: readonly AgentProfileDiff[]\n }\n | {\n kind: 'candidate-profile'\n /** Already converted to the closed, secret-free candidate profile contract. */\n profile: AgentCandidateProfile\n }\n\n/** The only accepted path from an agent-eval code candidate to executable bytes. */\nexport interface AgentCandidateCodeSurfaceSource {\n kind: 'code-surface'\n surface: CodeSurface\n repository: AgentCandidateGitHubRepository\n /** Optional parent directory used to resolve a relative `surface.worktreeRef`. */\n worktreeDir?: string\n}\n\n/** Explicit control/no-op code or one finalized CodeSurface whose bytes must still verify. */\nexport type AgentCandidateCodeSource =\n | AgentCandidateCodeDisabled\n | AgentCandidateCodeNoOp\n | AgentCandidateCodeSurfaceSource\n\n/** Complete measured surfaces and execution policy compiled into one candidate bundle. */\nexport interface BuildAgentCandidateBundleInput {\n profile: AgentCandidateProfileSource\n code: AgentCandidateCodeSource\n execution: AgentCandidateExecution\n knowledge?: AgentCandidateKnowledge\n memory: AgentCandidateMemoryPolicy\n}\n\n/**\n * Compile one measured profile/code candidate into the immutable execution\n * contract. Code bytes are re-read and verified by agent-eval before they are\n * embedded. The returned bundle is schema-validated, canonically digested, and\n * deeply immutable; call `verifyAgentCandidateBundle` at the execution boundary\n * to re-read external memory, repository, and workspace artifacts.\n */\nexport function buildAgentCandidateBundle(\n input: BuildAgentCandidateBundleInput,\n): ReturnType<typeof sealAgentCandidateBundle> {\n const bundle: AgentCandidateBundleInput = {\n kind: 'agent-candidate-bundle',\n digestAlgorithm: 'rfc8785-sha256',\n profile: compileCandidateProfile(input.profile),\n code: compileCandidateCode(input.code),\n execution: input.execution,\n ...(input.knowledge !== undefined ? { knowledge: input.knowledge } : {}),\n memory: input.memory,\n }\n return sealAgentCandidateBundle(bundle)\n}\n\nfunction compileCandidateProfile(source: AgentCandidateProfileSource): AgentCandidateProfile {\n if (source.kind === 'candidate-profile') {\n return parseExactCandidateProfile(source.profile)\n }\n\n if (source.kind === 'profile') {\n return freezeGenericAgentCandidateProfile(source.profile)\n }\n\n if (source.kind !== 'profile-diffs') {\n throw new Error(\n `unsupported candidate profile source: ${String((source as { kind?: unknown }).kind)}`,\n )\n }\n if (source.diffs.length === 0) {\n throw new Error('profile-diffs source requires at least one AgentProfileDiff')\n }\n let profile = parseExactAgentProfile(source.base, 'base profile')\n for (const [index, inputDiff] of source.diffs.entries()) {\n const diff = parseExactAgentProfileDiff(inputDiff, `profile diff ${index}`)\n profile = applyExactAgentProfileDiff(profile, diff, `profile diff ${index}`)\n }\n return freezeGenericAgentCandidateProfile(profile)\n}\n\nfunction compileCandidateCode(source: AgentCandidateCodeSource): AgentCandidateBundleInput['code'] {\n if (source.kind === 'disabled' || source.kind === 'no-op') return source\n if (source.kind !== 'code-surface') {\n throw new Error(\n `unsupported candidate code source: ${String((source as { kind?: unknown }).kind)}`,\n )\n }\n\n const verified = verifyCodeSurface(source.surface, source.worktreeDir)\n const patch = embeddedCandidateArtifact(verified.patchBytes)\n if (\n patch.sha256 !== source.surface.patch.sha256 ||\n patch.byteLength !== source.surface.patch.byteLength\n ) {\n throw new Error('verified CodeSurface patch bytes do not match its content identity')\n }\n return {\n kind: 'git-patch',\n repository: source.repository,\n baseCommit: source.surface.baseCommit,\n baseTree: source.surface.baseTree,\n candidateTree: source.surface.candidateTree,\n patch: { format: 'git-diff-binary', artifact: patch },\n }\n}\n","import type { AgentCandidateBundle } from '@tangle-network/agent-interface'\nimport { agentCandidateBundleSchema } from '@tangle-network/agent-interface'\n\nimport { canonicalCandidateDigest, immutableCandidateValue, omitTopLevelDigest } from './digest'\n\n/** Exact candidate wire shape before the runtime computes its canonical digest. */\nexport type AgentCandidateBundleInput = Omit<AgentCandidateBundle, 'digest'>\n\n/** Validate and content-address a candidate bundle before it crosses an approval boundary. */\nexport function sealAgentCandidateBundle(input: AgentCandidateBundleInput): AgentCandidateBundle {\n const digest = canonicalCandidateDigest(input)\n const parsed = agentCandidateBundleSchema.parse({ ...input, digest })\n const parsedDigest = canonicalCandidateDigest(omitTopLevelDigest(parsed))\n if (parsedDigest !== digest) {\n throw new Error('candidate bundle changed while validating its canonical wire shape')\n }\n return immutableCandidateValue(parsed)\n}\n","import { randomUUID } from 'node:crypto'\nimport { linkSync } from 'node:fs'\nimport { mkdir, open, unlink } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { Sha256Digest } from '@tangle-network/agent-interface'\n\nimport {\n type AgentCandidateExecutionAttemptRecord,\n type AgentCandidateExecutionAttemptRef,\n type AgentCandidateExecutionClaim,\n type AgentCandidateExecutionClaimResult,\n type AgentCandidateExecutionClaimStore,\n type AgentCandidateExecutionFinishResult,\n type AgentCandidateExecutionLease,\n type AgentCandidateExecutionPhase,\n type AgentCandidateExecutionPhaseResult,\n type AgentCandidateExecutionRecoveryEvidence,\n type AgentCandidateExecutionStageResult,\n type AgentCandidateExecutionTerminalRecord,\n type AgentCandidateExecutionTerminalResult,\n type AgentCandidateRetryRejection,\n candidateClaimFileInternals,\n} from './claim'\nimport {\n assertRecoveryMatchesStaged,\n assertTerminalAllowedInPhase,\n assertTerminalMatchesClaim,\n assertTerminalMatchesStaged,\n recoveredTerminalRecord,\n rejectedFinish,\n rejectedStage,\n requireStagedTerminal,\n sealTerminalDigest,\n terminalRecord,\n} from './claim-terminal'\nimport { canonicalCandidateBytes } from './digest'\n\nconst {\n assertExpiredLease,\n assertLease,\n assertSameSlot,\n assertUnexpiredLease,\n attemptRecord,\n claimSlot,\n leaseDigest,\n newLease,\n readClaim,\n readClaimIfPresent,\n readTerminal,\n readTerminalIfPresent,\n readTransitionIfPresent,\n rejectedExistingClaim,\n rejectedRetry,\n retryRejection,\n sealAttemptRef,\n sealClaim,\n sealLease,\n} = candidateClaimFileInternals\n\nexport interface FileAgentCandidateExecutionClaimStoreOptions {\n /** Evaluator-owned directory shared by every process allowed to execute candidates. */\n directory: string\n /** Testable evaluator clock; defaults to `Date.now`. */\n now?: () => number\n}\n\n/** Cross-process lifecycle implemented as fsynced, create-if-absent records. */\nexport class FileAgentCandidateExecutionClaimStore implements AgentCandidateExecutionClaimStore {\n private readonly directory: string\n private readonly now: () => number\n\n constructor(options: FileAgentCandidateExecutionClaimStoreOptions) {\n if (options.directory.length === 0) {\n throw new Error('candidate execution claim directory must not be empty')\n }\n this.directory = options.directory\n this.now = options.now ?? Date.now\n }\n\n async tryClaim(\n requested: AgentCandidateExecutionClaim,\n ): Promise<AgentCandidateExecutionClaimResult> {\n const claim = sealClaim(requested)\n await mkdir(this.directory, { recursive: true })\n const claimPath = this.claimPath(claim)\n const existing = await readClaimIfPresent(claimPath)\n if (existing) {\n assertSameSlot(existing.claim, claim, claimPath)\n return rejectedExistingClaim(existing.claim, claim)\n }\n assertUnexpiredLease(claim.leaseExpiresAtMs, this.now())\n const retryFailure = await this.retryFailure(claim)\n if (retryFailure) return rejectedRetry(claim, retryFailure)\n\n const lease = newLease(claim)\n const acquired = await writeRecordIfAbsent(this.directory, claimPath, {\n ...claim,\n phase: 'claimed',\n leaseDigest: leaseDigest(lease),\n })\n if (acquired) return Object.freeze({ acquired: true, claim, lease })\n\n const winner = await readClaim(claimPath)\n assertSameSlot(winner.claim, claim, claimPath)\n return rejectedExistingClaim(winner.claim, claim)\n }\n\n async getAttempt(\n requestedAttempt: AgentCandidateExecutionAttemptRef,\n ): Promise<AgentCandidateExecutionAttemptRecord | undefined> {\n return await this.storedAttempt(sealAttemptRef(requestedAttempt))\n }\n\n async markCandidateMayRun(\n requestedLease: AgentCandidateExecutionLease,\n ): Promise<AgentCandidateExecutionPhaseResult> {\n const lease = sealLease(requestedLease)\n const claimPath = this.claimPath(lease)\n const stored = await readClaim(claimPath)\n assertSameSlot(stored.claim, lease, claimPath)\n assertLease(stored.leaseDigest, stored.claim.leaseExpiresAtMs, lease)\n const state = await this.transitionState(stored.claim)\n if (state.phase === 'candidate-may-run') {\n return Object.freeze({ marked: false, phase: 'candidate-may-run' })\n }\n if (state.staged) {\n throw new Error('candidate execution terminal was staged before candidate-may-run phase')\n }\n assertUnexpiredLease(stored.claim.leaseExpiresAtMs, this.now())\n const marked = await writeRecordIfAbsent(\n this.directory,\n this.transitionPath(stored.claim, 1),\n {\n kind: 'candidate-execution-phase',\n executionId: stored.claim.executionId,\n attempt: stored.claim.attempt,\n executionPlanDigest: stored.claim.executionPlanDigest,\n phase: 'candidate-may-run',\n },\n this.ownerPublication(stored.claim),\n )\n if (marked) return Object.freeze({ marked: true, phase: 'candidate-may-run' })\n const winner = await this.transitionState(stored.claim)\n if (winner.phase === 'candidate-may-run') {\n return Object.freeze({ marked: false, phase: 'candidate-may-run' })\n }\n throw new Error('candidate execution terminal was staged before candidate-may-run phase')\n }\n\n async stageTerminal(\n requestedLease: AgentCandidateExecutionLease,\n result: AgentCandidateExecutionTerminalResult,\n ): Promise<AgentCandidateExecutionStageResult> {\n const lease = sealLease(requestedLease)\n const claimPath = this.claimPath(lease)\n const stored = await readClaim(claimPath)\n assertSameSlot(stored.claim, lease, claimPath)\n assertLease(stored.leaseDigest, stored.claim.leaseExpiresAtMs, lease)\n const terminal = terminalRecord(stored.claim, result)\n const state = await this.transitionState(stored.claim)\n if (state.staged) return rejectedStage(state.staged, terminal)\n assertTerminalAllowedInPhase(state.phase, terminal)\n assertUnexpiredLease(stored.claim.leaseExpiresAtMs, this.now())\n const transition = state.phase === 'claimed' ? 1 : 2\n const staged = await writeRecordIfAbsent(\n this.directory,\n this.transitionPath(stored.claim, transition),\n {\n kind: 'candidate-execution-pending-terminal',\n terminal,\n },\n this.ownerPublication(stored.claim),\n )\n if (staged) return Object.freeze({ staged: true, terminal })\n const winner = await this.transitionState(stored.claim)\n if (!winner.staged) {\n throw new Error('candidate execution phase transition won while staging terminal')\n }\n return rejectedStage(winner.staged, terminal)\n }\n\n async finish(\n requestedLease: AgentCandidateExecutionLease,\n requestedTerminalDigest: Sha256Digest,\n ): Promise<AgentCandidateExecutionFinishResult> {\n const lease = sealLease(requestedLease)\n const terminalDigest = sealTerminalDigest(requestedTerminalDigest)\n const claimPath = this.claimPath(lease)\n const stored = await readClaim(claimPath)\n assertSameSlot(stored.claim, lease, claimPath)\n assertLease(stored.leaseDigest, stored.claim.leaseExpiresAtMs, lease)\n const state = await this.transitionState(stored.claim)\n const staged = requireStagedTerminal(state.staged, terminalDigest)\n const terminalPath = this.terminalPath(lease)\n const existing = await readTerminalIfPresent(terminalPath)\n if (existing) {\n assertTerminalMatchesClaim(existing, stored.claim, terminalPath)\n assertTerminalMatchesStaged(existing, staged, terminalPath)\n return rejectedFinish(existing, terminalDigest)\n }\n assertUnexpiredLease(stored.claim.leaseExpiresAtMs, this.now())\n const finished = await writeRecordIfAbsent(\n this.directory,\n terminalPath,\n {\n terminal: staged,\n },\n this.ownerPublication(stored.claim),\n )\n if (finished) return Object.freeze({ finished: true, terminal: staged })\n const winner = await readTerminal(terminalPath)\n assertSameSlot(winner, lease, terminalPath)\n assertTerminalMatchesClaim(winner, stored.claim, terminalPath)\n assertTerminalMatchesStaged(winner, staged, terminalPath)\n return rejectedFinish(winner, terminalDigest)\n }\n\n async recoverExpired(\n requestedAttempt: AgentCandidateExecutionAttemptRef,\n evidence: AgentCandidateExecutionRecoveryEvidence,\n ): Promise<AgentCandidateExecutionFinishResult> {\n const attempt = sealAttemptRef(requestedAttempt)\n const record = await this.storedAttempt(attempt)\n if (!record) throw new Error('candidate execution recovery does not name an acquired attempt')\n const recovered = recoveredTerminalRecord(record.claim, record.phase, evidence)\n if (record.staged) assertRecoveryMatchesStaged(record.staged, recovered)\n const requestedDigest = record.staged?.terminalDigest ?? recovered.terminalDigest\n if (record.terminal) return rejectedFinish(record.terminal, requestedDigest)\n assertExpiredLease(record.claim.leaseExpiresAtMs, this.now())\n\n let staged = record.staged\n if (!staged) {\n const transition = record.phase === 'claimed' ? 1 : 2\n const didStage = await writeRecordIfAbsent(\n this.directory,\n this.transitionPath(record.claim, transition),\n {\n kind: 'candidate-execution-pending-terminal',\n terminal: recovered,\n },\n )\n if (didStage) {\n staged = recovered\n } else {\n const winner = await this.transitionState(record.claim)\n if (!winner.staged) {\n throw new Error(\n 'candidate execution recovery lost terminal staging to a phase transition',\n )\n }\n assertRecoveryMatchesStaged(winner.staged, recovered)\n staged = winner.staged\n }\n }\n\n const terminalPath = this.terminalPath(attempt)\n const didFinish = await writeRecordIfAbsent(this.directory, terminalPath, {\n terminal: staged,\n })\n if (didFinish) return Object.freeze({ finished: true, terminal: staged })\n const winner = await readTerminal(terminalPath)\n assertSameSlot(winner, attempt, terminalPath)\n assertTerminalMatchesClaim(winner, record.claim, terminalPath)\n assertTerminalMatchesStaged(winner, staged, terminalPath)\n return rejectedFinish(winner, staged.terminalDigest)\n }\n\n private async storedAttempt(\n claim: Pick<AgentCandidateExecutionClaim, 'executionId' | 'attempt'>,\n ): Promise<AgentCandidateExecutionAttemptRecord | undefined> {\n const claimPath = this.claimPath(claim)\n const stored = await readClaimIfPresent(claimPath)\n if (!stored) return undefined\n assertSameSlot(stored.claim, claim, claimPath)\n const state = await this.transitionState(stored.claim)\n const terminalPath = this.terminalPath(claim)\n const terminal = await readTerminalIfPresent(terminalPath)\n if (terminal) {\n assertTerminalMatchesClaim(terminal, stored.claim, terminalPath)\n if (!state.staged) {\n throw new Error(\n `candidate execution terminal record at ${terminalPath} has no staged outbox`,\n )\n }\n assertTerminalMatchesStaged(terminal, state.staged, terminalPath)\n }\n return attemptRecord(stored.claim, state.phase, state.staged, terminal)\n }\n\n private async transitionState(claim: AgentCandidateExecutionClaim): Promise<{\n phase: AgentCandidateExecutionPhase\n staged?: AgentCandidateExecutionTerminalRecord\n }> {\n const firstPath = this.transitionPath(claim, 1)\n const first = await readTransitionIfPresent(firstPath, claim)\n if (!first) return { phase: 'claimed' }\n if (first.kind === 'pending') return { phase: 'claimed', staged: first.terminal }\n const secondPath = this.transitionPath(claim, 2)\n const second = await readTransitionIfPresent(secondPath, claim)\n if (!second) return { phase: 'candidate-may-run' }\n if (second.kind !== 'pending') {\n throw new Error(`candidate execution transition at ${secondPath} repeats the phase marker`)\n }\n return { phase: 'candidate-may-run', staged: second.terminal }\n }\n\n private async retryFailure(\n claim: AgentCandidateExecutionClaim,\n ): Promise<AgentCandidateRetryRejection | undefined> {\n if (claim.attempt === 1) return undefined\n return retryRejection(\n claim,\n await this.storedAttempt({\n executionId: claim.executionId,\n attempt: claim.attempt - 1,\n }),\n )\n }\n\n private ownerPublication(claim: AgentCandidateExecutionClaim): {\n authorizePublish: () => true\n } {\n return {\n authorizePublish: () => {\n assertUnexpiredLease(claim.leaseExpiresAtMs, this.now())\n return true\n },\n }\n }\n\n private claimPath(claim: Pick<AgentCandidateExecutionClaim, 'executionId' | 'attempt'>): string {\n return join(this.directory, `${claimSlot(claim)}.claim.json`)\n }\n\n private terminalPath(\n claim: Pick<AgentCandidateExecutionClaim, 'executionId' | 'attempt'>,\n ): string {\n return join(this.directory, `${claimSlot(claim)}.terminal.json`)\n }\n\n private transitionPath(\n claim: Pick<AgentCandidateExecutionClaim, 'executionId' | 'attempt'>,\n ordinal: 1 | 2,\n ): string {\n return join(this.directory, `${claimSlot(claim)}.transition-${ordinal}.json`)\n }\n}\n\nasync function writeRecordIfAbsent(\n directory: string,\n destination: string,\n record: object,\n options: {\n /** Synchronous authorization checked after temp fsync, immediately before atomic publication. */\n authorizePublish?: () => true\n } = {},\n): Promise<boolean> {\n const temporaryPath = join(directory, `.candidate-execution-${process.pid}-${randomUUID()}.tmp`)\n const handle = await open(temporaryPath, 'wx', 0o600)\n try {\n await handle.writeFile(\n Buffer.concat([Buffer.from(canonicalCandidateBytes(record)), Buffer.from('\\n')]),\n )\n await handle.sync()\n } finally {\n await handle.close()\n }\n\n let written = false\n try {\n if (options.authorizePublish && options.authorizePublish() !== true) {\n throw new Error('candidate execution record publication was not authorized')\n }\n // Authorization and the atomic filesystem call are one synchronous critical\n // section so the event loop cannot advance an injected lease clock between them.\n linkSync(temporaryPath, destination)\n written = true\n await syncDirectory(directory)\n } catch (error) {\n if (!isNodeError(error, 'EEXIST')) throw error\n } finally {\n await unlink(temporaryPath).catch((error: unknown) => {\n if (!isNodeError(error, 'ENOENT')) throw error\n })\n }\n return written\n}\n\nasync function syncDirectory(directory: string): Promise<void> {\n const handle = await open(directory, 'r')\n try {\n await handle.sync()\n } finally {\n await handle.close()\n }\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: unknown }).code === code\n )\n}\n","import { candidateCleanupDeadline, withinCandidateCleanupDeadline } from './cleanup'\nimport { sealAgentCandidateModelSettlement } from './model-settlement'\nimport {\n assertPreparedCandidateIntegrity,\n beginPreparedCandidateDisposal,\n consumePreparedCandidateExecution,\n} from './prepared-state'\nimport type { PreparedAgentCandidateExecution } from './types'\n\nexport interface DisposePreparedAgentCandidateOptions {\n cleanupTimeoutMs?: number\n}\n\n/** Revoke reservations held by a prepared candidate that will not be executed. */\nexport async function disposePreparedAgentCandidateExecution(\n prepared: PreparedAgentCandidateExecution,\n options: DisposePreparedAgentCandidateOptions = {},\n): Promise<{ disposed: true }> {\n const initialState = assertPreparedCandidateIntegrity(prepared)\n const cleanupTimeoutMs = options.cleanupTimeoutMs ?? initialState.cleanupTimeoutMs\n if (cleanupTimeoutMs > initialState.cleanupTimeoutMs) {\n throw new Error('disposal cleanup timeout exceeds the frozen preparation bound')\n }\n const cleanupDeadlineAtMs = candidateCleanupDeadline(cleanupTimeoutMs)\n const state = beginPreparedCandidateDisposal(prepared)\n const cleanup: Array<Promise<unknown>> = []\n\n if (state.memory.mode === 'isolated') {\n const reservation = state.memoryReservation\n if (!reservation) throw new Error('isolated memory reservation is missing')\n cleanup.push(\n withinCandidateCleanupDeadline(\n async () => {\n const closed = await state.ports.memory.close({\n executionId: state.executionId,\n preparationId: reservation.preparationId,\n accessDigest: reservation.accessDigest,\n effectiveNamespace: reservation.effectiveNamespace,\n reason: 'abandoned',\n })\n if (closed.closed !== true || Object.keys(closed).some((key) => key !== 'closed')) {\n throw new Error('abandoned isolated memory access did not acknowledge closure')\n }\n },\n cleanupDeadlineAtMs,\n 'isolated memory disposal',\n ),\n )\n }\n\n cleanup.push(\n withinCandidateCleanupDeadline(\n async () => {\n const settlement = sealAgentCandidateModelSettlement(\n await state.ports.models.settleGrant({\n executionId: state.executionId,\n preparationId: state.preparationId,\n grantDigest: state.modelReservation.digest,\n resolved: state.resolvedModel,\n reason: 'abandoned',\n }),\n {\n preparationId: state.preparationId,\n grantDigest: state.modelReservation.digest,\n model: state.resolvedModel.model,\n },\n )\n if (settlement.usage.modelCalls !== 0) {\n throw new Error('unexecuted model reservation unexpectedly contains calls')\n }\n },\n cleanupDeadlineAtMs,\n 'model reservation disposal',\n ),\n )\n\n const results = await Promise.allSettled(cleanup)\n const failures = results\n .filter((result): result is PromiseRejectedResult => result.status === 'rejected')\n .map((result) => result.reason)\n if (failures.length > 0) {\n consumePreparedCandidateExecution(prepared, 'disposal-failed')\n throw new AggregateError(failures, 'candidate preparation disposal failed')\n }\n\n consumePreparedCandidateExecution(prepared, 'disposed')\n return Object.freeze({ disposed: true as const })\n}\n","import type {\n AgentCandidateModelAccessNetwork,\n AgentCandidateResolvedModel,\n Sha256Digest,\n} from '@tangle-network/agent-interface'\n\nimport { canonicalCandidateDigest, immutableCandidateValue } from './digest'\nimport { assertExactObjectKeys } from './exact-object'\nimport { sealAgentCandidateModelSettlement, usdToNanos } from './model-settlement'\nimport type {\n AgentCandidateModelLimits,\n AgentCandidateModelPort,\n AgentCandidateProtectedModelActivation,\n AgentCandidateProtectedModelReservation,\n AgentCandidateProtectedModelSettlement,\n} from './types'\n\nexport type AgentCandidateModelGrantReserveInput = Parameters<\n AgentCandidateModelPort['reserveGrant']\n>[0]\nexport type AgentCandidateModelGrantActivateInput = Parameters<\n AgentCandidateModelPort['activateGrant']\n>[0]\nexport type AgentCandidateModelGrantSettleInput = Parameters<\n AgentCandidateModelPort['settleGrant']\n>[0]\n\n/** Secret-free response from the service's reservation endpoint. */\nexport type AgentCandidateModelGrantReservation = AgentCandidateProtectedModelReservation\n\n/**\n * Narrow transport contract for a service that owns scoped model credentials\n * and the authoritative per-call usage ledger.\n *\n * An HTTP client can bind these methods to control-plane endpoints. Keeping\n * transport out of the runtime prevents parent credentials, endpoint paths,\n * and retry policy from becoming part of the portable candidate contract.\n */\nexport interface AgentCandidateModelGrantClient {\n reserve(input: AgentCandidateModelGrantReserveInput): Promise<AgentCandidateModelGrantReservation>\n activate(\n input: AgentCandidateModelGrantActivateInput,\n ): Promise<AgentCandidateProtectedModelActivation>\n settle(\n input: AgentCandidateModelGrantSettleInput,\n ): Promise<AgentCandidateProtectedModelSettlement>\n}\n\nexport interface CreateProtectedAgentCandidateModelPortOptions {\n client: AgentCandidateModelGrantClient\n /** Catalog/snapshot resolution stays separate from credential issuance. */\n resolveModel: AgentCandidateModelPort['resolve']\n /** The only public DNS name candidate processes may reach for inference. */\n gatewayDomain: string\n /** Exact environment names the activation endpoint must return, no more or fewer. */\n activationEnvNames: readonly string[]\n}\n\ninterface RememberedReservation {\n requestDigest: Sha256Digest\n responseDigest: Sha256Digest\n executionId: string\n preparationId: string\n grantDigest: Sha256Digest\n expiresAtMs: number\n resolved: AgentCandidateResolvedModel\n limits: AgentCandidateModelLimits\n maxCostUsdNanos: number\n activation: 'reserved' | 'activating' | 'activated'\n settlementDigest?: Sha256Digest\n settlementReason?: AgentCandidateModelGrantSettleInput['reason']\n}\n\ninterface RememberedSettlement {\n settlementDigest: Sha256Digest\n settlementReason: AgentCandidateModelGrantSettleInput['reason']\n expiresAtMs: number\n}\n\nconst MAX_RECENT_SETTLEMENTS = 4_096\nconst RECOVERED_SETTLEMENT_RETENTION_MS = 15 * 60 * 1_000\n\n/**\n * Bind a protected model-grant service to the immutable candidate runtime.\n *\n * The service remains the authority for expiry, admission, revocation, and\n * metering. This adapter independently checks every response before allowing\n * it to cross into candidate execution or durable receipt finalization.\n */\nexport function createProtectedAgentCandidateModelPort(\n options: CreateProtectedAgentCandidateModelPortOptions,\n): AgentCandidateModelPort {\n const gatewayDomain = assertGatewayDomain(options.gatewayDomain)\n const activationEnvNames = exactEnvironmentNames(options.activationEnvNames)\n const reservations = new Map<string, RememberedReservation>()\n const recentSettlements = new Map<string, RememberedSettlement>()\n\n return {\n resolve: async (input) => {\n const request = immutableCandidateValue(input)\n const resolved = validateResolvedModel(await options.resolveModel(request), request)\n return immutableCandidateValue(resolved)\n },\n\n reserveGrant: async (input) => {\n pruneExpiredState(reservations, recentSettlements, Date.now())\n const request = immutableCandidateValue(input)\n validateReserveInput(request)\n const requestDigest = canonicalCandidateDigest(request)\n const key = reservationKey(request.executionId, request.preparationId)\n if (recentSettlements.has(key)) {\n throw new Error('protected model reservation is already settled')\n }\n const previous = reservations.get(key)\n if (previous && previous.requestDigest !== requestDigest) {\n throw new Error('protected model reservation retry changed immutable input')\n }\n\n const reservation = validateReservation(\n await options.client.reserve(request),\n request,\n gatewayDomain,\n )\n const responseDigest = canonicalCandidateDigest(reservation)\n if (recentSettlements.has(key)) {\n throw new Error('protected model reservation completed after the grant was settled')\n }\n const recorded = previous ?? reservations.get(key)\n if (recorded && recorded.requestDigest !== requestDigest) {\n throw new Error('protected model reservation retry changed immutable input')\n }\n if (recorded && recorded.responseDigest !== responseDigest) {\n throw new Error('protected model reservation retry returned different evidence')\n }\n if (!recorded) {\n reservations.set(key, {\n requestDigest,\n responseDigest,\n executionId: request.executionId,\n preparationId: request.preparationId,\n grantDigest: reservation.digest,\n expiresAtMs: request.expiresAtMs,\n resolved: immutableCandidateValue(request.resolved),\n limits: immutableCandidateValue(request.limits),\n maxCostUsdNanos: usdToNanos(request.limits.maxCostUsd, 'reserved maxCostUsd'),\n activation: 'reserved',\n })\n }\n return reservation\n },\n\n activateGrant: async (input) => {\n pruneExpiredState(reservations, recentSettlements, Date.now())\n const request = immutableCandidateValue(input)\n const key = reservationKey(request.executionId, request.preparationId)\n if (recentSettlements.has(key)) throw new Error('protected model grant is already settled')\n const state = reservations.get(key)\n if (!state) throw new Error('protected model grant was not reserved by this port')\n assertGrantIdentity(state, request)\n if (state.settlementDigest) throw new Error('protected model grant is already settled')\n if (state.activation !== 'reserved') {\n throw new Error('protected model grant activation is single-use')\n }\n if (!Number.isSafeInteger(request.deadlineAtMs) || request.deadlineAtMs <= 0) {\n throw new Error('protected model activation deadline must be a positive safe integer')\n }\n if (request.deadlineAtMs <= Date.now()) {\n throw new Error('protected model activation deadline must be in the future')\n }\n if (request.deadlineAtMs > state.expiresAtMs) {\n throw new Error('protected model activation deadline exceeds the reserved expiry')\n }\n state.activation = 'activating'\n try {\n const activation = validateActivation(\n await options.client.activate(request),\n state.limits.maxModelCalls === 0 ? [] : activationEnvNames,\n )\n if (recentSettlements.has(key) || reservations.get(key) !== state) {\n throw new Error('protected model grant settled while activation was in flight')\n }\n state.activation = 'activated'\n return activation\n } catch (error) {\n state.activation = 'reserved'\n throw error\n }\n },\n\n settleGrant: async (input) => {\n const now = Date.now()\n pruneExpiredState(reservations, recentSettlements, now)\n const request = immutableCandidateValue(input)\n const key = reservationKey(request.executionId, request.preparationId)\n const state = reservations.get(key)\n if (state) assertGrantIdentity(state, request)\n const remembered = state ?? recentSettlements.get(key)\n if (remembered?.settlementReason && remembered.settlementReason !== request.reason) {\n throw new Error('protected model settlement retry changed the termination reason')\n }\n\n const sealed = sealAgentCandidateModelSettlement(await options.client.settle(request), {\n preparationId: request.preparationId,\n grantDigest: request.grantDigest,\n model: request.resolved.model,\n })\n if (state) assertWithinReservedLimits(sealed.usage, state)\n\n const settlementDigest = canonicalCandidateDigest(sealed.value)\n if (remembered?.settlementDigest && remembered.settlementDigest !== settlementDigest) {\n throw new Error('protected model settlement retry returned a different final ledger')\n }\n if (remembered?.settlementReason && remembered.settlementReason !== request.reason) {\n throw new Error('protected model settlement retry changed the termination reason')\n }\n const expiresAtMs = state?.expiresAtMs ?? now + RECOVERED_SETTLEMENT_RETENTION_MS\n if (state) {\n state.settlementDigest = settlementDigest\n state.settlementReason = request.reason\n }\n reservations.delete(key)\n rememberSettlement(recentSettlements, key, {\n settlementDigest,\n settlementReason: request.reason,\n expiresAtMs,\n })\n return sealed.value\n },\n }\n}\n\nfunction validateReserveInput(input: AgentCandidateModelGrantReserveInput): void {\n if (!Number.isSafeInteger(input.expiresAtMs) || input.expiresAtMs <= 0) {\n throw new Error('protected model reservation expiry must be a positive safe integer')\n }\n if (input.expiresAtMs <= Date.now()) {\n throw new Error('protected model reservation expiry must be in the future')\n }\n for (const [name, value] of [\n ['maxModelCalls', input.limits.maxModelCalls],\n ['maxInputTokens', input.limits.maxInputTokens],\n ['maxOutputTokens', input.limits.maxOutputTokens],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`protected model reservation ${name} must be a nonnegative safe integer`)\n }\n }\n usdToNanos(input.limits.maxCostUsd, 'reserved maxCostUsd')\n}\n\nfunction validateReservation(\n value: unknown,\n expected: AgentCandidateModelGrantReserveInput,\n gatewayDomain: string,\n): AgentCandidateModelGrantReservation {\n const source = exactRecord(\n value,\n ['preparationId', 'digest', 'expiresAtMs', 'enforcedLimits', 'network'],\n 'protected model reservation response',\n )\n if (source.preparationId !== expected.preparationId) {\n throw new Error('protected model reservation response changed preparation identity')\n }\n if (!isSha256Digest(source.digest)) {\n throw new Error('protected model reservation response has an invalid digest')\n }\n if (source.expiresAtMs !== expected.expiresAtMs) {\n throw new Error('protected model reservation response changed expiry')\n }\n exactRecord(\n source.enforcedLimits,\n ['maxModelCalls', 'maxInputTokens', 'maxOutputTokens', 'maxCostUsd'],\n 'protected model reservation enforced limits',\n )\n if (\n canonicalCandidateDigest(source.enforcedLimits) !== canonicalCandidateDigest(expected.limits)\n ) {\n throw new Error('protected model reservation response changed enforced limits')\n }\n\n const network = validateReservationNetwork(\n source.network,\n expected.limits.maxModelCalls,\n gatewayDomain,\n )\n return immutableCandidateValue({\n preparationId: source.preparationId,\n digest: source.digest,\n expiresAtMs: source.expiresAtMs,\n enforcedLimits: source.enforcedLimits,\n network,\n }) as AgentCandidateModelGrantReservation\n}\n\nfunction validateReservationNetwork(\n value: unknown,\n maxModelCalls: number,\n gatewayDomain: string,\n): AgentCandidateModelAccessNetwork {\n if (maxModelCalls === 0) {\n const source = exactRecord(value, ['mode'], 'protected model reservation network')\n if (source.mode !== 'disabled') {\n throw new Error('zero-call protected model reservation must disable gateway access')\n }\n return { mode: 'disabled' }\n }\n\n const source = exactRecord(value, ['mode', 'domains'], 'protected model reservation network')\n if (source.mode !== 'gateway-only') {\n throw new Error('protected model reservation must allow only its model gateway')\n }\n if (\n !Array.isArray(source.domains) ||\n source.domains.length !== 1 ||\n source.domains[0] !== gatewayDomain\n ) {\n throw new Error('protected model reservation returned an unexpected gateway domain')\n }\n return { mode: 'gateway-only', domains: [gatewayDomain] }\n}\n\nfunction validateActivation(\n value: unknown,\n expectedNames: readonly string[],\n): AgentCandidateProtectedModelActivation {\n const source = exactRecord(value, ['env'], 'protected model activation response')\n const env = record(source.env, 'protected model activation environment')\n const actualNames = Object.keys(env).sort()\n if (\n actualNames.length !== expectedNames.length ||\n actualNames.some((name, index) => name !== expectedNames[index])\n ) {\n throw new Error('protected model activation returned unexpected environment names')\n }\n const detached: Record<string, string> = Object.create(null) as Record<string, string>\n for (const name of expectedNames) {\n const value = env[name]\n if (typeof value !== 'string' || value.length < 8 || value.length > 65_536) {\n throw new Error(`protected model activation ${name} must be a non-empty protected value`)\n }\n detached[name] = value\n }\n return Object.freeze({ env: Object.freeze(detached) })\n}\n\nfunction validateResolvedModel(\n value: unknown,\n expected: Parameters<AgentCandidateModelPort['resolve']>[0],\n): AgentCandidateResolvedModel {\n const source = exactRecord(\n value,\n ['requested', 'provider', 'model', 'snapshot', 'reasoningEffort'],\n 'resolved candidate model',\n )\n if (source.requested !== expected.requested) {\n throw new Error('model resolver changed the evaluator-owned request')\n }\n if (source.reasoningEffort !== expected.reasoningEffort) {\n throw new Error('model resolver changed the evaluator-owned reasoning effort')\n }\n for (const name of ['requested', 'provider', 'model', 'snapshot'] as const) {\n if (typeof source[name] !== 'string' || source[name].length === 0) {\n throw new Error(`resolved candidate model ${name} must be non-empty`)\n }\n }\n return source as unknown as AgentCandidateResolvedModel\n}\n\nfunction assertGrantIdentity(\n expected: RememberedReservation,\n actual: AgentCandidateModelGrantActivateInput | AgentCandidateModelGrantSettleInput,\n): void {\n if (\n actual.executionId !== expected.executionId ||\n actual.preparationId !== expected.preparationId ||\n actual.grantDigest !== expected.grantDigest ||\n canonicalCandidateDigest(actual.resolved) !== canonicalCandidateDigest(expected.resolved)\n ) {\n throw new Error('protected model grant input does not match its immutable reservation')\n }\n}\n\nfunction assertWithinReservedLimits(\n usage: {\n modelCalls: number\n inputTokens: number\n outputTokens: number\n costUsdNanos: number\n },\n reservation: RememberedReservation,\n): void {\n for (const [name, actual, limit] of [\n ['model calls', usage.modelCalls, reservation.limits.maxModelCalls],\n ['input tokens', usage.inputTokens, reservation.limits.maxInputTokens],\n ['output tokens', usage.outputTokens, reservation.limits.maxOutputTokens],\n ['cost USD nanos', usage.costUsdNanos, reservation.maxCostUsdNanos],\n ] as const) {\n if (actual > limit) {\n throw new Error(`protected model settlement ${name} ${actual} exceeds reserved ${limit}`)\n }\n }\n}\n\nfunction exactEnvironmentNames(values: readonly string[]): readonly string[] {\n if (values.length === 0) {\n throw new Error('protected model activation environment names must not be empty')\n }\n const names = [...values].sort()\n if (new Set(names).size !== names.length) {\n throw new Error('protected model activation environment names must be unique')\n }\n for (const name of names) {\n if (\n !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name) ||\n ['__proto__', 'constructor', 'prototype'].includes(name)\n ) {\n throw new Error(`protected model activation environment name is invalid: ${name}`)\n }\n }\n return Object.freeze(names)\n}\n\nfunction assertGatewayDomain(value: string): string {\n if (\n value.length > 253 ||\n value !== value.toLowerCase() ||\n value.endsWith('.') ||\n value.includes(':') ||\n value === 'localhost' ||\n value.endsWith('.localhost') ||\n value === 'metadata.google' ||\n value === 'metadata.google.internal'\n ) {\n throw new Error('protected model gateway must be an exact lowercase public DNS name')\n }\n const labels = value.split('.')\n if (\n labels.length < 2 ||\n !labels.every(\n (label) =>\n label.length >= 1 && label.length <= 63 && /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(label),\n ) ||\n !/[a-z]/.test(labels.at(-1) ?? '')\n ) {\n throw new Error('protected model gateway must be an exact lowercase public DNS name')\n }\n return value\n}\n\nfunction reservationKey(executionId: string, preparationId: string): string {\n return canonicalCandidateDigest({ executionId, preparationId })\n}\n\nfunction pruneExpiredState(\n reservations: Map<string, RememberedReservation>,\n settlements: Map<string, RememberedSettlement>,\n now: number,\n): void {\n for (const [key, value] of reservations) {\n if (value.expiresAtMs <= now) reservations.delete(key)\n }\n for (const [key, value] of settlements) {\n if (value.expiresAtMs <= now) settlements.delete(key)\n }\n}\n\nfunction rememberSettlement(\n settlements: Map<string, RememberedSettlement>,\n key: string,\n value: RememberedSettlement,\n): void {\n settlements.delete(key)\n settlements.set(key, value)\n while (settlements.size > MAX_RECENT_SETTLEMENTS) {\n const oldest = settlements.keys().next().value\n if (oldest === undefined) return\n settlements.delete(oldest)\n }\n}\n\nfunction isSha256Digest(value: unknown): value is Sha256Digest {\n return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value)\n}\n\nfunction exactRecord(\n value: unknown,\n keys: readonly string[],\n label: string,\n): Record<string, unknown> {\n const source = record(value, label)\n assertExactObjectKeys(source, keys, label)\n return source\n}\n\nfunction record(value: unknown, label: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object`)\n }\n const prototype = Object.getPrototypeOf(value)\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(`${label} must be a plain object`)\n }\n return value as Record<string, unknown>\n}\n","import type { TraceStore } from '@tangle-network/agent-eval'\nimport type {\n AgentCandidateExecutionPlanMaterial,\n AgentCandidateMaterializationReceipt,\n} from '@tangle-network/agent-interface'\nimport {\n agentCandidateExecutionPlanMaterialSchema,\n agentCandidateMaterializationReceiptSchema,\n} from '@tangle-network/agent-interface'\n\nimport { readVerifiedArtifact } from './artifacts'\nimport type {\n AgentCandidateExecutionAttemptRef,\n AgentCandidateExecutionClaim,\n AgentCandidateExecutionClaimStore,\n AgentCandidateExecutionFinishResult,\n} from './claim'\nimport {\n candidateCleanupDeadline,\n candidateCleanupTimeout,\n withinCandidateCleanupDeadline,\n} from './cleanup'\nimport { canonicalCandidateBytes } from './digest'\nimport { sealAgentCandidateExecutorStopAcknowledgement } from './executor-capture'\nimport { sealAgentCandidateModelSettlement } from './model-settlement'\nimport { persistCandidateModelSettlementEvidence } from './outcome-evidence'\nimport { persistCandidateOutputArtifact } from './output-artifacts'\nimport { RecoveryAgentCandidateTraceStore } from './protected-trace-store'\nimport type {\n AgentCandidateExecutionPorts,\n AgentCandidateExecutorPort,\n AgentCandidateOutputArtifactPort,\n} from './types'\n\nexport interface RecoverExpiredAgentCandidateOptions {\n attempt: AgentCandidateExecutionAttemptRef\n claimStore: AgentCandidateExecutionClaimStore\n executor: AgentCandidateExecutorPort\n traceStore: TraceStore\n ports: Pick<AgentCandidateExecutionPorts, 'models' | 'memory'>\n outputArtifacts: AgentCandidateOutputArtifactPort\n cleanupTimeoutMs?: number\n /** Evaluator clock; must be the same clock used by the claim store. */\n now?: () => number\n}\n\n/** Close an expired crashed attempt from persisted non-secret handles, then record failure. */\nexport async function recoverExpiredAgentCandidateExecution(\n options: RecoverExpiredAgentCandidateOptions,\n): Promise<AgentCandidateExecutionFinishResult> {\n const record = await options.claimStore.getAttempt(options.attempt)\n if (!record) throw new Error('candidate execution recovery attempt is missing')\n if (record.terminal) {\n return Object.freeze({ finished: false, terminal: record.terminal, exactReplay: true })\n }\n const cleanupTimeoutMs = candidateCleanupTimeout(\n options.cleanupTimeoutMs ?? record.claim.cleanup.cleanupTimeoutMs,\n )\n if (cleanupTimeoutMs > record.claim.cleanup.cleanupTimeoutMs) {\n throw new Error('recovery cleanup timeout exceeds the frozen preparation bound')\n }\n\n const now = options.now ?? Date.now\n if (now() < record.claim.leaseExpiresAtMs) {\n throw new Error('candidate execution lease has not expired')\n }\n\n const cleanupDeadlineAtMs = candidateCleanupDeadline(cleanupTimeoutMs)\n const recoveryTraceStore = new RecoveryAgentCandidateTraceStore(options.traceStore)\n const preparation = withinCandidateCleanupDeadline(\n () => readRecoveryPreparation(record.claim, options.outputArtifacts),\n cleanupDeadlineAtMs,\n 'expired candidate preparation evidence read',\n )\n const processClosure = withinCandidateCleanupDeadline(\n async (cleanupSignal) => {\n const stopped = await options.executor.stop(\n {\n executionId: record.claim.executionId,\n executionPlanDigest: record.claim.executionPlanDigest,\n },\n {\n traceStore: recoveryTraceStore,\n reason: 'failed',\n signal: cleanupSignal,\n deadlineAtMs: cleanupDeadlineAtMs,\n },\n )\n sealAgentCandidateExecutorStopAcknowledgement(stopped)\n if (options.executor.dispose) {\n const disposed = await options.executor.dispose(\n {\n executionId: record.claim.executionId,\n executionPlanDigest: record.claim.executionPlanDigest,\n },\n { signal: cleanupSignal },\n )\n if (disposed.disposed !== true || Object.keys(disposed).some((key) => key !== 'disposed')) {\n throw new Error('expired candidate executor did not acknowledge resource disposal')\n }\n }\n return { stopped: true as const }\n },\n cleanupDeadlineAtMs,\n 'expired candidate process termination',\n )\n\n const modelClosure = withinCandidateCleanupDeadline(\n async () =>\n sealAgentCandidateModelSettlement(\n await options.ports.models.settleGrant({\n executionId: record.claim.executionId,\n preparationId: record.claim.cleanup.preparationId,\n grantDigest: record.claim.cleanup.modelGrantDigest,\n resolved: record.claim.cleanup.resolvedModel,\n reason: 'failed',\n }),\n {\n preparationId: record.claim.cleanup.preparationId,\n grantDigest: record.claim.cleanup.modelGrantDigest,\n model: record.claim.cleanup.resolvedModel.model,\n },\n ),\n cleanupDeadlineAtMs,\n 'expired candidate model settlement',\n )\n\n const memoryClosure = record.claim.cleanup.memory\n ? withinCandidateCleanupDeadline(\n async () => {\n const memory = record.claim.cleanup.memory\n if (!memory) throw new Error('expired candidate memory handle is missing')\n const closed = await options.ports.memory.close({\n executionId: record.claim.executionId,\n preparationId: record.claim.cleanup.preparationId,\n accessDigest: memory.accessDigest,\n effectiveNamespace: memory.effectiveNamespace,\n reason: 'failed',\n })\n if (closed.closed !== true || Object.keys(closed).some((key) => key !== 'closed')) {\n throw new Error('expired candidate memory did not acknowledge closure')\n }\n return { closed: true as const }\n },\n cleanupDeadlineAtMs,\n 'expired candidate memory closure',\n )\n : undefined\n\n const closureOutcomes = Promise.allSettled([\n modelClosure,\n memoryClosure ?? Promise.resolve(undefined),\n ] as const)\n const [preparationOutcome, processOutcome] = await Promise.allSettled([\n preparation,\n processClosure,\n ] as const)\n const failures: unknown[] = [preparationOutcome, processOutcome]\n .filter((outcome): outcome is PromiseRejectedResult => outcome.status === 'rejected')\n .map((outcome) => outcome.reason)\n const [modelOutcome, memoryOutcome] = await closureOutcomes\n for (const outcome of [modelOutcome, memoryOutcome]) {\n if (outcome.status === 'rejected') failures.push(outcome.reason)\n }\n if (failures.length > 0) {\n throw new AggregateError(failures, 'expired candidate cleanup could not be proven')\n }\n\n if (modelOutcome.status !== 'fulfilled') {\n throw new Error('expired candidate model settlement was not recovered')\n }\n const model = modelOutcome.value\n const modelSettlement = await withinCandidateCleanupDeadline(\n () =>\n persistCandidateModelSettlementEvidence(\n {\n executionId: record.claim.executionId,\n executionPlanDigest: record.claim.executionPlanDigest,\n resolvedModel: record.claim.cleanup.resolvedModel,\n },\n model,\n options.outputArtifacts,\n ),\n cleanupDeadlineAtMs,\n 'expired candidate model-settlement persistence',\n )\n const failureClass =\n record.phase === 'claimed' && model.usage.modelCalls === 0\n ? 'pre-model-infrastructure'\n : 'unknown'\n const failureEvidence = await withinCandidateCleanupDeadline(\n () =>\n persistCandidateOutputArtifact(options.outputArtifacts, {\n executionId: record.claim.executionId,\n purpose: 'failure-evidence',\n bytes: canonicalCandidateBytes({\n kind: 'agent-candidate-recovery-failure',\n executionId: record.claim.executionId,\n attempt: record.claim.attempt,\n bundleDigest: record.claim.bundleDigest,\n executionPlanDigest: record.claim.executionPlanDigest,\n materializationReceiptDigest:\n record.claim.preparationEvidence.materializationReceipt.sha256,\n failureClass,\n processStopped: true,\n modelSettlementDigest: modelSettlement.digest,\n memoryClosed: record.claim.cleanup.memory !== undefined,\n }),\n }),\n cleanupDeadlineAtMs,\n 'expired candidate failure-evidence persistence',\n )\n const memory = record.claim.cleanup.memory\n return await options.claimStore.recoverExpired(options.attempt, {\n failureClass,\n usage: model.usage,\n modelSettlement: modelSettlement.artifact,\n failureEvidence,\n process: {\n stopped: true,\n executionPlanDigest: record.claim.executionPlanDigest,\n },\n model: {\n closed: true,\n preparationId: record.claim.cleanup.preparationId,\n grantDigest: record.claim.cleanup.modelGrantDigest,\n },\n ...(memory\n ? {\n memory: {\n closed: true,\n preparationId: record.claim.cleanup.preparationId,\n accessDigest: memory.accessDigest,\n effectiveNamespace: memory.effectiveNamespace,\n },\n }\n : {}),\n })\n}\n\nasync function readRecoveryPreparation(\n claim: AgentCandidateExecutionClaim,\n artifacts: AgentCandidateOutputArtifactPort,\n): Promise<{\n plan: AgentCandidateExecutionPlanMaterial\n receipt: AgentCandidateMaterializationReceipt\n}> {\n const [planBytes, receiptBytes] = await Promise.all([\n readVerifiedArtifact(claim.preparationEvidence.executionPlan, artifacts),\n readVerifiedArtifact(claim.preparationEvidence.materializationReceipt, artifacts),\n ])\n const plan = agentCandidateExecutionPlanMaterialSchema.parse(\n parseCanonicalBytes(planBytes, 'plan'),\n )\n if (claim.preparationEvidence.executionPlan.sha256 !== claim.executionPlanDigest) {\n throw new Error('recovery execution plan artifact does not match the claimed digest')\n }\n const receiptMaterial = parseCanonicalBytes(receiptBytes, 'materialization receipt')\n const receipt = agentCandidateMaterializationReceiptSchema.parse({\n ...receiptMaterial,\n digest: claim.preparationEvidence.materializationReceipt.sha256,\n })\n if (\n receipt.bundleDigest !== claim.bundleDigest ||\n receipt.executionPlan.digest !== claim.executionPlanDigest ||\n plan.runCell.bundleDigest !== claim.bundleDigest ||\n plan.executionId !== claim.executionId\n ) {\n throw new Error('recovery preparation evidence does not match the durable claim')\n }\n return { plan, receipt }\n}\n\nfunction parseCanonicalBytes(bytes: Uint8Array, label: string): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(Buffer.from(bytes).toString('utf8'))\n } catch (error) {\n throw new Error(`candidate recovery ${label} is not JSON`, { cause: error })\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(`candidate recovery ${label} must be an object`)\n }\n if (!Buffer.from(canonicalCandidateBytes(parsed)).equals(Buffer.from(bytes))) {\n throw new Error(`candidate recovery ${label} bytes are not canonical`)\n }\n return parsed as Record<string, unknown>\n}\n"],"mappings":"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","names":["record","winner","source","value","record","memory"]}
@@ -1,334 +0,0 @@
1
- import {
2
- researcherProfile
3
- } from "./chunk-5QOB7H74.js";
4
- import {
5
- captureAgentCandidateWorkspace
6
- } from "./chunk-MKGRLDWB.js";
7
- import {
8
- verifyAgentImprovementActivation,
9
- verifyAgentImprovementProposal,
10
- verifyAgentImprovementReview
11
- } from "./chunk-G55QE4IQ.js";
12
- import {
13
- canonicalCandidateBytes,
14
- embeddedCandidateArtifact,
15
- persistCandidateOutputArtifact
16
- } from "./chunk-WTZ37EQY.js";
17
- import {
18
- supervise
19
- } from "./chunk-IADLKE7I.js";
20
-
21
- // src/knowledge/improvement-job.ts
22
- import { realpath } from "fs/promises";
23
- import {
24
- agentCandidateKnowledgeSchema
25
- } from "@tangle-network/agent-interface";
26
- import {
27
- evaluateKnowledgeBaseReadiness,
28
- fromAgentCandidateKnowledgeRef,
29
- hashKnowledgeBase,
30
- improveKnowledgeBase,
31
- knowledgeImprovementCandidateRef,
32
- promoteKnowledgeCandidate,
33
- toAgentCandidateKnowledgeRef,
34
- withKnowledgeImprovementCandidate
35
- } from "@tangle-network/agent-knowledge";
36
-
37
- // src/knowledge/supervised-update.ts
38
- var RESEARCH_SUPERVISOR_SYSTEM_PROMPT = [
39
- "You are a research supervisor. You do not answer the research question yourself.",
40
- "You create and manage researcher workers that improve one shared knowledge base until it is ready.",
41
- "",
42
- "Each round:",
43
- "1. Read the goal and the gaps the readiness check still reports.",
44
- "2. Decompose the open work into independent sub-topics.",
45
- "3. Spawn one researcher per sub-topic; split by sub-topic, never duplicate work.",
46
- "4. Wait for researchers to settle, steer or re-spawn thin sub-topics, then stop when the check passes.",
47
- "",
48
- "Conserve the shared budget. Prefer a small number of well-scoped researchers over a large fanout that re-covers the same ground."
49
- ].join("\n");
50
- function knowledgeReadinessDeliverable(options) {
51
- return {
52
- describe: `knowledge base at ${options.root} is ready for: ${options.goal}`,
53
- async check() {
54
- const result = await options.readiness({
55
- root: options.root,
56
- goal: options.goal,
57
- readinessSpecs: options.readinessSpecs,
58
- readinessTaskId: options.readinessTaskId,
59
- readiness: options.readinessOptions
60
- });
61
- return typeof result === "boolean" ? result : result.ready;
62
- }
63
- };
64
- }
65
- function createSupervisedKnowledgeUpdater(options) {
66
- return (input) => runSupervisedKnowledgeUpdate({
67
- ...options,
68
- root: input.candidateRoot ?? input.root ?? options.root,
69
- goal: input.goal ?? options.goal,
70
- findings: input.findings ?? options.findings,
71
- metadata: { ...options.metadata, ...input.metadata }
72
- });
73
- }
74
- async function runSupervisedKnowledgeUpdate(options) {
75
- const { profile: workerProfile } = researcherProfile({ harness: options.harness });
76
- const baseInstructions = options.supervisorSystemPrompt ?? RESEARCH_SUPERVISOR_SYSTEM_PROMPT;
77
- const workerContract = workerProfile.prompt?.systemPrompt;
78
- const systemPrompt = workerContract ? `${baseInstructions}
79
-
80
- Each researcher worker you spawn follows this contract:
81
- ${workerContract}` : baseInstructions;
82
- const profile = {
83
- name: "knowledge-research-supervisor",
84
- model: options.supervisorModel,
85
- systemPrompt
86
- };
87
- const run = options.runSupervised ?? supervise;
88
- const task = formatSupervisedKnowledgeTask(options);
89
- const supervised = await run(profile, task, {
90
- ...options.superviseOptions,
91
- budget: options.budget,
92
- backend: options.backend,
93
- deliverable: knowledgeReadinessDeliverable(options),
94
- makeWorkerAgent: options.makeWorkerAgent,
95
- allowedModels: options.allowedModels
96
- });
97
- return {
98
- applied: supervised.kind === "winner",
99
- summary: supervised.kind === "winner" ? "research supervisor completed and the knowledge base passed readiness" : `research supervisor stopped without a ready knowledge base: ${supervised.reason}`,
100
- supervised,
101
- metadata: {
102
- supervised: true,
103
- root: options.root,
104
- goal: options.goal,
105
- result: supervised.kind
106
- }
107
- };
108
- }
109
- function formatSupervisedKnowledgeTask(options) {
110
- const sections = [
111
- `Goal: ${options.goal}`,
112
- `Knowledge base root: ${options.root}`,
113
- options.readinessTaskId ? `Readiness task id: ${options.readinessTaskId}` : void 0,
114
- options.readinessSpecs?.length ? `Readiness specs:
115
- ${JSON.stringify(options.readinessSpecs, null, 2)}` : void 0,
116
- options.findings?.length ? `Current findings:
117
- ${JSON.stringify(options.findings, null, 2)}` : void 0,
118
- options.metadata && Object.keys(options.metadata).length > 0 ? `Metadata:
119
- ${JSON.stringify(options.metadata, null, 2)}` : void 0
120
- ].filter((section) => Boolean(section));
121
- return `${sections.join("\n\n")}
122
-
123
- Update files under the knowledge base root only. Stop when the readiness check passes.`;
124
- }
125
-
126
- // src/knowledge/improvement-job.ts
127
- function createAgentKnowledgeReadinessCheck(options) {
128
- return async (input) => {
129
- const readiness = await evaluateKnowledgeBaseReadiness({
130
- root: input.root,
131
- goal: input.goal ?? options.goal,
132
- readinessSpecs: input.readinessSpecs ?? options.readinessSpecs,
133
- readinessTaskId: input.readinessTaskId ?? options.readinessTaskId,
134
- readiness: input.readiness ?? options.readiness,
135
- strict: options.strict,
136
- kbQuality: options.kbQuality
137
- });
138
- return {
139
- ready: readiness.ready,
140
- summary: readiness.summary,
141
- metadata: {
142
- dimensions: readiness.dimensions,
143
- validationOk: readiness.validation.ok,
144
- kbQualityOk: readiness.kbQuality.ok,
145
- blockingMissing: readiness.readiness?.report.blockingMissingRequirements.length ?? 0
146
- }
147
- };
148
- };
149
- }
150
- async function runKnowledgeImprovementJob(options) {
151
- const {
152
- allowedModels,
153
- backend,
154
- budget,
155
- candidateArtifacts,
156
- harness,
157
- makeWorkerAgent,
158
- onMeasurement,
159
- approval,
160
- readinessCheck,
161
- runSupervised,
162
- supervisorModel,
163
- supervisorSystemPrompt,
164
- superviseOptions,
165
- ...knowledgeOptions
166
- } = options;
167
- const startedAtMs = Date.now();
168
- const startedAt = new Date(startedAtMs).toISOString();
169
- const supervisedSpent = emptySpent();
170
- let updateCalls = 0;
171
- let updateDurationMs = 0;
172
- const readiness = readinessCheck ?? createAgentKnowledgeReadinessCheck(options);
173
- const updateKnowledge = createSupervisedKnowledgeUpdater({
174
- root: options.root,
175
- goal: options.goal,
176
- readiness,
177
- readinessSpecs: options.readinessSpecs,
178
- readinessTaskId: options.readinessTaskId,
179
- readinessOptions: options.readiness,
180
- budget,
181
- backend,
182
- makeWorkerAgent,
183
- harness,
184
- supervisorModel,
185
- supervisorSystemPrompt,
186
- superviseOptions,
187
- allowedModels,
188
- runSupervised
189
- });
190
- const instrumentedUpdateKnowledge = async (input) => {
191
- const updateStartedAt = Date.now();
192
- updateCalls += 1;
193
- const result = await updateKnowledge(input);
194
- updateDurationMs += Date.now() - updateStartedAt;
195
- addSpent(supervisedSpent, result.supervised);
196
- return result;
197
- };
198
- let resolvedImprovement;
199
- let candidateKnowledge;
200
- if (approval) {
201
- const approvedKnowledge = await approvedKnowledgeCandidate(approval);
202
- const candidate = agentKnowledgeCandidateRef(approvedKnowledge);
203
- knowledgeOptions.signal?.throwIfAborted();
204
- resolvedImprovement = await promoteKnowledgeCandidate({
205
- root: options.root,
206
- candidate,
207
- ...knowledgeOptions.ownerId ? { ownerId: knowledgeOptions.ownerId } : {},
208
- ...knowledgeOptions.leaseTtlMs ? { leaseTtlMs: knowledgeOptions.leaseTtlMs } : {},
209
- ...knowledgeOptions.now ? { now: knowledgeOptions.now } : {},
210
- ...knowledgeOptions.onState ? { onState: knowledgeOptions.onState } : {}
211
- });
212
- knowledgeOptions.signal?.throwIfAborted();
213
- const promotedHash = await hashKnowledgeBase(options.root);
214
- if (!resolvedImprovement.promoted || promotedHash !== candidate.candidateHash) {
215
- throw new Error("knowledge promotion did not activate the approved snapshot bytes");
216
- }
217
- candidateKnowledge = approvedKnowledge;
218
- } else {
219
- resolvedImprovement = await improveKnowledgeBase({
220
- ...knowledgeOptions,
221
- updateKnowledge: instrumentedUpdateKnowledge
222
- });
223
- if (resolvedImprovement.candidate) {
224
- candidateKnowledge = await freezeKnowledgeCandidate(
225
- options.root,
226
- resolvedImprovement,
227
- candidateArtifacts,
228
- knowledgeOptions.signal
229
- );
230
- }
231
- }
232
- const finishedAtMs = Date.now();
233
- const measurement = {
234
- startedAt,
235
- finishedAt: new Date(finishedAtMs).toISOString(),
236
- durationMs: finishedAtMs - startedAtMs,
237
- updateCalls,
238
- updateDurationMs,
239
- supervisedSpent
240
- };
241
- await onMeasurement?.(measurement);
242
- return {
243
- improvement: resolvedImprovement,
244
- ...candidateKnowledge ? { candidateKnowledge } : {},
245
- measurement,
246
- promoted: resolvedImprovement.promoted,
247
- blocked: resolvedImprovement.blocked
248
- };
249
- }
250
- async function freezeKnowledgeCandidate(root, improvement, artifacts, signal) {
251
- const candidate = knowledgeImprovementCandidateRef(improvement);
252
- return withKnowledgeImprovementCandidate({ root, candidate }, async (resolved) => {
253
- const executionId = `knowledge-${candidate.candidateId}`;
254
- const candidateRef = toAgentCandidateKnowledgeRef(candidate);
255
- const captured = await captureAgentCandidateWorkspace(await realpath(resolved.root), {
256
- ...artifacts ? {
257
- artifactPersistence: {
258
- executionId,
259
- outputArtifacts: artifacts,
260
- ...signal ? { signal } : {}
261
- }
262
- } : {}
263
- });
264
- const evaluation = await captureKnowledgeEvidence(
265
- canonicalCandidateBytes({
266
- kind: "agent-knowledge-candidate-evaluation",
267
- candidate: candidateRef,
268
- metric: resolved.evaluation
269
- }),
270
- "knowledge-evaluation",
271
- executionId,
272
- artifacts,
273
- signal
274
- );
275
- return agentCandidateKnowledgeSchema.parse({
276
- candidate: candidateRef,
277
- snapshot: captured.snapshot,
278
- evaluation
279
- });
280
- });
281
- }
282
- async function captureKnowledgeEvidence(bytes, purpose, executionId, artifacts, signal) {
283
- if (!artifacts) return embeddedCandidateArtifact(bytes);
284
- return persistCandidateOutputArtifact(artifacts, {
285
- executionId,
286
- purpose,
287
- bytes,
288
- ...signal ? { signal } : {}
289
- });
290
- }
291
- async function approvedKnowledgeCandidate(approval) {
292
- const proposal = verifyAgentImprovementProposal(approval.proposal);
293
- const review = verifyAgentImprovementReview(approval.review);
294
- const activation = verifyAgentImprovementActivation({
295
- proposal,
296
- review,
297
- activation: approval.activation
298
- });
299
- const candidateBundle = proposal.evaluation.experiment.candidate;
300
- const knowledgeTarget = activation.targets.find((target) => target.surface === "knowledge");
301
- if (proposal.changedSurfaces.length !== 1 || proposal.changedSurfaces[0] !== "knowledge" || !candidateBundle.knowledge || !knowledgeTarget || knowledgeTarget.expectedBaseDigest !== candidateBundle.knowledge.candidate.baseHash || review.decision !== "approve" || review.proposalDigest !== proposal.digest) {
302
- throw new Error("knowledge promotion requires an approved exact knowledge proposal");
303
- }
304
- if (!await approval.authorizeActivation(activation, proposal, review)) {
305
- throw new Error("knowledge candidate activation was not authorized");
306
- }
307
- return candidateBundle.knowledge;
308
- }
309
- function agentKnowledgeCandidateRef(knowledge) {
310
- return fromAgentCandidateKnowledgeRef(knowledge.candidate);
311
- }
312
- function emptySpent() {
313
- return { iterations: 0, inputTokens: 0, outputTokens: 0, usdKnown: true, usd: 0, ms: 0 };
314
- }
315
- function addSpent(target, result) {
316
- const spent = result.spentTotal;
317
- target.iterations += spent.iterations;
318
- target.inputTokens += spent.tokens.input;
319
- target.outputTokens += spent.tokens.output;
320
- target.usdKnown = target.usdKnown && spent.usdKnown !== false;
321
- target.usd += spent.usd;
322
- target.ms += spent.ms;
323
- }
324
-
325
- export {
326
- RESEARCH_SUPERVISOR_SYSTEM_PROMPT,
327
- knowledgeReadinessDeliverable,
328
- createSupervisedKnowledgeUpdater,
329
- runSupervisedKnowledgeUpdate,
330
- formatSupervisedKnowledgeTask,
331
- createAgentKnowledgeReadinessCheck,
332
- runKnowledgeImprovementJob
333
- };
334
- //# sourceMappingURL=chunk-AP7CPGMZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/knowledge/improvement-job.ts","../src/knowledge/supervised-update.ts"],"sourcesContent":["import { realpath } from 'node:fs/promises'\nimport {\n type AgentCandidateCapturedArtifact,\n type AgentCandidateKnowledge,\n type AgentImprovementActivation,\n type AgentImprovementProposal,\n type AgentImprovementReview,\n agentCandidateKnowledgeSchema,\n} from '@tangle-network/agent-interface'\nimport {\n type BuildEvalKnowledgeBundleOptions,\n evaluateKnowledgeBaseReadiness,\n fromAgentCandidateKnowledgeRef,\n hashKnowledgeBase,\n improveKnowledgeBase,\n type KnowledgeBaseQualityOptions,\n type KnowledgeImprovementCandidateRef,\n type KnowledgeImprovementOptions,\n type KnowledgeImprovementResult,\n type KnowledgeReadinessSpec,\n knowledgeImprovementCandidateRef,\n promoteKnowledgeCandidate,\n toAgentCandidateKnowledgeRef,\n withKnowledgeImprovementCandidate,\n} from '@tangle-network/agent-knowledge'\nimport { canonicalCandidateBytes, embeddedCandidateArtifact } from '../candidate-execution/digest'\nimport { persistCandidateOutputArtifact } from '../candidate-execution/output-artifacts'\nimport type { AgentCandidateOutputArtifactPort } from '../candidate-execution/types'\nimport { captureAgentCandidateWorkspace } from '../candidate-execution/workspace-archive'\nimport {\n verifyAgentImprovementActivation,\n verifyAgentImprovementProposal,\n verifyAgentImprovementReview,\n} from '../intelligence/improvement-cycle'\nimport type { ExecutorConfig } from '../runtime/supervise/runtime'\nimport type { SuperviseOptions } from '../runtime/supervise/supervise'\nimport type { SupervisorProfile } from '../runtime/supervise/supervisor-agent'\nimport type { Budget, SupervisedResult } from '../runtime/supervise/types'\nimport {\n createSupervisedKnowledgeUpdater,\n type KnowledgeReadinessCheck,\n type KnowledgeReadinessCheckResult,\n type SupervisedKnowledgeUpdateOptions,\n} from './supervised-update'\n\nexport interface RunKnowledgeImprovementJobOptions\n extends Omit<KnowledgeImprovementOptions, 'updateKnowledge'> {\n budget: Budget\n readinessCheck?: KnowledgeReadinessCheck\n backend?: ExecutorConfig\n makeWorkerAgent?: SuperviseOptions['makeWorkerAgent']\n harness?: string\n supervisorModel?: string\n supervisorSystemPrompt?: string\n superviseOptions?: Partial<\n Omit<\n SuperviseOptions,\n 'budget' | 'backend' | 'deliverable' | 'makeWorkerAgent' | 'allowedModels'\n >\n >\n allowedModels?: readonly string[]\n runSupervised?: (\n profile: SupervisorProfile,\n task: unknown,\n opts: SuperviseOptions,\n ) => Promise<SupervisedResult<unknown>>\n candidateArtifacts?: AgentCandidateOutputArtifactPort\n approval?: ApprovedKnowledgeImprovementCandidate\n onMeasurement?: (measurement: KnowledgeImprovementJobMeasurement) => Promise<void> | void\n}\n\nexport interface ApprovedKnowledgeImprovementCandidate {\n proposal: AgentImprovementProposal\n review: AgentImprovementReview\n activation: AgentImprovementActivation\n authorizeActivation: (\n activation: AgentImprovementActivation,\n proposal: AgentImprovementProposal,\n review: AgentImprovementReview,\n ) => boolean | Promise<boolean>\n}\n\nexport interface KnowledgeImprovementJobMeasurement {\n startedAt: string\n finishedAt: string\n durationMs: number\n updateCalls: number\n updateDurationMs: number\n supervisedSpent: {\n iterations: number\n inputTokens: number\n outputTokens: number\n usdKnown: boolean\n usd: number\n ms: number\n }\n}\n\nexport interface KnowledgeImprovementJobResult {\n improvement: KnowledgeImprovementResult\n candidateKnowledge?: AgentCandidateKnowledge\n measurement: KnowledgeImprovementJobMeasurement\n promoted: boolean\n blocked: boolean\n}\n\nexport interface AgentKnowledgeReadinessCheckOptions {\n goal: string\n readinessSpecs?: readonly KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n strict?: boolean\n kbQuality?: KnowledgeBaseQualityOptions\n}\n\n/** Build the default readiness check backed by `@tangle-network/agent-knowledge` validation and scoring. */\nexport function createAgentKnowledgeReadinessCheck(\n options: AgentKnowledgeReadinessCheckOptions,\n): KnowledgeReadinessCheck {\n return async (input): Promise<KnowledgeReadinessCheckResult> => {\n const readiness = await evaluateKnowledgeBaseReadiness({\n root: input.root,\n goal: input.goal ?? options.goal,\n readinessSpecs:\n (input.readinessSpecs as readonly KnowledgeReadinessSpec[] | undefined) ??\n options.readinessSpecs,\n readinessTaskId: input.readinessTaskId ?? options.readinessTaskId,\n readiness:\n (input.readiness as AgentKnowledgeReadinessCheckOptions['readiness'] | undefined) ??\n options.readiness,\n strict: options.strict,\n kbQuality: options.kbQuality,\n })\n return {\n ready: readiness.ready,\n summary: readiness.summary,\n metadata: {\n dimensions: readiness.dimensions,\n validationOk: readiness.validation.ok,\n kbQualityOk: readiness.kbQuality.ok,\n blockingMissing: readiness.readiness?.report.blockingMissingRequirements.length ?? 0,\n },\n }\n }\n}\n\n/** Produce a frozen KB candidate, and promote it only when an exact signed review is supplied. */\nexport async function runKnowledgeImprovementJob(\n options: RunKnowledgeImprovementJobOptions,\n): Promise<KnowledgeImprovementJobResult> {\n const {\n allowedModels,\n backend,\n budget,\n candidateArtifacts,\n harness,\n makeWorkerAgent,\n onMeasurement,\n approval,\n readinessCheck,\n runSupervised,\n supervisorModel,\n supervisorSystemPrompt,\n superviseOptions,\n ...knowledgeOptions\n } = options\n const startedAtMs = Date.now()\n const startedAt = new Date(startedAtMs).toISOString()\n const supervisedSpent = emptySpent()\n let updateCalls = 0\n let updateDurationMs = 0\n\n const readiness = readinessCheck ?? createAgentKnowledgeReadinessCheck(options)\n const updateKnowledge = createSupervisedKnowledgeUpdater({\n root: options.root,\n goal: options.goal,\n readiness,\n readinessSpecs: options.readinessSpecs,\n readinessTaskId: options.readinessTaskId,\n readinessOptions: options.readiness,\n budget,\n backend,\n makeWorkerAgent,\n harness,\n supervisorModel,\n supervisorSystemPrompt,\n superviseOptions,\n allowedModels,\n runSupervised,\n } satisfies SupervisedKnowledgeUpdateOptions)\n\n const instrumentedUpdateKnowledge: KnowledgeImprovementOptions['updateKnowledge'] = async (\n input,\n ) => {\n const updateStartedAt = Date.now()\n updateCalls += 1\n const result = await updateKnowledge(input)\n updateDurationMs += Date.now() - updateStartedAt\n addSpent(supervisedSpent, result.supervised)\n return result\n }\n let resolvedImprovement: KnowledgeImprovementResult\n let candidateKnowledge: AgentCandidateKnowledge | undefined\n if (approval) {\n const approvedKnowledge = await approvedKnowledgeCandidate(approval)\n const candidate = agentKnowledgeCandidateRef(approvedKnowledge)\n knowledgeOptions.signal?.throwIfAborted()\n resolvedImprovement = await promoteKnowledgeCandidate({\n root: options.root,\n candidate,\n ...(knowledgeOptions.ownerId ? { ownerId: knowledgeOptions.ownerId } : {}),\n ...(knowledgeOptions.leaseTtlMs ? { leaseTtlMs: knowledgeOptions.leaseTtlMs } : {}),\n ...(knowledgeOptions.now ? { now: knowledgeOptions.now } : {}),\n ...(knowledgeOptions.onState ? { onState: knowledgeOptions.onState } : {}),\n })\n knowledgeOptions.signal?.throwIfAborted()\n const promotedHash = await hashKnowledgeBase(options.root)\n if (!resolvedImprovement.promoted || promotedHash !== candidate.candidateHash) {\n throw new Error('knowledge promotion did not activate the approved snapshot bytes')\n }\n candidateKnowledge = approvedKnowledge\n } else {\n resolvedImprovement = await improveKnowledgeBase({\n ...knowledgeOptions,\n updateKnowledge: instrumentedUpdateKnowledge,\n })\n if (resolvedImprovement.candidate) {\n candidateKnowledge = await freezeKnowledgeCandidate(\n options.root,\n resolvedImprovement,\n candidateArtifacts,\n knowledgeOptions.signal,\n )\n }\n }\n const finishedAtMs = Date.now()\n const measurement: KnowledgeImprovementJobMeasurement = {\n startedAt,\n finishedAt: new Date(finishedAtMs).toISOString(),\n durationMs: finishedAtMs - startedAtMs,\n updateCalls,\n updateDurationMs,\n supervisedSpent,\n }\n await onMeasurement?.(measurement)\n return {\n improvement: resolvedImprovement,\n ...(candidateKnowledge ? { candidateKnowledge } : {}),\n measurement,\n promoted: resolvedImprovement.promoted,\n blocked: resolvedImprovement.blocked,\n }\n}\n\nasync function freezeKnowledgeCandidate(\n root: string,\n improvement: KnowledgeImprovementResult,\n artifacts: AgentCandidateOutputArtifactPort | undefined,\n signal: AbortSignal | undefined,\n): Promise<AgentCandidateKnowledge> {\n const candidate = knowledgeImprovementCandidateRef(improvement)\n return withKnowledgeImprovementCandidate({ root, candidate }, async (resolved) => {\n const executionId = `knowledge-${candidate.candidateId}`\n const candidateRef = toAgentCandidateKnowledgeRef(candidate)\n const captured = await captureAgentCandidateWorkspace(await realpath(resolved.root), {\n ...(artifacts\n ? {\n artifactPersistence: {\n executionId,\n outputArtifacts: artifacts,\n ...(signal ? { signal } : {}),\n },\n }\n : {}),\n })\n const evaluation = await captureKnowledgeEvidence(\n canonicalCandidateBytes({\n kind: 'agent-knowledge-candidate-evaluation',\n candidate: candidateRef,\n metric: resolved.evaluation,\n }),\n 'knowledge-evaluation',\n executionId,\n artifacts,\n signal,\n )\n return agentCandidateKnowledgeSchema.parse({\n candidate: candidateRef,\n snapshot: captured.snapshot,\n evaluation,\n })\n })\n}\n\nasync function captureKnowledgeEvidence(\n bytes: Uint8Array,\n purpose: 'knowledge-evaluation',\n executionId: string,\n artifacts: AgentCandidateOutputArtifactPort | undefined,\n signal: AbortSignal | undefined,\n): Promise<AgentCandidateCapturedArtifact> {\n if (!artifacts) return embeddedCandidateArtifact(bytes)\n return persistCandidateOutputArtifact(artifacts, {\n executionId,\n purpose,\n bytes,\n ...(signal ? { signal } : {}),\n })\n}\n\nasync function approvedKnowledgeCandidate(\n approval: ApprovedKnowledgeImprovementCandidate,\n): Promise<AgentCandidateKnowledge> {\n const proposal = verifyAgentImprovementProposal(approval.proposal)\n const review = verifyAgentImprovementReview(approval.review)\n const activation = verifyAgentImprovementActivation({\n proposal,\n review,\n activation: approval.activation,\n })\n const candidateBundle = proposal.evaluation.experiment.candidate\n const knowledgeTarget = activation.targets.find((target) => target.surface === 'knowledge')\n if (\n proposal.changedSurfaces.length !== 1 ||\n proposal.changedSurfaces[0] !== 'knowledge' ||\n !candidateBundle.knowledge ||\n !knowledgeTarget ||\n knowledgeTarget.expectedBaseDigest !== candidateBundle.knowledge.candidate.baseHash ||\n review.decision !== 'approve' ||\n review.proposalDigest !== proposal.digest\n ) {\n throw new Error('knowledge promotion requires an approved exact knowledge proposal')\n }\n if (!(await approval.authorizeActivation(activation, proposal, review))) {\n throw new Error('knowledge candidate activation was not authorized')\n }\n return candidateBundle.knowledge\n}\n\nfunction agentKnowledgeCandidateRef(\n knowledge: AgentCandidateKnowledge,\n): KnowledgeImprovementCandidateRef {\n return fromAgentCandidateKnowledgeRef(knowledge.candidate)\n}\n\nfunction emptySpent(): KnowledgeImprovementJobMeasurement['supervisedSpent'] {\n return { iterations: 0, inputTokens: 0, outputTokens: 0, usdKnown: true, usd: 0, ms: 0 }\n}\n\nfunction addSpent(\n target: KnowledgeImprovementJobMeasurement['supervisedSpent'],\n result: SupervisedResult<unknown>,\n): void {\n const spent = result.spentTotal\n target.iterations += spent.iterations\n target.inputTokens += spent.tokens.input\n target.outputTokens += spent.tokens.output\n target.usdKnown = target.usdKnown && spent.usdKnown !== false\n target.usd += spent.usd\n target.ms += spent.ms\n}\n","import type { RagKnowledgeUpdateResult } from '@tangle-network/agent-knowledge'\nimport { researcherProfile } from '../profiles/researcher'\nimport type { DeliverableSpec } from '../runtime/supervise/completion-gate'\nimport type { ExecutorConfig } from '../runtime/supervise/runtime'\nimport { type SuperviseOptions, supervise } from '../runtime/supervise/supervise'\nimport type { SupervisorProfile } from '../runtime/supervise/supervisor-agent'\nimport type { Budget, SupervisedResult } from '../runtime/supervise/types'\n\n/** Standing prompt for a supervisor that grows a shared knowledge base through spawned researchers. */\nexport const RESEARCH_SUPERVISOR_SYSTEM_PROMPT = [\n 'You are a research supervisor. You do not answer the research question yourself.',\n 'You create and manage researcher workers that improve one shared knowledge base until it is ready.',\n '',\n 'Each round:',\n '1. Read the goal and the gaps the readiness check still reports.',\n '2. Decompose the open work into independent sub-topics.',\n '3. Spawn one researcher per sub-topic; split by sub-topic, never duplicate work.',\n '4. Wait for researchers to settle, steer or re-spawn thin sub-topics, then stop when the check passes.',\n '',\n 'Conserve the shared budget. Prefer a small number of well-scoped researchers over a large fanout that re-covers the same ground.',\n].join('\\n')\n\nexport interface KnowledgeReadinessCheckInput {\n root: string\n goal: string\n readinessSpecs?: readonly unknown[]\n readinessTaskId?: string\n readiness?: unknown\n}\n\nexport type KnowledgeReadinessCheckResult =\n | boolean\n | {\n ready: boolean\n summary?: string\n metadata?: Record<string, unknown>\n }\n\nexport type KnowledgeReadinessCheck = (\n input: KnowledgeReadinessCheckInput,\n) => Promise<KnowledgeReadinessCheckResult> | KnowledgeReadinessCheckResult\n\nexport interface SupervisedKnowledgeUpdateInput {\n goal?: string\n root?: string\n candidateRoot?: string\n findings?: readonly unknown[]\n metadata?: Record<string, unknown>\n}\n\nexport interface SupervisedKnowledgeUpdateResult {\n applied: boolean\n summary: string\n supervised: SupervisedResult<unknown>\n metadata: NonNullable<RagKnowledgeUpdateResult['metadata']>\n}\n\nexport interface SupervisedKnowledgeUpdateOptions {\n root: string\n goal: string\n readiness: KnowledgeReadinessCheck\n readinessSpecs?: readonly unknown[]\n readinessTaskId?: string\n readinessOptions?: unknown\n findings?: readonly unknown[]\n metadata?: Record<string, unknown>\n budget: Budget\n backend?: ExecutorConfig\n makeWorkerAgent?: SuperviseOptions['makeWorkerAgent']\n harness?: string\n supervisorModel?: string\n supervisorSystemPrompt?: string\n superviseOptions?: Partial<\n Omit<\n SuperviseOptions,\n 'budget' | 'backend' | 'deliverable' | 'makeWorkerAgent' | 'allowedModels'\n >\n >\n allowedModels?: readonly string[]\n runSupervised?: (\n profile: SupervisorProfile,\n task: unknown,\n opts: SuperviseOptions,\n ) => Promise<SupervisedResult<unknown>>\n}\n\nexport type SupervisedKnowledgeUpdater = (\n input: SupervisedKnowledgeUpdateInput,\n) => Promise<SupervisedKnowledgeUpdateResult>\n\n/** Build the completion check a supervised KB update uses to stop only when the KB is ready. */\nexport function knowledgeReadinessDeliverable(\n options: Pick<\n SupervisedKnowledgeUpdateOptions,\n 'root' | 'goal' | 'readiness' | 'readinessSpecs' | 'readinessTaskId' | 'readinessOptions'\n >,\n): DeliverableSpec<unknown> {\n return {\n describe: `knowledge base at ${options.root} is ready for: ${options.goal}`,\n async check() {\n const result = await options.readiness({\n root: options.root,\n goal: options.goal,\n readinessSpecs: options.readinessSpecs,\n readinessTaskId: options.readinessTaskId,\n readiness: options.readinessOptions,\n })\n return typeof result === 'boolean' ? result : result.ready\n },\n }\n}\n\n/** Create an `improveKnowledgeBase` update callback backed by runtime supervision. */\nexport function createSupervisedKnowledgeUpdater(\n options: SupervisedKnowledgeUpdateOptions,\n): SupervisedKnowledgeUpdater {\n return (input) =>\n runSupervisedKnowledgeUpdate({\n ...options,\n root: input.candidateRoot ?? input.root ?? options.root,\n goal: input.goal ?? options.goal,\n findings: input.findings ?? options.findings,\n metadata: { ...options.metadata, ...input.metadata },\n })\n}\n\n/** Run a runtime supervisor that updates one candidate knowledge base and stops on readiness. */\nexport async function runSupervisedKnowledgeUpdate(\n options: SupervisedKnowledgeUpdateOptions,\n): Promise<SupervisedKnowledgeUpdateResult> {\n const { profile: workerProfile } = researcherProfile({ harness: options.harness })\n const baseInstructions = options.supervisorSystemPrompt ?? RESEARCH_SUPERVISOR_SYSTEM_PROMPT\n const workerContract = workerProfile.prompt?.systemPrompt\n const systemPrompt = workerContract\n ? `${baseInstructions}\\n\\nEach researcher worker you spawn follows this contract:\\n${workerContract}`\n : baseInstructions\n\n const profile: SupervisorProfile = {\n name: 'knowledge-research-supervisor',\n model: options.supervisorModel,\n systemPrompt,\n }\n const run = options.runSupervised ?? supervise\n const task = formatSupervisedKnowledgeTask(options)\n const supervised = await run(profile, task, {\n ...options.superviseOptions,\n budget: options.budget,\n backend: options.backend,\n deliverable: knowledgeReadinessDeliverable(options),\n makeWorkerAgent: options.makeWorkerAgent,\n allowedModels: options.allowedModels,\n })\n return {\n applied: supervised.kind === 'winner',\n summary:\n supervised.kind === 'winner'\n ? 'research supervisor completed and the knowledge base passed readiness'\n : `research supervisor stopped without a ready knowledge base: ${supervised.reason}`,\n supervised,\n metadata: {\n supervised: true,\n root: options.root,\n goal: options.goal,\n result: supervised.kind,\n },\n }\n}\n\n/** Format the supervisor task with the KB root, readiness requirements, current findings, and metadata. */\nexport function formatSupervisedKnowledgeTask(\n options: Pick<\n SupervisedKnowledgeUpdateOptions,\n 'root' | 'goal' | 'readinessSpecs' | 'readinessTaskId' | 'findings' | 'metadata'\n >,\n): string {\n const sections = [\n `Goal: ${options.goal}`,\n `Knowledge base root: ${options.root}`,\n options.readinessTaskId ? `Readiness task id: ${options.readinessTaskId}` : undefined,\n options.readinessSpecs?.length\n ? `Readiness specs:\\n${JSON.stringify(options.readinessSpecs, null, 2)}`\n : undefined,\n options.findings?.length\n ? `Current findings:\\n${JSON.stringify(options.findings, null, 2)}`\n : undefined,\n options.metadata && Object.keys(options.metadata).length > 0\n ? `Metadata:\\n${JSON.stringify(options.metadata, null, 2)}`\n : undefined,\n ].filter((section): section is string => Boolean(section))\n return `${sections.join('\\n\\n')}\\n\\nUpdate files under the knowledge base root only. Stop when the readiness check passes.`\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +0,0 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined") return require.apply(this, arguments);
5
- throw Error('Dynamic require of "' + x + '" is not supported');
6
- });
7
-
8
- export {
9
- __require
10
- };
11
- //# sourceMappingURL=chunk-DGUM43GV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}