@agenticprimitives/service-host 0.0.0-alpha.2 → 0.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/host.d.ts +50 -0
  2. package/dist/host.d.ts.map +1 -0
  3. package/dist/host.js +36 -0
  4. package/dist/host.js.map +1 -0
  5. package/dist/index.d.ts +18 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +10 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/provenance-sink.d.ts +44 -0
  10. package/dist/provenance-sink.d.ts.map +1 -0
  11. package/dist/provenance-sink.js +89 -0
  12. package/dist/provenance-sink.js.map +1 -0
  13. package/dist/routes.d.ts +64 -0
  14. package/dist/routes.d.ts.map +1 -0
  15. package/dist/routes.js +173 -0
  16. package/dist/routes.js.map +1 -0
  17. package/dist/run.d.ts +110 -0
  18. package/dist/run.d.ts.map +1 -0
  19. package/dist/run.js +135 -0
  20. package/dist/run.js.map +1 -0
  21. package/dist/surface.d.ts +27 -0
  22. package/dist/surface.d.ts.map +1 -0
  23. package/dist/surface.js +76 -0
  24. package/dist/surface.js.map +1 -0
  25. package/dist/tools/external.d.ts +28 -0
  26. package/dist/tools/external.d.ts.map +1 -0
  27. package/dist/tools/external.js +75 -0
  28. package/dist/tools/external.js.map +1 -0
  29. package/dist/tools/find.d.ts +39 -0
  30. package/dist/tools/find.d.ts.map +1 -0
  31. package/dist/tools/find.js +95 -0
  32. package/dist/tools/find.js.map +1 -0
  33. package/dist/tools/index.d.ts +8 -0
  34. package/dist/tools/index.d.ts.map +1 -0
  35. package/dist/tools/index.js +5 -0
  36. package/dist/tools/index.js.map +1 -0
  37. package/dist/tools/inspect.d.ts +6 -0
  38. package/dist/tools/inspect.d.ts.map +1 -0
  39. package/dist/tools/inspect.js +43 -0
  40. package/dist/tools/inspect.js.map +1 -0
  41. package/dist/tools/invoke.d.ts +59 -0
  42. package/dist/tools/invoke.d.ts.map +1 -0
  43. package/dist/tools/invoke.js +92 -0
  44. package/dist/tools/invoke.js.map +1 -0
  45. package/package.json +4 -1
