@tangle-network/agent-interface 0.44.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 (91) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-candidate-code-schema.d.ts +1 -0
  3. package/dist/agent-candidate-execution-plan-schema.d.ts +8 -6
  4. package/dist/agent-candidate-profile-schema.d.ts +3 -2
  5. package/dist/agent-candidate-promotion-schema.d.ts +59 -42
  6. package/dist/agent-candidate-receipt-schema.d.ts +5 -4
  7. package/dist/agent-candidate-schema-common.js +1 -1
  8. package/dist/agent-candidate-schema.d.ts +4 -2
  9. package/dist/agent-execution-preparation.d.ts +27 -26
  10. package/dist/agent-profile.d.ts +10 -3
  11. package/dist/agent-profile.js +45 -22
  12. package/dist/backend-message.d.ts +14 -0
  13. package/dist/backend-message.js +1 -0
  14. package/dist/contract-limits.d.ts +26 -0
  15. package/dist/contract-limits.js +175 -0
  16. package/dist/environment-exact-process.d.ts +161 -0
  17. package/dist/environment-exact-process.js +1 -0
  18. package/dist/environment-profile-capabilities.d.ts +26 -0
  19. package/dist/environment-profile-capabilities.js +34 -0
  20. package/dist/environment-provider.d.ts +3 -730
  21. package/dist/environment-provider.js +3 -245
  22. package/dist/environment-requests.d.ts +70 -0
  23. package/dist/environment-requests.js +1 -0
  24. package/dist/environment-runtime.d.ts +834 -0
  25. package/dist/environment-runtime.js +228 -0
  26. package/dist/execution-types.d.ts +47 -0
  27. package/dist/execution-types.js +1 -0
  28. package/dist/harness-capabilities.js +5 -0
  29. package/dist/harness.d.ts +6 -1
  30. package/dist/harness.js +1 -0
  31. package/dist/host-services.d.ts +91 -0
  32. package/dist/host-services.js +1 -0
  33. package/dist/index.d.ts +10 -617
  34. package/dist/index.js +10 -125
  35. package/dist/interaction-answer-validation.d.ts +13 -0
  36. package/dist/interaction-answer-validation.js +149 -0
  37. package/dist/interaction-data.d.ts +22 -0
  38. package/dist/interaction-data.js +46 -0
  39. package/dist/interaction-envelope.d.ts +258 -0
  40. package/dist/interaction-envelope.js +245 -0
  41. package/dist/interaction-fields.d.ts +130 -0
  42. package/dist/interaction-fields.js +227 -0
  43. package/dist/interaction-permissions.d.ts +28 -0
  44. package/dist/interaction-permissions.js +57 -0
  45. package/dist/interaction-resolution-validation.d.ts +9 -0
  46. package/dist/interaction-resolution-validation.js +50 -0
  47. package/dist/interaction-response-validation.d.ts +17 -0
  48. package/dist/interaction-response-validation.js +102 -0
  49. package/dist/interaction.d.ts +6 -397
  50. package/dist/interaction.js +6 -603
  51. package/dist/mcp.d.ts +38 -0
  52. package/dist/mcp.js +1 -0
  53. package/dist/parts.d.ts +104 -0
  54. package/dist/parts.js +55 -0
  55. package/dist/portable-context-base.d.ts +82 -0
  56. package/dist/portable-context-base.js +63 -0
  57. package/dist/portable-context-continuation.d.ts +168 -0
  58. package/dist/portable-context-continuation.js +194 -0
  59. package/dist/portable-context-plan-request.d.ts +86 -0
  60. package/dist/portable-context-plan-request.js +102 -0
  61. package/dist/portable-context-plan.d.ts +229 -0
  62. package/dist/portable-context-plan.js +241 -0
  63. package/dist/portable-context-shared.d.ts +36 -0
  64. package/dist/portable-context-shared.js +46 -0
  65. package/dist/portable-context-transfer.d.ts +319 -0
  66. package/dist/portable-context-transfer.js +206 -0
  67. package/dist/portable-context.d.ts +5 -753
  68. package/dist/portable-context.js +5 -754
  69. package/dist/profile-diff.js +56 -47
  70. package/dist/profile-schema.d.ts +1 -0
  71. package/dist/provider-adapter.d.ts +45 -0
  72. package/dist/provider-adapter.js +1 -0
  73. package/dist/provider-config.d.ts +58 -0
  74. package/dist/provider-config.js +42 -0
  75. package/dist/runtime-control.d.ts +87 -10
  76. package/dist/runtime-control.js +159 -38
  77. package/dist/stream-events.d.ts +55 -0
  78. package/dist/stream-events.js +1 -0
  79. package/dist/workspace-branching-shared.d.ts +7 -0
  80. package/dist/workspace-branching-shared.js +20 -0
  81. package/dist/workspace-branching.d.ts +4 -254
  82. package/dist/workspace-branching.js +4 -400
  83. package/dist/workspace-checkpoint.d.ts +99 -0
  84. package/dist/workspace-checkpoint.js +169 -0
  85. package/dist/workspace-cleanup.d.ts +85 -0
  86. package/dist/workspace-cleanup.js +156 -0
  87. package/dist/workspace-confidentiality.d.ts +59 -0
  88. package/dist/workspace-confidentiality.js +123 -0
  89. package/dist/workspace-fork.d.ts +182 -0
  90. package/dist/workspace-fork.js +267 -0
  91. 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.44.0",
3
+ "version": "0.46.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",