@hachej/boring-agent 0.1.94 → 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.
- package/dist/DebugDrawer-2TO5SE2D.js +7 -0
- package/dist/{chunk-NITBKFG6.js → chunk-3OEDBRKY.js} +93 -58
- package/dist/{chunk-BOIV2I3N.js → chunk-46HJK2ES.js} +31 -16
- package/dist/{chunk-AQBXNPMD.js → chunk-4IQ4HHBG.js} +4 -0
- package/dist/{chunk-OFQ7J6SI.js → chunk-LSO2AO6Q.js} +57 -1
- package/dist/{chunk-N4AATPH7.js → chunk-NSE2RHU3.js} +8973 -7731
- package/dist/{chunk-2GBHYJVC.js → chunk-VXF5DWS6.js} +34 -0
- package/dist/{chunk-2TMS2RU2.js → chunk-WC5KBGP2.js} +518 -165
- package/dist/chunk-YGRQ4Q5P.js +20 -0
- package/dist/core/index.d.ts +5 -5
- package/dist/core/index.js +604 -7
- package/dist/{createHarness-UCD74XXK.js → createHarness-PW3A2MRB.js} +3 -3
- package/dist/{errors-G6T6S7PQ.d.ts → errors-cNC4HMpV.d.ts} +14 -7
- package/dist/eval/index.d.ts +5 -3
- package/dist/eval/index.js +31 -23
- package/dist/file-search-QxnanNjO.d.ts +87 -0
- package/dist/front/index.d.ts +87 -17
- package/dist/front/index.js +1232 -690
- package/dist/front/styles.css +1228 -2167
- package/dist/{harness-Cc48o6uS.d.ts → harness-DS8jLKIx.d.ts} +4 -2
- package/dist/{lease-CusB-uLg.d.ts → lease-D8WC6pQl.d.ts} +10 -89
- package/dist/{middleware-CzW8n7B7.d.ts → middleware-Cq_cYHjJ.d.ts} +1 -1
- package/dist/piChatEvent-B3ehh9V0.d.ts +384 -0
- package/dist/{piChatSessionService-C0KbcGw9.d.ts → piChatSessionService-xnv8rcdh.d.ts} +1 -1
- package/dist/{sandbox-DAD8cWQR.d.ts → sandbox-KQiEdz4W.d.ts} +12 -1
- package/dist/server/agent-host/testing/compositionRouteProof.d.ts +8 -0
- package/dist/server/agent-host/testing/compositionRouteProof.js +78 -0
- package/dist/server/agent-host/testing/gatewayConformance.d.ts +6 -6
- package/dist/server/agent-host/testing/gatewayConformance.js +17 -9
- package/dist/server/index.d.ts +570 -370
- package/dist/server/index.js +69 -17
- package/dist/server/worker/index.d.ts +2 -2
- package/dist/server/worker/index.js +9 -9
- package/dist/shared/index.d.ts +212 -56
- package/dist/shared/index.js +43 -7
- package/dist/{types-C-Eroi__.d.ts → types-D_SD-7_l.d.ts} +304 -87
- package/docs/AGENT_GATEWAY_V0.md +6 -3
- package/docs/AGENT_PACKAGES.md +80 -0
- package/docs/ERROR_CODES.md +58 -0
- package/docs/README.md +1 -0
- package/docs/runtime.md +19 -2
- package/package.json +34 -29
- package/dist/DebugDrawer-RYEBQ6CO.js +0 -6
- package/dist/chunk-EOMY2HDT.js +0 -619
- package/dist/piChatEvent-BsMp3MSo.d.ts +0 -368
package/docs/ERROR_CODES.md
CHANGED
|
@@ -26,6 +26,7 @@ All API failures must use the response envelope:
|
|
|
26
26
|
| `INVALID_API_KEY` | Provider rejects API key as malformed/invalid | 401 | re-auth | warn | stable (public API) |
|
|
27
27
|
| `OIDC_REFRESH_FAILED` | OIDC refresh token exchange fails | 401 | re-auth | warn | stable (public API) |
|
|
28
28
|
| `VERCEL_AUTH_FAILED` | Vercel sandbox auth/token request fails | 401 | re-auth | warn | stable (public API) |
|
|
29
|
+
| `BLAXEL_AUTH_FAILED` | Blaxel sandbox auth/workspace request fails | 401 | re-auth | warn | stable (public API) |
|
|
29
30
|
| `CONFIG_INVALID` | Runtime config fails schema validation | 500 | report-bug | error | stable (public API) |
|
|
30
31
|
| `PATH_ESCAPE` | Relative path escapes workspace root | 403 | user-fix | warn | stable (public API) |
|
|
31
32
|
| `PATH_ABSOLUTE` | Absolute path rejected where relative path is required | 400 | user-fix | warn | stable (public API) |
|
|
@@ -42,6 +43,12 @@ All API failures must use the response envelope:
|
|
|
42
43
|
| `AGENT_FLEET_PLUGIN_UNKNOWN` | Agent fleet configuration references a plugin that the app did not load | 500 | fix app configuration | error | stable (trusted API) |
|
|
43
44
|
| `AGENT_FLEET_CONFIG_BINDING_UNKNOWN` | Agent fleet configuration passes a plugin config key outside its declared Agent config contract | 500 | fix app configuration | error | stable (trusted API) |
|
|
44
45
|
| `AGENT_FLEET_MODEL_POLICY_UNCOMPILED` | Agent fleet configuration declares a model policy that the app fleet compiler did not resolve | 500 | configure app fleet compiler | error | stable (trusted API) |
|
|
46
|
+
| `AGENT_FLEET_SEAT_PERSONA_INVALID` | `loadConfiguredAgentFleet` excluded a fleet.yaml seat because its persona package failed to materialize or compose | 500 | fix persona package/spec | error | stable (trusted API) |
|
|
47
|
+
| `AGENT_FLEET_SEAT_SKILL_DIGEST_MISMATCH` | `loadConfiguredAgentFleet` excluded a fleet.yaml seat because a pinned skill's canonical content was unavailable or its digest drifted | 500 | run `pnpm write:skill-digests` or fix the skill file | error | stable (trusted API) |
|
|
48
|
+
| `AGENT_FLEET_SEAT_INSTRUCTIONS_PATH_UNPUBLISHABLE` | `loadConfiguredAgentFleet` composed a fleet.yaml seat but withheld the link to its persona `instructions.md`. Usually because the host serves a workspace root that does not contain the personas tree (multi-workspace hosts resolve a root per request and pass `workspaceRoot: null`); rarely because the seat name is not a safe path segment | 500 | expected on multi-workspace hosts — the seat runs normally, only the Agent-details instruction link is withheld. On a single-root host, check that `workspaceRoot` is the root the `user` filesystem serves and contains `personasDir`. If the message names the seat, rename it to `[A-Za-z0-9][A-Za-z0-9._-]*` | warn | stable (trusted API) |
|
|
49
|
+
| `AGENT_FLEET_CONFIG_FILE_INVALID` | `loadConfiguredAgentFleet`'s fleet.yaml could not be read, parsed, or validated (whole-fleet failure, not per-seat) | 500 | fix `.agents/factory/fleet.yaml` | error | stable (trusted API) |
|
|
50
|
+
| `AGENT_DEFINITION_ID_CONFLICT` | Multiple discovered plugin packages claim the same agent definition id, so every claimant is excluded | 500 | remove or rename conflicting definitions | error | stable (trusted API) |
|
|
51
|
+
| `AGENT_DEFINITION_UNSEATED` | A discovered agent package is not named by the fleet roster and remains inert | 200 | seat it in class-B fleet config if activation is intended | info | stable (trusted API) |
|
|
45
52
|
| `RUNTIME_PROVISIONING_FAILED` | Agent runtime dependency provisioning failed before Level 3 runtime dependencies became ready | 503 | retry/report | error | stable (public API) |
|
|
46
53
|
| `RUNTIME_PROVISIONING_LOCKED` | Agent runtime provisioning is locked by another reconciler | 423 | retry | warn | stable (public API) |
|
|
47
54
|
| `BWRAP_UNAVAILABLE` | `bwrap` binary not found | 500 | report-bug | error | stable (public API) |
|
|
@@ -50,6 +57,10 @@ All API failures must use the response envelope:
|
|
|
50
57
|
| `SANDBOX_NOT_READY` | Remote sandbox cold start / provisioning | 503 | retry | warn | stable (public API) |
|
|
51
58
|
| `SANDBOX_EXPIRED` | Remote sandbox TTL elapsed | 410 | retry | warn | stable (public API) |
|
|
52
59
|
| `VERCEL_API_ERROR` | Generic upstream Vercel SDK/API failure | 502 | retry | error | stable (public API) |
|
|
60
|
+
| `BLAXEL_API_ERROR` | Generic upstream Blaxel SDK/API failure | 502 | retry | error | stable (public API) |
|
|
61
|
+
| `BLAXEL_CONFIG_DRIFT` | Existing Blaxel sandbox or Volume differs from requested immutable configuration | 409 | operator action | error | stable (public API) |
|
|
62
|
+
| `BLAXEL_RUNTIME_UNQUALIFIED` | Blaxel runtime image lacks required workspace tools | 503 | replace image | error | stable (public API) |
|
|
63
|
+
| `BLAXEL_VOLUME_BUSY` | Durable Blaxel Volume remains attached to another sandbox | 409 | retry | warn | stable (public API) |
|
|
53
64
|
| `REMOTE_WORKER_CONFIG_INVALID` | Static remote-worker fleet configuration is invalid or incomplete | 500 | report-bug | error | stable (trusted API) |
|
|
54
65
|
| `REMOTE_WORKER_PROTOCOL_MISMATCH` | Worker protocol or provider-contract version differs from the configured V1 cohort | 502 | operator-fix | error | stable (trusted API) |
|
|
55
66
|
| `REMOTE_WORKER_UNAUTHENTICATED` | Worker rejected the per-box capability or authenticated receipt | 401 | operator-fix | warn | stable (trusted API) |
|
|
@@ -58,6 +69,8 @@ All API failures must use the response envelope:
|
|
|
58
69
|
| `REMOTE_WORKER_REQUEST_INVALID` | A strict remote-worker request schema rejected the request | 400 | report-bug | warn | stable (trusted API) |
|
|
59
70
|
| `REMOTE_WORKER_RESPONSE_INVALID` | A strict remote-worker response schema rejected the worker response | 502 | operator-fix | error | stable (trusted API) |
|
|
60
71
|
| `REMOTE_WORKER_CAPABILITY_EXPIRED` | A short-lived worker capability expired or exceeded its maximum lifetime | 401 | retry | warn | stable (trusted API) |
|
|
72
|
+
| `REMOTE_WORKER_CAPABILITY_REPLAY` | A single-use worker capability nonce was presented more than once | 409 | report-security | warn | stable (trusted API) |
|
|
73
|
+
| `REMOTE_WORKER_CAPABILITY_NONCE_STORE_EXHAUSTED` | Worker cannot accept another capability without violating its bounded nonce history | 503 | retry | warn | stable (trusted API) |
|
|
61
74
|
| `REMOTE_WORKER_AUTHORIZED_WORKSPACE_REQUIRED` | Remote provider creation lacked an authenticated workspace identity | 403 | report-bug | warn | stable (trusted API) |
|
|
62
75
|
| `REMOTE_WORKER_BINDING_RECEIPT_INVALID` | Create returned an unauthenticated or mismatched sandbox/workspace binding receipt | 502 | operator-fix | error | stable (trusted API) |
|
|
63
76
|
| `REMOTE_WORKER_SANDBOX_WORKSPACE_MISMATCH` | Authorized workspace capability does not match the immutable sandbox lease binding | 404 | report-security | warn | stable (trusted API) |
|
|
@@ -69,6 +82,12 @@ All API failures must use the response envelope:
|
|
|
69
82
|
| `REMOTE_WORKER_IDEMPOTENCY_CONFLICT` | Reused lease/invocation id has a different request digest | 409 | report-bug | warn | stable (trusted API) |
|
|
70
83
|
| `REMOTE_WORKER_EXEC_IN_PROGRESS` | Duplicate invocation is still executing | 409 | retry | warn | stable (trusted API) |
|
|
71
84
|
| `REMOTE_WORKER_SECRET_INVOCATION_NOT_REPLAYABLE` | Completed secret-bearing invocation cannot replay cached output | 409 | start-new-request | warn | stable (trusted API) |
|
|
85
|
+
| `REMOTE_WORKER_SECRET_REFERENCE_REJECTED` | Invocation secret metadata is invalid, cross-workspace, or classified as a model credential | 403 | report-bug | warn | stable (trusted API) |
|
|
86
|
+
| `REMOTE_WORKER_EXEC_ABORTED` | Invocation was aborted after bounded in-sandbox cleanup | 499 | retry | warn | stable (trusted API) |
|
|
87
|
+
| `REMOTE_WORKER_OUTPUT_LIMIT` | Invocation output exceeded its configured combined byte ceiling | 413 | reduce-output | warn | stable (trusted API) |
|
|
88
|
+
| `REMOTE_WORKER_PATH_UNSAFE` | Workspace operation failed dirfd-relative path confinement | 400 | report-bug | warn | stable (trusted API) |
|
|
89
|
+
| `REMOTE_WORKER_PATH_PRIMITIVE_UNAVAILABLE` | Required dirfd/openat2 containment primitive is unavailable | 503 | operator-fix | error | stable (trusted API) |
|
|
90
|
+
| `REMOTE_WORKER_QUOTA_EXCEEDED` | Fixed workspace byte or inode quota was exceeded | 507 | free-space | warn | stable (trusted API) |
|
|
72
91
|
| `REMOTE_WORKER_OUTCOME_UNKNOWN` | Worker loss left an effectful invocation outcome unknown; no automatic replay is safe | 502 | inspect-before-retry | error | stable (public API) |
|
|
73
92
|
| `REMOTE_WORKER_INCOMPLETE_CLEANUP` | Provider could not prove remote lease teardown after bounded retries | 502 | operator-fix | error | stable (trusted API) |
|
|
74
93
|
| `REMOTE_WORKER_DOCKER_COMMAND_FAILED` | Worker runtime command failed without exposing infrastructure stderr | 502 | operator-fix | error | stable (trusted API) |
|
|
@@ -81,6 +100,7 @@ All API failures must use the response envelope:
|
|
|
81
100
|
| `METERING_UNSUPPORTED_COMMAND` | Slash-command execution is disabled because metering cannot yet reserve/settle that path | 409 | user-fix | warn | stable (public API) |
|
|
82
101
|
| `SESSION_NOT_FOUND` | Session id does not exist | 404 | user-fix | warn | stable (public API) |
|
|
83
102
|
| `SESSION_LOCKED` | Session currently locked by concurrent writer | 409 | retry | warn | stable (public API) |
|
|
103
|
+
| `SESSION_TRANSCRIPT_UNREADABLE` | Canonical native session transcript exists but cannot be opened safely | 500 | retry | error | stable (public API) |
|
|
84
104
|
| `STREAM_BUFFER_EVICTED` | Resume cursor evicted from in-memory stream buffer | 410 | retry | warn | stable (public API) |
|
|
85
105
|
| `CURSOR_OUT_OF_RANGE` | Resume cursor invalid/out of range | 416 | user-fix | warn | stable (public API) |
|
|
86
106
|
| `BRIDGE_COMMAND_INVALID` | UI bridge command kind/params invalid | 400 | user-fix | warn | stable (public API) |
|
|
@@ -94,6 +114,11 @@ All API failures must use the response envelope:
|
|
|
94
114
|
| `MCP_AGENT_ARTIFACT_INVALID` | Managed MCP delivery artifact is path-shaped, non-Markdown, binary, malformed UTF-8, or otherwise invalid | 400 | user-fix | warn | stable (public API) |
|
|
95
115
|
| `MCP_AGENT_ARTIFACT_TOO_LARGE` | Managed MCP final text, inline Markdown artifact, or serialized result exceeds the delivery v0 byte cap | 413 | user-fix | warn | stable (public API) |
|
|
96
116
|
| `MCP_AGENT_ARTIFACT_UNAVAILABLE` | Managed MCP artifact is missing, unreadable through the authorized workspace, or changed during read | 409 | retry | warn | stable (public API) |
|
|
117
|
+
| `AGENT_MCP_GRANT_REF_UNGRANTED` | Agent declared an `mcpServerRefs` connector with no matching per-agent MCP grant in the workspace; the connector is dropped, never silently allowed | 200 | user-fix | warn | stable (public API) |
|
|
118
|
+
| `AGENT_MCP_GRANT_TOOL_NOT_ALLOWED` | A grant's `allowedTools` entry is not part of the connector's known tool catalog and was dropped during resolution | 200 | user-fix | warn | stable (public API) |
|
|
119
|
+
| `AGENT_MCP_GRANT_RECORD_MALFORMED` | A persisted MCP grant record has a missing or malformed config and was skipped rather than crashing the workspace's grant listing | 200 | user-fix | warn | stable (public API) |
|
|
120
|
+
| `AGENT_MCP_GRANT_CONNECTOR_UNKNOWN` | A grant's connector is unknown to the supplied connector catalog; the connector is denied rather than left unfiltered | 200 | user-fix | warn | stable (public API) |
|
|
121
|
+
| `AGENT_MCP_GRANT_TOOL_NAME_INVALID` | A grant's `allowedTools` entry contains a glob metacharacter (e.g. `*`), which is rejected at write time so it can never be misinterpreted as a wildcard downstream | 400 | user-fix | warn | stable (public API) |
|
|
97
122
|
| `PLUGIN_LOAD_FAILED` | Plugin failed to load/register | 500 | report-bug | error | stable (public API) |
|
|
98
123
|
| `PLUGIN_NAME_COLLISION` | Plugin name collides with existing tool/plugin | 409 | user-fix | warn | stable (public API) |
|
|
99
124
|
| `PLUGIN_RUNTIME_REVISION_MISMATCH` | Browser requested a stale plugin runtime revision after reload | 409 | retry | warn | stable (public API) |
|
|
@@ -113,11 +138,44 @@ All API failures must use the response envelope:
|
|
|
113
138
|
| `PROVISIONING_UV_BOOTSTRAP_FAILED` | uv bootstrap/preflight failed for Python runtime packages | 500 | user-fix | error | stable (public API) |
|
|
114
139
|
| `PROVISIONING_UV_INSTALL_FAILED` | uv venv or uv pip install failed | 500 | user-fix | error | stable (public API) |
|
|
115
140
|
| `PROVISIONING_ARTIFACT_FAILED` | Runtime-mode adapter failed to prepare/upload install artifact | 500 | retry | error | stable (public API) |
|
|
141
|
+
| `SKILL_DISCOVERY_FAILED` | Skill discovery failed without exposing package-manager or host-path details | 200 | retry | warn | stable (public API) |
|
|
142
|
+
| `PACKAGE_RESOURCE_INVALID` | A declared or scanned package resource (skill/agent) failed validation | 400 | user-fix | warn | stable (public API) |
|
|
143
|
+
| `PACKAGE_RESOURCE_CONFLICT` | Two package resources claim the same identity/path | 409 | user-fix | warn | stable (public API) |
|
|
144
|
+
| `RUNTIME_FILESYSTEM_BINDING_DUPLICATE` | A filesystem id was bound more than once while merging host/request-scoped runtime filesystem bindings | 500 | report-bug | error | stable (public API) |
|
|
145
|
+
| `RUNTIME_READONLY_FILESYSTEM_POLICY_INVALID` | A readonly primary-workspace path is not a normalized workspace-relative path | 400 | user-fix | warn | stable (public API) |
|
|
146
|
+
| `EVENT_STORE_OPEN_FAILED` | `BORING_CHAT_DURABLE_STREAM=1` but the SQLite event-stream store could not be opened: either no host-resolvable root exists (no `sessionRoot` and no host storage root — this deliberately never falls back to an in-sandbox/guest path) or `openDatabase` failed at the resolved path (bad path/permissions); reported via telemetry alongside `DURABLE_STREAM_UNAVAILABLE` | n/a (boot-time diagnostic, not an HTTP response) | report-bug | error | stable (public API) |
|
|
147
|
+
| `DURABLE_STREAM_UNAVAILABLE` | `BORING_CHAT_DURABLE_STREAM=1` but the durable event-stream store could not be opened; boot fails loudly with the underlying cause instead of silently falling back to in-memory streaming (flag off = in-memory, unchanged) | n/a (boot-time failure, not an HTTP response) | user-fix | error | stable (public API) |
|
|
116
148
|
| `ERR_NOT_IMPLEMENTED_UNTIL_T1` | Headless core method exists but the durable T1 implementation has not landed yet | 501 | retry-after-upgrade | warn | stable (public API) |
|
|
117
149
|
| `INTERNAL_ERROR` | Catch-all internal failure | 500 | report-bug | error | internal (may change) |
|
|
118
150
|
| `AR1_SHARE_NOT_FOUND` | `GET /a/:id` deep link: no such Lane W share entry, or the entry belongs to a workspace the requester is not authorized/scoped to (identical response either way — no existence oracle) | 404 | user-fix | warn | stable (public API) |
|
|
119
151
|
| `AR1_SHARE_TOMBSTONED` | `GET /a/:id` deep link: share entry exists but its target file is gone; response renders provenance + last-known metadata, never a bare 404 | 200 | user-fix | warn | stable (public API) |
|
|
120
152
|
|
|
153
|
+
## Credential registry
|
|
154
|
+
|
|
155
|
+
Credential failures use their own stable enum, `CREDENTIAL_ERROR_CODES` in
|
|
156
|
+
`src/shared/credentials/errors.ts`, surfaced as `CredentialResolutionError.code`.
|
|
157
|
+
These are trusted-API codes: messages are metadata only and never carry a
|
|
158
|
+
credential value, a workspace DEK, or KEK material.
|
|
159
|
+
|
|
160
|
+
| Code | When it fires | HTTP status | Suggested client action | Log level | Stability |
|
|
161
|
+
| --- | --- | --- | --- | --- | --- |
|
|
162
|
+
| `CREDENTIAL_PROVIDER_UNKNOWN` | The referenced provider is not in the startup provider registry | 404 | report-bug | warn | stable (trusted API) |
|
|
163
|
+
| `CREDENTIAL_NOT_CONFIGURED` | No credential material is configured for that workspace/provider, or a required registered field is absent | 404 | user-fix (connect the provider) | warn | stable (trusted API) |
|
|
164
|
+
| `CREDENTIAL_DISABLED` | The workspace credential exists but is administratively disabled | 403 | user-fix | warn | stable (trusted API) |
|
|
165
|
+
| `CREDENTIAL_REVOKED` | The workspace credential was revoked; no fallback is attempted | 403 | user-fix (reconnect) | warn | stable (trusted API) |
|
|
166
|
+
| `CREDENTIAL_FORBIDDEN` | The verified principal may not use this credential | 403 | user-fix | warn | stable (trusted API) |
|
|
167
|
+
| `CREDENTIAL_WORKSPACE_MISMATCH` | A credential artifact does not belong to the authority-verified workspace | 403 | report-bug | error | stable (trusted API) |
|
|
168
|
+
| `CREDENTIAL_CONSUMER_MISMATCH` | A reference, binding, and provider triple disagree, or the binding is not registered for its provider | 403 | report-bug | warn | stable (trusted API) |
|
|
169
|
+
| `CREDENTIAL_DELIVERY_FORBIDDEN` | The requested delivery channel is not permitted for that binding, or a lease was serialized | 403 | report-bug | error | stable (trusted API) |
|
|
170
|
+
| `CREDENTIAL_AUTHORITY_INVALID` | The workspace credential authority is unissued, copied, or expired | 403 | re-auth | warn | stable (trusted API) |
|
|
171
|
+
| `CREDENTIAL_SCHEMA_MISMATCH` | A credential reference, registry/binding definition, KEK context, or envelope AAD context failed strict validation | 400 | report-bug | warn | stable (trusted API) |
|
|
172
|
+
| `CREDENTIAL_UNREADABLE` | A credential envelope or wrapped workspace DEK failed AES-256-GCM authentication — tampered ciphertext/nonce/tag, a swapped AAD component, a wrong KEK, or another backend's envelope. Never treated as "absent" | 500 | operator-fix | error | stable (trusted API) |
|
|
173
|
+
| `CREDENTIAL_BACKEND_UNAVAILABLE` | The credential store or its KEK provider reported not-ready or failed unexpectedly; the operation fails closed with no fallback | 503 | retry/operator-fix | error | stable (trusted API) |
|
|
174
|
+
| `CREDENTIAL_KEK_UNAVAILABLE` | The configured KEK source is missing, unreadable, or the wrong length, so no workspace DEK could be wrapped or unwrapped. Never falls back to another backend or to plaintext | 503 | operator-fix (mount/repair the sealed KEK file) | error | stable (trusted API) |
|
|
175
|
+
| `CREDENTIAL_LEASE_EXPIRED` | A resolved credential lease was used after disposal or expiry | 410 | resolve a fresh lease | warn | stable (trusted API) |
|
|
176
|
+
| `CREDENTIAL_OAUTH_STATE_INVALID` | A one-use OAuth state transaction was unknown, replayed, or expired | 400 | restart the connect flow | warn | stable (trusted API) |
|
|
177
|
+
| `CREDENTIAL_OAUTH_REFRESH_FAILED` | Upstream refused a refresh-token exchange | 401 | re-auth | warn | stable (trusted API) |
|
|
178
|
+
|
|
121
179
|
## Readiness error details
|
|
122
180
|
|
|
123
181
|
`WORKSPACE_NOT_READY` is reserved for workspace substrate requirements:
|
package/docs/README.md
CHANGED
|
@@ -68,6 +68,7 @@ the agent ↔ workspace boundary is in
|
|
|
68
68
|
|
|
69
69
|
- [API](./API.md) — the four entry points and what each exports.
|
|
70
70
|
- [AUTHORING](./AUTHORING.md) — declarative agent directories, bounds, validation, and legacy catalog migration.
|
|
71
|
+
- [AGENT_PACKAGES](./AGENT_PACKAGES.md) — install, seat, update, unseat, and remove plugin-shaped agent packages in a workspace.
|
|
71
72
|
- [STYLING](./STYLING.md) — CSS-variable theming contract and public selectors.
|
|
72
73
|
- [UI-SHADCN](./UI-SHADCN.md) — `ChatPanel` styling model and tool-renderer overrides.
|
|
73
74
|
- [tools](./tools.md) — built-in tools, package-added tools, and how to add custom tools.
|
package/docs/runtime.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Runtime Modes and Provisioning
|
|
4
4
|
|
|
5
5
|
Every v1 agent is bound to an authorized workspace and an approved runtime
|
|
6
|
-
adapter. The agent supports
|
|
6
|
+
adapter. The agent supports multiple built-in execution modes controlling how
|
|
7
7
|
`bash` and filesystem tools run. A headless host may omit its UI/presentation
|
|
8
8
|
surface, but it still supplies the same workspace-backed runtime contract.
|
|
9
9
|
|
|
@@ -14,6 +14,7 @@ surface, but it still supplies the same workspace-backed runtime contract.
|
|
|
14
14
|
| `direct` | tools run directly in the host process | local dev, trusted environments |
|
|
15
15
|
| `local` | tools run in a `bwrap` sandbox (Linux only) | self-hosted, untrusted input |
|
|
16
16
|
| `vercel-sandbox` | tools run in Vercel Firecracker microVMs | production on Vercel |
|
|
17
|
+
| `blaxel` | tools run in a Blaxel sandbox pinned to an explicit EU region | sovereign-compute bridge; production safety gate remains opt-in |
|
|
17
18
|
|
|
18
19
|
Set via env var:
|
|
19
20
|
|
|
@@ -53,9 +54,25 @@ Mode-specific roots:
|
|
|
53
54
|
- `direct`: `runtimeCwd` is the real host workspace path.
|
|
54
55
|
- `local`/bwrap: `runtimeCwd` is `/workspace`; the host workspace is adapter-private.
|
|
55
56
|
- `vercel-sandbox`: `runtimeCwd` is `/workspace`; `/vercel/sandbox` is adapter-private.
|
|
57
|
+
- `blaxel`: `runtimeCwd` is the EU-pinned persistent Volume mount at `/workspace`.
|
|
56
58
|
|
|
57
59
|
Never expose adapter-private paths (host workspace roots for bwrap, `/vercel/sandbox` for Vercel) in model-facing prompts, tool descriptions, or observations.
|
|
58
60
|
|
|
61
|
+
### Blaxel v1 fidelity limits
|
|
62
|
+
|
|
63
|
+
Blaxel SDK 0.3.11 does not expose a server-side output byte limit. The adapter
|
|
64
|
+
therefore reads the terminal process record and applies Boring's single combined
|
|
65
|
+
byte budget locally, allocating stdout before stderr. The SDK's live log stream
|
|
66
|
+
is line based rather than byte exact, so v1 intentionally does not invoke
|
|
67
|
+
`onStdout`/`onStderr`; callers receive byte-capped terminal output instead.
|
|
68
|
+
|
|
69
|
+
Abort and timeout are implemented with a stable named process plus
|
|
70
|
+
`process.kill()`. This is best effort across control-plane races: Boring preserves
|
|
71
|
+
the caller's exact abort reason and returns exit 124 on timeout, but a provider
|
|
72
|
+
transport failure can delay confirmation that the remote process stopped.
|
|
73
|
+
Snapshots, forking, and Agent Drive remain out of scope because those Blaxel
|
|
74
|
+
surfaces are private preview in the pinned SDK.
|
|
75
|
+
|
|
59
76
|
## `.boring-agent/` runtime layout
|
|
60
77
|
|
|
61
78
|
Provisioned runtime artifacts live under the workspace-local `.boring-agent/` directory:
|
|
@@ -244,7 +261,7 @@ substrate as one runtime bundle.
|
|
|
244
261
|
|
|
245
262
|
```ts
|
|
246
263
|
interface RuntimeModeAdapter {
|
|
247
|
-
id: string // built-ins: 'direct' | 'local' | 'vercel-sandbox'
|
|
264
|
+
id: string // built-ins: 'direct' | 'local' | 'blaxel' | 'vercel-sandbox'
|
|
248
265
|
workspaceFsCapability?: Workspace['fsCapability']
|
|
249
266
|
// describes how much host-side fs access exists before create();
|
|
250
267
|
// remote backends must not claim strong host visibility
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hachej/boring-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.96",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Pane-embeddable coding agent. Ships direct/local/vercel-sandbox execution modes behind one interface.",
|
|
@@ -37,6 +37,11 @@
|
|
|
37
37
|
"import": "./dist/server/agent-host/testing/gatewayConformance.js",
|
|
38
38
|
"default": "./dist/server/agent-host/testing/gatewayConformance.js"
|
|
39
39
|
},
|
|
40
|
+
"./server/agent-host/testing/compositionRouteProof": {
|
|
41
|
+
"types": "./dist/server/agent-host/testing/compositionRouteProof.d.ts",
|
|
42
|
+
"import": "./dist/server/agent-host/testing/compositionRouteProof.js",
|
|
43
|
+
"default": "./dist/server/agent-host/testing/compositionRouteProof.js"
|
|
44
|
+
},
|
|
40
45
|
"./server/worker": {
|
|
41
46
|
"types": "./dist/server/worker/index.d.ts",
|
|
42
47
|
"import": "./dist/server/worker/index.js",
|
|
@@ -61,58 +66,58 @@
|
|
|
61
66
|
],
|
|
62
67
|
"dependencies": {
|
|
63
68
|
"@mariozechner/pi-coding-agent": "npm:@earendil-works/pi-coding-agent@0.80.7",
|
|
64
|
-
"@modelcontextprotocol/sdk": "1.
|
|
65
|
-
"@radix-ui/react-collapsible": "^1.1.
|
|
66
|
-
"@radix-ui/react-dialog": "^1.1.
|
|
67
|
-
"@radix-ui/react-dropdown-menu": "^2.1.
|
|
68
|
-
"@radix-ui/react-hover-card": "^1.1.
|
|
69
|
-
"@radix-ui/react-select": "^2.3.
|
|
70
|
-
"@radix-ui/react-separator": "^1.1.
|
|
71
|
-
"@radix-ui/react-slot": "^1.3.
|
|
72
|
-
"@radix-ui/react-tooltip": "^1.2.
|
|
73
|
-
"@radix-ui/react-use-controllable-state": "^1.2.
|
|
69
|
+
"@modelcontextprotocol/sdk": "1.30.0",
|
|
70
|
+
"@radix-ui/react-collapsible": "^1.1.20",
|
|
71
|
+
"@radix-ui/react-dialog": "^1.1.23",
|
|
72
|
+
"@radix-ui/react-dropdown-menu": "^2.1.24",
|
|
73
|
+
"@radix-ui/react-hover-card": "^1.1.23",
|
|
74
|
+
"@radix-ui/react-select": "^2.3.7",
|
|
75
|
+
"@radix-ui/react-separator": "^1.1.15",
|
|
76
|
+
"@radix-ui/react-slot": "^1.3.3",
|
|
77
|
+
"@radix-ui/react-tooltip": "^1.2.16",
|
|
78
|
+
"@radix-ui/react-use-controllable-state": "^1.2.6",
|
|
74
79
|
"@streamdown/cjk": "^1.0.3",
|
|
75
80
|
"@streamdown/code": "^1.1.1",
|
|
76
81
|
"@streamdown/math": "^1.0.2",
|
|
77
82
|
"@streamdown/mermaid": "^1.0.2",
|
|
78
|
-
"@tanstack/react-query": "^5.101.
|
|
79
|
-
"ai": "^7.0.
|
|
83
|
+
"@tanstack/react-query": "^5.101.4",
|
|
84
|
+
"ai": "^7.0.40",
|
|
80
85
|
"class-variance-authority": "^0.7.1",
|
|
81
86
|
"clsx": "^2.1.1",
|
|
82
87
|
"cmdk": "^1.1.1",
|
|
83
88
|
"diff": "^9.0.0",
|
|
84
|
-
"fastify": "^5.
|
|
85
|
-
"lucide-react": "^1.
|
|
86
|
-
"motion": "^12.
|
|
89
|
+
"fastify": "^5.11.2",
|
|
90
|
+
"lucide-react": "^1.27.0",
|
|
91
|
+
"motion": "^12.43.0",
|
|
87
92
|
"nanoid": "^6.0.0",
|
|
88
|
-
"shiki": "^4.
|
|
93
|
+
"shiki": "^4.4.2",
|
|
89
94
|
"streamdown": "^2.5.0",
|
|
90
95
|
"tailwind-merge": "^3.5.0",
|
|
91
96
|
"use-stick-to-bottom": "^1.1.6",
|
|
92
97
|
"yaml": "^2.9.0",
|
|
93
98
|
"zod": "^3.25.76",
|
|
94
|
-
"@hachej/boring-bash": "0.1.
|
|
95
|
-
"@hachej/boring-
|
|
96
|
-
"@hachej/boring-
|
|
99
|
+
"@hachej/boring-bash": "0.1.96",
|
|
100
|
+
"@hachej/boring-ui-kit": "0.1.96",
|
|
101
|
+
"@hachej/boring-sandbox": "0.1.96"
|
|
97
102
|
},
|
|
98
103
|
"devDependencies": {
|
|
99
|
-
"@vercel/sandbox": "2.
|
|
104
|
+
"@vercel/sandbox": "2.9.2",
|
|
100
105
|
"@antithesishq/bombadil": "0.6.1",
|
|
101
106
|
"@opentelemetry/api": "^1.9.1",
|
|
102
|
-
"@tailwindcss/postcss": "^4.3.
|
|
107
|
+
"@tailwindcss/postcss": "^4.3.3",
|
|
103
108
|
"@types/node": "^22.20.0",
|
|
104
|
-
"@types/react": "^19.2.
|
|
105
|
-
"@types/react-dom": "^19.
|
|
109
|
+
"@types/react": "^19.2.18",
|
|
110
|
+
"@types/react-dom": "^19.2.4",
|
|
106
111
|
"@vitejs/plugin-react": "^4.7.0",
|
|
107
112
|
"ajv": "^8.20.0",
|
|
108
113
|
"esbuild": "^0.28.1",
|
|
109
|
-
"postcss": "^8.5.
|
|
110
|
-
"react": "^19.2.
|
|
111
|
-
"react-dom": "^19.2.
|
|
114
|
+
"postcss": "^8.5.25",
|
|
115
|
+
"react": "^19.2.8",
|
|
116
|
+
"react-dom": "^19.2.8",
|
|
112
117
|
"tsup": "^8.4.0",
|
|
113
|
-
"tsx": "^4.23.
|
|
118
|
+
"tsx": "^4.23.6",
|
|
114
119
|
"typescript": "^6.0.3",
|
|
115
|
-
"vite": "^8.
|
|
120
|
+
"vite": "^8.2.0",
|
|
116
121
|
"vitest": "^4.1.9"
|
|
117
122
|
},
|
|
118
123
|
"peerDependencies": {
|