@intentic/sandbox-contract 1.126.0 → 1.133.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 (96) hide show
  1. package/dist/agent-catalog.d.ts.map +1 -1
  2. package/dist/contracts/activity.contract.d.ts +4 -4
  3. package/dist/contracts/activity.contract.d.ts.map +1 -1
  4. package/dist/contracts/agent.contract.d.ts +283 -252
  5. package/dist/contracts/agent.contract.d.ts.map +1 -1
  6. package/dist/contracts/agent.contract.js +4 -3
  7. package/dist/contracts/agent.contract.js.map +1 -1
  8. package/dist/contracts/agents.contract.d.ts +15 -13
  9. package/dist/contracts/agents.contract.d.ts.map +1 -1
  10. package/dist/contracts/automations.contract.d.ts +3 -3
  11. package/dist/contracts/automations.contract.d.ts.map +1 -1
  12. package/dist/contracts/capabilities.contract.d.ts +21 -16
  13. package/dist/contracts/capabilities.contract.d.ts.map +1 -1
  14. package/dist/contracts/claude.contract.d.ts.map +1 -1
  15. package/dist/contracts/codex.contract.d.ts.map +1 -1
  16. package/dist/contracts/drafts.contract.d.ts +6 -6
  17. package/dist/contracts/drafts.contract.d.ts.map +1 -1
  18. package/dist/contracts/extensions.contract.d.ts +4 -4
  19. package/dist/contracts/extensions.contract.d.ts.map +1 -1
  20. package/dist/contracts/git.contract.d.ts +6 -4
  21. package/dist/contracts/git.contract.d.ts.map +1 -1
  22. package/dist/contracts/grok.contract.d.ts.map +1 -1
  23. package/dist/contracts/history.contract.d.ts +3 -3
  24. package/dist/contracts/history.contract.d.ts.map +1 -1
  25. package/dist/contracts/intentic.contract.d.ts.map +1 -1
  26. package/dist/contracts/inventory.contract.d.ts +20 -20
  27. package/dist/contracts/inventory.contract.d.ts.map +1 -1
  28. package/dist/contracts/logs.contract.d.ts.map +1 -1
  29. package/dist/contracts/panels.contract.d.ts +1 -1
  30. package/dist/contracts/panels.contract.d.ts.map +1 -1
  31. package/dist/contracts/ports.contract.d.ts +1 -1
  32. package/dist/contracts/ports.contract.d.ts.map +1 -1
  33. package/dist/contracts/secrets.contract.d.ts +4 -4
  34. package/dist/contracts/secrets.contract.d.ts.map +1 -1
  35. package/dist/contracts/sessions.contract.d.ts +1 -1
  36. package/dist/contracts/sessions.contract.d.ts.map +1 -1
  37. package/dist/contracts/settings.contract.d.ts.map +1 -1
  38. package/dist/contracts/system.contract.d.ts +26 -26
  39. package/dist/contracts/system.contract.d.ts.map +1 -1
  40. package/dist/contracts/translator.contract.d.ts.map +1 -1
  41. package/dist/contracts/workspace.contract.d.ts +21 -21
  42. package/dist/contracts/workspace.contract.d.ts.map +1 -1
  43. package/dist/effects.d.ts +1 -1
  44. package/dist/effects.d.ts.map +1 -1
  45. package/dist/effects.js +2 -0
  46. package/dist/effects.js.map +1 -1
  47. package/dist/events.d.ts +213 -29
  48. package/dist/events.d.ts.map +1 -1
  49. package/dist/events.js +5 -0
  50. package/dist/events.js.map +1 -1
  51. package/dist/hostnames.d.ts.map +1 -1
  52. package/dist/index.d.ts +417 -377
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/model-metadata.d.ts.map +1 -1
  55. package/dist/schemas.d.ts +221 -212
  56. package/dist/schemas.d.ts.map +1 -1
  57. package/dist/schemas.js +13 -6
  58. package/dist/schemas.js.map +1 -1
  59. package/dist/sse.d.ts.map +1 -1
  60. package/dist/tunnel-ids.d.ts.map +1 -1
  61. package/package.json +8 -6
  62. package/src/agent-catalog.ts +62 -0
  63. package/src/contracts/activity.contract.ts +9 -0
  64. package/src/contracts/agent.contract.ts +17 -0
  65. package/src/contracts/agents.contract.ts +28 -0
  66. package/src/contracts/automations.contract.ts +23 -0
  67. package/src/contracts/capabilities.contract.ts +31 -0
  68. package/src/contracts/claude.contract.ts +22 -0
  69. package/src/contracts/codex.contract.ts +23 -0
  70. package/src/contracts/drafts.contract.ts +11 -0
  71. package/src/contracts/extensions.contract.ts +28 -0
  72. package/src/contracts/git.contract.ts +64 -0
  73. package/src/contracts/grok.contract.ts +16 -0
  74. package/src/contracts/history.contract.ts +12 -0
  75. package/src/contracts/intentic.contract.ts +17 -0
  76. package/src/contracts/inventory.contract.ts +11 -0
  77. package/src/contracts/logs.contract.ts +9 -0
  78. package/src/contracts/panels.contract.ts +12 -0
  79. package/src/contracts/ports.contract.ts +11 -0
  80. package/src/contracts/secrets.contract.ts +15 -0
  81. package/src/contracts/sessions.contract.ts +14 -0
  82. package/src/contracts/settings.contract.ts +11 -0
  83. package/src/contracts/system.contract.ts +37 -0
  84. package/src/contracts/translator.contract.ts +20 -0
  85. package/src/contracts/workspace.contract.ts +74 -0
  86. package/src/effects.test.ts +132 -0
  87. package/src/effects.ts +138 -0
  88. package/src/events.ts +277 -0
  89. package/src/hostnames.test.ts +44 -0
  90. package/src/hostnames.ts +97 -0
  91. package/src/index.ts +84 -0
  92. package/src/model-metadata.ts +30 -0
  93. package/src/schemas.ts +1407 -0
  94. package/src/sse.ts +43 -0
  95. package/src/terminal-protocol.ts +16 -0
  96. package/src/tunnel-ids.ts +19 -0
