@agenticprimitives/runtime-member 0.0.0-alpha.10
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/LICENSE +21 -0
- package/README.md +40 -0
- package/bin/ap-runtime.mjs +4 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +201 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +48 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +75 -0
- package/dist/client.js.map +1 -0
- package/dist/equip-entry.d.ts +8 -0
- package/dist/equip-entry.d.ts.map +1 -0
- package/dist/equip-entry.js +7 -0
- package/dist/equip-entry.js.map +1 -0
- package/dist/equip.d.ts +124 -0
- package/dist/equip.d.ts.map +1 -0
- package/dist/equip.js +173 -0
- package/dist/equip.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/join.d.ts +9 -0
- package/dist/join.d.ts.map +1 -0
- package/dist/join.js +32 -0
- package/dist/join.js.map +1 -0
- package/dist/keystore.d.ts +13 -0
- package/dist/keystore.d.ts.map +1 -0
- package/dist/keystore.js +60 -0
- package/dist/keystore.js.map +1 -0
- package/dist/loop.d.ts +78 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +151 -0
- package/dist/loop.js.map +1 -0
- package/dist/messaging.d.ts +19 -0
- package/dist/messaging.d.ts.map +1 -0
- package/dist/messaging.js +51 -0
- package/dist/messaging.js.map +1 -0
- package/dist/pair.d.ts +19 -0
- package/dist/pair.d.ts.map +1 -0
- package/dist/pair.js +51 -0
- package/dist/pair.js.map +1 -0
- package/dist/pairing.d.ts +61 -0
- package/dist/pairing.d.ts.map +1 -0
- package/dist/pairing.js +4 -0
- package/dist/pairing.js.map +1 -0
- package/dist/record.d.ts +33 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +2 -0
- package/dist/record.js.map +1 -0
- package/dist/run.d.ts +8 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +24 -0
- package/dist/run.js.map +1 -0
- package/dist/serve.d.ts +26 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +51 -0
- package/dist/serve.js.map +1 -0
- package/dist/standing.d.ts +58 -0
- package/dist/standing.d.ts.map +1 -0
- package/dist/standing.js +65 -0
- package/dist/standing.js.map +1 -0
- package/dist/workspace-mcp.d.ts +88 -0
- package/dist/workspace-mcp.d.ts.map +1 -0
- package/dist/workspace-mcp.js +129 -0
- package/dist/workspace-mcp.js.map +1 -0
- package/package.json +79 -0
- package/spec.md +10 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Agentic Trust Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# @agenticprimitives/runtime-member
|
|
2
|
+
|
|
3
|
+
> Part of **[Agentic Primitives](https://agenticprimitives.dev)** — the open-source trust substrate for agentic applications: identity that can sign, authority checked at act time, evidence the owner carries. [Developer kit](https://github.com/agentictrustlabs/agentic-primitives) · [All packages](https://agenticprimitives.dev/developers)
|
|
4
|
+
|
|
5
|
+
Admit an existing runtime — Claude Code, goose, Codex, anything that speaks the Agent Client Protocol — as a **member
|
|
6
|
+
of a workspace**, without a rewrite, with the workspace deciding what it may do at every act. Admission, not "add
|
|
7
|
+
coding": what the runtime is for is its own business; what it may do here is the member's grant.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 1. the steward charters goose-1.svc through the Home and invites it to the organization (a member like any other)
|
|
11
|
+
# 2. on the machine that runs goose:
|
|
12
|
+
ap runtime join --member goose-1.svc --workspace missio-nexus.org \
|
|
13
|
+
--home <home> --edge <edge> --a2a <runtime> --chain faithchain --handle alice --registry <skills registry>
|
|
14
|
+
ap runtime run --member goose-1.svc --agent "goose acp"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`join` generates the runtime's own key here, has the member's custodian sign a **session wire** (member → key, pinned to
|
|
18
|
+
`harness.ask`, time-bounded, revocable on chain), records the steward link and assigns the `runtime-member` playbook.
|
|
19
|
+
`run` polls the member's own inbox, hands each new message to the agent as an ACP prompt with the workspace context, and
|
|
20
|
+
sends the answer back as the runtime — an act that **parks for the steward's signature**, which the loop reports. The
|
|
21
|
+
agent reaches the workspace through the `workspace` MCP server (`ap runtime mcp`): `workspace_ask`, `workspace_reply`,
|
|
22
|
+
`workspace_inbox`, `workspace_status` — each a wire-signed A2A request as the runtime itself.
|
|
23
|
+
|
|
24
|
+
**Hosted next to the Worker (W1c).** The same loop, woken instead of clocked: `ap runtime serve` listens for
|
|
25
|
+
`POST /wake` from the workspace's queue consumer and runs one pass per wake. Declare where the runtime lives at join
|
|
26
|
+
(`--wake container`, or `--wake https://…` for a host of your own; `ap runtime host … none` to go back to polling),
|
|
27
|
+
then hand the Container the record without its key (`ap runtime export` → `AP_RUNTIME_RECORD`) and the wire's key
|
|
28
|
+
(`AP_RUNTIME_KEY`) as secrets. A wake carries the member, the thread and a message id — no content, no authority; the
|
|
29
|
+
runtime reads under its own wire. Compromise the Container and you hold a revocable wire, not the agent.
|
|
30
|
+
|
|
31
|
+
**The open mandate (W2a).** Every write parks — the reply included — unless the steward decides once:
|
|
32
|
+
`ap runtime grant --member goose-2.svc --handle alice --to alice.me messaging.direct.send` signs a **standing grant**
|
|
33
|
+
(member → the runtime's key, one capability, named recipients, 30 days, no intent binding). When a reply then parks,
|
|
34
|
+
the loop derives the child for that very intent, signs it with its own key, and continues the run presenting
|
|
35
|
+
`[child, standing]`; the harness verifies the chain and the message leaves on the member's own rail
|
|
36
|
+
(`ap runtime messaging --to …` enables it). A commit, an allocation, a payment still park; revoke the grant on chain
|
|
37
|
+
and the next derivation is refused. Nothing of anyone else's is ever held.
|
|
38
|
+
|
|
39
|
+
What never happens here: the runtime holds a person's session; a parked act is retried; a permission prompt about the
|
|
40
|
+
agent's own shell authorizes anything in the workspace.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ap-runtime — an outside runtime as a workspace member (spec 400 W1): join · run · mcp · status.
|
|
3
|
+
import { runtimeCli } from '../dist/index.js';
|
|
4
|
+
process.exitCode = await runtimeCli(process.argv.slice(2)).catch((e) => { process.stderr.write(`✗ ${e instanceof Error ? e.message : String(e)}\n`); return 1; });
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const RUNTIME_USAGE = "ap runtime pair <code> --home <url> [--wake container|<url>|none] [--agent <acp agent>] (the code the custodian minted at the Home \u2014 no session, no keys)\nap runtime join --member <label>.svc --workspace <label>.org --home <url> --edge <url> --a2a <url> --chain faithchain --handle <demo persona> --registry <skills registry url> [--days 30] [--wake container|<url>] [--messaging-to alice.me,bob.me] [--open-mandate messaging.direct.send]\nap runtime messaging --member <label>.svc --handle <demo persona> [--home <url>] --to alice.me,bob.me (the member's messaging RAIL: whom it may deliver to; widens, never narrows)\nap runtime grant --member <label>.svc --handle <demo persona> [--home <url>] [--days 30] [--to alice.me,bob.me] <capability\u2026> (the OPEN MANDATE: a standing grant the custodian signs once; replies stop parking; --to bounds the recipients, default anyone)\nap runtime run --member <label>.svc --agent \"<command \u2026>\" [--poll 15] [--turns N] [--since <cursor>] [--allow-local]\nap runtime serve --member <label>.svc --agent \"<command \u2026>\" [--port 8080] [--fallback-poll <seconds>] [--allow-local] (W1c: woken by the Worker; a Container's entrypoint)\nap runtime host --member <label>.svc --home <url> --handle <demo persona> (container|<url>|none) (declare where the Worker wakes this member)\nap runtime playbook --member <label>.svc --handle <demo persona> [--registry <url>] [--archetype runtime-member] (re-pin the playbook to the registry's current definition)\nap runtime mcp --member <label>.svc (the workspace MCP server the ACP agent spawns; stdio)\nap runtime status --member <label>.svc\nap runtime export --member <label>.svc (the record WITHOUT its key, for a Container's AP_RUNTIME_RECORD; the key goes to AP_RUNTIME_KEY)";
|
|
2
|
+
export declare function personaCustodian(home: string, handle: string): Promise<{
|
|
3
|
+
bearer: string;
|
|
4
|
+
agent: `0x${string}`;
|
|
5
|
+
signDigest: (d: `0x${string}`) => Promise<`0x${string}`>;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function runtimeCli(argv: string[]): Promise<number>;
|
|
8
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,aAAa,gxDAUsH,CAAC;AAsBjJ,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,CAahL;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqHhE"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// `ap runtime <join|run|mcp|status>` — the commands the devkit dispatches here (spec 400 §5.2). W1a signs the wire with
|
|
2
|
+
// a demo persona's custody signer at the Home (`--handle`); the pairing-code path (W1b) replaces that one function.
|
|
3
|
+
import { runtimeJoin, declareRuntimeHost, assignPlaybook, recordStandingGrant } from './join.js';
|
|
4
|
+
import { runtimePair } from './pair.js';
|
|
5
|
+
import { runRuntimeMember } from './run.js';
|
|
6
|
+
import { serveRuntimeMember } from './serve.js';
|
|
7
|
+
import { runWorkspaceMcpStdio } from './workspace-mcp.js';
|
|
8
|
+
import { loadRuntimeMember, portableRecord, runtimePath, saveRuntimeMember } from './keystore.js';
|
|
9
|
+
import { buildStandingGrant } from './standing.js';
|
|
10
|
+
import { standingEnforcers } from './join.js';
|
|
11
|
+
import { enableMessaging } from './messaging.js';
|
|
12
|
+
const flag = (argv, name) => { const i = argv.indexOf(`--${name}`); return i >= 0 ? argv[i + 1] : undefined; };
|
|
13
|
+
const need = (argv, name) => { const v = flag(argv, name); if (!v)
|
|
14
|
+
throw new Error(`--${name} is required`); return v; };
|
|
15
|
+
export const RUNTIME_USAGE = `ap runtime pair <code> --home <url> [--wake container|<url>|none] [--agent <acp agent>] (the code the custodian minted at the Home — no session, no keys)
|
|
16
|
+
ap runtime join --member <label>.svc --workspace <label>.org --home <url> --edge <url> --a2a <url> --chain faithchain --handle <demo persona> --registry <skills registry url> [--days 30] [--wake container|<url>] [--messaging-to alice.me,bob.me] [--open-mandate messaging.direct.send]
|
|
17
|
+
ap runtime messaging --member <label>.svc --handle <demo persona> [--home <url>] --to alice.me,bob.me (the member's messaging RAIL: whom it may deliver to; widens, never narrows)
|
|
18
|
+
ap runtime grant --member <label>.svc --handle <demo persona> [--home <url>] [--days 30] [--to alice.me,bob.me] <capability…> (the OPEN MANDATE: a standing grant the custodian signs once; replies stop parking; --to bounds the recipients, default anyone)
|
|
19
|
+
ap runtime run --member <label>.svc --agent "<command …>" [--poll 15] [--turns N] [--since <cursor>] [--allow-local]
|
|
20
|
+
ap runtime serve --member <label>.svc --agent "<command …>" [--port 8080] [--fallback-poll <seconds>] [--allow-local] (W1c: woken by the Worker; a Container's entrypoint)
|
|
21
|
+
ap runtime host --member <label>.svc --home <url> --handle <demo persona> (container|<url>|none) (declare where the Worker wakes this member)
|
|
22
|
+
ap runtime playbook --member <label>.svc --handle <demo persona> [--registry <url>] [--archetype runtime-member] (re-pin the playbook to the registry's current definition)
|
|
23
|
+
ap runtime mcp --member <label>.svc (the workspace MCP server the ACP agent spawns; stdio)
|
|
24
|
+
ap runtime status --member <label>.svc
|
|
25
|
+
ap runtime export --member <label>.svc (the record WITHOUT its key, for a Container's AP_RUNTIME_RECORD; the key goes to AP_RUNTIME_KEY)`;
|
|
26
|
+
/** Names or addresses, comma-separated → addresses, each resolved at the Home (a name that does not resolve is an error, never skipped). */
|
|
27
|
+
async function resolveNames(home, list) {
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const n of list.split(',').map((x) => x.trim()).filter(Boolean)) {
|
|
30
|
+
if (/^0x[0-9a-fA-F]{40}$/.test(n)) {
|
|
31
|
+
out.push(n.toLowerCase());
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const r = await (await fetch(`${home}/connect/name-info?name=${encodeURIComponent(n)}`)).json().catch(() => ({}));
|
|
35
|
+
if (!r.exists || !r.agent)
|
|
36
|
+
throw new Error(`${n} does not resolve at ${home}`);
|
|
37
|
+
out.push(String(r.agent).toLowerCase());
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
const wakeOf = (v) => {
|
|
42
|
+
if (v === undefined)
|
|
43
|
+
return undefined;
|
|
44
|
+
if (v === 'none')
|
|
45
|
+
return null;
|
|
46
|
+
if (v === 'container')
|
|
47
|
+
return { v: 1, kind: 'container' };
|
|
48
|
+
if (/^https?:\/\//.test(v))
|
|
49
|
+
return { v: 1, kind: 'url', url: v.replace(/\/$/, '') };
|
|
50
|
+
throw new Error(`--wake must be "container", a URL, or "none" (got ${v})`);
|
|
51
|
+
};
|
|
52
|
+
const allowLocalPolicy = (rest) => rest.includes('--allow-local') ? { permission: (req) => ({ outcome: { outcome: 'selected', optionId: (req.options.find((x) => x.kind === 'allow_once') ?? req.options[0]).optionId } }) } : {};
|
|
53
|
+
export async function personaCustodian(home, handle) {
|
|
54
|
+
const j = async (r) => { const t = await r.text(); try {
|
|
55
|
+
return JSON.parse(t);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { _raw: t.slice(0, 200) };
|
|
59
|
+
} };
|
|
60
|
+
const si = await j(await fetch(`${home}/connect/demo-signin`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ handle, client_id: 'demo-web' }) }));
|
|
61
|
+
if (!si.homeSession)
|
|
62
|
+
throw new Error(`${handle} could not sign in at ${home}: ${JSON.stringify(si).slice(0, 160)}`);
|
|
63
|
+
const bearer = String(si.homeSession);
|
|
64
|
+
return {
|
|
65
|
+
bearer, agent: String(si.agent).toLowerCase(),
|
|
66
|
+
signDigest: async (digest) => {
|
|
67
|
+
const b = await j(await fetch(`${home}/connect/persona-sign`, { method: 'POST', headers: { 'content-type': 'application/json', authorization: `Bearer ${bearer}` }, body: JSON.stringify({ digest }) }));
|
|
68
|
+
if (!b.signature)
|
|
69
|
+
throw new Error(`persona-sign refused: ${JSON.stringify(b).slice(0, 160)}`);
|
|
70
|
+
return b.signature;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export async function runtimeCli(argv) {
|
|
75
|
+
const [cmd, ...rest] = argv;
|
|
76
|
+
const out = (l) => process.stderr.write(`${l}\n`);
|
|
77
|
+
if (cmd === 'pair') {
|
|
78
|
+
const code = rest.find((a) => !a.startsWith('--')) ?? '';
|
|
79
|
+
const wake = flag(rest, 'wake');
|
|
80
|
+
const { path } = await runtimePair({ home: need(rest, 'home'), code, ...(wake !== undefined ? { wake: wakeOf(wake) ?? null } : {}), ...(flag(rest, 'agent') ? { agent: flag(rest, 'agent') } : {}), log: out });
|
|
81
|
+
out(`✓ paired — ${path}`);
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
if (cmd === 'join') {
|
|
85
|
+
const chain = flag(rest, 'chain') ?? 'faithchain';
|
|
86
|
+
const { getDeployments } = await import('@agenticprimitives/contracts/deployments');
|
|
87
|
+
const C = getDeployments(chain);
|
|
88
|
+
const contracts = { chainId: C.chainId, delegationManager: C.delegationManager, timestampEnforcer: C.timestampEnforcer, allowedMethodsEnforcer: C.allowedMethodsEnforcer, valueEnforcer: C.valueEnforcer, allowedTargetsEnforcer: C.allowedTargetsEnforcer, agentRelationship: C.agentRelationship, agentNameRegistry: C.agentNameRegistry, permissionlessSubregistry: C.permissionlessSubregistry, digestBindingEnforcer: C.digestBindingEnforcer };
|
|
89
|
+
const home = need(rest, 'home');
|
|
90
|
+
const custodian = await personaCustodian(home, need(rest, 'handle'));
|
|
91
|
+
const { path } = await runtimeJoin({
|
|
92
|
+
home, edge: need(rest, 'edge'), a2a: need(rest, 'a2a'), member: need(rest, 'member'), workspace: need(rest, 'workspace'), contracts, custodian,
|
|
93
|
+
// The registry the playbook is pinned from is the product's to name (agentic.lock.json#definitions, `ap upgrade --pin-definitions`); no default here.
|
|
94
|
+
registry: { origin: need(rest, 'registry'), context: flag(rest, 'context') ?? 'agentic-trust', archetype: flag(rest, 'archetype') ?? 'runtime-member' },
|
|
95
|
+
validForSeconds: Number(flag(rest, 'days') ?? 30) * 86_400, log: out,
|
|
96
|
+
...((w) => (w ? { wake: w } : {}))(wakeOf(flag(rest, 'wake'))),
|
|
97
|
+
...(flag(rest, 'messaging-to') ? { messagingTo: await resolveNames(home, flag(rest, 'messaging-to')) } : {}),
|
|
98
|
+
...(flag(rest, 'open-mandate') ? { openMandate: flag(rest, 'open-mandate').split(',').map((x) => x.trim()).filter(Boolean) } : {}),
|
|
99
|
+
});
|
|
100
|
+
out(`✓ joined — ${path}`);
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
if (cmd === 'playbook') {
|
|
104
|
+
const rec = loadRuntimeMember(need(rest, 'member'));
|
|
105
|
+
const custodian = await personaCustodian(flag(rest, 'home') ?? rec.home, need(rest, 'handle'));
|
|
106
|
+
const rel = await (await fetch(`${rec.home}/connect/related-orgs?surface=any`, { headers: { authorization: `Bearer ${custodian.bearer}` } })).json().catch(() => ({}));
|
|
107
|
+
const link = (rel.orgs ?? []).find((l) => l.orgAgent.toLowerCase() === rec.agent.toLowerCase() && l.relationship === 'steward');
|
|
108
|
+
if (!link?.stewardshipDelegation)
|
|
109
|
+
throw new Error(`${flag(rest, 'handle')} holds no steward link for ${rec.name}`);
|
|
110
|
+
const digest = await assignPlaybook({ a2a: rec.a2a, member: rec.agent, custodian, stewardship: link.stewardshipDelegation, registry: { origin: need(rest, 'registry'), context: flag(rest, 'context') ?? 'agentic-trust', archetype: flag(rest, 'archetype') ?? 'runtime-member' }, force: true, log: out });
|
|
111
|
+
out(`✓ ${rec.name} runs the ${flag(rest, 'archetype') ?? 'runtime-member'} playbook at ${digest.slice(0, 14)}…`);
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
if (cmd === 'messaging') {
|
|
115
|
+
const rec = loadRuntimeMember(need(rest, 'member'));
|
|
116
|
+
const home = (flag(rest, 'home') ?? rec.home).replace(/\/$/, '');
|
|
117
|
+
const custodian = await personaCustodian(home, need(rest, 'handle'));
|
|
118
|
+
const rel = await (await fetch(`${home}/connect/related-orgs?surface=any`, { headers: { authorization: `Bearer ${custodian.bearer}` } })).json().catch(() => ({}));
|
|
119
|
+
const link = (rel.orgs ?? []).find((l) => l.orgAgent.toLowerCase() === rec.agent.toLowerCase() && l.relationship === 'steward');
|
|
120
|
+
if (!link?.stewardshipDelegation)
|
|
121
|
+
throw new Error(`${flag(rest, 'handle')} holds no steward link for ${rec.name} — run \`ap runtime join\` first`);
|
|
122
|
+
const recipients = await resolveNames(home, need(rest, 'to'));
|
|
123
|
+
const { getDeployments } = await import('@agenticprimitives/contracts/deployments');
|
|
124
|
+
const C = getDeployments((flag(rest, 'chain') ?? 'faithchain'));
|
|
125
|
+
const contracts = { chainId: C.chainId, delegationManager: C.delegationManager, timestampEnforcer: C.timestampEnforcer, allowedMethodsEnforcer: C.allowedMethodsEnforcer, valueEnforcer: C.valueEnforcer, allowedTargetsEnforcer: C.allowedTargetsEnforcer, agentRelationship: C.agentRelationship, agentNameRegistry: C.agentNameRegistry, permissionlessSubregistry: C.permissionlessSubregistry, digestBindingEnforcer: C.digestBindingEnforcer };
|
|
126
|
+
const rail = await enableMessaging({ a2a: rec.a2a, member: rec.agent, recipients, contracts, custodian, stewardship: link.stewardshipDelegation });
|
|
127
|
+
out(`✓ ${rec.name} may deliver to ${rail.recipients.length} recipient(s) (${rail.hash.slice(0, 12)}…)`);
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
if (cmd === 'grant') {
|
|
131
|
+
const rec = loadRuntimeMember(need(rest, 'member'));
|
|
132
|
+
const caps = rest.filter((a, i) => !a.startsWith('--') && !(i > 0 && rest[i - 1].startsWith('--')) && a !== 'grant');
|
|
133
|
+
if (!caps.length)
|
|
134
|
+
throw new Error('name the capabilities to grant, e.g. messaging.direct.send');
|
|
135
|
+
const chain = flag(rest, 'chain') ?? 'faithchain';
|
|
136
|
+
const { getDeployments } = await import('@agenticprimitives/contracts/deployments');
|
|
137
|
+
const C = getDeployments(chain);
|
|
138
|
+
const contracts = { chainId: C.chainId, delegationManager: C.delegationManager, timestampEnforcer: C.timestampEnforcer, allowedMethodsEnforcer: C.allowedMethodsEnforcer, valueEnforcer: C.valueEnforcer, allowedTargetsEnforcer: C.allowedTargetsEnforcer, agentRelationship: C.agentRelationship, agentNameRegistry: C.agentNameRegistry, permissionlessSubregistry: C.permissionlessSubregistry, digestBindingEnforcer: C.digestBindingEnforcer };
|
|
139
|
+
const custodian = await personaCustodian(flag(rest, 'home') ?? rec.home, need(rest, 'handle'));
|
|
140
|
+
const home = (flag(rest, 'home') ?? rec.home).replace(/\/$/, '');
|
|
141
|
+
const locations = await resolveNames(home, flag(rest, 'to') ?? '');
|
|
142
|
+
const standing = await buildStandingGrant({ member: rec.agent, runtimeKey: rec.address, capabilities: caps, ...(locations.length ? { locations } : {}), validForSeconds: Number(flag(rest, 'days') ?? 30) * 86_400, enforcers: standingEnforcers(contracts), chainId: contracts.chainId, delegationManager: contracts.delegationManager, signDigest: custodian.signDigest });
|
|
143
|
+
saveRuntimeMember({ ...rec, standing });
|
|
144
|
+
// Recorded on the member's object too (spec 400 B4): the Grants screen lists it; Revoke there expands it.
|
|
145
|
+
const rel2 = await (await fetch(`${home}/connect/related-orgs?surface=any`, { headers: { authorization: `Bearer ${custodian.bearer}` } })).json().catch(() => ({}));
|
|
146
|
+
const link2 = (rel2.orgs ?? []).find((l) => l.orgAgent.toLowerCase() === rec.agent.toLowerCase() && l.relationship === 'steward');
|
|
147
|
+
await recordStandingGrant({ a2a: rec.a2a, member: rec.agent, custodian, ...(link2?.stewardshipDelegation ? { stewardship: link2.stewardshipDelegation } : {}), standing, holderName: `${rec.name} runtime key` });
|
|
148
|
+
out(`✓ standing grant ${standing.ref.slice(0, 18)}… · ${rec.name} → ${rec.address} · ${caps.join(', ')}${locations.length ? ` to ${locations.length} recipient(s)` : ' to anyone'} · until ${new Date(standing.requirement.validUntil * 1000).toISOString().slice(0, 10)}\n kept in ${runtimePath(rec.name)}; a Container needs the record re-exported (ap runtime export → AP_RUNTIME_RECORD_<NAME>)`);
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
if (cmd === 'host') {
|
|
152
|
+
const rec = loadRuntimeMember(need(rest, 'member'));
|
|
153
|
+
const target = rest.filter((a) => !a.startsWith('--') && !['host', flag(rest, 'member'), flag(rest, 'home'), flag(rest, 'handle')].includes(a)).at(-1);
|
|
154
|
+
const host = wakeOf(target);
|
|
155
|
+
if (host === undefined)
|
|
156
|
+
throw new Error('say where: container | <url> | none');
|
|
157
|
+
const custodian = await personaCustodian(flag(rest, 'home') ?? rec.home, need(rest, 'handle'));
|
|
158
|
+
// The custodian's steward link for the member — the one join recorded; the Home holds it.
|
|
159
|
+
const rel = await (await fetch(`${rec.home}/connect/related-orgs?surface=any`, { headers: { authorization: `Bearer ${custodian.bearer}` } })).json().catch(() => ({}));
|
|
160
|
+
const link = (rel.orgs ?? []).find((l) => l.orgAgent.toLowerCase() === rec.agent.toLowerCase() && l.relationship === 'steward');
|
|
161
|
+
if (!link?.stewardshipDelegation)
|
|
162
|
+
throw new Error(`${flag(rest, 'handle')} holds no steward link for ${rec.name} — run \`ap runtime join\` first`);
|
|
163
|
+
await declareRuntimeHost({ a2a: rec.a2a, member: rec.agent, custodian, host, stewardship: link.stewardshipDelegation });
|
|
164
|
+
out(host ? `✓ ${rec.name} is woken at ${host.kind === 'url' ? host.url : 'its Container'}` : `✓ ${rec.name} is no longer woken — it polls`);
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
if (cmd === 'serve') {
|
|
168
|
+
const agent = need(rest, 'agent').split(/\s+/).filter(Boolean);
|
|
169
|
+
const fb = flag(rest, 'fallback-poll');
|
|
170
|
+
const { close } = await serveRuntimeMember({ member: need(rest, 'member'), agent, port: Number(flag(rest, 'port') ?? process.env.PORT ?? 8080), ...(fb ? { fallbackPollMs: Number(fb) * 1000 } : {}), ...allowLocalPolicy(rest), log: out });
|
|
171
|
+
await new Promise((resolve) => { for (const sig of ['SIGINT', 'SIGTERM'])
|
|
172
|
+
process.once(sig, () => { void close().finally(resolve); }); });
|
|
173
|
+
return 0;
|
|
174
|
+
}
|
|
175
|
+
if (cmd === 'export') {
|
|
176
|
+
process.stdout.write(`${JSON.stringify(portableRecord(loadRuntimeMember(need(rest, 'member'))))}\n`);
|
|
177
|
+
return 0;
|
|
178
|
+
}
|
|
179
|
+
if (cmd === 'run') {
|
|
180
|
+
const agent = need(rest, 'agent').split(/\s+/).filter(Boolean);
|
|
181
|
+
await runRuntimeMember({
|
|
182
|
+
member: need(rest, 'member'), agent, pollMs: Number(flag(rest, 'poll') ?? 15) * 1000,
|
|
183
|
+
...(flag(rest, 'turns') ? { maxTurns: Number(flag(rest, 'turns')) } : {}), ...(flag(rest, 'since') ? { since: flag(rest, 'since') } : {}),
|
|
184
|
+
...allowLocalPolicy(rest),
|
|
185
|
+
log: out,
|
|
186
|
+
});
|
|
187
|
+
return 0;
|
|
188
|
+
}
|
|
189
|
+
if (cmd === 'mcp') {
|
|
190
|
+
await runWorkspaceMcpStdio(need(rest, 'member'));
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
if (cmd === 'status') {
|
|
194
|
+
const rec = loadRuntimeMember(need(rest, 'member'));
|
|
195
|
+
out(`${rec.name} ${rec.agent}\n ${rec.standing ? `standing grant ${rec.standing.ref.slice(0, 18)}… for ${rec.standing.requirement.actions.join(', ')} until ${new Date(rec.standing.requirement.validUntil * 1000).toISOString().slice(0, 10)}` : 'no standing grant — every write parks'}\n workspace ${rec.workspace.name} ${rec.workspace.agent}\n key ${rec.address}${rec.key ? '' : ' (not in the record — AP_RUNTIME_KEY or a signer)'} · wire ${rec.wireRef.slice(0, 18)}… valid until ${new Date(rec.validUntil * 1000).toISOString()}\n edge ${rec.edge} · runtime ${rec.a2a} · home ${rec.home}\n ${runtimePath(rec.name)}`);
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
out(RUNTIME_USAGE);
|
|
199
|
+
return cmd ? 2 : 0;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Hex } from 'viem';
|
|
2
|
+
import { type StandardA2aClient } from '@agenticprimitives/a2a/standard';
|
|
3
|
+
import type { RuntimeMemberRecordV1 } from './keystore.js';
|
|
4
|
+
export declare const endpointFor: (rec: Pick<RuntimeMemberRecordV1, "edge">, target: string) => string;
|
|
5
|
+
/** THE WIRE'S SIGNER — a port. The delegate key signs the request digest; where that key lives is the host's
|
|
6
|
+
* business: in the record on a laptop (`~/.ap/runtime/<name>.json`), in a Container's secret (`AP_RUNTIME_KEY`), or
|
|
7
|
+
* behind a KMS that never yields it (W1c). Whatever signs, the workspace sees one thing: the wire's delegate. */
|
|
8
|
+
export type Signer = (digest: Hex) => Promise<Hex>;
|
|
9
|
+
/** The record's own key as a signer — the laptop and the env-secret shapes. */
|
|
10
|
+
export declare function recordSigner(rec: Pick<RuntimeMemberRecordV1, 'key' | 'name'>): Signer;
|
|
11
|
+
export interface ClientOptions {
|
|
12
|
+
fetch?: typeof fetch;
|
|
13
|
+
signer?: Signer;
|
|
14
|
+
}
|
|
15
|
+
/** A client addressed at ONE agent by name, signing as the runtime. */
|
|
16
|
+
export declare function clientFor(rec: RuntimeMemberRecordV1, target: string, opts?: ClientOptions): StandardA2aClient;
|
|
17
|
+
export interface Plan {
|
|
18
|
+
steps: Array<{
|
|
19
|
+
toolId: string;
|
|
20
|
+
args: Record<string, unknown>;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
/** What one ask came to: the words, the task's state, and the run it opened (for the steward's approval page). */
|
|
24
|
+
export interface AskOutcome {
|
|
25
|
+
text: string;
|
|
26
|
+
state: string;
|
|
27
|
+
taskId?: string;
|
|
28
|
+
runRef?: string;
|
|
29
|
+
/** The task parked for a mandate the runtime does not hold — the steward signs at the Home. */
|
|
30
|
+
parked: boolean;
|
|
31
|
+
data?: unknown;
|
|
32
|
+
}
|
|
33
|
+
/** Ask an agent, as the runtime. A `plan` rides in the message's metadata (spec 400 W1) — a deterministic read that
|
|
34
|
+
* costs no planner turn; the harness admits it like the Home's. */
|
|
35
|
+
export declare function askAs(rec: RuntimeMemberRecordV1, target: string, text: string, opts?: {
|
|
36
|
+
plan?: Plan;
|
|
37
|
+
timeoutMs?: number;
|
|
38
|
+
fetch?: typeof fetch;
|
|
39
|
+
signer?: Signer;
|
|
40
|
+
}): Promise<AskOutcome>;
|
|
41
|
+
/** Spec 400 W2a — CONTINUE a run of the runtime's own that parked for authority, presenting the chain it derived
|
|
42
|
+
* (`[child, standing]`) on the same task. The harness verifies the chain where it is used; the reply is the run's. */
|
|
43
|
+
export declare function continueAs(rec: RuntimeMemberRecordV1, target: string, taskId: string, presented: Array<Record<string, unknown>>, opts?: {
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
fetch?: typeof fetch;
|
|
46
|
+
signer?: Signer;
|
|
47
|
+
}): Promise<AskOutcome>;
|
|
48
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAA8C,KAAK,iBAAiB,EAAe,MAAM,iCAAiC,CAAC;AAClI,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3D,eAAO,MAAM,WAAW,QAAS,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,UAAU,MAAM,KAAG,MAA4D,CAAC;AAEpJ;;kHAEkH;AAClH,MAAM,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEnD,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,qBAAqB,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAIrF;AAED,MAAM,WAAW,aAAa;IAAG,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAExE,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,iBAAiB,CAWjH;AAED,MAAM,WAAW,IAAI;IAAG,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE;AAEzF,kHAAkH;AAClH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;oEACoE;AACpE,wBAAsB,KAAK,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAchM;AAED;uHACuH;AACvH,wBAAsB,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAWrO"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// THE RUNTIME SPEAKING AS ITSELF — one wire-signed A2A request per act, on the standard surface (spec 372 S3c), to any
|
|
2
|
+
// agent by name: its own (`<name>.svc` — its inbox, its records), the workspace (a read under its member standing, an
|
|
3
|
+
// act that parks), a person (a message). The signer holds the runtime's key on this machine; the assertion binds the
|
|
4
|
+
// method, the body, the audience and the moment, and is spent once where it lands.
|
|
5
|
+
import { sign } from 'viem/accounts';
|
|
6
|
+
import { createStandardA2aClient, sessionWireSigner } from '@agenticprimitives/a2a/standard';
|
|
7
|
+
export const endpointFor = (rec, target) => `${rec.edge.replace(/\/$/, '')}/api/a2a/${target}`;
|
|
8
|
+
/** The record's own key as a signer — the laptop and the env-secret shapes. */
|
|
9
|
+
export function recordSigner(rec) {
|
|
10
|
+
if (!rec.key)
|
|
11
|
+
throw new Error(`runtime member ${rec.name} has no key in its record and no signer was supplied (set AP_RUNTIME_KEY, or pass a signer)`);
|
|
12
|
+
const key = rec.key;
|
|
13
|
+
return (digest) => sign({ hash: digest, privateKey: key, to: 'hex' });
|
|
14
|
+
}
|
|
15
|
+
/** A client addressed at ONE agent by name, signing as the runtime. */
|
|
16
|
+
export function clientFor(rec, target, opts = {}) {
|
|
17
|
+
return createStandardA2aClient({
|
|
18
|
+
endpoint: endpointFor(rec, target),
|
|
19
|
+
fetch: opts.fetch ?? fetch,
|
|
20
|
+
signRequest: sessionWireSigner({
|
|
21
|
+
agent: rec.agent,
|
|
22
|
+
wire: rec.wire,
|
|
23
|
+
audience: rec.audience,
|
|
24
|
+
signDigest: opts.signer ?? recordSigner(rec),
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** Ask an agent, as the runtime. A `plan` rides in the message's metadata (spec 400 W1) — a deterministic read that
|
|
29
|
+
* costs no planner turn; the harness admits it like the Home's. */
|
|
30
|
+
export async function askAs(rec, target, text, opts = {}) {
|
|
31
|
+
const client = clientFor(rec, target, { fetch: opts.fetch, signer: opts.signer });
|
|
32
|
+
const out = await client.ask(text, { ...(opts.plan ? { metadata: { plan: opts.plan } } : {}), timeoutMs: opts.timeoutMs ?? 60_000 });
|
|
33
|
+
const task = out.task;
|
|
34
|
+
const state = task?.status?.state ?? (out.message ? 'MESSAGE' : 'UNKNOWN');
|
|
35
|
+
const data = dataOf(task);
|
|
36
|
+
return {
|
|
37
|
+
text: out.text,
|
|
38
|
+
state,
|
|
39
|
+
...(task?.id ? { taskId: task.id } : {}),
|
|
40
|
+
...(typeof task?.metadata?.runRef === 'string' ? { runRef: task.metadata.runRef } : {}),
|
|
41
|
+
parked: state === 'TASK_STATE_AUTH_REQUIRED' || state === 'TASK_STATE_INPUT_REQUIRED',
|
|
42
|
+
...(data !== undefined ? { data } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Spec 400 W2a — CONTINUE a run of the runtime's own that parked for authority, presenting the chain it derived
|
|
46
|
+
* (`[child, standing]`) on the same task. The harness verifies the chain where it is used; the reply is the run's. */
|
|
47
|
+
export async function continueAs(rec, target, taskId, presented, opts = {}) {
|
|
48
|
+
const client = clientFor(rec, target, { fetch: opts.fetch, signer: opts.signer });
|
|
49
|
+
const sent = await client.sendMessage([{ text: 'continuing under the standing grant' }], { taskId, metadata: { presented } });
|
|
50
|
+
const task = sent.task && !['TASK_STATE_COMPLETED', 'TASK_STATE_FAILED', 'TASK_STATE_REJECTED', 'TASK_STATE_CANCELED'].includes(sent.task.status.state) ? await client.awaitTask(sent.task.id, { timeoutMs: opts.timeoutMs ?? 60_000 }) : sent.task;
|
|
51
|
+
const state = task?.status?.state ?? 'UNKNOWN';
|
|
52
|
+
const data = dataOf(task);
|
|
53
|
+
return {
|
|
54
|
+
text: (task?.status?.message?.parts ?? []).map((p) => p.text ?? '').join('').trim(),
|
|
55
|
+
state, ...(task?.id ? { taskId: task.id } : {}), ...(typeof task?.metadata?.runRef === 'string' ? { runRef: task.metadata.runRef } : {}),
|
|
56
|
+
parked: state === 'TASK_STATE_AUTH_REQUIRED' || state === 'TASK_STATE_INPUT_REQUIRED', ...(data !== undefined ? { data } : {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** The structured answer a read returns: the `results` artifact's first step result (what the tool said), else a data
|
|
60
|
+
* part on the status message. The `trace` artifact (a flow trace, `ap.flow-trace.v1`) is evidence of what ran, never
|
|
61
|
+
* the answer — it is skipped, not mistaken for one. */
|
|
62
|
+
function dataOf(task) {
|
|
63
|
+
if (!task)
|
|
64
|
+
return undefined;
|
|
65
|
+
const results = task.artifacts?.find((a) => a.name === 'results');
|
|
66
|
+
const rows = results?.parts?.[0]?.data;
|
|
67
|
+
if (Array.isArray(rows) && rows.length)
|
|
68
|
+
return rows.length === 1 ? rows[0].result : rows.map((r) => r.result);
|
|
69
|
+
for (const p of task.status?.message?.parts ?? []) {
|
|
70
|
+
if (p.data !== undefined && !(typeof p.data === 'object' && p.data && p.data.kind === 'ap.flow-trace.v1'))
|
|
71
|
+
return p.data;
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { equipRuntimeMember, standingEnforcers, assignPlaybook, recordStandingGrant, declareRuntimeHost } from './equip.js';
|
|
2
|
+
export type { EquipOptions, JoinOptions, Contracts, CustodianSigner, RuntimeHostV1 } from './equip.js';
|
|
3
|
+
export type { RuntimeMemberRecordV1 } from './record.js';
|
|
4
|
+
export { buildStandingGrant } from './standing.js';
|
|
5
|
+
export type { StandingGrantV1, StandingEnforcers } from './standing.js';
|
|
6
|
+
export { enableMessaging, MESSAGING_WIRE_SKILLS } from './messaging.js';
|
|
7
|
+
export { PAIRING_CODE_RE, pairingHandleOf, type PairingStateV1, type PairingClaimV1, type PairingOptionsV1 } from './pairing.js';
|
|
8
|
+
//# sourceMappingURL=equip-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equip-entry.d.ts","sourceRoot":"","sources":["../src/equip-entry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5H,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvG,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// `@agenticprimitives/runtime-member/equip` — the browser-safe subset: equip a member for a runtime key, no disk,
|
|
2
|
+
// no key generation, no CLI. The Home imports THIS for the pairing ceremony (spec 400 W1b).
|
|
3
|
+
export { equipRuntimeMember, standingEnforcers, assignPlaybook, recordStandingGrant, declareRuntimeHost } from './equip.js';
|
|
4
|
+
export { buildStandingGrant } from './standing.js';
|
|
5
|
+
export { enableMessaging, MESSAGING_WIRE_SKILLS } from './messaging.js';
|
|
6
|
+
export { PAIRING_CODE_RE, pairingHandleOf } from './pairing.js';
|
|
7
|
+
//# sourceMappingURL=equip-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equip-entry.js","sourceRoot":"","sources":["../src/equip-entry.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,4FAA4F;AAC5F,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG5H,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAmE,MAAM,cAAc,CAAC"}
|
package/dist/equip.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { type Address, type Hex } from 'viem';
|
|
2
|
+
import type { RuntimeMemberRecordV1 } from './record.js';
|
|
3
|
+
import { type StandingEnforcers } from './standing.js';
|
|
4
|
+
/** The enforcer map a standing grant is written against; the digest-binding enforcer is required to derive children. */
|
|
5
|
+
export declare function standingEnforcers(c: Contracts): StandingEnforcers;
|
|
6
|
+
export interface Contracts {
|
|
7
|
+
chainId: number;
|
|
8
|
+
delegationManager: Address;
|
|
9
|
+
timestampEnforcer: Address;
|
|
10
|
+
allowedMethodsEnforcer: Address;
|
|
11
|
+
valueEnforcer: Address;
|
|
12
|
+
allowedTargetsEnforcer: Address;
|
|
13
|
+
agentRelationship: Address;
|
|
14
|
+
agentNameRegistry: Address;
|
|
15
|
+
permissionlessSubregistry: Address; /** Spec 400 W2a — needed to derive a child mandate from a standing grant. */
|
|
16
|
+
digestBindingEnforcer?: Address;
|
|
17
|
+
}
|
|
18
|
+
/** Who signs for the member's Smart Agent — its custodian. A port: the key is never here. */
|
|
19
|
+
export interface CustodianSigner {
|
|
20
|
+
/** The custodian's Home session bearer (a demo persona's, for W1a) — used only for the Home's own routes. */
|
|
21
|
+
bearer: string;
|
|
22
|
+
/** The custodian's own agent address. */
|
|
23
|
+
agent: Address;
|
|
24
|
+
signDigest: (digest: Hex) => Promise<Hex>;
|
|
25
|
+
}
|
|
26
|
+
export interface JoinOptions {
|
|
27
|
+
home: string;
|
|
28
|
+
/** The standard A2A surface's host (the edge: `<edge>/api/a2a/<name>`). */
|
|
29
|
+
edge: string;
|
|
30
|
+
/** The agent runtime's host (the interactions ops: `<a2a>/interactions/<agent>/<op>`). */
|
|
31
|
+
a2a: string;
|
|
32
|
+
member: string;
|
|
33
|
+
workspace: string;
|
|
34
|
+
contracts: Contracts;
|
|
35
|
+
custodian: CustodianSigner;
|
|
36
|
+
/** The registry the playbook is read from and its archetype (context/id). */
|
|
37
|
+
registry: {
|
|
38
|
+
origin: string;
|
|
39
|
+
context: string;
|
|
40
|
+
archetype: string;
|
|
41
|
+
};
|
|
42
|
+
validForSeconds?: number;
|
|
43
|
+
/** W1c — where the runtime is hosted, so the Worker can WAKE it when a message is admitted instead of the runtime
|
|
44
|
+
* polling: `container` (the app's Container binding, one instance per member) or a URL that serves `POST /wake`.
|
|
45
|
+
* Omitted: the runtime polls (`ap runtime run`). Declared by the custodian, kept on the member's own object. */
|
|
46
|
+
wake?: RuntimeHostV1;
|
|
47
|
+
/** Spec 400 W2a — the OPEN MANDATE: capabilities the custodian pre-authorizes ONCE for this runtime (a standing
|
|
48
|
+
* grant, no intent binding, the same window as the wire); the loop derives a child per parked reply. Typically
|
|
49
|
+
* `['messaging.direct.send']`. Omitted: every write parks. */
|
|
50
|
+
openMandate?: string[];
|
|
51
|
+
/** The open mandate's locations (for messaging: the recipients); omitted: any. */
|
|
52
|
+
openMandateLocations?: Address[];
|
|
53
|
+
/** Spec 400 W2a — the member's MESSAGING RAIL: the recipients its custodian lets it deliver to (the signing wire +
|
|
54
|
+
* transport grant the Home's ceremony mints). Without a rail an authorized reply cannot leave. */
|
|
55
|
+
messagingTo?: Address[];
|
|
56
|
+
fetch?: typeof fetch;
|
|
57
|
+
log?: (line: string) => void;
|
|
58
|
+
}
|
|
59
|
+
/** Where a runtime member's host lives — the Worker's wake target. Config, never authority: a wake carries no
|
|
60
|
+
* content and no grant; the host reads under its own wire. */
|
|
61
|
+
export type RuntimeHostV1 = {
|
|
62
|
+
v: 1;
|
|
63
|
+
kind: 'container';
|
|
64
|
+
} | {
|
|
65
|
+
v: 1;
|
|
66
|
+
kind: 'url';
|
|
67
|
+
url: string;
|
|
68
|
+
};
|
|
69
|
+
/** The member's playbook, pinned by digest from the registry (the K3 assignment the Playbook page writes). Kept when
|
|
70
|
+
* the same archetype is already assigned unless `force` — a re-pin after the registry's definition changed. */
|
|
71
|
+
export declare function assignPlaybook(o: {
|
|
72
|
+
a2a: string;
|
|
73
|
+
member: Address;
|
|
74
|
+
custodian: CustodianSigner;
|
|
75
|
+
stewardship?: unknown;
|
|
76
|
+
registry: {
|
|
77
|
+
origin: string;
|
|
78
|
+
context: string;
|
|
79
|
+
archetype: string;
|
|
80
|
+
};
|
|
81
|
+
force?: boolean;
|
|
82
|
+
fetch?: typeof fetch;
|
|
83
|
+
log?: (l: string) => void;
|
|
84
|
+
}): Promise<string>;
|
|
85
|
+
/** Spec 400 W2 (B4) — keep the standing grant on the member's own object (like a read grant), so the grants screen
|
|
86
|
+
* lists it and a revocation can expand its digest. The object verifies it was issued by the member. */
|
|
87
|
+
export declare function recordStandingGrant(o: {
|
|
88
|
+
a2a: string;
|
|
89
|
+
member: Address;
|
|
90
|
+
custodian: CustodianSigner;
|
|
91
|
+
stewardship?: unknown;
|
|
92
|
+
standing: {
|
|
93
|
+
wire: Record<string, unknown>;
|
|
94
|
+
requirement: {
|
|
95
|
+
actions: string[];
|
|
96
|
+
locations?: string[];
|
|
97
|
+
validUntil: number;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
holderName?: string;
|
|
101
|
+
fetch?: typeof fetch;
|
|
102
|
+
}): Promise<string>;
|
|
103
|
+
/** Declare (or clear, with `null`) where the member's runtime is hosted — the custodian's act on the member's object. */
|
|
104
|
+
export declare function declareRuntimeHost(o: {
|
|
105
|
+
a2a: string;
|
|
106
|
+
member: string;
|
|
107
|
+
custodian: CustodianSigner;
|
|
108
|
+
host: RuntimeHostV1 | null;
|
|
109
|
+
stewardship?: unknown;
|
|
110
|
+
fetch?: typeof fetch;
|
|
111
|
+
}): Promise<void>;
|
|
112
|
+
export interface EquipOptions extends Omit<JoinOptions, 'log'> {
|
|
113
|
+
/** The runtime's OWN key's address — generated on its machine; never the key. */
|
|
114
|
+
address: Address;
|
|
115
|
+
/** Where to CALL the Home and the agent runtime from here, when that differs from what the record should name —
|
|
116
|
+
* the Home's browser reaches its own origin and the `/a2a` proxy while the record carries the public origins. */
|
|
117
|
+
call?: {
|
|
118
|
+
home?: string;
|
|
119
|
+
a2a?: string;
|
|
120
|
+
};
|
|
121
|
+
log?: (line: string) => void;
|
|
122
|
+
}
|
|
123
|
+
export declare function equipRuntimeMember(o: EquipOptions): Promise<Omit<RuntimeMemberRecordV1, 'key'>>;
|
|
124
|
+
//# sourceMappingURL=equip.d.ts.map
|