witnora 0.8.1 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +275 -12
  2. package/dist/artifact-manifest.js +37 -0
  3. package/dist/artifact-validation.js +102 -0
  4. package/dist/badge.js +31 -0
  5. package/dist/browser-adapter.js +156 -0
  6. package/dist/bundle.js +100 -0
  7. package/dist/cli.js +971 -0
  8. package/dist/command-help.js +71 -0
  9. package/dist/companion-artifacts.js +170 -0
  10. package/dist/conformance.js +115 -0
  11. package/dist/control-plane.js +409 -0
  12. package/dist/corpus-governance.js +126 -0
  13. package/dist/corpus-store.js +239 -0
  14. package/dist/corpus.js +438 -0
  15. package/dist/credentials.js +127 -0
  16. package/dist/evidence-signing.js +85 -0
  17. package/dist/failure-review.js +188 -0
  18. package/dist/guided-setup.js +101 -0
  19. package/dist/index.js +16 -0
  20. package/dist/lab.js +323 -0
  21. package/dist/local-server.js +491 -0
  22. package/dist/monitor.js +100 -0
  23. package/dist/normalizers.js +265 -0
  24. package/dist/onboarding-templates.js +158 -0
  25. package/dist/release-gate.js +457 -0
  26. package/dist/report.js +165 -0
  27. package/dist/runner.js +349 -0
  28. package/dist/sandbox.js +424 -0
  29. package/dist/schema-validator.js +503 -0
  30. package/dist/try.js +135 -0
  31. package/dist/types.js +3 -0
  32. package/dist/vendor/onegent-runtime/browser-adapter-kit.d.ts +107 -0
  33. package/dist/vendor/onegent-runtime/browser-adapter-kit.d.ts.map +1 -0
  34. package/dist/vendor/onegent-runtime/browser-adapter-kit.js +187 -0
  35. package/dist/vendor/onegent-runtime/browser-enforcement-runtime.d.ts +183 -0
  36. package/dist/vendor/onegent-runtime/browser-enforcement-runtime.d.ts.map +1 -0
  37. package/dist/vendor/onegent-runtime/browser-enforcement-runtime.js +344 -0
  38. package/dist/vendor/onegent-runtime/controlled-adapter.d.ts +6 -0
  39. package/dist/vendor/onegent-runtime/controlled-adapter.d.ts.map +1 -0
  40. package/dist/vendor/onegent-runtime/controlled-adapter.js +40 -0
  41. package/dist/vendor/onegent-runtime/mock-procurement.d.ts +6 -0
  42. package/dist/vendor/onegent-runtime/mock-procurement.d.ts.map +1 -0
  43. package/dist/vendor/onegent-runtime/mock-procurement.js +33 -0
  44. package/dist/vendor/onegent-runtime/policies.d.ts +6 -0
  45. package/dist/vendor/onegent-runtime/policies.d.ts.map +1 -0
  46. package/dist/vendor/onegent-runtime/policies.js +109 -0
  47. package/dist/vendor/onegent-runtime/risk.d.ts +3 -0
  48. package/dist/vendor/onegent-runtime/risk.d.ts.map +1 -0
  49. package/dist/vendor/onegent-runtime/risk.js +54 -0
  50. package/dist/vendor/onegent-runtime/sandbox-adapter-kit.d.ts +45 -0
  51. package/dist/vendor/onegent-runtime/sandbox-adapter-kit.d.ts.map +1 -0
  52. package/dist/vendor/onegent-runtime/sandbox-adapter-kit.js +148 -0
  53. package/dist/vendor/onegent-runtime/sandbox-harness.d.ts +167 -0
  54. package/dist/vendor/onegent-runtime/sandbox-harness.d.ts.map +1 -0
  55. package/dist/vendor/onegent-runtime/sandbox-harness.js +729 -0
  56. package/dist/vendor/onegent-runtime/sandbox-hosted.d.ts +77 -0
  57. package/dist/vendor/onegent-runtime/sandbox-hosted.d.ts.map +1 -0
  58. package/dist/vendor/onegent-runtime/sandbox-hosted.js +152 -0
  59. package/dist/vendor/onegent-runtime/sdk.d.ts +29 -0
  60. package/dist/vendor/onegent-runtime/sdk.d.ts.map +1 -0
  61. package/dist/vendor/onegent-runtime/sdk.js +140 -0
  62. package/dist/vendor/onegent-runtime/service.d.ts +27 -0
  63. package/dist/vendor/onegent-runtime/service.d.ts.map +1 -0
  64. package/dist/vendor/onegent-runtime/service.js +423 -0
  65. package/dist/vendor/onegent-runtime/store.d.ts +16 -0
  66. package/dist/vendor/onegent-runtime/store.d.ts.map +1 -0
  67. package/dist/vendor/onegent-runtime/store.js +29 -0
  68. package/dist/vendor/onegent-runtime/stripe-test-readonly.d.ts +79 -0
  69. package/dist/vendor/onegent-runtime/stripe-test-readonly.d.ts.map +1 -0
  70. package/dist/vendor/onegent-runtime/stripe-test-readonly.js +163 -0
  71. package/dist/vendor/onegent-runtime/trust-crypto.d.ts +11 -0
  72. package/dist/vendor/onegent-runtime/trust-crypto.d.ts.map +1 -0
  73. package/dist/vendor/onegent-runtime/trust-crypto.js +70 -0
  74. package/dist/vendor/onegent-runtime/trust-types.d.ts +163 -0
  75. package/dist/vendor/onegent-runtime/trust-types.d.ts.map +1 -0
  76. package/dist/vendor/onegent-runtime/trust-types.js +7 -0
  77. package/dist/vendor/onegent-runtime/trusted-recorder.d.ts +49 -0
  78. package/dist/vendor/onegent-runtime/trusted-recorder.d.ts.map +1 -0
  79. package/dist/vendor/onegent-runtime/trusted-recorder.js +347 -0
  80. package/dist/vendor/onegent-runtime/types.d.ts +287 -0
  81. package/dist/vendor/onegent-runtime/types.d.ts.map +1 -0
  82. package/dist/vendor/onegent-runtime/types.js +1 -0
  83. package/dist/vendor/onegent-runtime/vendor-sandbox-egress.d.ts +49 -0
  84. package/dist/vendor/onegent-runtime/vendor-sandbox-egress.d.ts.map +1 -0
  85. package/dist/vendor/onegent-runtime/vendor-sandbox-egress.js +152 -0
  86. package/package.json +37 -13
  87. package/bin/witnora.js +0 -3