package/src/sse.ts ADDED
@@ -0,0 +1,43 @@
1
+ // Low-level SSE framing for the daemon's streamed routes (oRPC eventIterator over HTTP): frames separated by
2
+ // a blank line, each carrying one `data: <JSON>` line. Protocol-only (no domain shapes) — shared by every
3
+ // consumer of the wire: the web's chat/intentic streams and the ACP bridge's daemon client.
4
+
5
+ // Yields each raw SSE frame (the text between blank-line separators) as it arrives, reassembling frames split
6
+ // across network chunks.
7
+ export async function* sseFrames(body: ReadableStream<Uint8Array>): AsyncGenerator<string> {
8
+ const reader = body.getReader();
9
+ const decoder = new TextDecoder();
10
+ let buffer = "";
11
+ for (;;) {
12
+ // oxlint-disable-next-line eslint/no-await-in-loop -- streaming reader; each chunk must be awaited in order as it arrives
13
+ const { done, value } = await reader.read();
14
+ if (done) {
15
+ break;
16
+ }
17
+ buffer += decoder.decode(value, { stream: true });
18
+ let separator = buffer.indexOf("\n\n");
19
+ while (separator !== -1) {
20
+ yield buffer.slice(0, separator);
21
+ buffer = buffer.slice(separator + 2);
22
+ separator = buffer.indexOf("\n\n");
23
+ }
24
+ }
25
+ }
26
+
27
+ // The parsed JSON payload of a frame's `data:` line, or undefined for a frame with no data line, an empty
28
+ // payload, or malformed JSON (all cases the callers skip).
29
+ export const sseData = (frame: string): unknown => {
30
+ const dataLine = frame.split("\n").find((line) => line.startsWith("data:"));
31
+ if (dataLine === undefined) {
32
+ return undefined;
33
+ }
34
+ const payload = dataLine.slice(5).trim();
35
+ if (payload.length === 0) {
36
+ return undefined;
37
+ }
38
+ try {
39
+ return JSON.parse(payload);
40
+ } catch {
41
+ return undefined; // Skip a malformed frame.
42
+ }
43
+ };
@@ -0,0 +1,16 @@
1
+ // The /system/terminal WebSocket wire protocol — JSON text frames both ways (xterm speaks strings), shared by
2
+ // the daemon's terminal route and the browser's terminal session so the two can't drift. Plain types, not zod
3
+ // schemas: `data` is the per-pty-chunk hot path between two mutually authenticated endpoints, and no oRPC
4
+ // eventIterator validates these frames (which is why events.ts uses schemas).
5
+
6
+ // `ping` is the client's 30s keepalive against tunnel idle-reaping; the server answers with `pong`, so a
7
+ // healthy idle connection always sees a frame within the ping interval — silence beyond it means half-open.
8
+ export type TerminalClientMessage =
9
+ | { readonly type: "input"; readonly data: string }
10
+ | { readonly type: "resize"; readonly cols: number; readonly rows: number }
11
+ | { readonly type: "ping" };
12
+
13
+ // `data` is raw pty output; `exit` fires when the tmux client ends (shell exited, or an attach-only session
14
+ // doesn't exist) and is terminal — the client never reconnects after it.
15
+ export type TerminalServerMessage =
16
+ { readonly type: "data"; readonly data: string } | { readonly type: "exit"; readonly code: number } | { readonly type: "pong" };
@@ -0,0 +1,19 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ // The one sha256-hex digest every stable content/token identity derives from: the tunnel ids below, the
4
+ // platform's token lookup digest, the sandbox's bridge-token hashes and environment-overlay hash, hashline
5
+ // anchors. node:crypto → this subpath is node-only.
6
+ export const sha256Hex = (value: string): string => createHash("sha256").update(value).digest("hex");
7
+
8
+ // The sandbox's stable 12-hex id, digested from the connect token. Used by:
9
+ // • the CLI's sandbox-tunnel bootstrap (sandbox-tunnel.ts) to name the tunnel + DNS
10
+ // • the sandbox daemon's preview hostname builder (preview-hostname.ts)
11
+ // • the sandbox daemon's sync SSH hostname derivation (sync.ts)
12
+ // All three MUST agree on the digest, so it lives in the contract they share.
13
+ export const sandboxIdFromToken = (connectToken: string): string | undefined =>
14
+ connectToken === "" ? undefined : sha256Hex(connectToken).slice(0, 12);
15
+
16
+ // A per-host SSH tunnel's stable 12-hex id, salted with the host name so each enrolled deploy target gets its
17
+ // own ssh-<id>.<zone> (no collision across hosts). Shared by the CLI (createHostSshTunnel) and the platform API
18
+ // (provisionHostSshTunnel), which MUST derive the identical id.
19
+ export const hostSshIdFromToken = (connectToken: string, hostName: string): string => sha256Hex(`${connectToken}:${hostName}`).slice(0, 12);