@sentropic/h2a 0.97.6 → 0.97.7
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +5 -0
- package/dist/mcp.js.map +1 -1
- package/dist/runtime/drive/consent-tools.d.ts +17 -0
- package/dist/runtime/drive/consent-tools.d.ts.map +1 -0
- package/dist/runtime/drive/consent-tools.js +102 -0
- package/dist/runtime/drive/consent-tools.js.map +1 -0
- package/dist/runtime/drive/consent.d.ts +46 -0
- package/dist/runtime/drive/consent.d.ts.map +1 -0
- package/dist/runtime/drive/consent.js +150 -0
- package/dist/runtime/drive/consent.js.map +1 -0
- package/dist/runtime/drive/index.d.ts +9 -6
- package/dist/runtime/drive/index.d.ts.map +1 -1
- package/dist/runtime/drive/index.js +33 -3
- package/dist/runtime/drive/index.js.map +1 -1
- package/dist/runtime/local-files/store.d.ts +12 -1
- package/dist/runtime/local-files/store.d.ts.map +1 -1
- package/dist/runtime/local-files/store.js +338 -2
- package/dist/runtime/local-files/store.js.map +1 -1
- package/dist/runtime/mcp/server.d.ts.map +1 -1
- package/dist/runtime/mcp/server.js +4 -0
- package/dist/runtime/mcp/server.js.map +1 -1
- package/dist/runtime/mcp/tools.d.ts.map +1 -1
- package/dist/runtime/mcp/tools.js +5 -0
- package/dist/runtime/mcp/tools.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -131,6 +131,6 @@ export declare const H2A_CLI_ADAPTER: {
|
|
|
131
131
|
readonly corePackageName: "@sentropic/h2a";
|
|
132
132
|
readonly protocol: "sentropic.h2a";
|
|
133
133
|
readonly hosts: readonly [import("./hosts/codex.js").H2AConfigurableHostDescriptor, import("./hosts/codex.js").H2AConfigurableHostDescriptor, import("./hosts/codex.js").H2AConfigurableHostDescriptor, import("./hosts/codex.js").H2AConfigurableHostDescriptor, import("./hosts/codex.js").H2AConfigurableHostDescriptor, import("./hosts/codex.js").H2AConfigurableHostDescriptor, import("./hosts/codex.js").H2AConfigurableHostDescriptor];
|
|
134
|
-
readonly mcpToolNames: readonly ["h2a_register_instance", "h2a_discover_instances", "h2a_read_payload", "h2a_identity_status", "h2a_open_negotiation", "h2a_offer", "h2a_counteroffer", "h2a_sign", "h2a_stabilize", "h2a_attest_comprehension", "h2a_declare_conflit_interet", "h2a_conflict_posture", "h2a_inbox", "h2a_send", "h2a_append_journal", "h2a_escalate", "h2a_session_open", "h2a_session_close", "h2a_discover_sessions", "h2a_nhi_report", "h2a_nhi_inventory", "h2a_nhi_attest", "h2a_nhi_offboard", "h2a_nhi_export", "h2a_blockage_raise", "h2a_blockage_list", "h2a_blockage_resolve", "h2a_conductor", "h2a_conductor_claim", "h2a_conductor_release", "h2a_conductor_launch_check", "h2a_conductor_launch", "h2a_run", "h2a_loop_create", "h2a_loop_join", "h2a_loop_report", "h2a_loop_done", "h2a_loop_stop", "h2a_loop_list", "h2a_loop_status", "track_report", "track_snapshot", "track_query", "track_validate", "track_audit", "track_branch_provenance", "track_freshness", "track_external_deps", "track_status", "track_verification_runs", "track_scope_validate", "track_cursor", "track_canevas", "track_amendment_trace", "track_workspace_activity"];
|
|
134
|
+
readonly mcpToolNames: readonly ["h2a_register_instance", "h2a_discover_instances", "h2a_read_payload", "h2a_identity_status", "h2a_open_negotiation", "h2a_offer", "h2a_counteroffer", "h2a_sign", "h2a_stabilize", "h2a_attest_comprehension", "h2a_declare_conflit_interet", "h2a_conflict_posture", "h2a_inbox", "h2a_send", "h2a_drive_consent_request", "h2a_drive_consent_respond", "h2a_drive_consent_cosign", "h2a_drive_consent_revoke", "h2a_drive_consent_status", "h2a_append_journal", "h2a_escalate", "h2a_session_open", "h2a_session_close", "h2a_discover_sessions", "h2a_nhi_report", "h2a_nhi_inventory", "h2a_nhi_attest", "h2a_nhi_offboard", "h2a_nhi_export", "h2a_blockage_raise", "h2a_blockage_list", "h2a_blockage_resolve", "h2a_conductor", "h2a_conductor_claim", "h2a_conductor_release", "h2a_conductor_launch_check", "h2a_conductor_launch", "h2a_run", "h2a_loop_create", "h2a_loop_join", "h2a_loop_report", "h2a_loop_done", "h2a_loop_stop", "h2a_loop_list", "h2a_loop_status", "track_report", "track_snapshot", "track_query", "track_validate", "track_audit", "track_branch_provenance", "track_freshness", "track_external_deps", "track_status", "track_verification_runs", "track_scope_validate", "track_cursor", "track_canevas", "track_amendment_trace", "track_workspace_activity"];
|
|
135
135
|
};
|
|
136
136
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mcp.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const H2A_CLI_MCP_TOOL_NAMES: readonly ["h2a_register_instance", "h2a_discover_instances", "h2a_read_payload", "h2a_identity_status", "h2a_open_negotiation", "h2a_offer", "h2a_counteroffer", "h2a_sign", "h2a_stabilize", "h2a_attest_comprehension", "h2a_declare_conflit_interet", "h2a_conflict_posture", "h2a_inbox", "h2a_send", "h2a_append_journal", "h2a_escalate", "h2a_session_open", "h2a_session_close", "h2a_discover_sessions", "h2a_nhi_report", "h2a_nhi_inventory", "h2a_nhi_attest", "h2a_nhi_offboard", "h2a_nhi_export", "h2a_blockage_raise", "h2a_blockage_list", "h2a_blockage_resolve", "h2a_conductor", "h2a_conductor_claim", "h2a_conductor_release", "h2a_conductor_launch_check", "h2a_conductor_launch", "h2a_run", "h2a_loop_create", "h2a_loop_join", "h2a_loop_report", "h2a_loop_done", "h2a_loop_stop", "h2a_loop_list", "h2a_loop_status", "track_report", "track_snapshot", "track_query", "track_validate", "track_audit", "track_branch_provenance", "track_freshness", "track_external_deps", "track_status", "track_verification_runs", "track_scope_validate", "track_cursor", "track_canevas", "track_amendment_trace", "track_workspace_activity"];
|
|
1
|
+
export declare const H2A_CLI_MCP_TOOL_NAMES: readonly ["h2a_register_instance", "h2a_discover_instances", "h2a_read_payload", "h2a_identity_status", "h2a_open_negotiation", "h2a_offer", "h2a_counteroffer", "h2a_sign", "h2a_stabilize", "h2a_attest_comprehension", "h2a_declare_conflit_interet", "h2a_conflict_posture", "h2a_inbox", "h2a_send", "h2a_drive_consent_request", "h2a_drive_consent_respond", "h2a_drive_consent_cosign", "h2a_drive_consent_revoke", "h2a_drive_consent_status", "h2a_append_journal", "h2a_escalate", "h2a_session_open", "h2a_session_close", "h2a_discover_sessions", "h2a_nhi_report", "h2a_nhi_inventory", "h2a_nhi_attest", "h2a_nhi_offboard", "h2a_nhi_export", "h2a_blockage_raise", "h2a_blockage_list", "h2a_blockage_resolve", "h2a_conductor", "h2a_conductor_claim", "h2a_conductor_release", "h2a_conductor_launch_check", "h2a_conductor_launch", "h2a_run", "h2a_loop_create", "h2a_loop_join", "h2a_loop_report", "h2a_loop_done", "h2a_loop_stop", "h2a_loop_list", "h2a_loop_status", "track_report", "track_snapshot", "track_query", "track_validate", "track_audit", "track_branch_provenance", "track_freshness", "track_external_deps", "track_status", "track_verification_runs", "track_scope_validate", "track_cursor", "track_canevas", "track_amendment_trace", "track_workspace_activity"];
|
|
2
2
|
//# sourceMappingURL=mcp.d.ts.map
|
package/dist/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,kvCA+DzB,CAAC"}
|
package/dist/mcp.js
CHANGED
|
@@ -13,6 +13,11 @@ export const H2A_CLI_MCP_TOOL_NAMES = [
|
|
|
13
13
|
"h2a_conflict_posture",
|
|
14
14
|
"h2a_inbox",
|
|
15
15
|
"h2a_send",
|
|
16
|
+
"h2a_drive_consent_request",
|
|
17
|
+
"h2a_drive_consent_respond",
|
|
18
|
+
"h2a_drive_consent_cosign",
|
|
19
|
+
"h2a_drive_consent_revoke",
|
|
20
|
+
"h2a_drive_consent_status",
|
|
16
21
|
"h2a_append_journal",
|
|
17
22
|
"h2a_escalate",
|
|
18
23
|
"h2a_session_open",
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,uBAAuB;IACvB,wBAAwB;IACxB,kBAAkB;IAClB,qBAAqB;IACrB,sBAAsB;IACtB,WAAW;IACX,kBAAkB;IAClB,UAAU;IACV,eAAe;IACf,0BAA0B;IAC1B,6BAA6B;IAC7B,sBAAsB;IACtB,WAAW;IACX,UAAU;IACV,oBAAoB;IACpB,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,uBAAuB;IACvB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;IACtB,eAAe;IACf,qBAAqB;IACrB,uBAAuB;IACvB,4BAA4B;IAC5B,sBAAsB;IACtB,SAAS;IACT,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,eAAe;IACf,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,6EAA6E;IAC7E,uEAAuE;IACvE,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,yBAAyB;IACzB,iBAAiB;IACjB,qBAAqB;IACrB,cAAc;IACd,yBAAyB;IACzB,sBAAsB;IACtB,cAAc;IACd,eAAe;IACf,uBAAuB;IACvB,0BAA0B;CAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,uBAAuB;IACvB,wBAAwB;IACxB,kBAAkB;IAClB,qBAAqB;IACrB,sBAAsB;IACtB,WAAW;IACX,kBAAkB;IAClB,UAAU;IACV,eAAe;IACf,0BAA0B;IAC1B,6BAA6B;IAC7B,sBAAsB;IACtB,WAAW;IACX,UAAU;IACV,2BAA2B;IAC3B,2BAA2B;IAC3B,0BAA0B;IAC1B,0BAA0B;IAC1B,0BAA0B;IAC1B,oBAAoB;IACpB,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,uBAAuB;IACvB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;IACtB,eAAe;IACf,qBAAqB;IACrB,uBAAuB;IACvB,4BAA4B;IAC5B,sBAAsB;IACtB,SAAS;IACT,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,eAAe;IACf,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,6EAA6E;IAC7E,uEAAuE;IACvE,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,yBAAyB;IACzB,iBAAiB;IACjB,qBAAqB;IACrB,cAAc;IACd,yBAAyB;IACzB,sBAAsB;IACtB,cAAc;IACd,eAAe;IACf,uBAAuB;IACvB,0BAA0B;CAClB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { LocalStore } from '../local-files/store.js';
|
|
2
|
+
import type { H2ASendSigner } from '../send.js';
|
|
3
|
+
export declare const CONSENT_TOOLS: readonly ["h2a_drive_consent_request", "h2a_drive_consent_respond", "h2a_drive_consent_cosign", "h2a_drive_consent_revoke", "h2a_drive_consent_status"];
|
|
4
|
+
/** The signer comes only from the trusted MCP sidecar, never tool arguments. */
|
|
5
|
+
export declare function handleDriveConsent(store: LocalStore, signer: H2ASendSigner | undefined, name: string, args?: Record<string, unknown>): {
|
|
6
|
+
content: {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
}[];
|
|
10
|
+
} | {
|
|
11
|
+
isError: true;
|
|
12
|
+
content: {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
}[];
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=consent-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-tools.d.ts","sourceRoot":"","sources":["../../../src/runtime/drive/consent-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAG9C,eAAO,MAAM,aAAa,yJAAsJ,CAAC;AAQjL,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAC,UAAU,EAAC,MAAM,EAAC,aAAa,GAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,GAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAI;;;;;;;;;;;EAuD5H"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { computeHash, signCanonical } from '@sentropic/h2a';
|
|
3
|
+
import { consentPairId, consentScope, evidence, instant, verified, DRIVE_CONSENT_MAX_ANSWER_MS, DRIVE_CONSENT_MAX_GRANT_MS } from './consent.js';
|
|
4
|
+
export const CONSENT_TOOLS = ['h2a_drive_consent_request', 'h2a_drive_consent_respond', 'h2a_drive_consent_cosign', 'h2a_drive_consent_revoke', 'h2a_drive_consent_status'];
|
|
5
|
+
const fields = {
|
|
6
|
+
h2a_drive_consent_request: ['to', 'answerBy', 'requestedNotAfter', 'purpose'],
|
|
7
|
+
h2a_drive_consent_respond: ['from', 'requestId', 'decision', 'notBefore', 'notAfter', 'reason'],
|
|
8
|
+
h2a_drive_consent_cosign: ['from', 'to', 'grantId'],
|
|
9
|
+
h2a_drive_consent_revoke: ['from', 'to', 'requestId', 'reason'],
|
|
10
|
+
h2a_drive_consent_status: ['from', 'to']
|
|
11
|
+
};
|
|
12
|
+
/** The signer comes only from the trusted MCP sidecar, never tool arguments. */
|
|
13
|
+
export function handleDriveConsent(store, signer, name, args = {}) {
|
|
14
|
+
try {
|
|
15
|
+
for (const key of Object.keys(args))
|
|
16
|
+
if (!fields[name]?.includes(key))
|
|
17
|
+
throw Error('unsupported argument: ' + key);
|
|
18
|
+
const text = (key) => { if (typeof args[key] !== 'string' || !args[key])
|
|
19
|
+
throw Error('required argument: ' + key); return args[key]; };
|
|
20
|
+
if (name === 'h2a_drive_consent_status')
|
|
21
|
+
return result(store.findDriveConsent(text('from'), text('to')));
|
|
22
|
+
if (!signer)
|
|
23
|
+
throw Error('consent-principal-unavailable: no bound signing session');
|
|
24
|
+
const identity = store.findInstance(signer.instance);
|
|
25
|
+
if (!identity || identity.id !== signer.instance)
|
|
26
|
+
throw Error('consent-invalid: bound identity not registered');
|
|
27
|
+
const now = Date.now(), at = new Date(now).toISOString();
|
|
28
|
+
let from = name === 'h2a_drive_consent_request' ? signer.instance : text('from');
|
|
29
|
+
let to = name === 'h2a_drive_consent_respond' ? signer.instance : text('to');
|
|
30
|
+
const a = store.findInstance(from), b = store.findInstance(to);
|
|
31
|
+
if (!a || !b)
|
|
32
|
+
throw Error('missing-registration');
|
|
33
|
+
const bindings = { from, to, ...(a.agentUuid ? { fromAgentUuid: a.agentUuid } : {}), ...(b.agentUuid ? { toAgentUuid: b.agentUuid } : {}) };
|
|
34
|
+
let payload, type;
|
|
35
|
+
const entries = store.readDriveConsentChain(from, to);
|
|
36
|
+
if (name === 'h2a_drive_consent_request') {
|
|
37
|
+
const answerBy = text('answerBy'), requestedNotAfter = text('requestedNotAfter');
|
|
38
|
+
if (!(instant(answerBy) > now && instant(answerBy) - now <= DRIVE_CONSENT_MAX_ANSWER_MS && instant(requestedNotAfter) >= instant(answerBy) && instant(requestedNotAfter) - now <= DRIVE_CONSENT_MAX_GRANT_MS + DRIVE_CONSENT_MAX_ANSWER_MS))
|
|
39
|
+
throw Error('consent-invalid: dates');
|
|
40
|
+
payload = { kind: 'h2a.drive.consent.request', v: 1, requestId: randomUUID(), ...bindings, scope: consentScope, createdAt: at, answerBy, requestedNotAfter, ...(args.purpose !== undefined ? { purpose: args.purpose } : {}) };
|
|
41
|
+
type = 'propose';
|
|
42
|
+
}
|
|
43
|
+
else if (name === 'h2a_drive_consent_cosign') {
|
|
44
|
+
if (b.principal === undefined || signer.instance !== b.principal)
|
|
45
|
+
throw Error('consent-principal-unavailable: session is not the registered principal');
|
|
46
|
+
const grant = entries.map(e => e.body).filter(evidence).find(e => e.payload.kind === 'h2a.drive.consent.grant' && computeHash(e.payload) === text('grantId'));
|
|
47
|
+
if (!grant || !verified(store, grant.payload, grant.signature, to))
|
|
48
|
+
throw Error('consent-invalid: target grant');
|
|
49
|
+
const coSignature = signCanonical(grant.payload, { by: signer.instance, privateKeyPem: signer.privateKeyPem });
|
|
50
|
+
if (!verified(store, grant.payload, coSignature, b.principal))
|
|
51
|
+
throw Error('consent-principal-unavailable: no active principal signing key');
|
|
52
|
+
const projection = store.recordDriveConsentEnvelope({ id: randomUUID(), type: 'accept', actor: { instance: to, role: 'AGENTS', scope: 'drive-consent' }, negotiationId: consentPairId(from, to), createdAt: at, body: { ...grant, coSignature } });
|
|
53
|
+
return result(projection);
|
|
54
|
+
}
|
|
55
|
+
else if (name === 'h2a_drive_consent_revoke' && args.requestId === undefined) {
|
|
56
|
+
if (signer.instance !== from && signer.instance !== to)
|
|
57
|
+
throw Error('consent-invalid: parties only');
|
|
58
|
+
const live = entries.map(e => e.body).filter(evidence).filter(e => e.payload.kind === 'h2a.drive.consent.request' && instant(e.payload.requestedNotAfter) > now && verified(store, e.payload, e.signature, from, true));
|
|
59
|
+
const notAfter = Math.max(now, ...live.map(e => instant(e.payload.requestedNotAfter)));
|
|
60
|
+
payload = { kind: 'h2a.drive.consent.revocation', v: 1, ...bindings, pair: true, at, notAfter: new Date(notAfter).toISOString(), ...(args.reason !== undefined ? { reason: args.reason } : {}) };
|
|
61
|
+
type = 'withdraw';
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const requestId = text('requestId');
|
|
65
|
+
const request = entries.map(e => e.body).filter(evidence).find(e => e.payload.kind === 'h2a.drive.consent.request' && e.payload.requestId === requestId);
|
|
66
|
+
if (!request)
|
|
67
|
+
throw Error('consent-invalid: unknown request');
|
|
68
|
+
const common = { v: 1, requestId, requestHash: computeHash(request.payload), ...bindings };
|
|
69
|
+
if (name === 'h2a_drive_consent_revoke') {
|
|
70
|
+
if (signer.instance !== from && signer.instance !== to)
|
|
71
|
+
throw Error('consent-invalid: parties only');
|
|
72
|
+
payload = { kind: 'h2a.drive.consent.revocation', ...common, at, ...(args.reason !== undefined ? { reason: args.reason } : {}) };
|
|
73
|
+
type = 'withdraw';
|
|
74
|
+
}
|
|
75
|
+
else if (text('decision') === 'refuse') {
|
|
76
|
+
payload = { kind: 'h2a.drive.consent.refusal', ...common, at, ...(args.reason !== undefined ? { reason: args.reason } : {}) };
|
|
77
|
+
type = 'reject';
|
|
78
|
+
}
|
|
79
|
+
else if (text('decision') === 'grant') {
|
|
80
|
+
if (b.principal !== undefined && (!store.findInstance(b.principal) || !store.listInstanceKeys(b.principal).length))
|
|
81
|
+
throw Error('consent-principal-unavailable: no active principal key; no provisioning');
|
|
82
|
+
if (entries.some(e => evidence(e.body) && e.body.payload.requestId === requestId && ['h2a.drive.consent.refusal', 'h2a.drive.consent.revocation', 'h2a.drive.consent.grant'].includes(e.body.payload.kind)))
|
|
83
|
+
throw Error('consent-invalid: already decided');
|
|
84
|
+
const notBefore = text('notBefore'), notAfter = text('notAfter');
|
|
85
|
+
if (now >= instant(request.payload.answerBy) || instant(notBefore) < now || !(instant(notAfter) > instant(notBefore)) || instant(notAfter) - instant(notBefore) > DRIVE_CONSENT_MAX_GRANT_MS || instant(notAfter) > instant(request.payload.requestedNotAfter))
|
|
86
|
+
throw Error('consent-invalid: grant dates');
|
|
87
|
+
payload = { kind: 'h2a.drive.consent.grant', ...common, scope: consentScope, issuedAt: at, notBefore, notAfter, ...(b.principal !== undefined ? { principal: b.principal } : {}) };
|
|
88
|
+
type = 'accept';
|
|
89
|
+
}
|
|
90
|
+
else
|
|
91
|
+
throw Error('consent-invalid: decision');
|
|
92
|
+
}
|
|
93
|
+
const signature = signCanonical(payload, { by: signer.instance, privateKeyPem: signer.privateKeyPem });
|
|
94
|
+
const projection = store.recordDriveConsentEnvelope({ id: randomUUID(), type, actor: { instance: signer.instance, role: identity.roles[0] ?? 'AGENTS', scope: 'drive-consent' }, negotiationId: consentPairId(from, to), createdAt: at, body: { kind: String(payload.kind), payload, signature } });
|
|
95
|
+
return result({ payload, projection });
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return { isError: true, content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }] };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function result(value) { return { content: [{ type: 'text', text: JSON.stringify(value) }] }; }
|
|
102
|
+
//# sourceMappingURL=consent-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-tools.js","sourceRoot":"","sources":["../../../src/runtime/drive/consent-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Pair/time consent. The journal, not negotiation status or inboxes, is authority. */
|
|
2
|
+
import { type H2AJournalEntry, type H2ASignature } from '@sentropic/h2a';
|
|
3
|
+
import type { LocalStore } from '../local-files/store.js';
|
|
4
|
+
export declare const DRIVE_CONSENT_DEFAULT_ANSWER_MS: number;
|
|
5
|
+
export declare const DRIVE_CONSENT_MAX_ANSWER_MS: number;
|
|
6
|
+
export declare const DRIVE_CONSENT_DEFAULT_GRANT_MS: number;
|
|
7
|
+
export declare const DRIVE_CONSENT_MAX_GRANT_MS: number;
|
|
8
|
+
export declare const DRIVE_CONSENT_LIMIT = "Signatures prove active-key possession, not intent. Source: owner build brief decision 2, 2026-09-24: earlier measurement of 53,904 private-key files under one OS account in /home/antoinefa/h2a-workspace/.h2a/keys, including a direct cross-lane key read. Source: ~/h2a-workspace/.h2a/registry/instances.jsonl, count 2026-09-24: 0 / 26,964 live registrations carry a principal, so conditional co-signing is inert on that fleet. Source: ~/h2a-workspace/.h2a/keys/, measurement 2026-09-24: 26,964 private keys, mode 0600, all owned by the current uid; any same-uid lane can read a principal key, so co-signature is explicit but NOT attributable to human intent. Out-of-band principal custody does not exist; per-agent custody deferred to Track 01M38WH19VE7VGW8QY0P9NHHVX.";
|
|
9
|
+
export type ConsentReason = 'unauthorized' | 'consent-pending' | 'consent-refused' | 'consent-expired' | 'consent-revoked' | 'consent-invalid' | 'consent-unavailable' | 'consent-principal-unavailable';
|
|
10
|
+
export type ConsentDecision = {
|
|
11
|
+
ok: true;
|
|
12
|
+
via: 'consent';
|
|
13
|
+
grantId: string;
|
|
14
|
+
requestId: string;
|
|
15
|
+
notAfter: string;
|
|
16
|
+
principalDecision: 'principal-absent' | 'co-signed';
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
reason: ConsentReason;
|
|
20
|
+
};
|
|
21
|
+
export interface ConsentProjection {
|
|
22
|
+
decision: ConsentDecision;
|
|
23
|
+
anomalies: string[];
|
|
24
|
+
requests: number;
|
|
25
|
+
limit: typeof DRIVE_CONSENT_LIMIT;
|
|
26
|
+
}
|
|
27
|
+
export interface ConsentEvidence {
|
|
28
|
+
kind: string;
|
|
29
|
+
payload: Record<string, unknown>;
|
|
30
|
+
signature: H2ASignature;
|
|
31
|
+
coSignature?: H2ASignature;
|
|
32
|
+
}
|
|
33
|
+
export declare const consentPairId: (from: string, to: string) => string;
|
|
34
|
+
export declare const isConsentId: (id: string) => boolean;
|
|
35
|
+
export declare const consentScope: {
|
|
36
|
+
readonly action: "drive.instruction";
|
|
37
|
+
readonly direction: "from->to";
|
|
38
|
+
};
|
|
39
|
+
export declare function instant(value: unknown): number;
|
|
40
|
+
export declare function evidence(x: unknown): x is ConsentEvidence;
|
|
41
|
+
type ConsentReader = Pick<LocalStore, 'findInstance' | 'listInstanceKeys' | 'listKeyEvents'>;
|
|
42
|
+
export declare function verified(store: ConsentReader, payload: unknown, signature: H2ASignature | undefined, by: string, historical?: boolean): boolean;
|
|
43
|
+
/** No authority may depend on writer-supplied policy or cached verified flags. */
|
|
44
|
+
export declare function projectConsent(store: ConsentReader, from: string, to: string, entries: readonly H2AJournalEntry<unknown>[], now: number): ConsentProjection;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=consent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../src/runtime/drive/consent.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAgC,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACvG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,eAAO,MAAM,+BAA+B,QAAiB,CAAC;AAC9D,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAC1D,eAAO,MAAM,8BAA8B,QAAiB,CAAC;AAC7D,eAAO,MAAM,0BAA0B,QAAsB,CAAC;AAC9D,eAAO,MAAM,mBAAmB,qwBAAqwB,CAAC;AAStyB,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,qBAAqB,GAAG,+BAA+B,CAAC;AACzM,MAAM,MAAM,eAAe,GAAG;IAAC,EAAE,EAAC,IAAI,CAAC;IAAA,GAAG,EAAC,SAAS,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,iBAAiB,EAAC,kBAAkB,GAAC,WAAW,CAAA;CAAC,GAAG;IAAC,EAAE,EAAC,KAAK,CAAC;IAAA,MAAM,EAAC,aAAa,CAAA;CAAC,CAAC;AACzL,MAAM,WAAW,iBAAiB;IAAG,QAAQ,EAAC,eAAe,CAAC;IAAC,SAAS,EAAC,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,OAAO,mBAAmB,CAAC;CAAE;AACvI,MAAM,WAAW,eAAe;IAAE,IAAI,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,CAAC;IAAA,SAAS,EAAC,YAAY,CAAC;IAAA,WAAW,CAAC,EAAC,YAAY,CAAC;CAAC;AAC/H,eAAO,MAAM,aAAa,GAAI,MAAK,MAAM,EAAC,IAAG,MAAM,KAAE,MAAiD,CAAC;AACvG,eAAO,MAAM,WAAW,GAAI,IAAG,MAAM,KAAE,OAA6E,CAAC;AACrH,eAAO,MAAM,YAAY;;;CAA6D,CAAC;AACvF,wBAAgB,OAAO,CAAC,KAAK,EAAC,OAAO,GAAE,MAAM,CAG5C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAC,OAAO,GAAE,CAAC,IAAI,eAAe,CAEvD;AACD,KAAK,aAAa,GAAC,IAAI,CAAC,UAAU,EAAC,cAAc,GAAC,kBAAkB,GAAC,eAAe,CAAC,CAAC;AACtF,wBAAgB,QAAQ,CAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,YAAY,GAAC,SAAS,EAAC,EAAE,EAAC,MAAM,EAAC,UAAU,UAAM,GAAE,OAAO,CAIhI;AACD,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,KAAK,EAAC,aAAa,EAAC,IAAI,EAAC,MAAM,EAAC,EAAE,EAAC,MAAM,EAAC,OAAO,EAAC,SAAS,eAAe,CAAC,OAAO,CAAC,EAAE,EAAC,GAAG,EAAC,MAAM,GAAE,iBAAiB,CAsEjJ"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/** Pair/time consent. The journal, not negotiation status or inboxes, is authority. */
|
|
2
|
+
import { computeHash, verifyCanonical } from '@sentropic/h2a';
|
|
3
|
+
export const DRIVE_CONSENT_DEFAULT_ANSWER_MS = 15 * 60 * 1000;
|
|
4
|
+
export const DRIVE_CONSENT_MAX_ANSWER_MS = 60 * 60 * 1000;
|
|
5
|
+
export const DRIVE_CONSENT_DEFAULT_GRANT_MS = 60 * 60 * 1000;
|
|
6
|
+
export const DRIVE_CONSENT_MAX_GRANT_MS = 24 * 60 * 60 * 1000;
|
|
7
|
+
export const DRIVE_CONSENT_LIMIT = 'Signatures prove active-key possession, not intent. Source: owner build brief decision 2, 2026-09-24: earlier measurement of 53,904 private-key files under one OS account in /home/antoinefa/h2a-workspace/.h2a/keys, including a direct cross-lane key read. Source: ~/h2a-workspace/.h2a/registry/instances.jsonl, count 2026-09-24: 0 / 26,964 live registrations carry a principal, so conditional co-signing is inert on that fleet. Source: ~/h2a-workspace/.h2a/keys/, measurement 2026-09-24: 26,964 private keys, mode 0600, all owned by the current uid; any same-uid lane can read a principal key, so co-signature is explicit but NOT attributable to human intent. Out-of-band principal custody does not exist; per-agent custody deferred to Track 01M38WH19VE7VGW8QY0P9NHHVX.';
|
|
8
|
+
export const consentPairId = (from, to) => 'drive-consent:' + computeHash({ from, to });
|
|
9
|
+
export const isConsentId = (id) => id.startsWith('drive-consent:') || id.startsWith('drive-consent-');
|
|
10
|
+
export const consentScope = { action: 'drive.instruction', direction: 'from->to' };
|
|
11
|
+
export function instant(value) {
|
|
12
|
+
if (typeof value !== 'string' || !/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}Z$/.test(value))
|
|
13
|
+
return NaN;
|
|
14
|
+
const n = Date.parse(value);
|
|
15
|
+
return Number.isFinite(n) && new Date(n).toISOString() === value ? n : NaN;
|
|
16
|
+
}
|
|
17
|
+
function record(x) { return !!x && typeof x === 'object' && !Array.isArray(x); }
|
|
18
|
+
export function evidence(x) {
|
|
19
|
+
return record(x) && typeof x.kind === 'string' && record(x.payload) && record(x.signature);
|
|
20
|
+
}
|
|
21
|
+
export function verified(store, payload, signature, by, historical = false) {
|
|
22
|
+
if (!signature || signature.by !== by || signature.alg !== 'ed25519')
|
|
23
|
+
return false;
|
|
24
|
+
const keys = historical ? [...(store.findInstance(by)?.publicKeys ?? []), ...store.listKeyEvents().filter(k => k.instance === by && k.type === 'added').map(k => k.publicKey)] : store.listInstanceKeys(by);
|
|
25
|
+
return keys.some(key => { try {
|
|
26
|
+
return verifyCanonical(payload, signature, key);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
} });
|
|
31
|
+
}
|
|
32
|
+
/** No authority may depend on writer-supplied policy or cached verified flags. */
|
|
33
|
+
export function projectConsent(store, from, to, entries, now) {
|
|
34
|
+
const anomalies = [];
|
|
35
|
+
const done = (decision, requests = 0) => ({ decision, anomalies, requests, limit: DRIVE_CONSENT_LIMIT });
|
|
36
|
+
if (!Number.isFinite(now))
|
|
37
|
+
return done({ ok: false, reason: 'consent-unavailable' });
|
|
38
|
+
const a = store.findInstance(from), b = store.findInstance(to);
|
|
39
|
+
if (!a || !b)
|
|
40
|
+
return done({ ok: false, reason: 'consent-invalid' });
|
|
41
|
+
const events = [];
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
if (record(entry.body) && entry.body.kind === 'drive-consent.audit')
|
|
44
|
+
continue;
|
|
45
|
+
if (!evidence(entry.body) || entry.body.kind !== entry.body.payload.kind || entry.negotiationId !== consentPairId(from, to)) {
|
|
46
|
+
anomalies.push(entry.id);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const p = entry.body.payload;
|
|
50
|
+
if (p.v !== 1 || p.from !== from || p.to !== to || !['h2a.drive.consent.request', 'h2a.drive.consent.grant', 'h2a.drive.consent.refusal', 'h2a.drive.consent.revocation'].includes(String(p.kind))) {
|
|
51
|
+
anomalies.push(entry.id);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
events.push({ body: entry.body, entry });
|
|
55
|
+
}
|
|
56
|
+
const bound = (p) => p.fromAgentUuid === a.agentUuid && p.toAgentUuid === b.agentUuid;
|
|
57
|
+
const requests = events.filter(({ body, entry }) => {
|
|
58
|
+
const p = body.payload;
|
|
59
|
+
if (p.kind !== 'h2a.drive.consent.request')
|
|
60
|
+
return false;
|
|
61
|
+
const created = instant(p.createdAt), answer = instant(p.answerBy), end = instant(p.requestedNotAfter);
|
|
62
|
+
const valid = bound(p) && typeof p.requestId === 'string' && /^[a-f0-9-]{32,36}$/.test(p.requestId) && record(p.scope) && computeHash(p.scope) === computeHash(consentScope) && answer > created && answer - created <= DRIVE_CONSENT_MAX_ANSWER_MS && end >= answer && end - created <= DRIVE_CONSENT_MAX_GRANT_MS + DRIVE_CONSENT_MAX_ANSWER_MS && (p.purpose === undefined || (typeof p.purpose === 'string' && Buffer.byteLength(p.purpose) <= 1024)) && verified(store, p, body.signature, from, true);
|
|
63
|
+
if (!valid)
|
|
64
|
+
anomalies.push(entry.id);
|
|
65
|
+
return valid;
|
|
66
|
+
});
|
|
67
|
+
if (!requests.length)
|
|
68
|
+
return done({ ok: false, reason: events.length ? 'consent-invalid' : 'unauthorized' });
|
|
69
|
+
// Pair revocation is independent of journal order and overrides every
|
|
70
|
+
// conflicting live grant throughout the revoked requests' remaining window.
|
|
71
|
+
const pairRevoked = events.some(({ body, entry }) => {
|
|
72
|
+
const p = body.payload;
|
|
73
|
+
if (p.kind !== 'h2a.drive.consent.revocation' || p.pair !== true)
|
|
74
|
+
return false;
|
|
75
|
+
const at = instant(p.at), end = instant(p.notAfter), by = body.signature.by;
|
|
76
|
+
const valid = bound(p) && (by === from || by === to) && Number.isFinite(at) && end >= at && end - at <= DRIVE_CONSENT_MAX_GRANT_MS + DRIVE_CONSENT_MAX_ANSWER_MS && verified(store, p, body.signature, by, true);
|
|
77
|
+
if (!valid)
|
|
78
|
+
anomalies.push(entry.id);
|
|
79
|
+
return valid && now < end;
|
|
80
|
+
});
|
|
81
|
+
if (pairRevoked)
|
|
82
|
+
return done({ ok: false, reason: 'consent-revoked' }, requests.length);
|
|
83
|
+
const decisions = [];
|
|
84
|
+
for (const { body: requestBody } of requests) {
|
|
85
|
+
const request = requestBody.payload, hash = computeHash(request);
|
|
86
|
+
const related = events.filter(({ body }) => body.payload.requestId === request.requestId && body.payload.requestHash === hash);
|
|
87
|
+
const terminal = (kind, party) => related.some(({ body, entry }) => {
|
|
88
|
+
if (body.payload.kind !== kind)
|
|
89
|
+
return false;
|
|
90
|
+
const by = body.signature.by;
|
|
91
|
+
const valid = (by === to || (party && by === from)) && verified(store, body.payload, body.signature, by, true) && Number.isFinite(instant(body.payload.at));
|
|
92
|
+
if (!valid)
|
|
93
|
+
anomalies.push(entry.id);
|
|
94
|
+
return valid;
|
|
95
|
+
});
|
|
96
|
+
if (terminal('h2a.drive.consent.revocation', true)) {
|
|
97
|
+
decisions.push({ ok: false, reason: 'consent-revoked' });
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (terminal('h2a.drive.consent.refusal', false)) {
|
|
101
|
+
decisions.push({ ok: false, reason: 'consent-refused' });
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const grants = related.filter(({ body, entry }) => {
|
|
105
|
+
const p = body.payload;
|
|
106
|
+
if (p.kind !== 'h2a.drive.consent.grant')
|
|
107
|
+
return false;
|
|
108
|
+
const start = instant(p.notBefore), end = instant(p.notAfter), issued = instant(p.issuedAt), committed = instant(entry.createdAt);
|
|
109
|
+
const valid = bound(p) && p.principal === b.principal && record(p.scope) && computeHash(p.scope) === computeHash(request.scope) && Number.isFinite(start) && end > start && end - start <= DRIVE_CONSENT_MAX_GRANT_MS && end <= instant(request.requestedNotAfter) && start >= issued && issued >= instant(request.createdAt) && issued < instant(request.answerBy) && committed >= issued && committed < instant(request.answerBy) && verified(store, p, body.signature, to);
|
|
110
|
+
if (!valid)
|
|
111
|
+
anomalies.push(entry.id);
|
|
112
|
+
return valid;
|
|
113
|
+
});
|
|
114
|
+
if (new Set(grants.map(g => computeHash(g.body.payload))).size > 1) {
|
|
115
|
+
decisions.push({ ok: false, reason: 'consent-invalid' });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (!grants.length && b.principal !== undefined && related.some(({ body }) => body.payload.kind === 'h2a.drive.consent.grant' && body.payload.principal === undefined && verified(store, body.payload, body.signature, to))) {
|
|
119
|
+
decisions.push({ ok: false, reason: 'consent-principal-unavailable' });
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (!grants.length) {
|
|
123
|
+
decisions.push({ ok: false, reason: now >= instant(request.answerBy) ? 'consent-expired' : related.some(e => e.body.payload.kind === 'h2a.drive.consent.grant') ? 'consent-invalid' : 'consent-pending' });
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const g = grants[0].body.payload;
|
|
127
|
+
if (now >= instant(g.notAfter)) {
|
|
128
|
+
decisions.push({ ok: false, reason: 'consent-expired' });
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (now < instant(g.notBefore)) {
|
|
132
|
+
decisions.push({ ok: false, reason: 'consent-pending' });
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Undefined is a separate successful policy branch, never co-signature-satisfied.
|
|
136
|
+
if (b.principal === undefined) {
|
|
137
|
+
decisions.push({ ok: true, via: 'consent', grantId: computeHash(g), requestId: String(request.requestId), notAfter: String(g.notAfter), principalDecision: 'principal-absent' });
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!store.findInstance(b.principal) || !store.listInstanceKeys(b.principal).length || !grants.some(({ body }) => verified(store, g, body.coSignature, b.principal))) {
|
|
141
|
+
decisions.push({ ok: false, reason: 'consent-principal-unavailable' });
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
decisions.push({ ok: true, via: 'consent', grantId: computeHash(g), requestId: String(request.requestId), notAfter: String(g.notAfter), principalDecision: 'co-signed' });
|
|
145
|
+
}
|
|
146
|
+
const success = decisions.find(d => d.ok);
|
|
147
|
+
const priority = ['consent-revoked', 'consent-refused', 'consent-principal-unavailable', 'consent-invalid', 'consent-expired', 'consent-pending', 'unauthorized'];
|
|
148
|
+
return done(success ?? priority.map(reason => decisions.find(d => !d.ok && d.reason === reason)).find(Boolean) ?? { ok: false, reason: 'consent-invalid' }, requests.length);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=consent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.js","sourceRoot":"","sources":["../../../src/runtime/drive/consent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Server } from "node:http";
|
|
2
2
|
import { type H2ALaunchContext, type H2AReplayGuard, type H2ASignature } from "@sentropic/h2a";
|
|
3
|
+
import type { ConsentReason, ConsentDecision } from "./consent.js";
|
|
3
4
|
import type { LocalStore } from "../local-files/store.js";
|
|
4
5
|
import { type RelauncherRuntime } from "../drumbeat/relaunchers.js";
|
|
5
6
|
export interface H2ADriveInstructionPayload {
|
|
@@ -35,8 +36,8 @@ export interface VerifySignedDriveInstructionOptions {
|
|
|
35
36
|
readonly guard: H2AReplayGuard;
|
|
36
37
|
readonly now?: number;
|
|
37
38
|
}
|
|
38
|
-
export type H2ADriveAuthorizeReason = "missing-registration" |
|
|
39
|
-
export type H2ADriveAuthorizeResult = {
|
|
39
|
+
export type H2ADriveAuthorizeReason = "missing-registration" | ConsentReason;
|
|
40
|
+
export type H2ADriveAuthorizeResult = ConsentDecision | {
|
|
40
41
|
readonly ok: true;
|
|
41
42
|
} | {
|
|
42
43
|
readonly ok: false;
|
|
@@ -51,7 +52,7 @@ export type H2ADriveAcceptResult = {
|
|
|
51
52
|
readonly reason: H2ADriveAcceptReason;
|
|
52
53
|
};
|
|
53
54
|
export interface AcceptDriveInstructionOptions {
|
|
54
|
-
readonly store: Pick<LocalStore, "findInstance" | "listInstanceKeys"
|
|
55
|
+
readonly store: Pick<LocalStore, "findInstance" | "listInstanceKeys"> & Partial<Pick<LocalStore, "findDriveConsent" | "commitDriveConsentAdmission">>;
|
|
55
56
|
readonly guard: H2AReplayGuard;
|
|
56
57
|
readonly expectedTo?: string;
|
|
57
58
|
readonly now?: number;
|
|
@@ -138,11 +139,13 @@ export interface VerifyDriveOnReceiveOptions {
|
|
|
138
139
|
readonly guard: H2AReplayGuard;
|
|
139
140
|
readonly now?: number;
|
|
140
141
|
}
|
|
141
|
-
export declare function authorizeDrive(store: Pick<LocalStore, "findInstance"
|
|
142
|
+
export declare function authorizeDrive(store: Pick<LocalStore, "findInstance"> & Partial<Pick<LocalStore, "findDriveConsent">>, request: {
|
|
142
143
|
readonly from: string;
|
|
143
144
|
readonly to: string;
|
|
145
|
+
}, options?: {
|
|
146
|
+
now?: number;
|
|
144
147
|
}): H2ADriveAuthorizeResult;
|
|
145
|
-
export declare function verifyDriveOnReceive(store: Pick<LocalStore, "findInstance" | "listInstanceKeys"
|
|
148
|
+
export declare function verifyDriveOnReceive(store: Pick<LocalStore, "findInstance" | "listInstanceKeys"> & Partial<Pick<LocalStore, "findDriveConsent" | "commitDriveConsentAdmission">>, line: string, options: VerifyDriveOnReceiveOptions): H2ADriveReceiveResult;
|
|
146
149
|
export declare function acceptDriveInstruction(line: string, options: AcceptDriveInstructionOptions): Promise<H2ADriveAcceptResult>;
|
|
147
150
|
export declare function loggingDriver(log?: (line: string) => void): H2ADriver;
|
|
148
151
|
export declare function nativeBackchannelDriver(options?: NativeBackchannelDriverOptions): H2ADriver;
|
|
@@ -152,7 +155,7 @@ export declare function buildHeadlessDriveCommand(input: BuildHeadlessDriveComma
|
|
|
152
155
|
export declare function headlessDriver(options?: DriverRuntimeOptions): H2ADriver;
|
|
153
156
|
export declare function remoteDriveRejectionStatus(reason: H2ADriveRemoteReason): number;
|
|
154
157
|
export declare function createRemoteDriveServer(options: RemoteDriveServerOptions): Server;
|
|
155
|
-
export declare function remoteDriveServerForStore(store: Pick<LocalStore, "findInstance" | "listInstanceKeys"
|
|
158
|
+
export declare function remoteDriveServerForStore(store: Pick<LocalStore, "findInstance" | "listInstanceKeys"> & Partial<Pick<LocalStore, "findDriveConsent" | "commitDriveConsentAdmission">>, options: RemoteDriveServerForStoreOptions): Server;
|
|
156
159
|
export declare function chainDriver(...drivers: readonly H2ADriver[]): H2ADriver;
|
|
157
160
|
/**
|
|
158
161
|
* Return the most-recently-heartbeated launch context recorded for `instance`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/drive/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EAQL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;CAClC;AAED,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,SAAS,GACT,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAElE,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;IACpE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/drive/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -134,7 +134,7 @@ function canIssueMandate(reg) {
|
|
|
134
134
|
return reg.roles.some((role) => H2A_AUTHORITY_MATRIX.MANDATE.roles.includes(role) &&
|
|
135
135
|
canSignArtifactKind(role, "MANDATE"));
|
|
136
136
|
}
|
|
137
|
-
export function authorizeDrive(store, request) {
|
|
137
|
+
export function authorizeDrive(store, request, options) {
|
|
138
138
|
const from = store.findInstance(request.from);
|
|
139
139
|
const to = store.findInstance(request.to);
|
|
140
140
|
if (!from || !to)
|
|
@@ -146,6 +146,14 @@ export function authorizeDrive(store, request) {
|
|
|
146
146
|
if (hasSharedScope(from, to) && canIssueMandate(from)) {
|
|
147
147
|
return { ok: true };
|
|
148
148
|
}
|
|
149
|
+
if (store.findDriveConsent) {
|
|
150
|
+
try {
|
|
151
|
+
return store.findDriveConsent(request.from, request.to, options?.now).decision;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return { ok: false, reason: "consent-unavailable" };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
149
157
|
return { ok: false, reason: "unauthorized" };
|
|
150
158
|
}
|
|
151
159
|
export function verifyDriveOnReceive(store, line, options) {
|
|
@@ -165,9 +173,16 @@ export function verifyDriveOnReceive(store, line, options) {
|
|
|
165
173
|
const auth = authorizeDrive(store, {
|
|
166
174
|
from: verified.payload.from,
|
|
167
175
|
to: verified.payload.to
|
|
168
|
-
});
|
|
176
|
+
}, { now: options.now });
|
|
169
177
|
if (!auth.ok)
|
|
170
178
|
return auth;
|
|
179
|
+
if ("via" in auth) {
|
|
180
|
+
const admission = store.commitDriveConsentAdmission?.(verified.payload, parsed.signature, options.now);
|
|
181
|
+
if (!admission)
|
|
182
|
+
return { ok: false, reason: "consent-unavailable" };
|
|
183
|
+
if (!admission.ok)
|
|
184
|
+
return admission;
|
|
185
|
+
}
|
|
171
186
|
return {
|
|
172
187
|
ok: true,
|
|
173
188
|
from: verified.payload.from,
|
|
@@ -192,9 +207,16 @@ export async function acceptDriveInstruction(line, options) {
|
|
|
192
207
|
const authorized = authorizeDrive(options.store, {
|
|
193
208
|
from: verified.payload.from,
|
|
194
209
|
to: verified.payload.to
|
|
195
|
-
});
|
|
210
|
+
}, { now: options.now });
|
|
196
211
|
if (!authorized.ok)
|
|
197
212
|
return authorized;
|
|
213
|
+
if ("via" in authorized) {
|
|
214
|
+
const admission = options.store.commitDriveConsentAdmission?.(verified.payload, parsed.signature, options.now);
|
|
215
|
+
if (!admission)
|
|
216
|
+
return { ok: false, reason: "consent-unavailable" };
|
|
217
|
+
if (!admission.ok)
|
|
218
|
+
return admission;
|
|
219
|
+
}
|
|
198
220
|
const injected = await options.inject(verified.payload);
|
|
199
221
|
if (!injected)
|
|
200
222
|
return { ok: false, reason: "inject-failed" };
|
|
@@ -367,6 +389,12 @@ export function remoteDriveRejectionStatus(reason) {
|
|
|
367
389
|
return 401;
|
|
368
390
|
case "missing-registration":
|
|
369
391
|
case "unauthorized":
|
|
392
|
+
case "consent-pending":
|
|
393
|
+
case "consent-refused":
|
|
394
|
+
case "consent-expired":
|
|
395
|
+
case "consent-revoked":
|
|
396
|
+
case "consent-invalid":
|
|
397
|
+
case "consent-principal-unavailable":
|
|
370
398
|
case "target-mismatch":
|
|
371
399
|
return 403;
|
|
372
400
|
case "replayed":
|
|
@@ -374,6 +402,8 @@ export function remoteDriveRejectionStatus(reason) {
|
|
|
374
402
|
case "expired":
|
|
375
403
|
case "future":
|
|
376
404
|
return 422;
|
|
405
|
+
case "consent-unavailable":
|
|
406
|
+
return 503;
|
|
377
407
|
case "inject-failed":
|
|
378
408
|
return 502;
|
|
379
409
|
case "payload-too-large":
|