@hachej/boring-agent 0.1.95 → 0.1.96

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 (45) hide show
  1. package/dist/DebugDrawer-2TO5SE2D.js +7 -0
  2. package/dist/{chunk-NITBKFG6.js → chunk-3OEDBRKY.js} +93 -58
  3. package/dist/{chunk-BOIV2I3N.js → chunk-46HJK2ES.js} +31 -16
  4. package/dist/{chunk-AQBXNPMD.js → chunk-4IQ4HHBG.js} +4 -0
  5. package/dist/{chunk-OFQ7J6SI.js → chunk-LSO2AO6Q.js} +57 -1
  6. package/dist/{chunk-2EMAKBVR.js → chunk-NSE2RHU3.js} +8967 -7740
  7. package/dist/{chunk-2GBHYJVC.js → chunk-VXF5DWS6.js} +34 -0
  8. package/dist/{chunk-2TMS2RU2.js → chunk-WC5KBGP2.js} +518 -165
  9. package/dist/chunk-YGRQ4Q5P.js +20 -0
  10. package/dist/core/index.d.ts +5 -5
  11. package/dist/core/index.js +604 -7
  12. package/dist/{createHarness-UCD74XXK.js → createHarness-PW3A2MRB.js} +3 -3
  13. package/dist/{errors-G6T6S7PQ.d.ts → errors-cNC4HMpV.d.ts} +14 -7
  14. package/dist/eval/index.d.ts +5 -3
  15. package/dist/eval/index.js +31 -23
  16. package/dist/file-search-QxnanNjO.d.ts +87 -0
  17. package/dist/front/index.d.ts +84 -16
  18. package/dist/front/index.js +832 -339
  19. package/dist/front/styles.css +1171 -2129
  20. package/dist/{harness-Cc48o6uS.d.ts → harness-DS8jLKIx.d.ts} +4 -2
  21. package/dist/{lease-CusB-uLg.d.ts → lease-D8WC6pQl.d.ts} +10 -89
  22. package/dist/{middleware-CzW8n7B7.d.ts → middleware-Cq_cYHjJ.d.ts} +1 -1
  23. package/dist/piChatEvent-B3ehh9V0.d.ts +384 -0
  24. package/dist/{piChatSessionService-C0KbcGw9.d.ts → piChatSessionService-xnv8rcdh.d.ts} +1 -1
  25. package/dist/{sandbox-DAD8cWQR.d.ts → sandbox-KQiEdz4W.d.ts} +12 -1
  26. package/dist/server/agent-host/testing/compositionRouteProof.d.ts +8 -0
  27. package/dist/server/agent-host/testing/compositionRouteProof.js +78 -0
  28. package/dist/server/agent-host/testing/gatewayConformance.d.ts +6 -6
  29. package/dist/server/agent-host/testing/gatewayConformance.js +17 -9
  30. package/dist/server/index.d.ts +569 -370
  31. package/dist/server/index.js +69 -17
  32. package/dist/server/worker/index.d.ts +2 -2
  33. package/dist/server/worker/index.js +9 -9
  34. package/dist/shared/index.d.ts +212 -56
  35. package/dist/shared/index.js +43 -7
  36. package/dist/{types-C-Eroi__.d.ts → types-D_SD-7_l.d.ts} +304 -87
  37. package/docs/AGENT_GATEWAY_V0.md +6 -3
  38. package/docs/AGENT_PACKAGES.md +80 -0
  39. package/docs/ERROR_CODES.md +58 -0
  40. package/docs/README.md +1 -0
  41. package/docs/runtime.md +19 -2
  42. package/package.json +34 -29
  43. package/dist/DebugDrawer-RYEBQ6CO.js +0 -6
  44. package/dist/chunk-EOMY2HDT.js +0 -619
  45. package/dist/piChatEvent-BsMp3MSo.d.ts +0 -368