package/dist/run.d.ts ADDED
@@ -0,0 +1,110 @@
1
+ import { type Intent, type Planner, type ToolSpec, type ToolInvoker, type RunResult, type RunEvent, type OrchestrationPorts, type SuppliedInputV1, type RunRecordV1, type TraceContextV1 } from '@agenticprimitives/orchestration';
2
+ import { type PlaybookView } from '@agenticprimitives/harness';
3
+ import type { DelegationWireV1 } from '@agenticprimitives/a2a';
4
+ import type { Address } from '@agenticprimitives/types';
5
+ import { type RunStore } from './run-store.js';
6
+ /** The `/harness/ask` envelope — the shape `readSubjectReply` (the asker's runtime) and `subjectEnvelopeOf` read. */
7
+ export interface AskReplyEnvelopeV1 {
8
+ ok: boolean;
9
+ error?: string;
10
+ runRef: string;
11
+ reply?: {
12
+ kind: 'answer' | 'done' | 'prompt' | 'authority_required' | 'refused';
13
+ runRef: string;
14
+ text: string;
15
+ summary?: string;
16
+ results?: Array<{
17
+ toolId: string;
18
+ result: unknown;
19
+ }>;
20
+ prompt?: RunResult['prompt'];
21
+ required?: RunResult['required'];
22
+ /** The receipts of this turn, by step (stepRef · capability · status) — evidence the asker's record cites. */
23
+ receipts?: Array<{
24
+ stepRef: string;
25
+ capability?: string;
26
+ status: string;
27
+ }>;
28
+ };
29
+ }
30
+ /** Who asked, as admission established it. Display and audit; the loop reads `presented`, never this. */
31
+ export type TurnCredentialV1 = {
32
+ kind: 'home-session';
33
+ token?: string;
34
+ } | {
35
+ kind: 'app-delegation';
36
+ authorization: string;
37
+ body: string;
38
+ } | {
39
+ kind: 'agent';
40
+ agent: Address;
41
+ } | {
42
+ kind: 'public';
43
+ };
44
+ export interface TurnInput {
45
+ /** The agent this turn runs AT — whose playbook, whose store, whose authority is spent. */
46
+ agent: Address;
47
+ /** The admitted asker. For a public read, the agent itself. */
48
+ asker: Address;
49
+ credential: TurnCredentialV1;
50
+ /** The sentence. */
51
+ message: string;
52
+ /** The full intent when the run was entered with one — a resume or a durable run; else built from the message. */
53
+ intent?: Intent;
54
+ /** Spec 361 I4 — a caller-supplied plan: deterministic, no planner turn. */
55
+ plan?: {
56
+ steps: Array<{
57
+ toolId: string;
58
+ args: Record<string, unknown>;
59
+ id?: string;
60
+ }>;
61
+ };
62
+ /** The mandate(s) this turn presents — a keyring grows across turns (`mergeTurn`). */
63
+ presented?: DelegationWireV1 | DelegationWireV1[] | null;
64
+ /** Answers to prompts earlier turns raised. */
65
+ supplied?: SuppliedInputV1[];
66
+ /** A resume names the run it continues. */
67
+ runRef?: string;
68
+ traceContext?: TraceContextV1 | null;
69
+ receivedAt?: number;
70
+ }
71
+ export interface TurnDeps {
72
+ /** The playbook pinned by digest (`loadPlaybook`); absent ⇒ the bare harness offers every built-in (spec 354 §4.3). */
73
+ playbook?: PlaybookView | null;
74
+ /** The tools this host offers before the playbook narrows them. */
75
+ tools: ReadonlyArray<ToolSpec>;
76
+ /** One invoker per tool id — the app's work. A tool with no invoker is refused at the step, never guessed. */
77
+ invokers: Readonly<Record<string, ToolInvoker>>;
78
+ /** The planner port. Required when no plan is supplied. */
79
+ planner?: Planner;
80
+ /** Spec 350 — the authority ports the host binds (verifier · ladder · approvals · receipts · effects). */
81
+ ports?: Omit<OrchestrationPorts, 'events'>;
82
+ /** The agent's own store: checkpoint, progress, record. */
83
+ runStore: RunStore;
84
+ /** The receipt's reference for a presented wire — the delegation hash in a deployment. Default: a stable key. */
85
+ mandateRef?: (wire: DelegationWireV1) => string;
86
+ /** One sentence from a finished run — the host's composer, or the default (the last step's words). */
87
+ say?: (result: RunResult, tools: ReadonlyArray<ToolSpec>) => Promise<string> | string;
88
+ /** The capability's plain words for progress lines ("create organizations"). */
89
+ words?: (capabilityId: string) => string | undefined;
90
+ /** How many steps / re-plans a turn may take (loop defaults otherwise). */
91
+ maxSteps?: number;
92
+ maxReplans?: number;
93
+ now?: () => number;
94
+ log?: (line: string) => void;
95
+ /** A fresh run reference when none is given. */
96
+ newRunRef?: () => string;
97
+ }
98
+ export interface TurnOutcome {
99
+ envelope: AskReplyEnvelopeV1;
100
+ result: RunResult;
101
+ record: RunRecordV1 | null;
102
+ events: RunEvent[];
103
+ runRef: string;
104
+ }
105
+ /** A planner that returns the supplied plan once and nothing after — a deterministic turn costs no planner call. */
106
+ export declare function suppliedPlanner(plan: NonNullable<TurnInput['plan']>): Planner;
107
+ /** The default sentence: the last successful step's `text` / `said` / `observation`, else a one-line count. */
108
+ export declare function defaultSay(result: RunResult): string;
109
+ export declare function runTurn(input: TurnInput, deps: TurnDeps): Promise<TurnOutcome>;
110
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
package/dist/run.js ADDED
@@ -0,0 +1,135 @@
1
+ // THE TURN — spec 433 W1 step 3 (census §1): one `/harness/ask` from admission to envelope, promoted from the ap-home
2
+ // runtime's `askReplyForInner` + `harnessInvoker` with the Home's tool universe left behind. What stays is what every
3
+ // service agent's turn is made of: the playbook pinned by digest decides what is OFFERED; a supplied plan or the planner
4
+ // port proposes; the orchestration loop judges each step under the mandate verifier and the ladder; the app's
5
+ // INVOKERS act; receipts land in the sink; a run that stops to ask a person is checkpointed in the agent's own store;
6
+ // a finished run leaves its record there (and its provenance in the vault, `provenance-sink.ts`); the reply is the
7
+ // `/harness/ask`-shaped envelope every asker's runtime reads (`readSubjectReply`, `subjectEnvelopeOf`).
8
+ //
9
+ // Intelligence may be probabilistic. Authority must not be. Nothing here decides authority: the verifier the host binds
10
+ // does, per step, inside the loop (spec 350).
11
+ import { runIntent, recordOf } from '@agenticprimitives/orchestration';
12
+ import { composeOfferedTools } from '@agenticprimitives/harness';
13
+ import { mergeTurn, expiryFor, completedStepsOf } from './run-store.js';
14
+ import { progressLine } from './progress.js';
15
+ const stableRef = (w) => `${String(w.delegator).toLowerCase()}:${String(w.delegate).toLowerCase()}:${String(w.salt)}`;
16
+ const randomRunRef = () => `run-${crypto.randomUUID()}`;
17
+ /** A planner that returns the supplied plan once and nothing after — a deterministic turn costs no planner call. */
18
+ export function suppliedPlanner(plan) {
19
+ return { async plan() { return { steps: plan.steps.map((s, i) => ({ id: s.id ?? `s${i + 1}`, toolId: s.toolId, args: s.args })) }; } };
20
+ }
21
+ /** The default sentence: the last successful step's `text` / `said` / `observation`, else a one-line count. */
22
+ export function defaultSay(result) {
23
+ for (let i = result.steps.length - 1; i >= 0; i--) {
24
+ const r = result.steps[i]?.result;
25
+ if (typeof r === 'string' && r.trim())
26
+ return r.trim();
27
+ if (r && typeof r === 'object')
28
+ for (const k of ['text', 'said', 'observation', 'answer']) {
29
+ const v = r[k];
30
+ if (typeof v === 'string' && v.trim())
31
+ return v.trim();
32
+ }
33
+ }
34
+ return result.outcome === 'completed' ? `Done — ${result.steps.length} step(s).` : (result.error ?? result.outcome);
35
+ }
36
+ /** What kind of awaiting a suspended run records — from the prompt it raised. */
37
+ function awaitingOf(result) {
38
+ if (result.outcome === 'authority-required' && result.required)
39
+ return { kind: 'authority', prompt: `${result.required.toolId} needs a mandate`, stepRef: result.required.stepRef };
40
+ const p = result.prompt;
41
+ if (!p)
42
+ return undefined;
43
+ const kind = ['data', 'signature', 'confirmation', 'commitment', 'authority'].includes(p.kind) ? p.kind : 'data';
44
+ return { kind, prompt: p.prompt ?? '', stepRef: p.stepRef ?? '' };
45
+ }
46
+ export async function runTurn(input, deps) {
47
+ const now = deps.now ?? Date.now;
48
+ const log = deps.log ?? (() => { });
49
+ const agent = input.agent.toLowerCase();
50
+ const asker = input.asker.toLowerCase();
51
+ const stored = input.runRef ? await deps.runStore.load(agent, input.runRef) : null;
52
+ if (input.runRef && stored && stored.asker.toLowerCase() !== asker) {
53
+ return refusal(input.runRef, 'this run was asked by someone else — only they may resume it');
54
+ }
55
+ const merged = mergeTurn(stored, { message: input.message, presented: input.presented, supplied: input.supplied });
56
+ if ('error' in merged)
57
+ return refusal(input.runRef ?? (deps.newRunRef ?? randomRunRef)(), merged.error);
58
+ const runRef = input.runRef ?? (deps.newRunRef ?? randomRunRef)();
59
+ const intent = stored?.intent ?? input.intent ?? { goal: merged.message };
60
+ const tools = composeOfferedTools([...deps.tools], deps.playbook ?? null, (d) => log(`[turn] contract disagreement: ${JSON.stringify(d)}`));
61
+ const plan = input.plan ?? stored?.plan;
62
+ const planner = plan ? suppliedPlanner(plan) : deps.planner;
63
+ if (!planner)
64
+ return refusal(runRef, 'no plan was supplied and this host has no planner — a deterministic ask names its steps');
65
+ const presented = merged.presented.map((w) => ({ ref: (deps.mandateRef ?? stableRef)(w), wire: w }));
66
+ const events = [];
67
+ const invoke = async (toolId, args, ctx) => {
68
+ const fn = deps.invokers[toolId];
69
+ if (!fn)
70
+ throw new Error(`no invoker for ${toolId} — this host does not perform it`);
71
+ return fn(toolId, args, ctx);
72
+ };
73
+ const result = await runIntent(intent, {
74
+ planner, tools, invoke, runRef, presented,
75
+ ports: { ...(deps.ports ?? {}), events: (e) => { events.push(e); } },
76
+ ...(deps.maxSteps !== undefined ? { maxSteps: deps.maxSteps } : {}),
77
+ ...(deps.maxReplans !== undefined ? { maxReplans: deps.maxReplans } : {}),
78
+ ...(stored?.executed ? { resume: stored.executed } : {}),
79
+ });
80
+ // Progress — one sentence per event, for a surface that watches (best-effort, never the turn's failure).
81
+ for (const e of events) {
82
+ const line = progressLine(e, tools, deps.words ?? (() => undefined));
83
+ if (line)
84
+ await deps.runStore.appendProgress(agent, runRef, asker, line).catch(() => undefined);
85
+ }
86
+ const t = now();
87
+ const terminal = result.outcome === 'completed' || result.outcome === 'failed' || result.outcome === 'denied';
88
+ if (!terminal) {
89
+ // THE CHECKPOINT: what the person already gave, what ran, what it waits for. A rebuild, never the record.
90
+ const awaiting = awaitingOf(result);
91
+ const checkpoint = {
92
+ runRef, message: merged.message, intent, addressee: agent, asker, presented: merged.presented, supplied: merged.supplied,
93
+ ...(plan ? { plan } : {}), ...(awaiting ? { awaiting } : {}),
94
+ executed: { plan: result.plan, completed: completedStepsOf(result) },
95
+ expiresAt: expiryFor(awaiting, t), createdAt: stored?.createdAt ?? t, updatedAt: t,
96
+ };
97
+ await deps.runStore.save(checkpoint);
98
+ }
99
+ else if (stored) {
100
+ await deps.runStore.drop(agent, runRef).catch(() => undefined);
101
+ }
102
+ const record = terminal || result.outcome === 'authority-required' || result.outcome === 'suspended'
103
+ ? { ...recordOf({ runRef, intent, result, events, presented, now: t, ...(input.traceContext ? { traceContext: input.traceContext } : {}), ...(input.receivedAt ? { receivedAt: input.receivedAt } : {}) }), asker, credential: input.credential.kind }
104
+ : null;
105
+ if (record && terminal)
106
+ await deps.runStore.putRecord(agent, record).catch((e) => log(`[turn] record not kept: ${e instanceof Error ? e.message : String(e)}`));
107
+ await deps.runStore.appendProgress(agent, runRef, asker, { type: 'ReplyReady', said: terminal ? 'Replied.' : 'Waiting on you.', terminal: true }).catch(() => undefined);
108
+ const receipts = result.receipts.map((r) => ({ stepRef: r.stepRef, ...(r.capability?.id ? { capability: r.capability.id } : {}), status: r.status }));
109
+ const envelope = await envelopeOf(runRef, result, tools, deps, receipts);
110
+ return { envelope, result, record, events, runRef };
111
+ }
112
+ async function envelopeOf(runRef, result, tools, deps, receipts) {
113
+ const results = result.steps.filter((s) => s.ok).map((s) => ({ toolId: s.step.toolId, result: s.result }));
114
+ switch (result.outcome) {
115
+ case 'completed': {
116
+ const text = await (deps.say ? deps.say(result, tools) : defaultSay(result));
117
+ // An ACT ran when any completed step's tool declares a capability; a turn of reads is an answer.
118
+ const acted = result.steps.some((s) => s.ok && tools.find((t) => t.id === s.step.toolId)?.capability);
119
+ return { ok: true, runRef, reply: { kind: acted ? 'done' : 'answer', runRef, text, results, receipts } };
120
+ }
121
+ case 'suspended':
122
+ return { ok: true, runRef, reply: { kind: 'prompt', runRef, text: String(result.prompt?.prompt ?? 'More is needed.'), prompt: result.prompt, results, receipts } };
123
+ case 'authority-required':
124
+ return { ok: true, runRef, reply: { kind: 'authority_required', runRef, text: `${result.required?.toolId ?? 'this step'} needs a mandate`, required: result.required, results, receipts } };
125
+ case 'denied':
126
+ case 'failed':
127
+ default:
128
+ return { ok: false, runRef, error: result.error ?? result.outcome, reply: { kind: 'refused', runRef, text: result.error ?? result.outcome, results, receipts } };
129
+ }
130
+ }
131
+ function refusal(runRef, error) {
132
+ const result = { outcome: 'failed', plan: { steps: [] }, steps: [], error, runRef, receipts: [] };
133
+ return { envelope: { ok: false, runRef, error, reply: { kind: 'refused', runRef, text: error, results: [], receipts: [] } }, result, record: null, events: [], runRef };
134
+ }
135
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type Principal, type StandardServer, type StandardTaskStore } from '@agenticprimitives/a2a/standard';
2
+ import type { Address } from '@agenticprimitives/types';
3
+ import { type TurnDeps, type TurnCredentialV1 } from './run.js';
4
+ import type { RunStore } from './run-store.js';
5
+ import type { AdmittedPrincipal } from './routes.js';
6
+ export interface SurfaceDeps {
7
+ agent: Address;
8
+ /** The live card (name, description, skills from the definition, provider); the standard fields are added here. */
9
+ card: Record<string, unknown>;
10
+ /** The origin this surface is served at — `messageUrl` is `${origin}/api/a2a`. */
11
+ origin: string;
12
+ runStore: RunStore;
13
+ turnDeps: (ctx: {
14
+ asker: AdmittedPrincipal;
15
+ }) => Promise<Omit<TurnDeps, 'runStore'>> | Omit<TurnDeps, 'runStore'>;
16
+ /** WHO is calling the door (ADR-0057): a wire-signed agent, a Home session bearer; null ⇒ nobody. */
17
+ principal?: (request: Request) => Promise<Principal | null>;
18
+ /** Strangers may ask (reads only; acts park). Default false. */
19
+ public?: boolean;
20
+ tasks?: StandardTaskStore;
21
+ /** The asker's credential a routed profile carries, verified by the host as the receiver; `null` refuses the hop. */
22
+ verifyForwarded?: (credential: unknown, asker: Address) => Promise<TurnCredentialV1 | null>;
23
+ log?: (line: string) => void;
24
+ }
25
+ /** The standard server over the turn. */
26
+ export declare function standardSurface(deps: SurfaceDeps): StandardServer;
27
+ //# sourceMappingURL=surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"AAMA,OAAO,EAAqK,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEjR,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAW,KAAK,QAAQ,EAAkB,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,mHAAmH;IACnH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,iBAAiB,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClH,qGAAqG;IACrG,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC5D,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,qHAAqH;IACrH,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC5F,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,yCAAyC;AACzC,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,CA6CjE"}
@@ -0,0 +1,76 @@
1
+ // THE SURFACE — spec 433 W1 step 5 (census §4): the standard A2A 1.0 door (spec 372) mounted over the turn, promoted from
2
+ // the ap-home runtime's `standard-a2a.ts`. Two things arrive here: a SUBJECT-ROUTED ASK from another agent's run (spec
3
+ // 366 — the profile in the message's metadata, the asker's credential forwarded; the reply rides the `subject-answer`
4
+ // artifact as the `/harness/ask` envelope the asker's runtime reads), and a plain message from any caller the door
5
+ // admits (an outside agent, a stranger when the surface is public). Either way the SAME turn runs; the task's state is
6
+ // settled from the reply's kind (spec 372 S4). The card is the definition's, released by the agent's own records.
7
+ import { createStandardA2aServer, partsText, settlementForReplyKind, settleTask, withStandardCardFields, canSeeDelegatedOrOwnTask } from '@agenticprimitives/a2a/standard';
8
+ import { subjectAskOf, subjectAnswerArtifact } from '@agenticprimitives/a2a';
9
+ import { traceContextOf } from '@agenticprimitives/orchestration';
10
+ import { runTurn } from './run.js';
11
+ /** The standard server over the turn. */
12
+ export function standardSurface(deps) {
13
+ const card = withStandardCardFields(deps.card, { messageUrl: `${deps.origin.replace(/\/$/, '')}/api/a2a`, extensions: [] });
14
+ return createStandardA2aServer({
15
+ card,
16
+ ...(deps.tasks ? { tasks: deps.tasks } : {}),
17
+ ...(deps.principal ? { principal: deps.principal } : {}),
18
+ // A non-party is answered TaskNotFound (a2a's rule): the asker of a task or a party to a delegated one sees it.
19
+ canSeeTask: (task, principal) => canSeeDelegatedOrOwnTask(task, principal),
20
+ executor: {
21
+ async execute(ctx) {
22
+ const routed = subjectAskOf(ctx.message);
23
+ if (routed && 'errors' in routed) {
24
+ await ctx.reject([{ text: `the routed ask is malformed: ${routed.errors.join('; ')}` }]);
25
+ return;
26
+ }
27
+ let asker;
28
+ let message;
29
+ let plan;
30
+ if (routed) {
31
+ // A ROUTED ASK: the asker is the person the sender's run acts for; their credential is verified HERE as the
32
+ // receiver — never trusted from the message. A profile the host cannot verify is refused in its words.
33
+ const a = routed.ask.asker.agent.toLowerCase();
34
+ const cred = deps.verifyForwarded ? await deps.verifyForwarded(routed.ask.asker.credential, a).catch(() => null) : null;
35
+ if (!cred) {
36
+ if (!deps.public) {
37
+ await ctx.reject([{ text: 'a routed ask carries the asker’s credential; this one could not be verified here' }]);
38
+ return;
39
+ }
40
+ asker = { agent: deps.agent, credential: { kind: 'public' } };
41
+ }
42
+ else
43
+ asker = { agent: a, credential: cred };
44
+ message = routed.ask.request.goal;
45
+ const wholeAsk = routed.ask.request.capability === 'harness.ask';
46
+ plan = wholeAsk ? undefined : { steps: [{ toolId: routed.ask.request.capability, args: routed.ask.request.args }] };
47
+ }
48
+ else {
49
+ const p = ctx.principal;
50
+ if (p?.agent)
51
+ asker = { agent: p.agent.toLowerCase(), credential: { kind: 'agent', agent: p.agent.toLowerCase() } };
52
+ else if (deps.public)
53
+ asker = { agent: deps.agent, credential: { kind: 'public' } };
54
+ else {
55
+ await ctx.reject([{ text: 'this agent answers callers it can name; present a session wire or a Home session' }]);
56
+ return;
57
+ }
58
+ message = partsText(ctx.message.parts);
59
+ }
60
+ if (!message.trim()) {
61
+ await ctx.reject([{ text: 'nothing was asked' }]);
62
+ return;
63
+ }
64
+ await ctx.working();
65
+ const turnDeps = await deps.turnDeps({ asker });
66
+ const out = await runTurn({ agent: deps.agent, asker: asker.agent, credential: asker.credential, message, ...(plan ? { plan } : {}), ...(routed ? { runRef: undefined } : {}), traceContext: traceContextOf(ctx.headers) ?? null, receivedAt: Date.now() }, { ...turnDeps, runStore: deps.runStore });
67
+ if (routed)
68
+ await ctx.artifact(subjectAnswerArtifact(out.envelope));
69
+ const reply = out.envelope.reply;
70
+ const said = reply?.text || out.envelope.error || '';
71
+ await settleTask(ctx, settlementForReplyKind(reply?.kind), [{ text: said || (out.envelope.ok ? 'Done.' : 'Refused.') }, ...(reply?.results?.length ? [{ data: { results: reply.results, runRef: out.runRef } }] : [])]);
72
+ },
73
+ },
74
+ });
75
+ }
76
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ToolSpec, ToolInvoker } from '@agenticprimitives/orchestration';
2
+ export declare const EXTERNAL_AGENT_CAPABILITY: "external.agent.ask";
3
+ export declare const EXTERNAL_AGENT_TOOL: ToolSpec;
4
+ /** A registry NAME's own records: where its card is and the digest it pins. `null` ⇒ the registry knows no such name. */
5
+ export type NameRecordsPort = (name: string) => Promise<{
6
+ a2aEndpoint?: string;
7
+ cardUri?: string;
8
+ cardDigest?: string;
9
+ mcpEndpoint?: string;
10
+ } | null>;
11
+ export interface ExternalAgentDeps {
12
+ fetch?: typeof fetch;
13
+ /** A digest the caller pinned for this card; a served card that differs is refused. */
14
+ pinnedDigest?: (cardUrl: string) => Promise<string | undefined>;
15
+ /** Discovery resolves; it never admits (338): the card is still only a card, and the tool still spends nothing. */
16
+ nameRecords?: NameRecordsPort;
17
+ timeoutMs?: number;
18
+ }
19
+ export declare const TYPED_NAME: RegExp;
20
+ /** Where a registry name's card is, and what pins it — from the name's records, or the reason there is none. */
21
+ export declare function cardOfName(name: string, records: NameRecordsPort): Promise<{
22
+ cardUrl: string;
23
+ pinnedDigest?: string;
24
+ } | {
25
+ refused: string;
26
+ }>;
27
+ export declare function externalAgentInvoker(deps?: ExternalAgentDeps): ToolInvoker;
28
+ //# sourceMappingURL=external.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../src/tools/external.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAG9E,eAAO,MAAM,yBAAyB,EAAG,oBAA6B,CAAC;AAEvE,eAAO,MAAM,mBAAmB,EAAE,QAWjC,CAAC;AAEF,yHAAyH;AACzH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC;AAEtJ,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,uFAAuF;IACvF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChE,mHAAmH;IACnH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,QAA2C,CAAC;AAEnE,gHAAgH;AAChH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAMlJ;AAED,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,iBAAsB,GAAG,WAAW,CAiC9E"}
@@ -0,0 +1,75 @@
1
+ import { resolveAgentCard, createStandardA2aClient } from '@agenticprimitives/a2a/standard';
2
+ export const EXTERNAL_AGENT_CAPABILITY = 'external.agent.ask';
3
+ export const EXTERNAL_AGENT_TOOL = {
4
+ id: EXTERNAL_AGENT_CAPABILITY,
5
+ answers: ['what an outside agent says', 'what does an outside agent say'],
6
+ verbs: ['ask', 'consult'],
7
+ description: 'ANSWERS A QUESTION BY ASKING AN OUTSIDE AGENT — any A2A 1.0 agent published at a card URL (https://…/agent-card.json) '
8
+ + 'or under a registry name (nathan.me, clock.svc), whose card the name\'s own records point at. Use it when the ask '
9
+ + 'names an outside agent, a registry name to consult, or a card URL. Its answer is an observation with its source '
10
+ + 'named; it is never a record of ours and it can perform nothing. Args: agent (the card URL or the name, exactly as '
11
+ + 'said), question (what to ask it, in plain words).',
12
+ inputSchema: { type: 'object', properties: { agent: { type: 'string', description: 'The outside agent\'s card URL (https://…) or its registry name (nathan.me)' }, question: { type: 'string', description: 'The question, in plain words' } }, required: ['agent', 'question'] },
13
+ };
14
+ export const TYPED_NAME = /^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9-]+)+$/i;
15
+ /** Where a registry name's card is, and what pins it — from the name's records, or the reason there is none. */
16
+ export async function cardOfName(name, records) {
17
+ const r = await records(name).catch(() => null);
18
+ if (!r)
19
+ return { refused: `the registry names no agent called “${name}”` };
20
+ const cardUrl = r.cardUri ?? (r.a2aEndpoint ? `${new URL(r.a2aEndpoint).origin}/.well-known/agent-card.json` : null);
21
+ if (!cardUrl)
22
+ return { refused: `“${name}” publishes no A2A endpoint or card in its records — nothing to reach` };
23
+ return { cardUrl, ...(r.cardDigest && /^0x[0-9a-f]{64}$/i.test(r.cardDigest) ? { pinnedDigest: r.cardDigest } : {}) };
24
+ }
25
+ export function externalAgentInvoker(deps = {}) {
26
+ return async (_toolId, args) => {
27
+ const said = String(args.agent ?? '').trim();
28
+ const question = String(args.question ?? '').trim();
29
+ let agent = said;
30
+ let byName = null;
31
+ let expect;
32
+ if (!/^https:\/\//.test(said) && TYPED_NAME.test(said) && deps.nameRecords) {
33
+ const found = await cardOfName(said.toLowerCase(), deps.nameRecords);
34
+ if ('refused' in found)
35
+ return { refused: found.refused, interpretation: `looked “${said}” up in the registry` };
36
+ agent = found.cardUrl;
37
+ expect = found.pinnedDigest;
38
+ byName = { name: said.toLowerCase(), pinned: !!found.pinnedDigest };
39
+ }
40
+ if (!/^https:\/\//.test(agent))
41
+ return { refused: `an outside agent is reached by its card URL (https://…) or a registry name; "${said || 'nothing'}" is neither` };
42
+ if (!question)
43
+ return { refused: 'nothing to ask — the question is empty' };
44
+ if (expect === undefined)
45
+ expect = await deps.pinnedDigest?.(agent).catch(() => undefined);
46
+ let resolved;
47
+ try {
48
+ resolved = await resolveAgentCard(agent, deps.fetch ?? fetch, expect);
49
+ }
50
+ catch (e) {
51
+ return { refused: e instanceof Error ? e.message : String(e), interpretation: byName ? `resolved “${byName.name}” through the registry to ${agent}` : `read the card at ${agent}` };
52
+ }
53
+ const client = createStandardA2aClient({ endpoint: resolved.endpoint, fetch: deps.fetch ?? fetch });
54
+ let answer;
55
+ try {
56
+ answer = await client.ask(question, { timeoutMs: deps.timeoutMs ?? 20_000 });
57
+ }
58
+ catch (e) {
59
+ return { refused: `${resolved.card.name} did not answer: ${e instanceof Error ? e.message : String(e)}`, interpretation: `asked ${resolved.card.name} (an outside agent at ${resolved.endpoint})` };
60
+ }
61
+ const state = answer.task?.status.state ?? 'message';
62
+ const ok = state === 'TASK_STATE_COMPLETED' || state === 'message';
63
+ return {
64
+ observation: answer.text || '(no words)',
65
+ outcome: ok ? 'answered' : state.replace('TASK_STATE_', '').toLowerCase(),
66
+ agent: { name: resolved.card.name, description: resolved.card.description, cardUrl: agent, endpoint: resolved.endpoint, cardDigest: resolved.cardDigest, ...(resolved.card.provider ? { provider: resolved.card.provider } : {}) },
67
+ ...(byName ? { resolvedBy: { registry: byName.name, pinned: byName.pinned } } : {}),
68
+ attributedTo: resolved.card.provider?.url ?? resolved.card.name,
69
+ interpretation: `asked ${resolved.card.name} (${byName ? `“${byName.name}” resolved through the registry to its card${byName.pinned ? ', pinned by its records' : ''}` : 'reached by its card URL'})`,
70
+ note: `Said by ${resolved.card.name}, an outside agent — evidence with its source named, never a record of this agent's and never authority. Say who said it.`,
71
+ untrusted: true,
72
+ };
73
+ };
74
+ }
75
+ //# sourceMappingURL=external.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.js","sourceRoot":"","sources":["../../src/tools/external.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { ToolSpec, ToolInvoker } from '@agenticprimitives/orchestration';
2
+ export declare const DISCOVERY_FIND_CAPABILITY: "discovery.agents.find";
3
+ export declare const DISCOVERY_FIND_TOOL: ToolSpec;
4
+ export interface ArdSearchBody {
5
+ query: {
6
+ text: string;
7
+ filter?: Record<string, string[]>;
8
+ };
9
+ pageSize: number;
10
+ federation: 'none';
11
+ }
12
+ /** DETERMINISTIC: the person's words become ONE registry query, reproducible by a reviewer. No model plans it. */
13
+ export declare function planFind(args: Record<string, unknown>): {
14
+ body: ArdSearchBody;
15
+ refused?: string;
16
+ };
17
+ export interface FoundAgent {
18
+ agent: string | null;
19
+ name: string | null;
20
+ displayName: string;
21
+ description?: string;
22
+ capabilities: string[];
23
+ card: string | null;
24
+ website: string | null;
25
+ agentType?: string;
26
+ registryStatus?: string;
27
+ relevance: number | null;
28
+ evidence?: unknown;
29
+ }
30
+ export interface FindDeps {
31
+ /** The registry's origin; absent ⇒ the find tool is not offered at all. */
32
+ registryOrigin?: string;
33
+ fetch?: typeof fetch;
34
+ /** The registry name of an address, when the host can resolve one. */
35
+ nameOf?: (address: string) => Promise<string | null>;
36
+ }
37
+ /** The ONE mechanism (ADR-0013): the registry's ARD `POST /search`. A registry error is the tool's refusal, in its words. */
38
+ export declare function discoveryFindInvoker(deps: FindDeps): ToolInvoker;
39
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE9E,eAAO,MAAM,yBAAyB,EAAG,uBAAgC,CAAC;AAE1E,eAAO,MAAM,mBAAmB,EAAE,QAuBjC,CAAC;AAEF,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAEnI,kHAAkH;AAClH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAYjG;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAC7G,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACnH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtD;AAED,6HAA6H;AAC7H,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,CA2ChE"}