@tangle-network/agent-interface 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-candidate-profile-schema.d.ts +2 -2
  3. package/dist/agent-candidate-promotion-schema.d.ts +22 -22
  4. package/dist/agent-candidate-schema-common.js +1 -1
  5. package/dist/agent-candidate-schema.d.ts +2 -2
  6. package/dist/agent-execution-preparation.d.ts +26 -26
  7. package/dist/agent-profile.d.ts +10 -3
  8. package/dist/agent-profile.js +45 -22
  9. package/dist/backend-message.d.ts +14 -0
  10. package/dist/backend-message.js +1 -0
  11. package/dist/contract-limits.d.ts +26 -0
  12. package/dist/contract-limits.js +175 -0
  13. package/dist/environment-exact-process.d.ts +161 -0
  14. package/dist/environment-exact-process.js +1 -0
  15. package/dist/environment-profile-capabilities.d.ts +26 -0
  16. package/dist/environment-profile-capabilities.js +34 -0
  17. package/dist/environment-provider.d.ts +3 -730
  18. package/dist/environment-provider.js +3 -245
  19. package/dist/environment-requests.d.ts +70 -0
  20. package/dist/environment-requests.js +1 -0
  21. package/dist/environment-runtime.d.ts +834 -0
  22. package/dist/environment-runtime.js +228 -0
  23. package/dist/execution-types.d.ts +47 -0
  24. package/dist/execution-types.js +1 -0
  25. package/dist/host-services.d.ts +91 -0
  26. package/dist/host-services.js +1 -0
  27. package/dist/index.d.ts +10 -617
  28. package/dist/index.js +10 -125
  29. package/dist/interaction-answer-validation.d.ts +13 -0
  30. package/dist/interaction-answer-validation.js +149 -0
  31. package/dist/interaction-data.d.ts +22 -0
  32. package/dist/interaction-data.js +46 -0
  33. package/dist/interaction-envelope.d.ts +258 -0
  34. package/dist/interaction-envelope.js +245 -0
  35. package/dist/interaction-fields.d.ts +130 -0
  36. package/dist/interaction-fields.js +227 -0
  37. package/dist/interaction-permissions.d.ts +28 -0
  38. package/dist/interaction-permissions.js +57 -0
  39. package/dist/interaction-resolution-validation.d.ts +9 -0
  40. package/dist/interaction-resolution-validation.js +50 -0
  41. package/dist/interaction-response-validation.d.ts +17 -0
  42. package/dist/interaction-response-validation.js +102 -0
  43. package/dist/interaction.d.ts +6 -397
  44. package/dist/interaction.js +6 -603
  45. package/dist/mcp.d.ts +38 -0
  46. package/dist/mcp.js +1 -0
  47. package/dist/parts.d.ts +104 -0
  48. package/dist/parts.js +55 -0
  49. package/dist/portable-context-base.d.ts +82 -0
  50. package/dist/portable-context-base.js +63 -0
  51. package/dist/portable-context-continuation.d.ts +168 -0
  52. package/dist/portable-context-continuation.js +194 -0
  53. package/dist/portable-context-plan-request.d.ts +86 -0
  54. package/dist/portable-context-plan-request.js +102 -0
  55. package/dist/portable-context-plan.d.ts +229 -0
  56. package/dist/portable-context-plan.js +241 -0
  57. package/dist/portable-context-shared.d.ts +36 -0
  58. package/dist/portable-context-shared.js +46 -0
  59. package/dist/portable-context-transfer.d.ts +319 -0
  60. package/dist/portable-context-transfer.js +206 -0
  61. package/dist/portable-context.d.ts +5 -753
  62. package/dist/portable-context.js +5 -754
  63. package/dist/profile-diff.js +56 -47
  64. package/dist/provider-adapter.d.ts +45 -0
  65. package/dist/provider-adapter.js +1 -0
  66. package/dist/provider-config.d.ts +58 -0
  67. package/dist/provider-config.js +42 -0
  68. package/dist/runtime-control.d.ts +87 -10
  69. package/dist/runtime-control.js +159 -38
  70. package/dist/stream-events.d.ts +55 -0
  71. package/dist/stream-events.js +1 -0
  72. package/dist/workspace-branching-shared.d.ts +7 -0
  73. package/dist/workspace-branching-shared.js +20 -0
  74. package/dist/workspace-branching.d.ts +4 -254
  75. package/dist/workspace-branching.js +4 -400
  76. package/dist/workspace-checkpoint.d.ts +99 -0
  77. package/dist/workspace-checkpoint.js +169 -0
  78. package/dist/workspace-cleanup.d.ts +85 -0
  79. package/dist/workspace-cleanup.js +156 -0
  80. package/dist/workspace-confidentiality.d.ts +59 -0
  81. package/dist/workspace-confidentiality.js +123 -0
  82. package/dist/workspace-fork.d.ts +182 -0
  83. package/dist/workspace-fork.js +267 -0
  84. package/package.json +1 -1