@@ -0,0 +1,7 @@
1
+ import {
2
+ DebugDrawer
3
+ } from "./chunk-46HJK2ES.js";
4
+ import "./chunk-YGRQ4Q5P.js";
5
+ export {
6
+ DebugDrawer
7
+ };
@@ -1,13 +1,47 @@
1
+ import {
2
+ safeRandomUUID
3
+ } from "./chunk-YGRQ4Q5P.js";
1
4
  import {
2
5
  AgentConsumptionErrorCode,
3
6
  AgentDefinitionErrorCode,
4
7
  AgentDeploymentErrorCode,
5
8
  ErrorCode
6
- } from "./chunk-2GBHYJVC.js";
9
+ } from "./chunk-VXF5DWS6.js";
10
+
11
+ // src/shared/skill-resource.ts
12
+ var AGENT_RESOURCES_FILESYSTEM_ID = "agent_resources";
13
+ var AGENT_KNOWLEDGE_FILESYSTEM_ID = "agent_knowledge";
14
+
15
+ // src/shared/workspace.ts
16
+ var READONLY_FILESYSTEM_MUTATION_CODE = "readonly";
17
+ var RUNTIME_FILESYSTEM_CAPABILITIES = Object.freeze([
18
+ "read",
19
+ "write",
20
+ "create-child",
21
+ "delete",
22
+ "move-from"
23
+ ]);
24
+ var ReadonlyFilesystemMutationError = class extends Error {
25
+ code = READONLY_FILESYSTEM_MUTATION_CODE;
26
+ statusCode = 403;
27
+ filesystem;
28
+ operation;
29
+ constructor(filesystem, operation) {
30
+ super(`${filesystem} binding is readonly`);
31
+ this.name = "ReadonlyFilesystemMutationError";
32
+ this.filesystem = filesystem;
33
+ this.operation = operation;
34
+ }
35
+ };
36
+ function isReadonlyFilesystemMutationError(value) {
37
+ if (!value || typeof value !== "object") return false;
38
+ const candidate = value;
39
+ return candidate.code === READONLY_FILESYSTEM_MUTATION_CODE && candidate.statusCode === 403 && typeof candidate.filesystem === "string" && RUNTIME_FILESYSTEM_CAPABILITIES.includes(candidate.operation);
40
+ }
7
41
 
8
42
  // src/shared/config-schema.ts
9
43
  import { z } from "zod";