@@ -0,0 +1,107 @@
1
+ import type { BrowserCredentialLeaseInput, BrowserTargetAuditSource, TargetAuditEvent } from "./browser-enforcement-runtime.js";
2
+ import type { ControlledActionAdapter, IndependentOutcomeProbe, OutcomeObservation } from "./trust-types.js";
3
+ import type { ActionExecutionContext, ActionExecutionSummary, ActionIntent, ActionType, LocalActionAdapterResult } from "./types.js";
4
+ export declare const CUSTOMER_OWNED_BROWSER_ADAPTER_PROTOCOL: "agentcert.customer_browser_adapter.v0.1";
5
+ export interface BrowserAdapterCredential {
6
+ reference: string;
7
+ secret: string;
8
+ expiresAt: string;
9
+ }
10
+ export interface CustomerOwnedBrowserAdapterConfig {
11
+ name: string;
12
+ targetSystem: string;
13
+ allowedOrigins: string[];
14
+ allowedActionTypes: ActionType[];
15
+ allowedOperation: string;
16
+ allowedResource: string;
17
+ sandbox: true;
18
+ resolveWriteCredential(): BrowserAdapterCredential | Promise<BrowserAdapterCredential>;
19
+ resolveReadCredential(): BrowserAdapterCredential | Promise<BrowserAdapterCredential>;
20
+ execute(input: {
21
+ action: ActionIntent;
22
+ context: ActionExecutionContext;
23
+ origin: string;
24
+ operation: string;
25
+ resource: string;
26
+ credential: string;
27
+ }): LocalActionAdapterResult | Promise<LocalActionAdapterResult>;
28
+ observe(input: {
29
+ action: ActionIntent;
30
+ execution: ActionExecutionSummary;
31
+ credential: string;
32
+ }): OutcomeObservation | Promise<OutcomeObservation>;
33
+ listAuditEvents(input: {
34
+ windowStart: string;
35
+ windowEnd: string;
36
+ credential: string;
37
+ }): TargetAuditEvent[] | Promise<TargetAuditEvent[]>;
38
+ revokeWriteCredential?(credential: BrowserAdapterCredential): void | Promise<void>;
39
+ }
40
+ export interface PreparedCustomerBrowserAdapter {
41
+ adapter: ControlledActionAdapter;
42
+ outcomeProbe: IndependentOutcomeProbe;
43
+ targetAuditSource: BrowserTargetAuditSource;
44
+ credentialLease: BrowserCredentialLeaseInput;
45
+ metadata: {
46
+ protocolVersion: typeof CUSTOMER_OWNED_BROWSER_ADAPTER_PROTOCOL;
47
+ sandbox: true;
48
+ adapterName: string;
49
+ targetSystem: string;
50
+ allowedOrigins: readonly string[];
51
+ allowedActionTypes: readonly ActionType[];
52
+ allowedOperation: string;
53
+ allowedResource: string;
54
+ writeCredentialReferenceSha256: string;
55
+ readCredentialReferenceSha256: string;
56
+ };
57
+ }
58
+ export interface CustomerOwnedBrowserAdapterKit {
59
+ readonly protocolVersion: typeof CUSTOMER_OWNED_BROWSER_ADAPTER_PROTOCOL;
60
+ readonly name: string;
61
+ readonly targetSystem: string;
62
+ prepareExecution(): Promise<PreparedCustomerBrowserAdapter>;
63
+ }
64
+ export interface BrowserAdapterConformanceFixture {
65
+ action: ActionIntent;
66
+ expectedObservedState: Record<string, unknown>;
67
+ expectedAudit: {
68
+ operation: string;
69
+ resource: string;
70
+ parametersDigest: string;
71
+ };
72
+ forbiddenSecrets?: string[];
73
+ }
74
+ export interface BrowserAdapterConformanceReport {
75
+ schemaVersion: "agentcert.customer_browser_adapter_conformance.v0.1";
76
+ kind: "agentcert.customer_browser_adapter_conformance";
77
+ implementation: string;
78
+ generatedAt: string;
79
+ verdict: {
80
+ passed: boolean;
81
+ score: number;
82
+ };
83
+ summary: {
84
+ passed: number;
85
+ failed: number;
86
+ total: number;
87
+ };
88
+ checks: Array<{
89
+ id: string;
90
+ status: "passed" | "failed";
91
+ message: string;
92
+ }>;
93
+ boundary: PreparedCustomerBrowserAdapter["metadata"];
94
+ evidence: {
95
+ observedStateSha256?: string;
96
+ auditEventSha256?: string;
97
+ credentialsRevoked: boolean;
98
+ };
99
+ limitations: string[];
100
+ }
101
+ export declare function createCustomerOwnedBrowserAdapterKit(config: CustomerOwnedBrowserAdapterConfig): CustomerOwnedBrowserAdapterKit;
102
+ export declare function runCustomerOwnedBrowserAdapterConformance(input: {
103
+ kit: CustomerOwnedBrowserAdapterKit;
104
+ fixture: BrowserAdapterConformanceFixture;
105
+ now?: () => Date;
106
+ }): Promise<BrowserAdapterConformanceReport>;
107
+ //# sourceMappingURL=browser-adapter-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-adapter-kit.d.ts","sourceRoot":"","sources":["../../../../onegent-runtime/src/browser-adapter-kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createControlledActionAdapter, createIndependentOutcomeProbe } from "./controlled-adapter.js";
3
+ import { canonicalJson, sha256 } from "./trust-crypto.js";
4
+ export const CUSTOMER_OWNED_BROWSER_ADAPTER_PROTOCOL = "agentcert.customer_browser_adapter.v0.1";
5
+ export function createCustomerOwnedBrowserAdapterKit(config) {
6
+ config = {
7
+ ...config,
8
+ allowedOrigins: config.allowedOrigins.map(normalizeOrigin),
9
+ allowedActionTypes: [...config.allowedActionTypes],
10
+ };
11
+ validateConfig(config);
12
+ return Object.freeze({
13
+ protocolVersion: CUSTOMER_OWNED_BROWSER_ADAPTER_PROTOCOL,
14
+ name: config.name,
15
+ targetSystem: config.targetSystem,
16
+ async prepareExecution() {
17
+ const [writeCredential, readCredential] = await Promise.all([
18
+ config.resolveWriteCredential(),
19
+ config.resolveReadCredential(),
20
+ ]);
21
+ validateCredential(writeCredential, "write");
22
+ validateCredential(readCredential, "read");
23
+ if (writeCredential.reference === readCredential.reference || writeCredential.secret === readCredential.secret) {
24
+ throw new Error("Browser adapter read and write credentials must be independent.");
25
+ }
26
+ let revoked = false;
27
+ const adapter = createControlledActionAdapter({
28
+ name: config.name,
29
+ control: {
30
+ mode: "agentcert_gateway",
31
+ credentials: "gateway_managed",
32
+ bypassPrevention: "credentials_unavailable_to_agent",
33
+ allowedActionTypes: [...config.allowedActionTypes],
34
+ allowedTargetSystems: [config.targetSystem],
35
+ },
36
+ async execute(action, context) {
37
+ assertBoundAction(config, action);
38
+ if (!context?.idempotencyKey)
39
+ throw new Error("Browser adapter execution requires an idempotency key.");
40
+ return config.execute({
41
+ action,
42
+ context,
43
+ origin: config.allowedOrigins[0],
44
+ operation: config.allowedOperation,
45
+ resource: config.allowedResource,
46
+ credential: writeCredential.secret,
47
+ });
48
+ },
49
+ });
50
+ const outcomeProbe = createIndependentOutcomeProbe({
51
+ name: `${config.name}:independent-outcome`,
52
+ independent: true,
53
+ async observe(action, execution) {
54
+ assertBoundAction(config, action);
55
+ return await config.observe({ action, execution, credential: readCredential.secret });
56
+ },
57
+ });
58
+ const targetAuditSource = Object.freeze({
59
+ name: `${config.name}:target-audit`,
60
+ exclusiveCredential: true,
61
+ async listEvents(windowStart, windowEnd) {
62
+ return await config.listAuditEvents({ windowStart, windowEnd, credential: readCredential.secret });
63
+ },
64
+ });
65
+ return {
66
+ adapter,
67
+ outcomeProbe,
68
+ targetAuditSource,
69
+ credentialLease: {
70
+ providerType: "CUSTOMER_SECRET_PROVIDER",
71
+ providerReference: writeCredential.reference,
72
+ isolationMode: "RUNTIME_INJECTED_CREDENTIAL",
73
+ expiresAt: writeCredential.expiresAt,
74
+ async revoke() {
75
+ if (revoked)
76
+ return;
77
+ revoked = true;
78
+ await config.revokeWriteCredential?.(writeCredential);
79
+ },
80
+ },
81
+ metadata: Object.freeze({
82
+ protocolVersion: CUSTOMER_OWNED_BROWSER_ADAPTER_PROTOCOL,
83
+ sandbox: true,
84
+ adapterName: config.name,
85
+ targetSystem: config.targetSystem,
86
+ allowedOrigins: Object.freeze([...config.allowedOrigins]),
87
+ allowedActionTypes: Object.freeze([...config.allowedActionTypes]),
88
+ allowedOperation: config.allowedOperation,
89
+ allowedResource: config.allowedResource,
90
+ writeCredentialReferenceSha256: sha256(writeCredential.reference),
91
+ readCredentialReferenceSha256: sha256(readCredential.reference),
92
+ }),
93
+ };
94
+ },
95
+ });
96
+ }
97
+ export async function runCustomerOwnedBrowserAdapterConformance(input) {
98
+ const checks = [];
99
+ const check = (id, passed, message) => checks.push({ id, status: passed ? "passed" : "failed", message });
100
+ const prepared = await input.kit.prepareExecution();
101
+ const now = input.now ?? (() => new Date());
102
+ const executionResult = await prepared.adapter.execute(input.fixture.action, { idempotencyKey: `conformance:${randomUUID()}`, attempt: 1 });
103
+ const execution = {
104
+ method: executionResult.method ?? "LOCAL_ADAPTER",
105
+ status: "COMPLETED",
106
+ targetSystem: executionResult.targetSystem ?? input.fixture.action.targetSystem,
107
+ previousState: executionResult.previousState,
108
+ observedState: executionResult.observedState,
109
+ rollbackToken: executionResult.rollbackToken,
110
+ };
111
+ const observation = await prepared.outcomeProbe.observe(input.fixture.action, execution);
112
+ const auditEvents = await prepared.targetAuditSource.listEvents(new Date(now().getTime() - 60_000).toISOString(), new Date(now().getTime() + 60_000).toISOString());
113
+ await prepared.credentialLease.revoke?.();
114
+ await prepared.credentialLease.revoke?.();
115
+ const matchingAudit = auditEvents.filter((event) => event.actionId === input.fixture.action.id
116
+ && event.operation === input.fixture.expectedAudit.operation
117
+ && event.resource === input.fixture.expectedAudit.resource
118
+ && event.parametersDigest === input.fixture.expectedAudit.parametersDigest);
119
+ check("gateway-boundary", prepared.adapter.control.mode === "agentcert_gateway" && prepared.adapter.control.credentials === "gateway_managed", "Adapter is registered behind the Witnora credential-isolated gateway boundary.");
120
+ check("sandbox-target", input.fixture.action.environment !== "production" && prepared.metadata.sandbox === true, "Conformance execution is restricted to a declared sandbox target.");
121
+ check("bounded-action", prepared.adapter.control.allowedActionTypes.includes(input.fixture.action.actionType) && prepared.adapter.control.allowedTargetSystems.includes(input.fixture.action.targetSystem), "Action type and target system match the immutable allowlist.");
122
+ check("credential-separation", prepared.metadata.writeCredentialReferenceSha256 !== prepared.metadata.readCredentialReferenceSha256, "Write execution and read-only verification use separate credential references.");
123
+ check("outcome-verified", canonicalJson(observation.observedState) === canonicalJson(input.fixture.expectedObservedState), "Independent outcome observation matches the expected sandbox state.");
124
+ check("target-audit", matchingAudit.length === 1 && auditEvents.length === 1, "Exactly one matching target audit event was observed.");
125
+ check("credential-revocation", true, "Credential lease revocation is idempotent and completed without exposing credential bytes.");
126
+ const reportCore = {
127
+ schemaVersion: "agentcert.customer_browser_adapter_conformance.v0.1",
128
+ kind: "agentcert.customer_browser_adapter_conformance",
129
+ implementation: input.kit.name,
130
+ generatedAt: now().toISOString(),
131
+ boundary: prepared.metadata,
132
+ evidence: {
133
+ observedStateSha256: sha256(canonicalJson(observation.observedState)),
134
+ auditEventSha256: matchingAudit[0] ? sha256(canonicalJson(matchingAudit[0])) : undefined,
135
+ credentialsRevoked: true,
136
+ },
137
+ limitations: [
138
+ "Conformance proves the declared sandbox adapter boundary, not the security of the vendor production system.",
139
+ "Customer secret-provider controls remain the customer's responsibility.",
140
+ ],
141
+ };
142
+ const serialized = canonicalJson(reportCore);
143
+ const leaked = (input.fixture.forbiddenSecrets ?? []).filter((secret) => secret.length >= 4 && serialized.includes(secret));
144
+ check("secret-redaction", leaked.length === 0 && !/(?:Bearer\s+|(?:sk|rk)_(?:test|live)_)/i.test(serialized), "Conformance report contains digests only and no recognized credential material.");
145
+ const passed = checks.filter((entry) => entry.status === "passed").length;
146
+ return {
147
+ ...reportCore,
148
+ verdict: { passed: passed === checks.length, score: Math.round((passed / checks.length) * 100) },
149
+ summary: { passed, failed: checks.length - passed, total: checks.length },
150
+ checks,
151
+ };
152
+ }
153
+ function validateConfig(config) {
154
+ if (!config.name?.trim() || !config.targetSystem?.trim())
155
+ throw new Error("Browser adapter name and target system are required.");
156
+ if (config.sandbox !== true)
157
+ throw new Error("Customer-owned browser adapter v0.1 supports sandbox systems only.");
158
+ if (!config.allowedActionTypes.length || !config.allowedOrigins.length)
159
+ throw new Error("Browser adapter action and origin allowlists cannot be empty.");
160
+ if (!config.allowedOperation?.trim() || !config.allowedResource?.trim())
161
+ throw new Error("Browser adapter operation and resource bounds are required.");
162
+ if (new Set(config.allowedOrigins).size !== config.allowedOrigins.length)
163
+ throw new Error("Browser adapter origins must be unique.");
164
+ }
165
+ function normalizeOrigin(value) {
166
+ const parsed = new URL(value);
167
+ if (parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
168
+ throw new Error(`Browser adapter origin must be an exact HTTPS origin: ${value}`);
169
+ }
170
+ return parsed.origin;
171
+ }
172
+ function validateCredential(credential, kind) {
173
+ if (!credential?.reference?.trim() || !credential.secret || credential.secret.length < 8)
174
+ throw new Error(`Browser adapter ${kind} credential is invalid.`);
175
+ if (!Number.isFinite(Date.parse(credential.expiresAt)) || Date.parse(credential.expiresAt) <= Date.now())
176
+ throw new Error(`Browser adapter ${kind} credential must have a future expiry.`);
177
+ }
178
+ function assertBoundAction(config, action) {
179
+ if (action.environment === "production")
180
+ throw new Error("Customer-owned browser adapter v0.1 refuses production actions.");
181
+ if (!config.allowedActionTypes.includes(action.actionType))
182
+ throw new Error(`Action type ${action.actionType} is not allowed by this browser adapter.`);
183
+ if (action.targetSystem !== config.targetSystem)
184
+ throw new Error(`Target system ${action.targetSystem} is not allowed by this browser adapter.`);
185
+ if (action.targetUrl && !config.allowedOrigins.includes(new URL(action.targetUrl).origin))
186
+ throw new Error(`Target origin ${new URL(action.targetUrl).origin} is not allowed by this browser adapter.`);
187
+ }
@@ -0,0 +1,183 @@
1
+ import type { ActionIntent, ActionExecutionSummary } from "./types.js";
2
+ import type { ControlledActionAdapter, IndependentOutcomeProbe, SourceSigner } from "./trust-types.js";
3
+ import type { TrustedActionRecorder } from "./trusted-recorder.js";
4
+ export declare const BROWSER_ENFORCEMENT_PROTOCOL: "agentcert.browser_enforcement.v0.2";
5
+ export declare const EXECUTION_GRANT_CONTEXT: "agentcert.execution-grant.v0.2";
6
+ export declare const RUNTIME_CLAIM_CONTEXT: "onegent.runtime-claim.v0.2";
7
+ export declare const EXECUTION_SESSION_CONTEXT: "onegent.execution-session.v0.2";
8
+ export declare const EVENT_CONTEXT: "onegent.execution-event.v0.2";
9
+ export declare const EVENT_CHECKPOINT_CONTEXT: "onegent.event-checkpoint.v0.2";
10
+ export declare const OUTCOME_CONTEXT: "onegent.outcome-attestation.v0.2";
11
+ export declare const RECONCILIATION_CONTEXT: "onegent.reconciliation-report.v0.2";
12
+ type CredentialIsolationMode = "PREAUTHENTICATED_BROWSER_CONTEXT" | "RUNTIME_INJECTED_CREDENTIAL" | "TARGET_EPHEMERAL_TOKEN" | "RUNTIME_MANAGED_SESSION";
13
+ export interface HostedAttestation {
14
+ schemaVersion: "agentcert.server_attestation.v0.1";
15
+ algorithm: "Ed25519";
16
+ keyId: string;
17
+ signedAt: string;
18
+ payloadSha256: string;
19
+ signature: string;
20
+ }
21
+ export interface ExecutionGrantWirePayload {
22
+ protocolVersion: typeof BROWSER_ENFORCEMENT_PROTOCOL;
23
+ objectType: "ExecutionGrant";
24
+ signatureContext: typeof EXECUTION_GRANT_CONTEXT;
25
+ executionGrantId: string;
26
+ tenantId: string;
27
+ actionId: string;
28
+ actionIntentDigest: string;
29
+ principalIdentityId: string;
30
+ principalIdentityAssertionId?: string;
31
+ principalIdentityDigest?: string;
32
+ principalIdentityProvider?: string;
33
+ agentIdentityId: string;
34
+ agentBuildId: string;
35
+ agentBuildDigest: string;
36
+ mandateId: string;
37
+ mandateChainDigest: string;
38
+ policyDecisionId: string;
39
+ policyDecisionDigest: string;
40
+ approvalSetDigest: string;
41
+ adapterId: string;
42
+ adapterVersionConstraint: string;
43
+ expectedRuntimeIdentityId: string;
44
+ targetAudience: string;
45
+ allowedOrigins: string[];
46
+ allowedOperation: string;
47
+ allowedResource: string;
48
+ parametersDigest: string;
49
+ outcomePredicateDigest: string;
50
+ credentialIsolationRequirement: "REQUIRED";
51
+ reconciliationRequirement: "REQUIRED";
52
+ issuedAt: string;
53
+ notBefore: string;
54
+ expiresAt: string;
55
+ maxUses: 1;
56
+ nonce: string;
57
+ jti: string;
58
+ issuerKeyId: string;
59
+ }
60
+ export interface SignedExecutionGrantWire {
61
+ payload: ExecutionGrantWirePayload;
62
+ payloadSha256: string;
63
+ attestation: HostedAttestation;
64
+ }
65
+ export interface RuntimeSignedObject<T> {
66
+ payload: T;
67
+ payloadSha256: string;
68
+ signature: {
69
+ algorithm: "Ed25519";
70
+ keyId: string;
71
+ signature: string;
72
+ };
73
+ }
74
+ export interface RuntimeClaimWirePayload {
75
+ protocolVersion: typeof BROWSER_ENFORCEMENT_PROTOCOL;
76
+ objectType: "RuntimeClaim";
77
+ signatureContext: typeof RUNTIME_CLAIM_CONTEXT;
78
+ runtimeIdentityId: string;
79
+ executionGrantId: string;
80
+ executionGrantDigest: string;
81
+ actionId: string;
82
+ principalIdentityAssertionId?: string;
83
+ principalIdentityDigest?: string;
84
+ principalIdentityProvider?: string;
85
+ executionSessionId: string;
86
+ claimNonce: string;
87
+ claimedAt: string;
88
+ runtimeKeyId: string;
89
+ idempotencyKey: string;
90
+ }
91
+ export interface ExecutionSessionWirePayload {
92
+ protocolVersion: typeof BROWSER_ENFORCEMENT_PROTOCOL;
93
+ objectType: "ExecutionSessionAttestation";
94
+ signatureContext: typeof EXECUTION_SESSION_CONTEXT;
95
+ executionSessionId: string;
96
+ executionGrantId: string;
97
+ executionGrantDigest: string;
98
+ actionId: string;
99
+ actionIntentDigest: string;
100
+ runtimeIdentityId: string;
101
+ runtimeKeyId: string;
102
+ adapterId: string;
103
+ adapterVersion: string;
104
+ browserContextIdDigest: string;
105
+ credentialLeaseId: string;
106
+ credentialIsolationMode: CredentialIsolationMode;
107
+ targetAudience: string;
108
+ allowedOrigins: string[];
109
+ startedAt: string;
110
+ sessionExpiresAt: string;
111
+ eventChainGenesisHash: string;
112
+ }
113
+ export interface RuntimeIdentityConfig {
114
+ runtimeIdentityId: string;
115
+ runtimeKeyId: string;
116
+ signer: SourceSigner;
117
+ }
118
+ export interface BrowserCredentialLeaseInput {
119
+ credentialLeaseId?: string;
120
+ providerType: "DEVELOPMENT_SECRET_PROVIDER" | "CUSTOMER_SECRET_PROVIDER";
121
+ providerReference: string;
122
+ isolationMode: CredentialIsolationMode;
123
+ expiresAt: string;
124
+ revoke?: () => void | Promise<void>;
125
+ }
126
+ export interface TargetAuditEvent {
127
+ targetEventId: string;
128
+ actionId?: string;
129
+ executionSessionId?: string;
130
+ occurredAt: string;
131
+ operation: string;
132
+ resource: string;
133
+ parametersDigest: string;
134
+ credentialReferenceDigest: string;
135
+ }
136
+ export interface BrowserTargetAuditSource {
137
+ name: string;
138
+ exclusiveCredential: true;
139
+ listEvents(windowStart: string, windowEnd: string): Promise<TargetAuditEvent[]>;
140
+ }
141
+ export interface BrowserEnforcementExecutionOptions {
142
+ grant: SignedExecutionGrantWire;
143
+ hostedIssuerKeys: Record<string, string>;
144
+ runtime: RuntimeIdentityConfig;
145
+ action: ActionIntent;
146
+ actionIntentDigest: string;
147
+ agentBuildDigest: string;
148
+ approvedParameters: Record<string, unknown>;
149
+ outcomePredicate: Record<string, unknown>;
150
+ adapter: ControlledActionAdapter;
151
+ adapterVersion: string;
152
+ outcomeProbe: IndependentOutcomeProbe;
153
+ targetAuditSource: BrowserTargetAuditSource;
154
+ recorder: TrustedActionRecorder;
155
+ credentialLease: BrowserCredentialLeaseInput;
156
+ claimGrant(claim: RuntimeSignedObject<RuntimeClaimWirePayload>): Promise<{
157
+ status: "CLAIMED";
158
+ claimedAt: string;
159
+ }>;
160
+ markConsumed(executionGrantId: string, executionSessionId: string): Promise<void>;
161
+ now?: () => Date;
162
+ clockSkewMs?: number;
163
+ }
164
+ export interface BrowserEnforcementRuntimeBundle {
165
+ protocolVersion: typeof BROWSER_ENFORCEMENT_PROTOCOL;
166
+ executionGrant: SignedExecutionGrantWire;
167
+ grantStatus: "CONSUMED";
168
+ runtimeClaim: RuntimeSignedObject<RuntimeClaimWirePayload>;
169
+ executionSession: RuntimeSignedObject<ExecutionSessionWirePayload>;
170
+ credentialLease: Record<string, unknown>;
171
+ events: Array<RuntimeSignedObject<Record<string, unknown>>>;
172
+ eventCheckpoint: RuntimeSignedObject<Record<string, unknown>>;
173
+ outcomeAttestation: RuntimeSignedObject<Record<string, unknown>>;
174
+ reconciliationReport: RuntimeSignedObject<Record<string, unknown>>;
175
+ finalParametersDigest: string;
176
+ detectedBypass: boolean;
177
+ execution: ActionExecutionSummary;
178
+ }
179
+ export declare function executeBrowserEnforcement(options: BrowserEnforcementExecutionOptions): Promise<BrowserEnforcementRuntimeBundle>;
180
+ export declare function verifyHostedExecutionGrant(grant: SignedExecutionGrantWire, issuerKeys: Record<string, string>, at?: Date, clockSkewMs?: number): void;
181
+ export declare function signRuntimeObject<T>(payload: T, signer: SourceSigner): RuntimeSignedObject<T>;
182
+ export {};
183
+ //# sourceMappingURL=browser-enforcement-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-enforcement-runtime.d.ts","sourceRoot":"","sources":["../../../../onegent-runtime/src/browser-enforcement-runtime.ts"],"names":[],"mappings":"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"}