@tangle-network/agent-runtime 0.113.1 → 0.115.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{activation-UZ1JenNv.js → activation-BNQQO-bc.js} +3 -3
- package/dist/{activation-UZ1JenNv.js.map → activation-BNQQO-bc.js.map} +1 -1
- package/dist/agent.d.ts +18 -7
- package/dist/agent.js +123 -64
- package/dist/agent.js.map +1 -1
- package/dist/candidate-execution/index.js +4 -4
- package/dist/{candidate-execution-Co3sRC_7.js → candidate-execution-CfpJrd3o.js} +4 -4
- package/dist/{candidate-execution-Co3sRC_7.js.map → candidate-execution-CfpJrd3o.js.map} +1 -1
- package/dist/{environment-provider-BsHpW4Dp.js → environment-provider-CCaEhA-l.js} +38 -4
- package/dist/environment-provider-CCaEhA-l.js.map +1 -0
- package/dist/{environment-provider-DG-cSx89.d.ts → environment-provider-Cygthiy3.d.ts} +40 -1
- package/dist/environment-provider.d.ts +1 -1
- package/dist/environment-provider.js +1 -1
- package/dist/{improvement-cycle-C3CrNfcy.js → improvement-cycle-CBLOgfsQ.js} +4 -4
- package/dist/{improvement-cycle-C3CrNfcy.js.map → improvement-cycle-CBLOgfsQ.js.map} +1 -1
- package/dist/{index-Cr7QlEUL.d.ts → index-B_vcAAle.d.ts} +6 -6
- package/dist/{index-zMAqz53v.d.ts → index-BuzkRsOn.d.ts} +244 -9
- package/dist/{index-B6WclhZI.d.ts → index-I97xACXk.d.ts} +3 -3
- package/dist/index.d.ts +8 -8
- package/dist/index.js +13 -13
- package/dist/intelligence.d.ts +3 -3
- package/dist/intelligence.js +6 -6
- package/dist/kernel.d.ts +4 -4
- package/dist/kernel.js +7 -7
- package/dist/{knowledge-GAJFl_gz.js → knowledge-DcIKJaPd.js} +5 -5
- package/dist/{knowledge-GAJFl_gz.js.map → knowledge-DcIKJaPd.js.map} +1 -1
- package/dist/knowledge.d.ts +1 -1
- package/dist/knowledge.js +1 -1
- package/dist/{local-harness-Ce1emWJE.d.ts → local-harness-BnB1E9nM.d.ts} +82 -2
- package/dist/{loop-runner-bin-DvLdFo38.js → loop-runner-bin-C2GIqSUn.js} +3 -3
- package/dist/{loop-runner-bin-DvLdFo38.js.map → loop-runner-bin-C2GIqSUn.js.map} +1 -1
- package/dist/{loop-runner-bin-Cba5tsdb.d.ts → loop-runner-bin-DgAXgQCI.d.ts} +3 -3
- package/dist/loop-runner-bin.d.ts +1 -1
- package/dist/loop-runner-bin.js +1 -1
- package/dist/mcp/bin.js +2 -2
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.js +5 -5
- package/dist/{openai-tools-DftmzKLc.js → openai-tools-BWAEIHkZ.js} +2 -2
- package/dist/{openai-tools-DftmzKLc.js.map → openai-tools-BWAEIHkZ.js.map} +1 -1
- package/dist/{otel-export-D34IQW1C.js → otel-export-CPZTSADj.js} +16 -7
- package/dist/otel-export-CPZTSADj.js.map +1 -0
- package/dist/{prepare-BKVdOn0w.js → prepare-BHQBb02e.js} +2 -2
- package/dist/{prepare-BKVdOn0w.js.map → prepare-BHQBb02e.js.map} +1 -1
- package/dist/primeintellect/index.d.ts +1 -1
- package/dist/{protected-model-port-BtldAE9j.js → protected-model-port-DqAH1Z2M.js} +2 -2
- package/dist/{protected-model-port-BtldAE9j.js.map → protected-model-port-DqAH1Z2M.js.map} +1 -1
- package/dist/{redact-xZvPu9qe.d.ts → redact-BRaHUFMf.d.ts} +2 -2
- package/dist/{runtime-DlSPFm9o.js → runtime-C_g_SsXg.js} +8 -5
- package/dist/runtime-C_g_SsXg.js.map +1 -0
- package/dist/{spawn-journal-DLhnom3e.js → spawn-journal-DCPbicXB.js} +2 -1
- package/dist/{spawn-journal-DLhnom3e.js.map → spawn-journal-DCPbicXB.js.map} +1 -1
- package/dist/{structural-rollout-R_ZqFaB5.js → structural-rollout-Cqm1dKa7.js} +3 -3
- package/dist/{structural-rollout-R_ZqFaB5.js.map → structural-rollout-Cqm1dKa7.js.map} +1 -1
- package/dist/{supervise-BDvAFOTM.js → supervise-BcCHhLrz.js} +807 -35
- package/dist/supervise-BcCHhLrz.js.map +1 -0
- package/dist/{supervisor-DS278ICs.js → supervisor-CspDspod.js} +250 -22
- package/dist/supervisor-CspDspod.js.map +1 -0
- package/dist/testing.js +9 -9
- package/dist/{trace-propagation-CJJC7SVB.js → trace-propagation-B-pL7xn_.js} +2 -2
- package/dist/{trace-propagation-CJJC7SVB.js.map → trace-propagation-B-pL7xn_.js.map} +1 -1
- package/dist/{workspace-archive-CYYxZyA7.js → workspace-archive-DXzJq7WP.js} +2 -2
- package/dist/{workspace-archive-CYYxZyA7.js.map → workspace-archive-DXzJq7WP.js.map} +1 -1
- package/package.json +1 -1
- package/dist/environment-provider-BsHpW4Dp.js.map +0 -1
- package/dist/otel-export-D34IQW1C.js.map +0 -1
- package/dist/runtime-DlSPFm9o.js.map +0 -1
- package/dist/supervise-BDvAFOTM.js.map +0 -1
- package/dist/supervisor-DS278ICs.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { it as canonicalCandidateDocument, rt as canonicalCandidateDigest$1, st as immutableCandidateValue, ut as verifyCanonicalCandidateDocument } from "./prepare-
|
|
2
|
-
import { C as agentImprovementTargetInput, S as agentImprovementTargetDigest, T as agentProfileImprovementStateDigest, c as requireSealedCandidateExperiment, d as verifyAgentImprovementActivation, f as verifyAgentImprovementProposal } from "./improvement-cycle-
|
|
1
|
+
import { it as canonicalCandidateDocument, rt as canonicalCandidateDigest$1, st as immutableCandidateValue, ut as verifyCanonicalCandidateDocument } from "./prepare-BHQBb02e.js";
|
|
2
|
+
import { C as agentImprovementTargetInput, S as agentImprovementTargetDigest, T as agentProfileImprovementStateDigest, c as requireSealedCandidateExperiment, d as verifyAgentImprovementActivation, f as verifyAgentImprovementProposal } from "./improvement-cycle-CBLOgfsQ.js";
|
|
3
3
|
import { agentImprovementActivationResultSchema, agentImprovementActivationSchema, agentProfileImprovementExperimentSchema } from "@tangle-network/agent-interface";
|
|
4
4
|
//#region src/intelligence/activation.ts
|
|
5
5
|
/** Create the exact result a product stores in the same transaction as its target write. */
|
|
@@ -201,4 +201,4 @@ function targetIdentity(target) {
|
|
|
201
201
|
//#endregion
|
|
202
202
|
export { executeAgentImprovementActivation as n, verifyAgentImprovementActivationResult as r, createAgentImprovementActivationResult as t };
|
|
203
203
|
|
|
204
|
-
//# sourceMappingURL=activation-
|
|
204
|
+
//# sourceMappingURL=activation-BNQQO-bc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activation-UZ1JenNv.js","names":["canonicalCandidateDigest"],"sources":["../src/intelligence/activation.ts"],"sourcesContent":["import type {\n AgentCandidateBundle,\n AgentCandidateExperiment,\n AgentImprovementActivation,\n AgentImprovementActivationOutcome,\n AgentImprovementActivationResult,\n AgentImprovementActivationTarget,\n AgentImprovementProposal,\n AgentImprovementReview,\n AgentImprovementSurface,\n AgentProfileImprovementChange,\n AgentProfileImprovementExperiment,\n Sha256Digest,\n} from '@tangle-network/agent-interface'\nimport {\n agentImprovementActivationResultSchema,\n agentImprovementActivationSchema,\n agentProfileImprovementExperimentSchema,\n} from '@tangle-network/agent-interface'\n\nimport {\n canonicalCandidateDigest,\n canonicalCandidateDocument,\n immutableCandidateValue,\n verifyCanonicalCandidateDocument,\n} from '../candidate-execution/digest'\nimport {\n requireSealedCandidateExperiment,\n verifyAgentImprovementActivation,\n verifyAgentImprovementProposal,\n} from './improvement-cycle'\nimport {\n agentImprovementTargetDigest,\n agentImprovementTargetInput,\n agentProfileImprovementStateDigest,\n} from './improvement-surfaces'\n\nexport interface CreateAgentImprovementActivationResultOptions {\n completedAt: string\n outcome: AgentImprovementActivationOutcome\n}\n\nexport interface AgentImprovementActivationTargetPlan extends AgentImprovementActivationTarget {\n desiredDigest: Sha256Digest\n /**\n * Exact measured input the product must apply to reach `desiredDigest`.\n * Transition surfaces such as code and knowledge are applied operations, so\n * their resulting state digest is not the digest of this input document.\n */\n desiredInput: unknown\n}\n\nexport type AgentProfileImprovementActivationOperation =\n | {\n kind: 'apply-change'\n changes: AgentProfileImprovementChange\n }\n | {\n /** The product must load its own saved state at `desiredStateDigest`. */\n kind: 'restore-state'\n }\n\nexport interface AgentProfileImprovementActivationTargetPlan\n extends AgentImprovementActivationTarget {\n desiredDigest: Sha256Digest\n desiredInput: AgentProfileImprovementActivationOperation\n}\n\nexport interface SealedCandidateActivationTransitionInput {\n kind: 'sealed-candidate'\n activation: AgentImprovementActivation\n candidateBundle: AgentCandidateBundle\n bundle: AgentCandidateBundle\n targets: [AgentImprovementActivationTargetPlan, ...AgentImprovementActivationTargetPlan[]]\n attemptedAt: string\n expired: boolean\n}\n\n/**\n * A measured profile change without raw profile bytes.\n * The product owns the private state lookup and atomic write.\n */\nexport interface ProfileImprovementActivationTransitionInput {\n kind: 'profile-improvement'\n activation: AgentImprovementActivation\n experiment: AgentProfileImprovementExperiment\n sourceStateDigest: Sha256Digest\n desiredStateDigest: Sha256Digest\n operation: AgentProfileImprovementActivationOperation\n targets: [\n AgentProfileImprovementActivationTargetPlan,\n ...AgentProfileImprovementActivationTargetPlan[],\n ]\n attemptedAt: string\n expired: boolean\n}\n\nexport type AgentImprovementActivationTransitionInput =\n | SealedCandidateActivationTransitionInput\n | ProfileImprovementActivationTransitionInput\n\nexport interface AgentImprovementActivationResultStore {\n load(idempotencyKey: Sha256Digest): Promise<unknown | undefined>\n putIfAbsent(result: AgentImprovementActivationResult): Promise<unknown>\n}\n\n/**\n * Product-owned or Runtime-composed transition.\n *\n * Implementations resolve a stored result for `activation.digest`, compare\n * every target, and make the write durably idempotent. Co-located targets store\n * the all-or-none write with its result. Other targets throw when result\n * storage fails so a retry can reconcile it. Runtime never invokes this write\n * function after authorization expires.\n */\nexport type AgentImprovementActivationTransition = (\n input: AgentImprovementActivationTransitionInput,\n) => Promise<unknown>\n\n/**\n * Target-read-only check for a prior exact write.\n * It may persist recovered result metadata, but must not change an activation target.\n * Return undefined only when no target write can have committed.\n */\nexport type AgentImprovementActivationReconciliation = (\n input: AgentImprovementActivationTransitionInput,\n) => Promise<unknown | undefined>\n\nexport interface ExecuteAgentImprovementActivationInput {\n proposal: AgentImprovementProposal\n review: AgentImprovementReview\n activation: AgentImprovementActivation\n}\n\nexport interface ExecuteAgentImprovementActivationOptions {\n transition: AgentImprovementActivationTransition\n reconcile?: AgentImprovementActivationReconciliation\n now?: () => Date\n}\n\n/** Create the exact result a product stores in the same transaction as its target write. */\nexport function createAgentImprovementActivationResult(\n transition: AgentImprovementActivationTransitionInput,\n options: CreateAgentImprovementActivationResultOptions,\n): AgentImprovementActivationResult {\n const activation = verifyCanonicalCandidateDocument(\n agentImprovementActivationSchema.parse(transition.activation),\n 'agent improvement activation',\n )\n assertTransitionInput(activation, transition)\n const result = agentImprovementActivationResultSchema.parse(\n canonicalCandidateDocument<AgentImprovementActivationResult>({\n kind: 'agent-improvement-activation-result',\n idempotencyKey: activation.digest,\n attemptedAt: transition.attemptedAt,\n completedAt: options.completedAt,\n outcome: options.outcome,\n }).value,\n )\n assertResultAgainstActivation(activation, result)\n assertOutcomeDesiredState(\n activation,\n result,\n new Map(transition.targets.map((target) => [targetIdentity(target), target.desiredDigest])),\n )\n return immutableCandidateValue(result)\n}\n\n/**\n * Recompute one historical activation result against the exact measured proposal and authority.\n * The result records that attempt; it is not a query of the target's current state.\n */\nexport function verifyAgentImprovementActivationResult(input: {\n proposal: unknown\n review: unknown\n activation: unknown\n result: unknown\n}): AgentImprovementActivationResult {\n const proposal = verifyAgentImprovementProposal(input.proposal)\n const activation = verifyAgentImprovementActivation(input)\n const result = verifyCanonicalCandidateDocument(\n agentImprovementActivationResultSchema.parse(input.result),\n 'agent improvement activation result',\n )\n assertResultAgainstActivation(activation, result)\n assertResultDesiredState(proposal, activation, result)\n return result\n}\n\n/** Validate and execute one product-owned activation transition. */\nexport async function executeAgentImprovementActivation(\n input: ExecuteAgentImprovementActivationInput,\n options: ExecuteAgentImprovementActivationOptions,\n): Promise<AgentImprovementActivationResult> {\n const proposal = verifyAgentImprovementProposal(input.proposal)\n const activation = verifyAgentImprovementActivation(input)\n const observedAt = (options.now ?? (() => new Date()))().toISOString()\n const attemptedAt =\n Date.parse(observedAt) < Date.parse(activation.authorizedAt)\n ? activation.authorizedAt\n : observedAt\n const expired = Date.parse(attemptedAt) >= Date.parse(activation.expiresAt)\n const transition = immutableCandidateValue<AgentImprovementActivationTransitionInput>(\n proposal.evaluation.kind === 'agent-improvement-measured-comparison'\n ? sealedCandidateTransition(proposal.evaluation.experiment, activation, attemptedAt, expired)\n : profileImprovementTransition(\n proposal.evaluation.experiment,\n activation,\n attemptedAt,\n expired,\n ),\n )\n\n if (transition.expired) {\n if (!options.reconcile) {\n return uncertainActivationResult(transition, 'RECONCILIATION_UNAVAILABLE')\n }\n let reconciled: unknown\n try {\n reconciled = await options.reconcile(transition)\n } catch {\n return uncertainActivationResult(transition, 'RECONCILIATION_THROW')\n }\n if (reconciled === undefined) {\n return createAgentImprovementActivationResult(transition, {\n completedAt: transition.attemptedAt,\n outcome: { status: 'expired' },\n })\n }\n try {\n return verifyAgentImprovementActivationResult({ ...input, result: reconciled })\n } catch {\n return uncertainActivationResult(transition, 'INVALID_RECONCILIATION')\n }\n }\n\n let rawResult: unknown\n try {\n rawResult = await options.transition(transition)\n } catch {\n return uncertainActivationResult(transition, 'TRANSITION_THROW')\n }\n try {\n return verifyAgentImprovementActivationResult({ ...input, result: rawResult })\n } catch {\n return uncertainActivationResult(transition, 'INVALID_RESULT')\n }\n}\n\nfunction sealedCandidateTransition(\n experiment: AgentCandidateExperiment,\n activation: AgentImprovementActivation,\n attemptedAt: string,\n expired: boolean,\n): SealedCandidateActivationTransitionInput {\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n return {\n kind: 'sealed-candidate',\n activation,\n candidateBundle: experiment.candidate,\n bundle: experiment[targetArm],\n targets: activation.targets.map((target) => ({\n ...target,\n desiredDigest: agentImprovementTargetDigest(experiment, targetArm, target.surface),\n desiredInput: agentImprovementTargetInput(experiment[targetArm], target.surface),\n })) as SealedCandidateActivationTransitionInput['targets'],\n attemptedAt,\n expired,\n }\n}\n\nfunction profileImprovementTransition(\n experiment: AgentProfileImprovementExperiment,\n activation: AgentImprovementActivation,\n attemptedAt: string,\n expired: boolean,\n): ProfileImprovementActivationTransitionInput {\n const sourceArm = activation.intent === 'activate-candidate' ? 'baseline' : 'candidate'\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const operation = profileImprovementOperation(experiment, activation.intent)\n return {\n kind: 'profile-improvement',\n activation,\n experiment,\n sourceStateDigest: agentProfileImprovementStateDigest(experiment, sourceArm),\n desiredStateDigest: agentProfileImprovementStateDigest(experiment, targetArm),\n operation,\n targets: activation.targets.map((target) => ({\n ...target,\n desiredDigest: agentProfileImprovementStateDigest(experiment, targetArm),\n desiredInput: operation,\n })) as ProfileImprovementActivationTransitionInput['targets'],\n attemptedAt,\n expired,\n }\n}\n\nfunction profileImprovementOperation(\n experiment: AgentProfileImprovementExperiment,\n intent: AgentImprovementActivation['intent'],\n): AgentProfileImprovementActivationOperation {\n return intent === 'activate-candidate'\n ? { kind: 'apply-change', changes: experiment.change }\n : { kind: 'restore-state' }\n}\n\nfunction uncertainActivationResult(\n transition: AgentImprovementActivationTransitionInput,\n code: string,\n): AgentImprovementActivationResult {\n return createAgentImprovementActivationResult(transition, {\n completedAt: transition.attemptedAt,\n outcome: {\n status: 'indeterminate',\n code,\n message: 'The product transition did not return a trustworthy commit result.',\n },\n })\n}\n\nfunction assertTransitionInput(\n activation: AgentImprovementActivation,\n transition: AgentImprovementActivationTransitionInput,\n): void {\n if (transition.kind === 'sealed-candidate') {\n assertSealedCandidateTransitionInput(activation, transition)\n return\n }\n assertProfileImprovementTransitionInput(activation, transition)\n}\n\nfunction assertSealedCandidateTransitionInput(\n activation: AgentImprovementActivation,\n transition: SealedCandidateActivationTransitionInput,\n): void {\n assertAuthorizedTransitionTargets(activation, transition.targets)\n const desiredInputsMatch = transition.targets.every(\n (target) =>\n canonicalCandidateDigest(target.desiredInput) ===\n canonicalCandidateDigest(agentImprovementTargetInput(transition.bundle, target.surface)),\n )\n if (\n transition.expired !== Date.parse(transition.attemptedAt) >= Date.parse(activation.expiresAt) ||\n transition.candidateBundle.digest !== activation.candidateDigest ||\n !desiredInputsMatch ||\n (activation.intent === 'activate-candidate' &&\n transition.bundle.digest !== transition.candidateBundle.digest)\n ) {\n throw new Error('activation transition does not match its authorization')\n }\n}\n\nfunction assertProfileImprovementTransitionInput(\n activation: AgentImprovementActivation,\n transition: ProfileImprovementActivationTransitionInput,\n): void {\n assertAuthorizedTransitionTargets(activation, transition.targets)\n const targetsAgentProfile = activation.targets.some(\n (target) => target.surface === 'agent-profile',\n )\n const experiment = agentProfileImprovementExperimentSchema.parse(transition.experiment)\n const sourceArm = activation.intent === 'activate-candidate' ? 'baseline' : 'candidate'\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const sourceStateDigest = agentProfileImprovementStateDigest(experiment, sourceArm)\n const desiredStateDigest = agentProfileImprovementStateDigest(experiment, targetArm)\n const operation = profileImprovementOperation(experiment, activation.intent)\n const targetsMatch = transition.targets.every(\n (target) =>\n target.expectedBaseDigest === sourceStateDigest &&\n target.desiredDigest === desiredStateDigest &&\n canonicalCandidateDigest(target.desiredInput) === canonicalCandidateDigest(operation),\n )\n if (\n transition.expired !== Date.parse(transition.attemptedAt) >= Date.parse(activation.expiresAt) ||\n experiment.digest !== activation.experimentDigest ||\n experiment.candidate.stateDigest !== activation.candidateDigest ||\n (targetsAgentProfile &&\n (activation.executionRef === undefined ||\n canonicalCandidateDigest(activation.executionRef) !==\n canonicalCandidateDigest(experiment.executionRef))) ||\n transition.sourceStateDigest !== sourceStateDigest ||\n transition.desiredStateDigest !== desiredStateDigest ||\n canonicalCandidateDigest(transition.operation) !== canonicalCandidateDigest(operation) ||\n !targetsMatch\n ) {\n throw new Error('activation transition does not match its authorization')\n }\n}\n\nfunction assertAuthorizedTransitionTargets(\n activation: AgentImprovementActivation,\n targets: readonly AgentImprovementActivationTargetPlan[],\n): void {\n const authorized = targetMap(activation.targets)\n const planned = targetMap(targets)\n if (\n authorized.size !== planned.size ||\n [...authorized.entries()].some(\n ([identity, target]) =>\n planned.get(identity)?.expectedBaseDigest !== target.expectedBaseDigest,\n )\n ) {\n throw new Error('activation transition does not match its authorization')\n }\n}\n\nfunction assertResultAgainstActivation(\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n): void {\n const attemptedAt = Date.parse(result.attemptedAt)\n const completedAt = Date.parse(result.completedAt)\n const expiresAt = Date.parse(activation.expiresAt)\n if (\n result.idempotencyKey !== activation.digest ||\n attemptedAt < Date.parse(activation.authorizedAt) ||\n completedAt < attemptedAt\n ) {\n throw new Error('activation result does not bind its authorization')\n }\n const expired = attemptedAt >= expiresAt\n if (\n (result.outcome.status === 'expired' && !expired) ||\n (expired && !['expired', 'indeterminate', 'already-applied'].includes(result.outcome.status))\n ) {\n throw new Error('activation result does not honor its authorization expiry')\n }\n if (!('targets' in result.outcome)) return\n const authorized = targetMap(activation.targets)\n const observed = new Set(result.outcome.targets.map(targetIdentity))\n if (\n authorized.size !== observed.size ||\n [...authorized.keys()].some((identity) => !observed.has(identity))\n ) {\n throw new Error('activation result must cover every authorized target exactly once')\n }\n if (\n result.outcome.status === 'applied' &&\n result.outcome.targets.some(\n (target) =>\n target.beforeDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest,\n )\n ) {\n throw new Error('applied activation did not start from its authorized base state')\n }\n}\n\nfunction assertResultDesiredState(\n proposal: AgentImprovementProposal,\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n): void {\n if (!('targets' in result.outcome)) return\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const desiredStateDigest =\n proposal.evaluation.kind === 'agent-profile-improvement-measured-comparison'\n ? agentProfileImprovementStateDigest(proposal.evaluation.experiment, targetArm)\n : undefined\n const desired = new Map(\n activation.targets.map((target) => [\n targetIdentity(target),\n desiredStateDigest ??\n agentImprovementTargetDigest(\n requireSealedCandidateExperiment(proposal),\n targetArm,\n target.surface,\n ),\n ]),\n )\n assertOutcomeDesiredState(activation, result, desired)\n}\n\nfunction assertOutcomeDesiredState(\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n desired: ReadonlyMap<string, Sha256Digest>,\n): void {\n if (!('targets' in result.outcome)) return\n if (result.outcome.status === 'applied') {\n if (\n result.outcome.targets.some(\n (target) => target.afterDigest !== desired.get(targetIdentity(target)),\n )\n ) {\n throw new Error('applied activation does not match the requested bundle')\n }\n return\n }\n const allDesired = result.outcome.targets.every(\n (target) => target.currentDigest === desired.get(targetIdentity(target)),\n )\n if (result.outcome.status === 'already-applied') {\n if (!allDesired) throw new Error('already-applied activation is not at the requested state')\n return\n }\n const authorized = targetMap(activation.targets)\n const hasStaleTarget = result.outcome.targets.some(\n (target) => target.currentDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest,\n )\n if (allDesired || !hasStaleTarget) {\n throw new Error('activation conflict does not identify stale target state')\n }\n}\n\nfunction targetMap<T extends { surface: AgentImprovementSurface; identity: string }>(\n targets: readonly T[],\n): Map<string, T> {\n return new Map(targets.map((target) => [targetIdentity(target), target]))\n}\n\nfunction targetIdentity(target: { surface: AgentImprovementSurface; identity: string }): string {\n return `${target.surface}\\u0000${target.identity}`\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"activation-BNQQO-bc.js","names":["canonicalCandidateDigest"],"sources":["../src/intelligence/activation.ts"],"sourcesContent":["import type {\n AgentCandidateBundle,\n AgentCandidateExperiment,\n AgentImprovementActivation,\n AgentImprovementActivationOutcome,\n AgentImprovementActivationResult,\n AgentImprovementActivationTarget,\n AgentImprovementProposal,\n AgentImprovementReview,\n AgentImprovementSurface,\n AgentProfileImprovementChange,\n AgentProfileImprovementExperiment,\n Sha256Digest,\n} from '@tangle-network/agent-interface'\nimport {\n agentImprovementActivationResultSchema,\n agentImprovementActivationSchema,\n agentProfileImprovementExperimentSchema,\n} from '@tangle-network/agent-interface'\n\nimport {\n canonicalCandidateDigest,\n canonicalCandidateDocument,\n immutableCandidateValue,\n verifyCanonicalCandidateDocument,\n} from '../candidate-execution/digest'\nimport {\n requireSealedCandidateExperiment,\n verifyAgentImprovementActivation,\n verifyAgentImprovementProposal,\n} from './improvement-cycle'\nimport {\n agentImprovementTargetDigest,\n agentImprovementTargetInput,\n agentProfileImprovementStateDigest,\n} from './improvement-surfaces'\n\nexport interface CreateAgentImprovementActivationResultOptions {\n completedAt: string\n outcome: AgentImprovementActivationOutcome\n}\n\nexport interface AgentImprovementActivationTargetPlan extends AgentImprovementActivationTarget {\n desiredDigest: Sha256Digest\n /**\n * Exact measured input the product must apply to reach `desiredDigest`.\n * Transition surfaces such as code and knowledge are applied operations, so\n * their resulting state digest is not the digest of this input document.\n */\n desiredInput: unknown\n}\n\nexport type AgentProfileImprovementActivationOperation =\n | {\n kind: 'apply-change'\n changes: AgentProfileImprovementChange\n }\n | {\n /** The product must load its own saved state at `desiredStateDigest`. */\n kind: 'restore-state'\n }\n\nexport interface AgentProfileImprovementActivationTargetPlan\n extends AgentImprovementActivationTarget {\n desiredDigest: Sha256Digest\n desiredInput: AgentProfileImprovementActivationOperation\n}\n\nexport interface SealedCandidateActivationTransitionInput {\n kind: 'sealed-candidate'\n activation: AgentImprovementActivation\n candidateBundle: AgentCandidateBundle\n bundle: AgentCandidateBundle\n targets: [AgentImprovementActivationTargetPlan, ...AgentImprovementActivationTargetPlan[]]\n attemptedAt: string\n expired: boolean\n}\n\n/**\n * A measured profile change without raw profile bytes.\n * The product owns the private state lookup and atomic write.\n */\nexport interface ProfileImprovementActivationTransitionInput {\n kind: 'profile-improvement'\n activation: AgentImprovementActivation\n experiment: AgentProfileImprovementExperiment\n sourceStateDigest: Sha256Digest\n desiredStateDigest: Sha256Digest\n operation: AgentProfileImprovementActivationOperation\n targets: [\n AgentProfileImprovementActivationTargetPlan,\n ...AgentProfileImprovementActivationTargetPlan[],\n ]\n attemptedAt: string\n expired: boolean\n}\n\nexport type AgentImprovementActivationTransitionInput =\n | SealedCandidateActivationTransitionInput\n | ProfileImprovementActivationTransitionInput\n\nexport interface AgentImprovementActivationResultStore {\n load(idempotencyKey: Sha256Digest): Promise<unknown | undefined>\n putIfAbsent(result: AgentImprovementActivationResult): Promise<unknown>\n}\n\n/**\n * Product-owned or Runtime-composed transition.\n *\n * Implementations resolve a stored result for `activation.digest`, compare\n * every target, and make the write durably idempotent. Co-located targets store\n * the all-or-none write with its result. Other targets throw when result\n * storage fails so a retry can reconcile it. Runtime never invokes this write\n * function after authorization expires.\n */\nexport type AgentImprovementActivationTransition = (\n input: AgentImprovementActivationTransitionInput,\n) => Promise<unknown>\n\n/**\n * Target-read-only check for a prior exact write.\n * It may persist recovered result metadata, but must not change an activation target.\n * Return undefined only when no target write can have committed.\n */\nexport type AgentImprovementActivationReconciliation = (\n input: AgentImprovementActivationTransitionInput,\n) => Promise<unknown | undefined>\n\nexport interface ExecuteAgentImprovementActivationInput {\n proposal: AgentImprovementProposal\n review: AgentImprovementReview\n activation: AgentImprovementActivation\n}\n\nexport interface ExecuteAgentImprovementActivationOptions {\n transition: AgentImprovementActivationTransition\n reconcile?: AgentImprovementActivationReconciliation\n now?: () => Date\n}\n\n/** Create the exact result a product stores in the same transaction as its target write. */\nexport function createAgentImprovementActivationResult(\n transition: AgentImprovementActivationTransitionInput,\n options: CreateAgentImprovementActivationResultOptions,\n): AgentImprovementActivationResult {\n const activation = verifyCanonicalCandidateDocument(\n agentImprovementActivationSchema.parse(transition.activation),\n 'agent improvement activation',\n )\n assertTransitionInput(activation, transition)\n const result = agentImprovementActivationResultSchema.parse(\n canonicalCandidateDocument<AgentImprovementActivationResult>({\n kind: 'agent-improvement-activation-result',\n idempotencyKey: activation.digest,\n attemptedAt: transition.attemptedAt,\n completedAt: options.completedAt,\n outcome: options.outcome,\n }).value,\n )\n assertResultAgainstActivation(activation, result)\n assertOutcomeDesiredState(\n activation,\n result,\n new Map(transition.targets.map((target) => [targetIdentity(target), target.desiredDigest])),\n )\n return immutableCandidateValue(result)\n}\n\n/**\n * Recompute one historical activation result against the exact measured proposal and authority.\n * The result records that attempt; it is not a query of the target's current state.\n */\nexport function verifyAgentImprovementActivationResult(input: {\n proposal: unknown\n review: unknown\n activation: unknown\n result: unknown\n}): AgentImprovementActivationResult {\n const proposal = verifyAgentImprovementProposal(input.proposal)\n const activation = verifyAgentImprovementActivation(input)\n const result = verifyCanonicalCandidateDocument(\n agentImprovementActivationResultSchema.parse(input.result),\n 'agent improvement activation result',\n )\n assertResultAgainstActivation(activation, result)\n assertResultDesiredState(proposal, activation, result)\n return result\n}\n\n/** Validate and execute one product-owned activation transition. */\nexport async function executeAgentImprovementActivation(\n input: ExecuteAgentImprovementActivationInput,\n options: ExecuteAgentImprovementActivationOptions,\n): Promise<AgentImprovementActivationResult> {\n const proposal = verifyAgentImprovementProposal(input.proposal)\n const activation = verifyAgentImprovementActivation(input)\n const observedAt = (options.now ?? (() => new Date()))().toISOString()\n const attemptedAt =\n Date.parse(observedAt) < Date.parse(activation.authorizedAt)\n ? activation.authorizedAt\n : observedAt\n const expired = Date.parse(attemptedAt) >= Date.parse(activation.expiresAt)\n const transition = immutableCandidateValue<AgentImprovementActivationTransitionInput>(\n proposal.evaluation.kind === 'agent-improvement-measured-comparison'\n ? sealedCandidateTransition(proposal.evaluation.experiment, activation, attemptedAt, expired)\n : profileImprovementTransition(\n proposal.evaluation.experiment,\n activation,\n attemptedAt,\n expired,\n ),\n )\n\n if (transition.expired) {\n if (!options.reconcile) {\n return uncertainActivationResult(transition, 'RECONCILIATION_UNAVAILABLE')\n }\n let reconciled: unknown\n try {\n reconciled = await options.reconcile(transition)\n } catch {\n return uncertainActivationResult(transition, 'RECONCILIATION_THROW')\n }\n if (reconciled === undefined) {\n return createAgentImprovementActivationResult(transition, {\n completedAt: transition.attemptedAt,\n outcome: { status: 'expired' },\n })\n }\n try {\n return verifyAgentImprovementActivationResult({ ...input, result: reconciled })\n } catch {\n return uncertainActivationResult(transition, 'INVALID_RECONCILIATION')\n }\n }\n\n let rawResult: unknown\n try {\n rawResult = await options.transition(transition)\n } catch {\n return uncertainActivationResult(transition, 'TRANSITION_THROW')\n }\n try {\n return verifyAgentImprovementActivationResult({ ...input, result: rawResult })\n } catch {\n return uncertainActivationResult(transition, 'INVALID_RESULT')\n }\n}\n\nfunction sealedCandidateTransition(\n experiment: AgentCandidateExperiment,\n activation: AgentImprovementActivation,\n attemptedAt: string,\n expired: boolean,\n): SealedCandidateActivationTransitionInput {\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n return {\n kind: 'sealed-candidate',\n activation,\n candidateBundle: experiment.candidate,\n bundle: experiment[targetArm],\n targets: activation.targets.map((target) => ({\n ...target,\n desiredDigest: agentImprovementTargetDigest(experiment, targetArm, target.surface),\n desiredInput: agentImprovementTargetInput(experiment[targetArm], target.surface),\n })) as SealedCandidateActivationTransitionInput['targets'],\n attemptedAt,\n expired,\n }\n}\n\nfunction profileImprovementTransition(\n experiment: AgentProfileImprovementExperiment,\n activation: AgentImprovementActivation,\n attemptedAt: string,\n expired: boolean,\n): ProfileImprovementActivationTransitionInput {\n const sourceArm = activation.intent === 'activate-candidate' ? 'baseline' : 'candidate'\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const operation = profileImprovementOperation(experiment, activation.intent)\n return {\n kind: 'profile-improvement',\n activation,\n experiment,\n sourceStateDigest: agentProfileImprovementStateDigest(experiment, sourceArm),\n desiredStateDigest: agentProfileImprovementStateDigest(experiment, targetArm),\n operation,\n targets: activation.targets.map((target) => ({\n ...target,\n desiredDigest: agentProfileImprovementStateDigest(experiment, targetArm),\n desiredInput: operation,\n })) as ProfileImprovementActivationTransitionInput['targets'],\n attemptedAt,\n expired,\n }\n}\n\nfunction profileImprovementOperation(\n experiment: AgentProfileImprovementExperiment,\n intent: AgentImprovementActivation['intent'],\n): AgentProfileImprovementActivationOperation {\n return intent === 'activate-candidate'\n ? { kind: 'apply-change', changes: experiment.change }\n : { kind: 'restore-state' }\n}\n\nfunction uncertainActivationResult(\n transition: AgentImprovementActivationTransitionInput,\n code: string,\n): AgentImprovementActivationResult {\n return createAgentImprovementActivationResult(transition, {\n completedAt: transition.attemptedAt,\n outcome: {\n status: 'indeterminate',\n code,\n message: 'The product transition did not return a trustworthy commit result.',\n },\n })\n}\n\nfunction assertTransitionInput(\n activation: AgentImprovementActivation,\n transition: AgentImprovementActivationTransitionInput,\n): void {\n if (transition.kind === 'sealed-candidate') {\n assertSealedCandidateTransitionInput(activation, transition)\n return\n }\n assertProfileImprovementTransitionInput(activation, transition)\n}\n\nfunction assertSealedCandidateTransitionInput(\n activation: AgentImprovementActivation,\n transition: SealedCandidateActivationTransitionInput,\n): void {\n assertAuthorizedTransitionTargets(activation, transition.targets)\n const desiredInputsMatch = transition.targets.every(\n (target) =>\n canonicalCandidateDigest(target.desiredInput) ===\n canonicalCandidateDigest(agentImprovementTargetInput(transition.bundle, target.surface)),\n )\n if (\n transition.expired !== Date.parse(transition.attemptedAt) >= Date.parse(activation.expiresAt) ||\n transition.candidateBundle.digest !== activation.candidateDigest ||\n !desiredInputsMatch ||\n (activation.intent === 'activate-candidate' &&\n transition.bundle.digest !== transition.candidateBundle.digest)\n ) {\n throw new Error('activation transition does not match its authorization')\n }\n}\n\nfunction assertProfileImprovementTransitionInput(\n activation: AgentImprovementActivation,\n transition: ProfileImprovementActivationTransitionInput,\n): void {\n assertAuthorizedTransitionTargets(activation, transition.targets)\n const targetsAgentProfile = activation.targets.some(\n (target) => target.surface === 'agent-profile',\n )\n const experiment = agentProfileImprovementExperimentSchema.parse(transition.experiment)\n const sourceArm = activation.intent === 'activate-candidate' ? 'baseline' : 'candidate'\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const sourceStateDigest = agentProfileImprovementStateDigest(experiment, sourceArm)\n const desiredStateDigest = agentProfileImprovementStateDigest(experiment, targetArm)\n const operation = profileImprovementOperation(experiment, activation.intent)\n const targetsMatch = transition.targets.every(\n (target) =>\n target.expectedBaseDigest === sourceStateDigest &&\n target.desiredDigest === desiredStateDigest &&\n canonicalCandidateDigest(target.desiredInput) === canonicalCandidateDigest(operation),\n )\n if (\n transition.expired !== Date.parse(transition.attemptedAt) >= Date.parse(activation.expiresAt) ||\n experiment.digest !== activation.experimentDigest ||\n experiment.candidate.stateDigest !== activation.candidateDigest ||\n (targetsAgentProfile &&\n (activation.executionRef === undefined ||\n canonicalCandidateDigest(activation.executionRef) !==\n canonicalCandidateDigest(experiment.executionRef))) ||\n transition.sourceStateDigest !== sourceStateDigest ||\n transition.desiredStateDigest !== desiredStateDigest ||\n canonicalCandidateDigest(transition.operation) !== canonicalCandidateDigest(operation) ||\n !targetsMatch\n ) {\n throw new Error('activation transition does not match its authorization')\n }\n}\n\nfunction assertAuthorizedTransitionTargets(\n activation: AgentImprovementActivation,\n targets: readonly AgentImprovementActivationTargetPlan[],\n): void {\n const authorized = targetMap(activation.targets)\n const planned = targetMap(targets)\n if (\n authorized.size !== planned.size ||\n [...authorized.entries()].some(\n ([identity, target]) =>\n planned.get(identity)?.expectedBaseDigest !== target.expectedBaseDigest,\n )\n ) {\n throw new Error('activation transition does not match its authorization')\n }\n}\n\nfunction assertResultAgainstActivation(\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n): void {\n const attemptedAt = Date.parse(result.attemptedAt)\n const completedAt = Date.parse(result.completedAt)\n const expiresAt = Date.parse(activation.expiresAt)\n if (\n result.idempotencyKey !== activation.digest ||\n attemptedAt < Date.parse(activation.authorizedAt) ||\n completedAt < attemptedAt\n ) {\n throw new Error('activation result does not bind its authorization')\n }\n const expired = attemptedAt >= expiresAt\n if (\n (result.outcome.status === 'expired' && !expired) ||\n (expired && !['expired', 'indeterminate', 'already-applied'].includes(result.outcome.status))\n ) {\n throw new Error('activation result does not honor its authorization expiry')\n }\n if (!('targets' in result.outcome)) return\n const authorized = targetMap(activation.targets)\n const observed = new Set(result.outcome.targets.map(targetIdentity))\n if (\n authorized.size !== observed.size ||\n [...authorized.keys()].some((identity) => !observed.has(identity))\n ) {\n throw new Error('activation result must cover every authorized target exactly once')\n }\n if (\n result.outcome.status === 'applied' &&\n result.outcome.targets.some(\n (target) =>\n target.beforeDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest,\n )\n ) {\n throw new Error('applied activation did not start from its authorized base state')\n }\n}\n\nfunction assertResultDesiredState(\n proposal: AgentImprovementProposal,\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n): void {\n if (!('targets' in result.outcome)) return\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const desiredStateDigest =\n proposal.evaluation.kind === 'agent-profile-improvement-measured-comparison'\n ? agentProfileImprovementStateDigest(proposal.evaluation.experiment, targetArm)\n : undefined\n const desired = new Map(\n activation.targets.map((target) => [\n targetIdentity(target),\n desiredStateDigest ??\n agentImprovementTargetDigest(\n requireSealedCandidateExperiment(proposal),\n targetArm,\n target.surface,\n ),\n ]),\n )\n assertOutcomeDesiredState(activation, result, desired)\n}\n\nfunction assertOutcomeDesiredState(\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n desired: ReadonlyMap<string, Sha256Digest>,\n): void {\n if (!('targets' in result.outcome)) return\n if (result.outcome.status === 'applied') {\n if (\n result.outcome.targets.some(\n (target) => target.afterDigest !== desired.get(targetIdentity(target)),\n )\n ) {\n throw new Error('applied activation does not match the requested bundle')\n }\n return\n }\n const allDesired = result.outcome.targets.every(\n (target) => target.currentDigest === desired.get(targetIdentity(target)),\n )\n if (result.outcome.status === 'already-applied') {\n if (!allDesired) throw new Error('already-applied activation is not at the requested state')\n return\n }\n const authorized = targetMap(activation.targets)\n const hasStaleTarget = result.outcome.targets.some(\n (target) => target.currentDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest,\n )\n if (allDesired || !hasStaleTarget) {\n throw new Error('activation conflict does not identify stale target state')\n }\n}\n\nfunction targetMap<T extends { surface: AgentImprovementSurface; identity: string }>(\n targets: readonly T[],\n): Map<string, T> {\n return new Map(targets.map((target) => [targetIdentity(target), target]))\n}\n\nfunction targetIdentity(target: { surface: AgentImprovementSurface; identity: string }): string {\n return `${target.surface}\\u0000${target.identity}`\n}\n"],"mappings":"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"}
|
package/dist/agent.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { x as RuntimeStreamEvent } from "./types-C9j4qg6l.js";
|
|
2
2
|
import { a as createSurfaceImprovementProposer, c as SurfaceValidationIssue, d as validateSurfaces, i as SurfaceImprovementEdit, l as renderSurfaceIssues, n as DraftPatchInput, o as AgentSurfaces, r as DraftPatchOutput, s as ResolvedSurface, t as CreateSurfaceImprovementProposerOptions, u as resolveSubjectPath } from "./improvement-adapter-D5gwwoXQ.js";
|
|
3
3
|
import { E as SandboxClient, t as AgentRunSpec, w as OutputAdapter } from "./types-DnNGJ5Gz.js";
|
|
4
|
-
import "./index-
|
|
4
|
+
import "./index-BuzkRsOn.js";
|
|
5
5
|
import { TraceAnalystDefinition } from "@tangle-network/agent-eval";
|
|
6
|
-
import { AgentProfile as AgentProfile$1, AgentProfileFileMount, AgentProfileMcpServer } from "@tangle-network/agent-interface";
|
|
6
|
+
import { AGENT_PROFILE_MATERIALIZATION_AXES, AgentProfile as AgentProfile$1, AgentProfileFileMount, AgentProfileMcpServer, CanonicalAgentProfileMaterializationAxis } from "@tangle-network/agent-interface";
|
|
7
7
|
import { SandboxEvent } from "@tangle-network/sandbox";
|
|
8
8
|
//#region src/agent/define-agent.d.ts
|
|
9
9
|
/**
|
|
@@ -228,9 +228,7 @@ declare class AgentManifestError extends Error {
|
|
|
228
228
|
declare function defineAgent<TPersona = unknown, TRunOutput = unknown>(manifest: AgentManifest<TPersona, TRunOutput>): AgentManifest<TPersona, TRunOutput>;
|
|
229
229
|
//#endregion
|
|
230
230
|
//#region src/agent/profile-materialization.d.ts
|
|
231
|
-
|
|
232
|
-
declare const AGENT_PROFILE_MATERIALIZATION_AXES: readonly ["identity", "name", "model", "prompt", "systemPrompt", "instructions", "resources", "files", "resourceInstructions", "skills", "resourceTools", "resourceAgents", "commands", "tools", "permissions", "mcp", "mcpConnections", "connections", "subagents", "hooks", "modes", "confidential", "metadata", "extensions"];
|
|
233
|
-
type KnownAgentProfileMaterializationAxis = (typeof AGENT_PROFILE_MATERIALIZATION_AXES)[number];
|
|
231
|
+
type KnownAgentProfileMaterializationAxis = CanonicalAgentProfileMaterializationAxis;
|
|
234
232
|
/** AgentProfile axis name, with `custom:<name>` reserved for caller-owned extensions. */
|
|
235
233
|
type AgentProfileMaterializationAxis = KnownAgentProfileMaterializationAxis | `custom:${string}`;
|
|
236
234
|
/** Declares which AgentProfile axes a concrete run path really carries. */
|
|
@@ -262,11 +260,24 @@ interface AssertProfileMaterializationOptions extends ValidateProfileMaterializa
|
|
|
262
260
|
/** Extra label included in the thrown error, usually the caller or run id. */
|
|
263
261
|
context?: string;
|
|
264
262
|
}
|
|
265
|
-
/**
|
|
263
|
+
/**
|
|
264
|
+
* Materialization contract for `createSandboxAct`.
|
|
265
|
+
*
|
|
266
|
+
* `createSandboxAct` hands the whole `AgentProfile` to the sandbox as `backend.profile`, so every
|
|
267
|
+
* profile leaf crosses the boundary. `buildBackendOptions` resolves the runner from an explicit
|
|
268
|
+
* `sandboxOverrides.backend.type`, then `profile.metadata.backendType`, then `profile.harness`,
|
|
269
|
+
* so a candidate that changes only `harness` runs on the harness it declares — and one declaring
|
|
270
|
+
* a harness the sandbox cannot run throws rather than running elsewhere and reporting success.
|
|
271
|
+
*/
|
|
266
272
|
declare const sandboxActProfileMaterialization: ProfileMaterializationContract;
|
|
267
273
|
/** Materialization contract for a run path that only injects prompt text. */
|
|
268
274
|
declare const promptOnlyProfileMaterialization: ProfileMaterializationContract;
|
|
269
|
-
/**
|
|
275
|
+
/**
|
|
276
|
+
* Materialization contract for a run path that injects prompt text plus inline resources.
|
|
277
|
+
*
|
|
278
|
+
* `resourceFailOnError` is absent: it is a resolution POLICY the attaching path would have to
|
|
279
|
+
* enforce, and inlining resource content does not carry it.
|
|
280
|
+
*/
|
|
270
281
|
declare const promptResourceProfileMaterialization: ProfileMaterializationContract;
|
|
271
282
|
/** Define the profile axes a concrete run path actually carries into execution. */
|
|
272
283
|
declare function defineProfileMaterializationContract(options: DefineProfileMaterializationContractOptions): ProfileMaterializationContract;
|
package/dist/agent.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { u as ValidationError } from "./errors-DEAvWQPy.js";
|
|
2
|
-
import "./runtime-
|
|
2
|
+
import "./runtime-C_g_SsXg.js";
|
|
3
3
|
import { r as mapSandboxEvent } from "./sandbox-events-DeI5xX8P.js";
|
|
4
|
-
import {
|
|
4
|
+
import { Kt as createSandboxForSpec } from "./supervise-BcCHhLrz.js";
|
|
5
|
+
import { AGENT_PROFILE_MATERIALIZATION_AXES } from "@tangle-network/agent-interface";
|
|
5
6
|
import { createHash } from "node:crypto";
|
|
6
7
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
7
8
|
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
@@ -435,59 +436,81 @@ function sha256(s) {
|
|
|
435
436
|
}
|
|
436
437
|
//#endregion
|
|
437
438
|
//#region src/agent/profile-materialization.ts
|
|
438
|
-
/** Known AgentProfile axes a run path may or may not carry into execution. */
|
|
439
|
-
const AGENT_PROFILE_MATERIALIZATION_AXES = [
|
|
440
|
-
"identity",
|
|
441
|
-
"name",
|
|
442
|
-
"model",
|
|
443
|
-
"prompt",
|
|
444
|
-
"systemPrompt",
|
|
445
|
-
"instructions",
|
|
446
|
-
"resources",
|
|
447
|
-
"files",
|
|
448
|
-
"resourceInstructions",
|
|
449
|
-
"skills",
|
|
450
|
-
"resourceTools",
|
|
451
|
-
"resourceAgents",
|
|
452
|
-
"commands",
|
|
453
|
-
"tools",
|
|
454
|
-
"permissions",
|
|
455
|
-
"mcp",
|
|
456
|
-
"mcpConnections",
|
|
457
|
-
"connections",
|
|
458
|
-
"subagents",
|
|
459
|
-
"hooks",
|
|
460
|
-
"modes",
|
|
461
|
-
"confidential",
|
|
462
|
-
"metadata",
|
|
463
|
-
"extensions"
|
|
464
|
-
];
|
|
465
439
|
const KNOWN_AXIS_SET = new Set(AGENT_PROFILE_MATERIALIZATION_AXES);
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
440
|
+
/**
|
|
441
|
+
* Compound AgentProfile properties and the canonical leaves they cover.
|
|
442
|
+
*
|
|
443
|
+
* agent-interface publishes two axis vocabularies, and this module has to sit between them:
|
|
444
|
+
* `profileMaterializationAxes` emits canonical LEAVES, while `changedAgentProfileAxes` emits
|
|
445
|
+
* DIFF axes, which are compound property names (`model`, `prompt`, `resources`, `identity`) for
|
|
446
|
+
* everything except the already-scalar properties. A changed-axis input is therefore expanded
|
|
447
|
+
* through this map, so both producers compose with this validator.
|
|
448
|
+
*
|
|
449
|
+
* A CONTRACT may still only name leaves. Expanding an input is safe — it asks about more, never
|
|
450
|
+
* less — whereas letting a contract claim a parent is what silently swallows a dropped child.
|
|
451
|
+
*/
|
|
452
|
+
const compoundAxisLeaves = {
|
|
453
|
+
identity: [
|
|
454
|
+
"name",
|
|
455
|
+
"description",
|
|
456
|
+
"version",
|
|
457
|
+
"tags"
|
|
458
|
+
],
|
|
459
|
+
prompt: ["systemPrompt", "instructions"],
|
|
460
|
+
model: [
|
|
461
|
+
"modelDefault",
|
|
462
|
+
"modelSmall",
|
|
463
|
+
"modelProvider",
|
|
464
|
+
"modelReasoningEffort",
|
|
465
|
+
"modelMetadata"
|
|
466
|
+
],
|
|
467
|
+
resources: [
|
|
468
|
+
"files",
|
|
469
|
+
"resourceTools",
|
|
470
|
+
"skills",
|
|
471
|
+
"resourceAgents",
|
|
472
|
+
"commands",
|
|
473
|
+
"resourceInstructions",
|
|
474
|
+
"resourceFailOnError"
|
|
475
|
+
],
|
|
476
|
+
mcpConnections: ["mcp"]
|
|
477
477
|
};
|
|
478
|
-
/**
|
|
478
|
+
/**
|
|
479
|
+
* Materialization contract for `createSandboxAct`.
|
|
480
|
+
*
|
|
481
|
+
* `createSandboxAct` hands the whole `AgentProfile` to the sandbox as `backend.profile`, so every
|
|
482
|
+
* profile leaf crosses the boundary. `buildBackendOptions` resolves the runner from an explicit
|
|
483
|
+
* `sandboxOverrides.backend.type`, then `profile.metadata.backendType`, then `profile.harness`,
|
|
484
|
+
* so a candidate that changes only `harness` runs on the harness it declares — and one declaring
|
|
485
|
+
* a harness the sandbox cannot run throws rather than running elsewhere and reporting success.
|
|
486
|
+
*/
|
|
479
487
|
const sandboxActProfileMaterialization = defineProfileMaterializationContract({
|
|
480
488
|
name: "createSandboxAct",
|
|
481
489
|
axes: [
|
|
482
|
-
"
|
|
483
|
-
"
|
|
484
|
-
"
|
|
485
|
-
"
|
|
486
|
-
"
|
|
490
|
+
"name",
|
|
491
|
+
"description",
|
|
492
|
+
"version",
|
|
493
|
+
"tags",
|
|
494
|
+
"harness",
|
|
495
|
+
"systemPrompt",
|
|
496
|
+
"instructions",
|
|
497
|
+
"modelDefault",
|
|
498
|
+
"modelSmall",
|
|
499
|
+
"modelProvider",
|
|
500
|
+
"modelReasoningEffort",
|
|
501
|
+
"modelMetadata",
|
|
487
502
|
"permissions",
|
|
503
|
+
"tools",
|
|
488
504
|
"mcp",
|
|
489
505
|
"connections",
|
|
490
506
|
"subagents",
|
|
507
|
+
"files",
|
|
508
|
+
"resourceTools",
|
|
509
|
+
"skills",
|
|
510
|
+
"resourceAgents",
|
|
511
|
+
"commands",
|
|
512
|
+
"resourceInstructions",
|
|
513
|
+
"resourceFailOnError",
|
|
491
514
|
"hooks",
|
|
492
515
|
"modes",
|
|
493
516
|
"confidential",
|
|
@@ -498,12 +521,26 @@ const sandboxActProfileMaterialization = defineProfileMaterializationContract({
|
|
|
498
521
|
/** Materialization contract for a run path that only injects prompt text. */
|
|
499
522
|
const promptOnlyProfileMaterialization = defineProfileMaterializationContract({
|
|
500
523
|
name: "prompt-only-message",
|
|
501
|
-
axes: ["
|
|
524
|
+
axes: ["systemPrompt", "instructions"]
|
|
502
525
|
});
|
|
503
|
-
/**
|
|
526
|
+
/**
|
|
527
|
+
* Materialization contract for a run path that injects prompt text plus inline resources.
|
|
528
|
+
*
|
|
529
|
+
* `resourceFailOnError` is absent: it is a resolution POLICY the attaching path would have to
|
|
530
|
+
* enforce, and inlining resource content does not carry it.
|
|
531
|
+
*/
|
|
504
532
|
const promptResourceProfileMaterialization = defineProfileMaterializationContract({
|
|
505
533
|
name: "prompt-resource-attachment",
|
|
506
|
-
axes: [
|
|
534
|
+
axes: [
|
|
535
|
+
"systemPrompt",
|
|
536
|
+
"instructions",
|
|
537
|
+
"files",
|
|
538
|
+
"resourceTools",
|
|
539
|
+
"skills",
|
|
540
|
+
"resourceAgents",
|
|
541
|
+
"commands",
|
|
542
|
+
"resourceInstructions"
|
|
543
|
+
]
|
|
507
544
|
});
|
|
508
545
|
/** Define the profile axes a concrete run path actually carries into execution. */
|
|
509
546
|
function defineProfileMaterializationContract(options) {
|
|
@@ -511,13 +548,13 @@ function defineProfileMaterializationContract(options) {
|
|
|
511
548
|
if (!name) throw new ValidationError("defineProfileMaterializationContract: name is required");
|
|
512
549
|
return {
|
|
513
550
|
name,
|
|
514
|
-
axes:
|
|
551
|
+
axes: normalizeContractAxes(options.axes, `${name}.axes`)
|
|
515
552
|
};
|
|
516
553
|
}
|
|
517
554
|
/** Return every changed profile axis that the selected run path would drop. */
|
|
518
555
|
function validateProfileMaterialization(options) {
|
|
519
|
-
const changedAxes =
|
|
520
|
-
const supported = new Set(
|
|
556
|
+
const changedAxes = normalizeChangedAxes(options.changedAxes, "changedAxes");
|
|
557
|
+
const supported = new Set(normalizeContractAxes(options.contract.axes, `${options.contract.name}.axes`));
|
|
521
558
|
const issues = [];
|
|
522
559
|
for (const axis of changedAxes) {
|
|
523
560
|
if (isAxisSupported(axis, supported)) continue;
|
|
@@ -549,32 +586,54 @@ function renderProfileMaterializationIssues(issues, context) {
|
|
|
549
586
|
"Use a run path that carries those AgentProfile axes, or remove them from the candidate."
|
|
550
587
|
].join("\n");
|
|
551
588
|
}
|
|
552
|
-
|
|
589
|
+
/** Contract side: leaves (or `custom:`) only. A parent claim would hide a dropped child. */
|
|
590
|
+
function normalizeContractAxes(axes, label) {
|
|
591
|
+
return dedupe(axes.map((raw) => assertLeafAxis(raw, label)));
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Input side: leaves, `custom:`, and compound diff axes, which expand to their leaves so
|
|
595
|
+
* `changedAgentProfileAxes` output composes with a leaf-only contract.
|
|
596
|
+
*/
|
|
597
|
+
function normalizeChangedAxes(axes, label) {
|
|
553
598
|
const out = [];
|
|
554
|
-
const seen = /* @__PURE__ */ new Set();
|
|
555
599
|
for (const raw of axes) {
|
|
556
|
-
const axis =
|
|
600
|
+
const axis = readAxisName(raw, label);
|
|
601
|
+
const leaves = compoundAxisLeaves[axis];
|
|
602
|
+
if (leaves && !KNOWN_AXIS_SET.has(axis)) {
|
|
603
|
+
out.push(...leaves);
|
|
604
|
+
continue;
|
|
605
|
+
}
|
|
606
|
+
out.push(assertLeafAxis(raw, label));
|
|
607
|
+
}
|
|
608
|
+
return dedupe(out);
|
|
609
|
+
}
|
|
610
|
+
function dedupe(axes) {
|
|
611
|
+
const out = [];
|
|
612
|
+
const seen = /* @__PURE__ */ new Set();
|
|
613
|
+
for (const axis of axes) {
|
|
557
614
|
if (seen.has(axis)) continue;
|
|
558
615
|
seen.add(axis);
|
|
559
616
|
out.push(axis);
|
|
560
617
|
}
|
|
561
618
|
return out;
|
|
562
619
|
}
|
|
563
|
-
function
|
|
620
|
+
function readAxisName(raw, label) {
|
|
564
621
|
if (typeof raw !== "string") throw new ValidationError(`${label}: profile axis must be a string`);
|
|
565
622
|
const axis = raw.trim();
|
|
566
623
|
if (!axis) throw new ValidationError(`${label}: profile axis must be non-empty`);
|
|
567
|
-
if (!KNOWN_AXIS_SET.has(axis) && !axis.startsWith("custom:")) throw new ValidationError(`${label}: unknown profile axis "${axis}". Use a known axis or custom:<name>.`);
|
|
568
624
|
return axis;
|
|
569
625
|
}
|
|
570
|
-
function
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
if (
|
|
575
|
-
|
|
626
|
+
function assertLeafAxis(raw, label) {
|
|
627
|
+
const axis = readAxisName(raw, label);
|
|
628
|
+
if (!KNOWN_AXIS_SET.has(axis) && !axis.startsWith("custom:")) {
|
|
629
|
+
const leaves = compoundAxisLeaves[axis];
|
|
630
|
+
if (leaves) throw new ValidationError(`${label}: "${axis}" is a compound AgentProfile property, not a materialization axis. Name the exact leaves this path carries: ${leaves.join(", ")}.`);
|
|
631
|
+
throw new ValidationError(`${label}: unknown profile axis "${axis}". Use a known axis or custom:<name>.`);
|
|
576
632
|
}
|
|
577
|
-
return
|
|
633
|
+
return axis;
|
|
634
|
+
}
|
|
635
|
+
function isAxisSupported(axis, supported) {
|
|
636
|
+
return supported.has(axis);
|
|
578
637
|
}
|
|
579
638
|
//#endregion
|
|
580
639
|
//#region src/agent/sandbox-act.ts
|