@@ -0,0 +1,267 @@
1
+ import { z } from "zod";
2
+ import { AgentExactRunControlRefSchema } from "./runtime-control.js";
3
+ import { idSchema, jsonRecordSchema, sameOptionalWireValue, sha256DigestSchema, wireDigest } from "./workspace-branching-shared.js";
4
+ import { WorkspaceCheckpointRefSchema } from "./workspace-checkpoint.js";
5
+ import { ConfidentialAttestationSchema, ConfidentialExecutionRequestSchema, confidentialExecutionVerified, } from "./workspace-confidentiality.js";
6
+ import { boundedStringSchema } from "./contract-limits.js";
7
+ const PlacementInfoSchema = z.strictObject({
8
+ kind: z.enum(["local", "sandbox", "fleet", "provider"]),
9
+ sandboxId: idSchema.optional(),
10
+ fleetId: idSchema.optional(),
11
+ machineId: idSchema.optional(),
12
+ region: idSchema.optional(),
13
+ providerMetadata: jsonRecordSchema.optional(),
14
+ });
15
+ const WorkspaceForkMaterialSchema = z.strictObject({
16
+ checkpoint: WorkspaceCheckpointRefSchema,
17
+ name: idSchema.optional(),
18
+ metadata: jsonRecordSchema.optional(),
19
+ placement: PlacementInfoSchema,
20
+ confidential: ConfidentialExecutionRequestSchema.optional(),
21
+ });
22
+ export function workspaceForkRequestDigest(material) {
23
+ const parsed = WorkspaceForkMaterialSchema.parse(material);
24
+ return wireDigest({
25
+ checkpoint: parsed.checkpoint,
26
+ ...(parsed.name === undefined ? {} : { name: parsed.name }),
27
+ ...(parsed.metadata === undefined ? {} : { metadata: parsed.metadata }),
28
+ placement: parsed.placement,
29
+ ...(parsed.confidential === undefined
30
+ ? {}
31
+ : { confidential: parsed.confidential }),
32
+ });
33
+ }
34
+ export const WorkspaceForkRequestSchema = z
35
+ .strictObject({
36
+ checkpoint: WorkspaceCheckpointRefSchema,
37
+ name: idSchema.optional(),
38
+ metadata: jsonRecordSchema.optional(),
39
+ placement: PlacementInfoSchema,
40
+ confidential: ConfidentialExecutionRequestSchema.optional(),
41
+ idempotencyKey: idSchema,
42
+ requestDigest: sha256DigestSchema,
43
+ })
44
+ .superRefine((request, refinement) => {
45
+ if (request.requestDigest !==
46
+ workspaceForkRequestDigest({
47
+ checkpoint: request.checkpoint,
48
+ name: request.name,
49
+ metadata: request.metadata,
50
+ placement: request.placement,
51
+ confidential: request.confidential,
52
+ })) {
53
+ refinement.addIssue({
54
+ code: "custom",
55
+ path: ["requestDigest"],
56
+ message: "fork request digest does not match its material",
57
+ });
58
+ }
59
+ if (request.confidential?.requested === true &&
60
+ (request.confidential.nonce === undefined ||
61
+ request.confidential.policy === undefined ||
62
+ request.confidential.profileDigest === undefined)) {
63
+ refinement.addIssue({
64
+ code: "custom",
65
+ path: ["confidential"],
66
+ message: "a confidential fork request must bind a nonce, policy, and profile digest",
67
+ });
68
+ }
69
+ });
70
+ export const ForkedEnvironmentRefSchema = z
71
+ .strictObject({
72
+ provider: idSchema,
73
+ environmentId: idSchema,
74
+ sourceEnvironmentId: idSchema,
75
+ source: AgentExactRunControlRefSchema,
76
+ sourceCheckpointId: idSchema,
77
+ idempotencyKey: idSchema,
78
+ requestDigest: sha256DigestSchema,
79
+ createdAt: z.iso.datetime().max(64),
80
+ placement: PlacementInfoSchema,
81
+ confidentialRequested: z.boolean(),
82
+ confidentialAttestation: ConfidentialAttestationSchema.optional(),
83
+ confidential: z.boolean().optional(),
84
+ metadata: jsonRecordSchema.optional(),
85
+ })
86
+ .superRefine((environment, refinement) => {
87
+ if (environment.environmentId === environment.sourceEnvironmentId) {
88
+ refinement.addIssue({
89
+ code: "custom",
90
+ path: ["environmentId"],
91
+ message: "a forked environment must differ from its source environment",
92
+ });
93
+ }
94
+ if (environment.source.environmentId !== environment.sourceEnvironmentId) {
95
+ refinement.addIssue({
96
+ code: "custom",
97
+ path: ["sourceEnvironmentId"],
98
+ message: "source environment id must match the complete source identity",
99
+ });
100
+ }
101
+ if (environment.provider !== environment.source.provider) {
102
+ refinement.addIssue({
103
+ code: "custom",
104
+ path: ["provider"],
105
+ message: "fork provider must match the source provider",
106
+ });
107
+ }
108
+ if (environment.confidentialAttestation !== undefined &&
109
+ environment.confidentialAttestation.environmentId !==
110
+ environment.environmentId) {
111
+ refinement.addIssue({
112
+ code: "custom",
113
+ path: ["confidentialAttestation", "environmentId"],
114
+ message: "attestation must be bound to the forked environment",
115
+ });
116
+ }
117
+ if (environment.confidentialAttestation !== undefined &&
118
+ environment.confidentialRequested !== true) {
119
+ refinement.addIssue({
120
+ code: "custom",
121
+ path: ["confidentialAttestation"],
122
+ message: "attestation cannot accompany a fork that did not request confidentiality",
123
+ });
124
+ }
125
+ });
126
+ /** The only supported way to decide whether a fork may be shown confidential. */
127
+ export function forkedEnvironmentConfidentialityVerified(request, environment, verifyProviderAttestation) {
128
+ const parsedRequest = WorkspaceForkRequestSchema.safeParse(request);
129
+ const parsedEnvironment = ForkedEnvironmentRefSchema.safeParse(environment);
130
+ if (!parsedRequest.success || !parsedEnvironment.success)
131
+ return false;
132
+ const exactRequest = parsedRequest.data;
133
+ const exactEnvironment = parsedEnvironment.data;
134
+ if (exactEnvironment.requestDigest !== exactRequest.requestDigest ||
135
+ exactEnvironment.provider !== exactRequest.checkpoint.provider ||
136
+ exactEnvironment.sourceCheckpointId !== exactRequest.checkpoint.checkpointId ||
137
+ exactEnvironment.sourceEnvironmentId !== exactRequest.checkpoint.source.environmentId ||
138
+ wireDigest(exactEnvironment.source) !==
139
+ wireDigest(exactRequest.checkpoint.source) ||
140
+ wireDigest(exactEnvironment.placement) !==
141
+ wireDigest(exactRequest.placement) ||
142
+ !sameOptionalWireValue(exactEnvironment.metadata, exactRequest.metadata)) {
143
+ return false;
144
+ }
145
+ return confidentialExecutionVerified({
146
+ request: exactRequest.confidential ?? { requested: false },
147
+ environment: {
148
+ provider: exactEnvironment.provider,
149
+ environmentId: exactEnvironment.environmentId,
150
+ source: exactEnvironment.source,
151
+ requestDigest: exactEnvironment.requestDigest,
152
+ confidentialRequested: exactEnvironment.confidentialRequested,
153
+ },
154
+ attestation: parsedEnvironment.data.confidentialAttestation,
155
+ ...(verifyProviderAttestation ? { verifyProviderAttestation } : {}),
156
+ });
157
+ }
158
+ const forkOperationBase = {
159
+ idempotencyKey: idSchema,
160
+ requestDigest: sha256DigestSchema,
161
+ };
162
+ export const WorkspaceForkResultSchema = z.discriminatedUnion("status", [
163
+ z.strictObject({
164
+ status: z.enum(["created", "replayed"]),
165
+ ...forkOperationBase,
166
+ environment: ForkedEnvironmentRefSchema,
167
+ }),
168
+ z.strictObject({
169
+ status: z.literal("conflict"),
170
+ ...forkOperationBase,
171
+ existingRequestDigest: sha256DigestSchema,
172
+ }),
173
+ z.strictObject({
174
+ status: z.literal("unknown"),
175
+ ...forkOperationBase,
176
+ message: boundedStringSchema.min(1),
177
+ retryable: z.boolean(),
178
+ }),
179
+ ]).superRefine((result, refinement) => {
180
+ if ((result.status === "created" || result.status === "replayed") &&
181
+ (result.environment.idempotencyKey !== result.idempotencyKey ||
182
+ result.environment.requestDigest !== result.requestDigest)) {
183
+ refinement.addIssue({
184
+ code: "custom",
185
+ path: ["environment"],
186
+ message: "forked environment identity must match its operation",
187
+ });
188
+ }
189
+ if (result.status === "conflict" &&
190
+ result.existingRequestDigest === result.requestDigest) {
191
+ refinement.addIssue({
192
+ code: "custom",
193
+ path: ["existingRequestDigest"],
194
+ message: "a conflict must identify a different existing request",
195
+ });
196
+ }
197
+ });
198
+ export const WorkspaceForkLookupResultSchema = z.discriminatedUnion("status", [
199
+ z.strictObject({
200
+ status: z.literal("found"),
201
+ ...forkOperationBase,
202
+ environment: ForkedEnvironmentRefSchema,
203
+ }),
204
+ z.strictObject({ status: z.literal("not_found"), ...forkOperationBase }),
205
+ z.strictObject({
206
+ status: z.literal("conflict"),
207
+ ...forkOperationBase,
208
+ existingRequestDigest: sha256DigestSchema,
209
+ }),
210
+ z.strictObject({
211
+ status: z.literal("unknown"),
212
+ ...forkOperationBase,
213
+ message: boundedStringSchema.min(1),
214
+ retryable: z.boolean(),
215
+ }),
216
+ ]).superRefine((result, refinement) => {
217
+ if (result.status === "found" &&
218
+ (result.environment.idempotencyKey !== result.idempotencyKey ||
219
+ result.environment.requestDigest !== result.requestDigest)) {
220
+ refinement.addIssue({
221
+ code: "custom",
222
+ path: ["environment"],
223
+ message: "forked environment identity must match its lookup operation",
224
+ });
225
+ }
226
+ if (result.status === "conflict" &&
227
+ result.existingRequestDigest === result.requestDigest) {
228
+ refinement.addIssue({
229
+ code: "custom",
230
+ path: ["existingRequestDigest"],
231
+ message: "a conflict must identify a different existing request",
232
+ });
233
+ }
234
+ });
235
+ export function workspaceForkResultMatchesRequest(request, result) {
236
+ const parsedRequest = WorkspaceForkRequestSchema.safeParse(request);
237
+ const parsedResult = WorkspaceForkResultSchema.safeParse(result);
238
+ const parsedLookup = WorkspaceForkLookupResultSchema.safeParse(result);
239
+ if (!parsedRequest.success)
240
+ return false;
241
+ const exactRequest = parsedRequest.data;
242
+ if (parsedResult.success &&
243
+ (parsedResult.data.status === "created" ||
244
+ parsedResult.data.status === "replayed")) {
245
+ return forkResultMatchesParsed(exactRequest, parsedResult.data);
246
+ }
247
+ if (parsedLookup.success && parsedLookup.data.status === "found") {
248
+ return forkResultMatchesParsed(exactRequest, parsedLookup.data);
249
+ }
250
+ return false;
251
+ }
252
+ function forkResultMatchesParsed(request, result) {
253
+ const source = request.checkpoint.source;
254
+ return (result.idempotencyKey === request.idempotencyKey &&
255
+ result.requestDigest === request.requestDigest &&
256
+ result.environment.idempotencyKey === request.idempotencyKey &&
257
+ result.environment.requestDigest === request.requestDigest &&
258
+ result.environment.sourceCheckpointId === request.checkpoint.checkpointId &&
259
+ result.environment.provider === request.checkpoint.provider &&
260
+ result.environment.sourceEnvironmentId === source.environmentId &&
261
+ wireDigest(result.environment.source) === wireDigest(source) &&
262
+ result.environment.environmentId !== source.environmentId &&
263
+ wireDigest(result.environment.placement) === wireDigest(request.placement) &&
264
+ result.environment.confidentialRequested ===
265
+ (request.confidential?.requested ?? false) &&
266
+ sameOptionalWireValue(result.environment.metadata, request.metadata));
267
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-interface",
3
- "version": "0.45.0",
3
+ "version": "0.46.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",