10
- var RuntimeModeSchema = z.enum(["direct", "local", "vercel-sandbox"]);
44
+ var RuntimeModeSchema = z.enum(["direct", "local", "blaxel", "vercel-sandbox"]);
11
45
  var ConfigSchema = z.object({
12
46
  workspaceRoot: z.string(),
13
47
  workspaceId: z.string(),
@@ -53,7 +87,16 @@ var EnvSchema = z.object({
53
87
  VERCEL_TOKEN: z.string().optional(),
54
88
  VERCEL_TEAM_ID: z.string().optional(),
55
89
  VERCEL_PROJECT_ID: z.string().optional(),
56
- BORING_AGENT_VERCEL_SANDBOX_TIMEOUT_MS: z.coerce.number().int().positive().optional()
90
+ BORING_AGENT_VERCEL_SANDBOX_TIMEOUT_MS: z.coerce.number().int().positive().optional(),
91
+ BL_WORKSPACE: z.string().optional(),
92
+ BL_API_KEY: z.string().optional(),
93
+ BORING_BLAXEL_IMAGE: z.string().optional(),
94
+ BORING_BLAXEL_MEMORY_MB: z.coerce.number().int().positive().optional(),
95
+ BORING_BLAXEL_REGION: z.string().optional(),
96
+ BORING_BLAXEL_VOLUME_SIZE_MB: z.coerce.number().int().positive().optional(),
97
+ BORING_BLAXEL_TTL: z.string().optional(),
98
+ BORING_BLAXEL_IDLE_TTL: z.string().optional(),
99
+ BORING_BLAXEL_TERMINATED_RETENTION: z.string().optional()
57
100
  });
58
101
  function validateConfig(config) {
59
102
  return ConfigSchema.parse(config);
@@ -569,55 +612,6 @@ function assertWithinConsumptionDepth(chain, guards) {
569
612
  }
570
613
  }
571
614
 
572
- // src/shared/gateway/errors.ts
573
- var AgentGatewayErrorCode = {
574
- AGENT_TYPE_UNKNOWN: "AGENT_TYPE_UNKNOWN",
575
- AGENT_SESSION_NOT_FOUND: "AGENT_SESSION_NOT_FOUND",
576
- AGENT_SCOPE_DENIED: "AGENT_SCOPE_DENIED",
577
- AGENT_SESSION_REPLAY_GAP: "AGENT_SESSION_REPLAY_GAP",
578
- AGENT_SESSION_CURSOR_AHEAD: "AGENT_SESSION_CURSOR_AHEAD",
579
- AGENT_SESSION_CURSOR_EXPIRED: "AGENT_SESSION_CURSOR_EXPIRED",
580
- AGENT_SESSION_CURSOR_INVALID: "AGENT_SESSION_CURSOR_INVALID",
581
- AGENT_REQUEST_CONFLICT: "AGENT_REQUEST_CONFLICT",
582
- AGENT_REQUEST_OUTCOME_UNKNOWN: "AGENT_REQUEST_OUTCOME_UNKNOWN",
583
- AGENT_COMMAND_INVALID_STATE: "AGENT_COMMAND_INVALID_STATE",
584
- AGENT_SESSION_RUNTIME_SCOPE_MISMATCH: "AGENT_SESSION_RUNTIME_SCOPE_MISMATCH",
585
- AGENT_SHARED_ENVIRONMENT_UNAVAILABLE: "AGENT_SHARED_ENVIRONMENT_UNAVAILABLE",
586
- AGENT_GATEWAY_CLOSED: "AGENT_GATEWAY_CLOSED"
587
- };
588
- var AGENT_GATEWAY_ERROR_CODES = [
589
- AgentGatewayErrorCode.AGENT_TYPE_UNKNOWN,
590
- AgentGatewayErrorCode.AGENT_SESSION_NOT_FOUND,
591
- AgentGatewayErrorCode.AGENT_SCOPE_DENIED,
592
- AgentGatewayErrorCode.AGENT_SESSION_REPLAY_GAP,
593
- AgentGatewayErrorCode.AGENT_SESSION_CURSOR_AHEAD,
594
- AgentGatewayErrorCode.AGENT_SESSION_CURSOR_EXPIRED,
595
- AgentGatewayErrorCode.AGENT_SESSION_CURSOR_INVALID,
596
- AgentGatewayErrorCode.AGENT_REQUEST_CONFLICT,
597
- AgentGatewayErrorCode.AGENT_REQUEST_OUTCOME_UNKNOWN,
598
- AgentGatewayErrorCode.AGENT_COMMAND_INVALID_STATE,
599
- AgentGatewayErrorCode.AGENT_SESSION_RUNTIME_SCOPE_MISMATCH,
600
- AgentGatewayErrorCode.AGENT_SHARED_ENVIRONMENT_UNAVAILABLE,
601
- AgentGatewayErrorCode.AGENT_GATEWAY_CLOSED
602
- ];
603
- var AgentGatewayError = class extends Error {
604
- code;
605
- details;
606
- constructor(code, message, details) {
607
- super(message);
608
- this.name = "AgentGatewayError";
609
- this.code = code;
610
- this.details = details;
611
- }
612
- toJSON() {
613
- return {
614
- code: this.code,
615
- message: this.message,
616
- ...this.details === void 0 ? {} : { details: this.details }
617
- };
618
- }
619
- };
620
-
621
615
  // src/shared/share-entry.ts
622
616
  import { z as z5 } from "zod";
623
617
  var nonEmptyString2 = z5.string().min(1);
@@ -626,7 +620,7 @@ function isOpaqueLocatorId2(value) {
626
620
  }
627
621
  var OpaqueShareLocatorIdSchema = z5.string().min(1, "must be a non-empty opaque id").max(256, "must be at most 256 characters").refine(isOpaqueLocatorId2, "must be an opaque platform-owned id (no path separators, no scheme, no traversal)");
628
622
  function mintShareEntryId() {
629
- return globalThis.crypto.randomUUID();
623
+ return safeRandomUUID();
630
624
  }
631
625
  var ShareEntryProvenanceSchema = z5.object({
632
626
  producerPrincipalRef: nonEmptyString2,
@@ -731,6 +725,7 @@ var CREDENTIAL_ERROR_CODES = {
731
725
  SCHEMA_MISMATCH: "CREDENTIAL_SCHEMA_MISMATCH",
732
726
  UNREADABLE: "CREDENTIAL_UNREADABLE",
733
727
  BACKEND_UNAVAILABLE: "CREDENTIAL_BACKEND_UNAVAILABLE",
728
+ KEK_UNAVAILABLE: "CREDENTIAL_KEK_UNAVAILABLE",
734
729
  LEASE_EXPIRED: "CREDENTIAL_LEASE_EXPIRED",
735
730
  OAUTH_STATE_INVALID: "CREDENTIAL_OAUTH_STATE_INVALID",
736
731
  OAUTH_REFRESH_FAILED: "CREDENTIAL_OAUTH_REFRESH_FAILED"
@@ -786,7 +781,7 @@ function validateHttpsOrigin(value) {
786
781
  schemaMismatch("Invalid sandbox egress origin");
787
782
  }
788
783
  }
789
- function providerFields(provider) {
784
+ function providerCredentialFieldsV1(provider) {
790
785
  if (provider.credential.type === "api-key") return provider.credential.fields;
791
786
  if (provider.credential.type === "oauth2-authorization-code" && provider.credential.tokenCustody === "local-vault") {
792
787
  return [
@@ -827,7 +822,9 @@ function validateBinding(binding, providerRegistry) {
827
822
  if (!provider.consumerBindingIds.includes(binding.id)) {
828
823
  schemaMismatch("Provider does not declare consumer binding");
829
824
  }
830
- const availableFieldIds = new Set(providerFields(provider).map((field) => field.id));
825
+ const availableFieldIds = new Set(
826
+ providerCredentialFieldsV1(provider).map((field) => field.id)
827
+ );
831
828
  const allowedFieldIds = /* @__PURE__ */ new Set();
832
829
  for (const fieldId of binding.allowedFieldIds) {
833
830
  validateCredentialId(fieldId, "allowed credential field id");
@@ -889,6 +886,15 @@ function createCredentialConsumerBindingRegistryV1(bindings, providerRegistry) {
889
886
  });
890
887
  }
891
888
 
889
+ // src/shared/credentials/kmsBackend.ts
890
+ var WORKSPACE_KEK_PROVIDER_VERSION = "boring.workspace-kek-provider.v1";
891
+ var CREDENTIAL_ENVELOPE_VERSION = "boring.credential-envelope.v1";
892
+ var CREDENTIAL_AAD_ENCODING_VERSION = "boring.credential-aad.v1";
893
+ var CREDENTIAL_DEK_BYTE_LENGTH_V1 = 32;
894
+ var CREDENTIAL_KEK_BYTE_LENGTH_V1 = 32;
895
+ var CREDENTIAL_NONCE_BYTE_LENGTH_V1 = 12;
896
+ var CREDENTIAL_AUTH_TAG_BYTE_LENGTH_V1 = 16;
897
+
892
898
  // src/shared/credentials/ref.ts
893
899
  var PROVIDER_CREDENTIAL_REF_VERSION = "boring.provider-credential-ref.v1";
894
900
  var MAX_EXECUTION_ID_LENGTH_V1 = 256;
@@ -1168,6 +1174,22 @@ function createProviderRegistryV1(defs) {
1168
1174
  var SANDBOX_CREDENTIAL_MAX_FIELDS_V1 = 16;
1169
1175
  var SANDBOX_CREDENTIAL_MAX_METADATA_BYTES_V1 = 16384;
1170
1176
  var SANDBOX_CREDENTIAL_MAX_TOTAL_BYTES_V1 = 65536;
1177
+ function sandboxCredentialPayloadMetadataBytesV1(payload) {
1178
+ return new TextEncoder().encode(JSON.stringify({
1179
+ contractVersion: payload.contractVersion,
1180
+ workspaceId: payload.workspaceId,
1181
+ sandboxId: payload.sandboxId,
1182
+ executionId: payload.executionId,
1183
+ deliveryAttemptId: payload.deliveryAttemptId,
1184
+ bindingId: payload.bindingId,
1185
+ credentialVersion: payload.credentialVersion,
1186
+ expiresAt: payload.expiresAt,
1187
+ fields: payload.fields.map((field) => ({
1188
+ fieldId: field.fieldId,
1189
+ byteLength: field.value.byteLength
1190
+ }))
1191
+ })).byteLength;
1192
+ }
1171
1193
  function createNotImplementedSandboxCredentialPayloadResolverV1() {
1172
1194
  return Object.freeze({
1173
1195
  contractVersion: "boring.sandbox-credential-payload-resolver.v1",
@@ -1181,12 +1203,19 @@ function createNotImplementedSandboxCredentialPayloadResolverV1() {
1181
1203
  }
1182
1204
 
1183
1205
  export {
1206
+ AGENT_RESOURCES_FILESYSTEM_ID,
1207
+ AGENT_KNOWLEDGE_FILESYSTEM_ID,
1208
+ READONLY_FILESYSTEM_MUTATION_CODE,
1209
+ RUNTIME_FILESYSTEM_CAPABILITIES,
1210
+ ReadonlyFilesystemMutationError,
1211
+ isReadonlyFilesystemMutationError,
1184
1212
  RuntimeModeSchema,
1185
1213
  ConfigSchema,
1186
1214
  EnvSchema,
1187
1215
  validateConfig,
1188
1216
  DEFAULT_AGENT_RUNTIME_CAPABILITIES,
1189
1217
  PI_AGENT_RUNTIME_CAPABILITIES,
1218
+ sha256,
1190
1219
  sha256Bytes,
1191
1220
  canonicalStringify,
1192
1221
  OpaqueRefSchema,
@@ -1223,9 +1252,6 @@ export {
1223
1252
  assertNoConsumptionCycle,
1224
1253
  isWithinConsumptionDepth,
1225
1254
  assertWithinConsumptionDepth,
1226
- AgentGatewayErrorCode,
1227
- AGENT_GATEWAY_ERROR_CODES,
1228
- AgentGatewayError,
1229
1255
  OpaqueShareLocatorIdSchema,
1230
1256
  ShareEntryProvenanceSchema,
1231
1257
  ShareEntryV1Schema,
@@ -1235,12 +1261,21 @@ export {
1235
1261
  resolveShareEntry,
1236
1262
  CREDENTIAL_ERROR_CODES,
1237
1263
  CredentialResolutionError,
1264
+ providerCredentialFieldsV1,
1238
1265
  createCredentialConsumerBindingRegistryV1,
1266
+ WORKSPACE_KEK_PROVIDER_VERSION,
1267
+ CREDENTIAL_ENVELOPE_VERSION,
1268
+ CREDENTIAL_AAD_ENCODING_VERSION,
1269
+ CREDENTIAL_DEK_BYTE_LENGTH_V1,
1270
+ CREDENTIAL_KEK_BYTE_LENGTH_V1,
1271
+ CREDENTIAL_NONCE_BYTE_LENGTH_V1,
1272
+ CREDENTIAL_AUTH_TAG_BYTE_LENGTH_V1,
1239
1273
  PROVIDER_CREDENTIAL_REF_VERSION,
1240
1274
  createProviderCredentialRefFactoryV1,
1241
1275
  createProviderRegistryV1,
1242
1276
  SANDBOX_CREDENTIAL_MAX_FIELDS_V1,
1243
1277
  SANDBOX_CREDENTIAL_MAX_METADATA_BYTES_V1,
1244
1278
  SANDBOX_CREDENTIAL_MAX_TOTAL_BYTES_V1,
1279
+ sandboxCredentialPayloadMetadataBytesV1,
1245
1280
  createNotImplementedSandboxCredentialPayloadResolverV1
1246
1281
  };
@@ -1,6 +1,28 @@
1
+ import {
2
+ safeRandomUUID
3
+ } from "./chunk-YGRQ4Q5P.js";
4
+
1
5
  // src/front/DebugDrawer.tsx
2
6
  import { useCallback, useEffect, useRef, useState } from "react";
3
7
 
8
+ // src/front/agentHttp.ts
9
+ function agentResourceUrl(apiBaseUrl, path) {
10
+ const base = apiBaseUrl?.replace(/\/$/, "") ?? "";
11
+ return `${base}${path}`;
12
+ }
13
+ function withStorageScope(requestHeaders, storageScope) {
14
+ const headers = {};
15
+ for (const [key, value] of Object.entries(requestHeaders ?? {})) {
16
+ if (value !== void 0) headers[key] = value;
17
+ }
18
+ const hasStorageScope = Object.keys(headers).some((key) => key.toLowerCase() === "x-boring-storage-scope");
19
+ if (storageScope && !hasStorageScope) headers["x-boring-storage-scope"] = storageScope;
20
+ return Object.keys(headers).length > 0 ? headers : void 0;
21
+ }
22
+ function createRequestId(operation) {
23
+ return `${operation}:${safeRandomUUID()}`;
24
+ }
25
+
4
26
  // src/front/clipboard.ts
5
27
  async function copyTextToClipboard(text) {
6
28
  if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) {
@@ -89,6 +111,7 @@ function SessionTab({ sessionId }) {
89
111
  var RETRY_DELAY_MS = 2500;
90
112
  var MAX_RETRIES = 20;
91
113
  function SystemPromptTab({
114
+ agentTypeId,
92
115
  apiBaseUrl,
93
116
  fetch: fetchImpl,
94
117
  sessionId,
@@ -107,8 +130,8 @@ function SystemPromptTab({
107
130
  let retryTimer = null;
108
131
  setState({ kind: "loading" });
109
132
  const nextFetch = fetchImpl ?? globalThis.fetch.bind(globalThis);
110
- nextFetch(agentResourceUrl(apiBaseUrl, `/api/v1/agent/sessions/${encodeURIComponent(sessionId)}/system-prompt`), {
111
- headers: scopedHeaders(requestHeaders, storageScope)
133
+ nextFetch(agentResourceUrl(apiBaseUrl, `/api/v1/agents/${encodeURIComponent(agentTypeId)}/sessions/${encodeURIComponent(sessionId)}/system-prompt`), {
134
+ headers: withStorageScope(requestHeaders, storageScope)
112
135
  }).then(async (res) => {
113
136
  if (aborted) return;
114
137
  if (res.ok) {
@@ -139,7 +162,7 @@ function SystemPromptTab({
139
162
  aborted = true;
140
163
  if (retryTimer) clearTimeout(retryTimer);
141
164
  };
142
- }, [apiBaseUrl, fetchImpl, sessionId, requestHeaders, retryKey, storageScope]);
165
+ }, [agentTypeId, apiBaseUrl, fetchImpl, sessionId, requestHeaders, retryKey, storageScope]);
143
166
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full min-h-0", children: [
144
167
  /* @__PURE__ */ jsxs("div", { className: "shrink-0 flex items-center justify-between px-3 pt-2 pb-1 border-b border-border/40", children: [
145
168
  /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground/80 font-mono", children: state.kind === "ok" ? `${state.text.length.toLocaleString()} chars` : state.kind === "loading" ? "loading\u2026" : state.kind === "empty" ? `waiting for session \xB7 retry ${retryCount.current}/${MAX_RETRIES}` : "error" }),
@@ -262,7 +285,7 @@ var TABS = [
262
285
  ];
263
286
  var MIN_WIDTH = 280;
264
287
  var MAX_WIDTH = 800;
265
- function DebugDrawer({ apiBaseUrl, fetch, sessionId, messages, requestHeaders, storageScope, width, onWidthChange }) {
288
+ function DebugDrawer({ agentTypeId, apiBaseUrl, fetch, sessionId, messages, requestHeaders, storageScope, width, onWidthChange }) {
266
289
  const [tab, setTab] = useState("session");
267
290
  const onDragStart = useCallback((e) => {
268
291
  e.preventDefault();
@@ -307,27 +330,19 @@ function DebugDrawer({ apiBaseUrl, fetch, sessionId, messages, requestHeaders, s
307
330
  id
308
331
  )) }) }),
309
332
  /* @__PURE__ */ jsx(TabsContent, { value: "session", forceMount: true, className: "flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden", children: /* @__PURE__ */ jsx(SessionTab, { sessionId }) }),
310
- /* @__PURE__ */ jsx(TabsContent, { value: "prompt", forceMount: true, className: "flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden", children: /* @__PURE__ */ jsx(SystemPromptTab, { apiBaseUrl, fetch, sessionId, requestHeaders, storageScope }) }),
333
+ /* @__PURE__ */ jsx(TabsContent, { value: "prompt", forceMount: true, className: "flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden", children: /* @__PURE__ */ jsx(SystemPromptTab, { agentTypeId, apiBaseUrl, fetch, sessionId, requestHeaders, storageScope }) }),
311
334
  /* @__PURE__ */ jsx(TabsContent, { value: "messages", forceMount: true, className: "flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden", children: /* @__PURE__ */ jsx(MessagesTab, { messages }) })
312
335
  ] })
313
336
  }
314
337
  )
315
338
  ] });
316
339
  }
317
- function agentResourceUrl(apiBaseUrl, path) {
318
- const base = apiBaseUrl?.replace(/\/$/, "") ?? "";
319
- return `${base}${path}`;
320
- }
321
- function scopedHeaders(headers, storageScope) {
322
- if (!headers && !storageScope) return void 0;
323
- const result = { ...headers ?? {} };
324
- const hasStorageScope = Object.keys(result).some((key) => key.toLowerCase() === "x-boring-storage-scope");
325
- if (storageScope && !hasStorageScope) result["x-boring-storage-scope"] = storageScope;
326
- return result;
327
- }
328
340
 
329
341
  export {
330
342
  cn,
331
343
  copyTextToClipboard,
344
+ agentResourceUrl,
345
+ withStorageScope,
346
+ createRequestId,
332
347
  DebugDrawer
333
348
  };
@@ -1,3 +1,6 @@
1
+ // src/shared/session.ts
2
+ var SAFE_NATIVE_SESSION_ID = /^[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*$/;
3
+
1
4
  // src/shared/telemetry.ts
2
5
  var noopTelemetry = {
3
6
  capture() {
@@ -12,6 +15,7 @@ function safeCapture(telemetry, event) {
12
15
  }
13
16
 
14
17
  export {
18
+ SAFE_NATIVE_SESSION_ID,
15
19
  noopTelemetry,
16
20
  safeCapture
17
21
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ErrorCode
3
- } from "./chunk-2GBHYJVC.js";
3
+ } from "./chunk-VXF5DWS6.js";
4
4
 
5
5
  // src/shared/tool-ui.ts
6
6
  function isRecord(value) {
@@ -33,6 +33,59 @@ function extractToolUiMetadata(output) {
33
33
  var WORKSPACE_AGENT_PLUGINS_RELOADED_EVENT = "boring-ui:agent-plugins-reloaded";
34
34
  var WORKSPACE_COMMAND_NOTIFY_EVENT = "boring-ui:command-notify";
35
35
 
36
+ // src/shared/gateway/errors.ts
37
+ var AgentGatewayErrorCode = {
38
+ AGENT_TYPE_UNKNOWN: "AGENT_TYPE_UNKNOWN",
39
+ AGENT_SESSION_NOT_FOUND: "AGENT_SESSION_NOT_FOUND",
40
+ AGENT_SCOPE_DENIED: "AGENT_SCOPE_DENIED",
41
+ AGENT_SESSION_REPLAY_GAP: "AGENT_SESSION_REPLAY_GAP",
42
+ AGENT_SESSION_CURSOR_AHEAD: "AGENT_SESSION_CURSOR_AHEAD",
43
+ AGENT_SESSION_CURSOR_EXPIRED: "AGENT_SESSION_CURSOR_EXPIRED",
44
+ AGENT_SESSION_CURSOR_INVALID: "AGENT_SESSION_CURSOR_INVALID",
45
+ AGENT_REQUEST_CONFLICT: "AGENT_REQUEST_CONFLICT",
46
+ AGENT_REQUEST_IN_PROGRESS: "AGENT_REQUEST_IN_PROGRESS",
47
+ AGENT_REQUEST_OUTCOME_UNKNOWN: "AGENT_REQUEST_OUTCOME_UNKNOWN",
48
+ AGENT_RUNTIME_RESTART_REQUIRED: "AGENT_RUNTIME_RESTART_REQUIRED",
49
+ AGENT_COMMAND_INVALID_STATE: "AGENT_COMMAND_INVALID_STATE",
50
+ AGENT_SESSION_RUNTIME_SCOPE_MISMATCH: "AGENT_SESSION_RUNTIME_SCOPE_MISMATCH",
51
+ AGENT_SHARED_ENVIRONMENT_UNAVAILABLE: "AGENT_SHARED_ENVIRONMENT_UNAVAILABLE",
52
+ AGENT_GATEWAY_CLOSED: "AGENT_GATEWAY_CLOSED"
53
+ };
54
+ var AGENT_GATEWAY_ERROR_CODES = [
55
+ AgentGatewayErrorCode.AGENT_TYPE_UNKNOWN,
56
+ AgentGatewayErrorCode.AGENT_SESSION_NOT_FOUND,
57
+ AgentGatewayErrorCode.AGENT_SCOPE_DENIED,
58
+ AgentGatewayErrorCode.AGENT_SESSION_REPLAY_GAP,
59
+ AgentGatewayErrorCode.AGENT_SESSION_CURSOR_AHEAD,
60
+ AgentGatewayErrorCode.AGENT_SESSION_CURSOR_EXPIRED,
61
+ AgentGatewayErrorCode.AGENT_SESSION_CURSOR_INVALID,
62
+ AgentGatewayErrorCode.AGENT_REQUEST_CONFLICT,
63
+ AgentGatewayErrorCode.AGENT_REQUEST_IN_PROGRESS,
64
+ AgentGatewayErrorCode.AGENT_REQUEST_OUTCOME_UNKNOWN,
65
+ AgentGatewayErrorCode.AGENT_RUNTIME_RESTART_REQUIRED,
66
+ AgentGatewayErrorCode.AGENT_COMMAND_INVALID_STATE,
67
+ AgentGatewayErrorCode.AGENT_SESSION_RUNTIME_SCOPE_MISMATCH,
68
+ AgentGatewayErrorCode.AGENT_SHARED_ENVIRONMENT_UNAVAILABLE,
69
+ AgentGatewayErrorCode.AGENT_GATEWAY_CLOSED
70
+ ];
71
+ var AgentGatewayError = class extends Error {
72
+ code;
73
+ details;
74
+ constructor(code, message, details) {
75
+ super(message);
76
+ this.name = "AgentGatewayError";
77
+ this.code = code;
78
+ this.details = details;
79
+ }
80
+ toJSON() {
81
+ return {
82
+ code: this.code,
83
+ message: this.message,
84
+ ...this.details === void 0 ? {} : { details: this.details }
85
+ };
86
+ }
87
+ };
88
+
36
89
  // src/shared/chat/piChatSchemas.ts
37
90
  import { z } from "zod";
38
91
  var nonEmptyString = z.string().min(1);
@@ -269,6 +322,9 @@ export {
269
322
  extractToolUiMetadata,
270
323
  WORKSPACE_AGENT_PLUGINS_RELOADED_EVENT,
271
324
  WORKSPACE_COMMAND_NOTIFY_EVENT,
325
+ AgentGatewayErrorCode,
326
+ AGENT_GATEWAY_ERROR_CODES,
327
+ AgentGatewayError,
272
328
  ToolUiMetadataSchema,
273
329
  sanitizeToolUiMetadata2,
274
330
  ChatErrorSchema,