@kelloggt/dsh-program-agents 0.0.0-stage → 0.1.1

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 (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -2
  3. package/cordis.patch.yml +5 -0
  4. package/dist/app/agents.d.ts +50 -0
  5. package/dist/app/agents.js +70 -0
  6. package/dist/app/agents.js.map +1 -0
  7. package/dist/app/conversations.d.ts +8 -0
  8. package/dist/app/conversations.js +26 -0
  9. package/dist/app/conversations.js.map +1 -0
  10. package/dist/app/endpoints.d.ts +36 -0
  11. package/dist/app/endpoints.js +162 -0
  12. package/dist/app/endpoints.js.map +1 -0
  13. package/dist/app/inbox.d.ts +61 -0
  14. package/dist/app/inbox.js +253 -0
  15. package/dist/app/inbox.js.map +1 -0
  16. package/dist/app/index.d.ts +70 -0
  17. package/dist/app/index.js +147 -0
  18. package/dist/app/index.js.map +1 -0
  19. package/dist/app/mailbox.d.ts +63 -0
  20. package/dist/app/mailbox.js +173 -0
  21. package/dist/app/mailbox.js.map +1 -0
  22. package/dist/app/models.d.ts +32 -0
  23. package/dist/app/models.js +13 -0
  24. package/dist/app/models.js.map +1 -0
  25. package/dist/app/server.d.ts +36 -0
  26. package/dist/app/server.js +233 -0
  27. package/dist/app/server.js.map +1 -0
  28. package/dist/app/stream-server.d.ts +9 -0
  29. package/dist/app/stream-server.js +77 -0
  30. package/dist/app/stream-server.js.map +1 -0
  31. package/dist/app/stream.d.ts +4 -0
  32. package/dist/app/stream.js +93 -0
  33. package/dist/app/stream.js.map +1 -0
  34. package/dist/app/tools.d.ts +16 -0
  35. package/dist/app/tools.js +24 -0
  36. package/dist/app/tools.js.map +1 -0
  37. package/dist/client/controller.d.ts +21 -0
  38. package/dist/client/controller.js +140 -0
  39. package/dist/client/controller.js.map +1 -0
  40. package/dist/client/index.d.ts +22 -0
  41. package/dist/client/index.js +14 -0
  42. package/dist/client/index.js.map +1 -0
  43. package/dist/client/model.d.ts +66 -0
  44. package/dist/client/model.js +147 -0
  45. package/dist/client/model.js.map +1 -0
  46. package/dist/client/models.d.ts +11 -0
  47. package/dist/client/models.js +27 -0
  48. package/dist/client/models.js.map +1 -0
  49. package/dist/client/transport.d.ts +64 -0
  50. package/dist/client/transport.js +141 -0
  51. package/dist/client/transport.js.map +1 -0
  52. package/dist/client/view.d.ts +19 -0
  53. package/dist/client/view.js +69 -0
  54. package/dist/client/view.js.map +1 -0
  55. package/dist/client.js +673 -0
  56. package/dist/conversations.d.ts +92 -0
  57. package/dist/conversations.js +6 -0
  58. package/dist/conversations.js.map +1 -0
  59. package/dist/endpoints.d.ts +48 -0
  60. package/dist/endpoints.js +43 -0
  61. package/dist/endpoints.js.map +1 -0
  62. package/dist/examples/dashboard.js +42 -0
  63. package/dist/examples/dynamic-server.js +27 -0
  64. package/dist/examples/inbox-worker.js +22 -0
  65. package/dist/examples/model-slots.js +19 -0
  66. package/dist/examples/standalone-supervisor.js +20 -0
  67. package/dist/host/adapter.d.ts +195 -0
  68. package/dist/host/adapter.js +630 -0
  69. package/dist/host/adapter.js.map +1 -0
  70. package/dist/host/agents.d.ts +35 -0
  71. package/dist/host/agents.js +222 -0
  72. package/dist/host/agents.js.map +1 -0
  73. package/dist/host/audit.d.ts +14 -0
  74. package/dist/host/audit.js +39 -0
  75. package/dist/host/audit.js.map +1 -0
  76. package/dist/host/catalog.d.ts +53 -0
  77. package/dist/host/catalog.js +116 -0
  78. package/dist/host/catalog.js.map +1 -0
  79. package/dist/host/contracts.d.ts +38 -0
  80. package/dist/host/contracts.js +2 -0
  81. package/dist/host/contracts.js.map +1 -0
  82. package/dist/host/conversations.d.ts +41 -0
  83. package/dist/host/conversations.js +324 -0
  84. package/dist/host/conversations.js.map +1 -0
  85. package/dist/host/events.d.ts +12 -0
  86. package/dist/host/events.js +106 -0
  87. package/dist/host/events.js.map +1 -0
  88. package/dist/host/http.d.ts +14 -0
  89. package/dist/host/http.js +30 -0
  90. package/dist/host/http.js.map +1 -0
  91. package/dist/host/index.d.ts +23 -0
  92. package/dist/host/index.js +86 -0
  93. package/dist/host/index.js.map +1 -0
  94. package/dist/host/installed-v10.js +27181 -0
  95. package/dist/host/installed-v11.js +27181 -0
  96. package/dist/host/installed-v12.js +27181 -0
  97. package/dist/host/installed-v13.js +27181 -0
  98. package/dist/host/installed-v2.js +27181 -0
  99. package/dist/host/installed-v3.js +27181 -0
  100. package/dist/host/installed-v4.js +27181 -0
  101. package/dist/host/installed-v5.js +27181 -0
  102. package/dist/host/installed-v6.js +27181 -0
  103. package/dist/host/installed-v7.js +27181 -0
  104. package/dist/host/installed-v8.js +27181 -0
  105. package/dist/host/installed-v9.js +27181 -0
  106. package/dist/host/mcp.d.ts +11 -0
  107. package/dist/host/mcp.js +42 -0
  108. package/dist/host/mcp.js.map +1 -0
  109. package/dist/host/models.d.ts +37 -0
  110. package/dist/host/models.js +141 -0
  111. package/dist/host/models.js.map +1 -0
  112. package/dist/host/operations.d.ts +22 -0
  113. package/dist/host/operations.js +72 -0
  114. package/dist/host/operations.js.map +1 -0
  115. package/dist/host/plugin.js +27181 -0
  116. package/dist/host/policies.d.ts +36 -0
  117. package/dist/host/policies.js +73 -0
  118. package/dist/host/policies.js.map +1 -0
  119. package/dist/host/requests.d.ts +57 -0
  120. package/dist/host/requests.js +353 -0
  121. package/dist/host/requests.js.map +1 -0
  122. package/dist/host/skills.d.ts +2 -0
  123. package/dist/host/skills.js +45 -0
  124. package/dist/host/skills.js.map +1 -0
  125. package/dist/host/tool-client.d.ts +19 -0
  126. package/dist/host/tool-client.js +62 -0
  127. package/dist/host/tool-client.js.map +1 -0
  128. package/dist/host/validation.d.ts +5 -0
  129. package/dist/host/validation.js +42 -0
  130. package/dist/host/validation.js.map +1 -0
  131. package/dist/mcp.d.ts +7 -0
  132. package/dist/mcp.js +2 -0
  133. package/dist/mcp.js.map +1 -0
  134. package/dist/models.d.ts +34 -0
  135. package/dist/models.js +53 -0
  136. package/dist/models.js.map +1 -0
  137. package/dist/monitoring/error-buffer.d.ts +89 -0
  138. package/dist/monitoring/error-buffer.js +355 -0
  139. package/dist/monitoring/error-buffer.js.map +1 -0
  140. package/dist/monitoring/fatal.d.ts +6 -0
  141. package/dist/monitoring/fatal.js +32 -0
  142. package/dist/monitoring/fatal.js.map +1 -0
  143. package/dist/monitoring/index.d.ts +7 -0
  144. package/dist/monitoring/index.js +8 -0
  145. package/dist/monitoring/index.js.map +1 -0
  146. package/dist/monitoring/logger.d.ts +45 -0
  147. package/dist/monitoring/logger.js +174 -0
  148. package/dist/monitoring/logger.js.map +1 -0
  149. package/dist/monitoring/schemas.d.ts +34 -0
  150. package/dist/monitoring/schemas.js +132 -0
  151. package/dist/monitoring/schemas.js.map +1 -0
  152. package/dist/monitoring/standard.d.ts +51 -0
  153. package/dist/monitoring/standard.js +140 -0
  154. package/dist/monitoring/standard.js.map +1 -0
  155. package/dist/monitoring/tailer.d.ts +41 -0
  156. package/dist/monitoring/tailer.js +210 -0
  157. package/dist/monitoring/tailer.js.map +1 -0
  158. package/dist/requests.d.ts +92 -0
  159. package/dist/requests.js +120 -0
  160. package/dist/requests.js.map +1 -0
  161. package/dist/runtime/bootstrap.d.ts +1 -0
  162. package/dist/runtime/bootstrap.js +25 -0
  163. package/dist/runtime/bootstrap.js.map +1 -0
  164. package/dist/runtime/definitions.d.ts +7 -0
  165. package/dist/runtime/definitions.js +138 -0
  166. package/dist/runtime/definitions.js.map +1 -0
  167. package/dist/runtime/index.d.ts +4 -0
  168. package/dist/runtime/index.js +4 -0
  169. package/dist/runtime/index.js.map +1 -0
  170. package/dist/runtime/log-file.d.ts +24 -0
  171. package/dist/runtime/log-file.js +124 -0
  172. package/dist/runtime/log-file.js.map +1 -0
  173. package/dist/runtime/protocol.d.ts +60 -0
  174. package/dist/runtime/protocol.js +155 -0
  175. package/dist/runtime/protocol.js.map +1 -0
  176. package/dist/runtime/registry.d.ts +8 -0
  177. package/dist/runtime/registry.js +38 -0
  178. package/dist/runtime/registry.js.map +1 -0
  179. package/dist/runtime/supervisor.d.ts +74 -0
  180. package/dist/runtime/supervisor.js +881 -0
  181. package/dist/runtime/supervisor.js.map +1 -0
  182. package/dist/sdk/connection.d.ts +33 -0
  183. package/dist/sdk/connection.js +265 -0
  184. package/dist/sdk/connection.js.map +1 -0
  185. package/dist/sdk/index.d.ts +8 -0
  186. package/dist/sdk/index.js +2 -0
  187. package/dist/sdk/index.js.map +1 -0
  188. package/dist/supervision.d.ts +22 -0
  189. package/dist/supervision.js +32 -0
  190. package/dist/supervision.js.map +1 -0
  191. package/dist/types.d.ts +170 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/docs/installation.md +37 -0
  195. package/docs/log-format.md +102 -0
  196. package/docs/publishing.md +45 -0
  197. package/docs/supervision.md +73 -0
  198. package/examples/dashboard.ts +31 -0
  199. package/examples/dsh-web-local.patch.yml +15 -0
  200. package/examples/dynamic-server.ts +13 -0
  201. package/examples/inbox-worker.ts +17 -0
  202. package/examples/model-slots.ts +12 -0
  203. package/examples/standalone-supervisor.ts +14 -0
  204. package/examples/watch-server.ts +12 -0
  205. package/package.json +134 -3
  206. package/schemas/dsh.http.request.v1.schema.json +14 -0
  207. package/schemas/dsh.program.error-batch.v1.schema.json +24 -0
  208. package/schemas/dsh.program.error.v1.schema.json +8 -0
  209. package/schemas/standard-log-record.v1.schema.json +26 -0
  210. package/skills/program-agents/SKILL.md +124 -0
  211. package/skills/program-agents/chat-sidebar.md +23 -0
  212. package/skills/program-agents/endpoints.md +92 -0
  213. package/skills/program-agents/inboxes.md +120 -0
  214. package/skills/program-agents/log-format.md +102 -0
  215. package/skills/program-agents/models.md +59 -0
  216. package/skills/program-agents/references/chat-sidebar/AgentSidebar.tsx +181 -0
  217. package/skills/program-agents/references/chat-sidebar/README.md +181 -0
  218. package/skills/program-agents/references/chat-sidebar/agent-sidebar.css +37 -0
  219. package/skills/program-agents/references/chat-sidebar/backend.ts +184 -0
  220. package/skills/program-agents/references/chat-sidebar/protocol.ts +214 -0
  221. package/skills/program-agents/schemas/dsh.http.request.v1.schema.json +14 -0
  222. package/skills/program-agents/schemas/dsh.program.error-batch.v1.schema.json +24 -0
  223. package/skills/program-agents/schemas/dsh.program.error.v1.schema.json +8 -0
  224. package/skills/program-agents/schemas/standard-log-record.v1.schema.json +26 -0
  225. package/skills/program-agents/ui-patterns.md +39 -0
@@ -0,0 +1,173 @@
1
+ import { randomBytes, randomUUID, timingSafeEqual } from 'node:crypto';
2
+ import { chmodSync, mkdirSync } from 'node:fs';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ import { setTimeout as delay } from 'node:timers/promises';
6
+ import { assertJson, ProgramError } from '../runtime/protocol.js';
7
+ /** Durable at-least-once queue. Acceptance is not app processing; only explicit ack records that. */
8
+ export class MessageStore {
9
+ db;
10
+ maxPending;
11
+ maxMessages;
12
+ clock;
13
+ closed = false;
14
+ constructor(path, options = {}) {
15
+ if (!options || typeof options !== 'object' || Array.isArray(options) || options.clock !== undefined && typeof options.clock !== 'function')
16
+ throw new ProgramError('INVALID_CONFIG', 'Invalid message store options');
17
+ this.maxPending = options.maxPendingPerProgram === undefined ? 1000 : options.maxPendingPerProgram;
18
+ this.maxMessages = options.maxMessages === undefined ? 10_000 : options.maxMessages;
19
+ this.clock = options.clock ?? Date.now;
20
+ if (!Number.isSafeInteger(this.maxPending) || this.maxPending < 1 || this.maxPending > 10_000 || !Number.isSafeInteger(this.maxMessages) || this.maxMessages < this.maxPending || this.maxMessages > 100_000)
21
+ throw new ProgramError('INVALID_CONFIG', 'Invalid message store limits');
22
+ if (path !== ':memory:') {
23
+ path = resolve(path);
24
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
25
+ }
26
+ this.db = new DatabaseSync(path);
27
+ if (path !== ':memory:')
28
+ chmodSync(path, 0o600);
29
+ this.db.exec(`PRAGMA journal_mode = WAL; PRAGMA busy_timeout = 1000;
30
+ CREATE TABLE IF NOT EXISTS app_messages (
31
+ id TEXT PRIMARY KEY, owner_id TEXT NOT NULL, program TEXT NOT NULL,
32
+ sender TEXT NOT NULL, body TEXT NOT NULL, correlation_id TEXT,
33
+ created_at INTEGER NOT NULL, claimed_at INTEGER, acked_at INTEGER,
34
+ lease_until INTEGER, lease_token TEXT, claimant TEXT,
35
+ attempts INTEGER NOT NULL DEFAULT 0
36
+ );
37
+ CREATE INDEX IF NOT EXISTS app_messages_inbox ON app_messages(owner_id, program, acked_at, created_at);
38
+ `);
39
+ }
40
+ send(scope, message) {
41
+ this.checkScope(scope);
42
+ if (!message || typeof message !== 'object' || Array.isArray(message) || typeof message.from !== 'string' || !message.from || message.from.length > 1024 || message.correlationId !== undefined && (typeof message.correlationId !== 'string' || message.correlationId.length > 256))
43
+ throw new ProgramError('INVALID_INPUT', 'Invalid message metadata');
44
+ assertJson(message.body);
45
+ // Reserve framing space for id, receipt timestamps, and the opaque claim token.
46
+ // Never accept durable work that cannot later cross the bounded bridge.
47
+ if (Buffer.byteLength(JSON.stringify(message)) > 60 * 1024)
48
+ throw new ProgramError('LIMIT', 'Inbox message exceeds 60 KiB');
49
+ return this.transaction(() => {
50
+ const count = this.db.prepare('SELECT count(*) AS count FROM app_messages WHERE owner_id=? AND program=? AND acked_at IS NULL').get(scope.ownerId, scope.program);
51
+ if (count.count >= this.maxPending)
52
+ throw new ProgramError('BACKPRESSURE', 'Program inbox is full');
53
+ // Receipts are retained across restarts, but are a bounded operational history.
54
+ const total = this.db.prepare('SELECT count(*) AS count FROM app_messages').get().count;
55
+ if (total >= this.maxMessages)
56
+ this.db.prepare('DELETE FROM app_messages WHERE id IN (SELECT id FROM app_messages WHERE acked_at IS NOT NULL ORDER BY acked_at LIMIT ?)').run(total - this.maxMessages + 1);
57
+ if (this.db.prepare('SELECT count(*) AS count FROM app_messages').get().count >= this.maxMessages)
58
+ throw new ProgramError('BACKPRESSURE', 'Message store is full');
59
+ const id = randomUUID();
60
+ this.db.prepare('INSERT INTO app_messages (id,owner_id,program,sender,body,correlation_id,created_at) VALUES (?,?,?,?,?,?,?)').run(id, scope.ownerId, scope.program, message.from, JSON.stringify(message.body), message.correlationId ?? null, this.clock());
61
+ return this.receipt(scope, id);
62
+ });
63
+ }
64
+ async receive(scope, options = {}, signal) {
65
+ this.checkScope(scope);
66
+ if (!options || typeof options !== 'object' || Array.isArray(options))
67
+ throw new ProgramError('INVALID_INPUT', 'Invalid receive options');
68
+ const waitMs = this.bound(options.waitMs === undefined ? 0 : options.waitMs, 'waitMs', 0, 30_000);
69
+ const leaseMs = this.bound(options.leaseMs === undefined ? 60_000 : options.leaseMs, 'leaseMs', 1, 300_000);
70
+ const deadline = Date.now() + waitMs;
71
+ do {
72
+ if (signal?.aborted)
73
+ throw new ProgramError('CANCELLED', 'Inbox receive was cancelled');
74
+ this.checkScope(scope);
75
+ const found = this.transaction(() => {
76
+ const now = this.clock();
77
+ const row = this.db.prepare('SELECT * FROM app_messages WHERE owner_id=? AND program=? AND acked_at IS NULL AND (lease_until IS NULL OR lease_until<=?) ORDER BY created_at,rowid LIMIT 1').get(scope.ownerId, scope.program, now);
78
+ if (!row)
79
+ return null;
80
+ const token = randomBytes(32).toString('base64url');
81
+ this.db.prepare('UPDATE app_messages SET claimed_at=?,lease_until=?,lease_token=?,claimant=?,attempts=attempts+1 WHERE id=?').run(now, now + leaseMs, token, scope.claimant ?? '', row.id);
82
+ return { id: row.id, from: row.sender, body: JSON.parse(row.body), createdAt: new Date(row.created_at).toISOString(), ...(row.correlation_id === null ? {} : { correlationId: row.correlation_id }), leaseToken: token, receipt: this.receipt(scope, row.id) };
83
+ });
84
+ if (found || Date.now() >= deadline)
85
+ return found;
86
+ try {
87
+ await delay(Math.min(100, Math.max(1, deadline - Date.now())), undefined, { signal });
88
+ }
89
+ catch {
90
+ throw new ProgramError('CANCELLED', 'Inbox receive was cancelled');
91
+ }
92
+ } while (true);
93
+ }
94
+ /** Extend only an unexpired claim belonging to this exact run and token. Never resurrect a lease. */
95
+ renew(scope, id, leaseToken, leaseMs) {
96
+ this.bound(leaseMs, 'leaseMs', 1, 300_000);
97
+ return this.transaction(() => {
98
+ const row = this.claim(scope, id, leaseToken);
99
+ this.db.prepare('UPDATE app_messages SET lease_until=? WHERE id=?').run(this.clock() + leaseMs, row.id);
100
+ return this.receipt(scope, id);
101
+ });
102
+ }
103
+ /** Low-level settlement. The exact live token is consumed; never retry an unknown ACK outcome. */
104
+ ack(scope, id, leaseToken) {
105
+ return this.transaction(() => {
106
+ const row = this.claim(scope, id, leaseToken);
107
+ this.db.prepare('UPDATE app_messages SET acked_at=?,lease_until=NULL,lease_token=NULL,claimant=NULL WHERE id=?').run(this.clock(), row.id);
108
+ return this.receipt(scope, id);
109
+ });
110
+ }
111
+ nack(scope, id, leaseToken) {
112
+ return this.transaction(() => {
113
+ const row = this.claim(scope, id, leaseToken);
114
+ this.db.prepare('UPDATE app_messages SET lease_until=NULL,lease_token=NULL,claimant=NULL WHERE id=?').run(row.id);
115
+ return this.receipt(scope, id);
116
+ });
117
+ }
118
+ receipt(scope, id) {
119
+ this.checkScope(scope);
120
+ const row = this.row(scope, id);
121
+ if (!row)
122
+ return null;
123
+ const active = row.lease_until !== null && row.lease_until > this.clock();
124
+ return { id: row.id, status: row.acked_at !== null ? 'acked' : active ? 'claimed' : 'accepted', acceptedAt: new Date(row.created_at).toISOString(), ...(row.claimed_at === null ? {} : { claimedAt: new Date(row.claimed_at).toISOString() }), ...(row.acked_at === null ? {} : { ackedAt: new Date(row.acked_at).toISOString() }), ...(!active ? {} : { leaseUntil: new Date(row.lease_until).toISOString() }), attempts: row.attempts };
125
+ }
126
+ /** Release only this revoked run's claims; namespace and unacked messages survive. */
127
+ releaseClaims(scope) {
128
+ this.checkScope(scope);
129
+ this.db.prepare('UPDATE app_messages SET lease_until=NULL,lease_token=NULL,claimant=NULL WHERE owner_id=? AND program=? AND claimant=? AND acked_at IS NULL').run(scope.ownerId, scope.program, scope.claimant ?? '');
130
+ }
131
+ close() { if (this.closed)
132
+ return; this.closed = true; this.db.close(); }
133
+ row(scope, id) {
134
+ if (typeof id !== 'string' || !id || id.length > 256)
135
+ throw new ProgramError('INVALID_INPUT', 'Invalid message id');
136
+ return this.db.prepare('SELECT * FROM app_messages WHERE owner_id=? AND program=? AND id=?').get(scope.ownerId, scope.program, id);
137
+ }
138
+ claim(scope, id, token) {
139
+ this.checkScope(scope);
140
+ const row = this.row(scope, id);
141
+ if (!row)
142
+ throw new ProgramError('NOT_FOUND', 'Message not found');
143
+ if (typeof token !== 'string' || !row.lease_token || Buffer.byteLength(token) !== Buffer.byteLength(row.lease_token) || !timingSafeEqual(Buffer.from(token), Buffer.from(row.lease_token)) || row.claimant !== (scope.claimant ?? '') || row.lease_until === null || row.lease_until <= this.clock() || row.acked_at !== null)
144
+ throw new ProgramError('LEASE_LOST', 'Claim lease is invalid, expired, or belongs to another run');
145
+ return row;
146
+ }
147
+ checkScope(scope) {
148
+ if (this.closed)
149
+ throw new ProgramError('DISPOSED', 'Message store is closed');
150
+ if (!scope || typeof scope.ownerId !== 'string' || !scope.ownerId || scope.ownerId.length > 1024 || typeof scope.program !== 'string' || !scope.program || scope.program.length > 256 || scope.claimant !== undefined && (typeof scope.claimant !== 'string' || scope.claimant.length > 2048))
151
+ throw new ProgramError('INVALID_INPUT', 'Invalid message namespace');
152
+ }
153
+ bound(value, name, min, max) {
154
+ if (!Number.isSafeInteger(value) || value < min || value > max)
155
+ throw new ProgramError('INVALID_INPUT', `${name} must be an integer from ${min} to ${max}`);
156
+ return value;
157
+ }
158
+ transaction(fn) {
159
+ if (this.closed)
160
+ throw new ProgramError('DISPOSED', 'Message store is closed');
161
+ this.db.exec('BEGIN IMMEDIATE');
162
+ try {
163
+ const result = fn();
164
+ this.db.exec('COMMIT');
165
+ return result;
166
+ }
167
+ catch (error) {
168
+ this.db.exec('ROLLBACK');
169
+ throw error;
170
+ }
171
+ }
172
+ }
173
+ //# sourceMappingURL=mailbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../src/app/mailbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { JsonValue } from '../types.js';
2
+ import type { CallOptions } from './index.js';
3
+ import { type ModelsDeclaration, type ModelSelection, type ModelSlotView } from '../models.js';
4
+ export type { ModelSelection, ModelSlotDeclaration, ModelsDeclaration, ModelSlotView } from '../models.js';
5
+ export type ModelBridgeCall = <T = JsonValue>(method: string, input?: JsonValue, options?: CallOptions) => Promise<T>;
6
+ export interface ModelCallControls {
7
+ prompt: string;
8
+ system?: string;
9
+ maxTokens?: number;
10
+ }
11
+ /** Slot calls use its complete selection; explicit calls remain independent. */
12
+ export type ProgramModelCallInput = ModelCallControls & ({
13
+ slot: string;
14
+ provider?: never;
15
+ model?: never;
16
+ reasoningEffort?: never;
17
+ } | (ModelSelection & {
18
+ slot?: never;
19
+ }));
20
+ export interface ProgramModels {
21
+ /** Publish a complete declaration snapshot without overwriting user overrides. */
22
+ declare(slots: ModelsDeclaration, options?: CallOptions): Promise<ModelSlotView[]>;
23
+ list(options?: CallOptions): Promise<ModelSlotView[]>;
24
+ /** Resolve the current preference at call time, across watch/run generations. */
25
+ resolve(slot: string, options?: CallOptions): Promise<ModelSelection>;
26
+ /** Alias of resolve: returns the route, not the slot's editable metadata. */
27
+ get(slot: string, options?: CallOptions): Promise<ModelSelection>;
28
+ /** Exactly one explicit model call. No inference, tools, or fallback loop is implicit. */
29
+ call<T = JsonValue>(input: ProgramModelCallInput | JsonValue, options?: CallOptions): Promise<T>;
30
+ }
31
+ /** The app face intentionally has no setter/resetter for human-owned preferences. */
32
+ export declare function createProgramModels(call: ModelBridgeCall): ProgramModels;
@@ -0,0 +1,13 @@
1
+ import { parseModelsDeclaration, parseModelSlotId } from '../models.js';
2
+ /** The app face intentionally has no setter/resetter for human-owned preferences. */
3
+ export function createProgramModels(call) {
4
+ const resolve = (slot, options) => call('models.resolve', { slot: parseModelSlotId(slot) }, options);
5
+ return {
6
+ declare: (slots, options) => call('models.declare', { slots: parseModelsDeclaration(slots) }, options),
7
+ list: options => call('models.list', {}, options),
8
+ resolve,
9
+ get: resolve,
10
+ call: (input, options) => call('models.call', input, options),
11
+ };
12
+ }
13
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/app/models.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAmE,MAAM,cAAc,CAAC;AAwBzI,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CAAC,IAAqB;IACvD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,OAAqB,EAAE,EAAE,CAAC,IAAI,CAAiB,gBAAgB,EAAE,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3I,OAAO;QACL,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAkB,gBAAgB,EAAE,EAAE,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,EAA0B,EAAE,OAAO,CAAC;QAC/I,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAkB,aAAa,EAAE,EAAE,EAAE,OAAO,CAAC;QAClE,OAAO;QACP,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,CAAgB,KAAwC,EAAE,OAAqB,EAAE,EAAE,CAAC,IAAI,CAAI,aAAa,EAAE,KAAkB,EAAE,OAAO,CAAC;KAC9I,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { JsonValue, ProgramDefinition, ProgramSnapshot } from '../types.js';
2
+ export interface AppBridgeContext {
3
+ run: ProgramSnapshot;
4
+ definition: ProgramDefinition;
5
+ }
6
+ export interface AppBridgeServerOptions {
7
+ handler(context: AppBridgeContext, method: string, input: JsonValue, signal: AbortSignal): Promise<JsonValue>;
8
+ streamHandler?(context: AppBridgeContext, method: string, input: JsonValue, signal: AbortSignal): AsyncIterable<JsonValue>;
9
+ /** Hard ceilings are 32 outstanding handlers and 120 seconds. */
10
+ maxOutstanding?: number;
11
+ timeoutMs?: number;
12
+ }
13
+ /** Parent-owned loopback bridge for trusted processes; this is not an OS sandbox. */
14
+ export declare class AppBridgeServer {
15
+ private readonly options;
16
+ readonly ready: Promise<void>;
17
+ private readonly server;
18
+ private readonly registrations;
19
+ private readonly tokens;
20
+ private readonly maxOutstanding;
21
+ private readonly timeoutMs;
22
+ private outstanding;
23
+ private disposed;
24
+ private closing?;
25
+ private address?;
26
+ constructor(options: AppBridgeServerOptions);
27
+ register(run: ProgramSnapshot, definition: ProgramDefinition): {
28
+ env: Record<string, string>;
29
+ };
30
+ revoke(run: Pick<ProgramSnapshot, 'id' | 'generation'>): void;
31
+ dispose(): Promise<void>;
32
+ private handle;
33
+ private read;
34
+ private abortable;
35
+ private reply;
36
+ }
@@ -0,0 +1,233 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { createServer } from 'node:http';
3
+ import { assertJson, exactKeys, isRecord, jsonClone, ProgramError, safeError, validName } from '../runtime/protocol.js';
4
+ import { writeProgramStream } from './stream-server.js';
5
+ const MAX_BYTES = 64 * 1024;
6
+ const key = (run) => `${run.id}:${run.generation}`;
7
+ /** Parent-owned loopback bridge for trusted processes; this is not an OS sandbox. */
8
+ export class AppBridgeServer {
9
+ options;
10
+ ready;
11
+ server;
12
+ registrations = new Map();
13
+ tokens = new Map();
14
+ maxOutstanding;
15
+ timeoutMs;
16
+ outstanding = 0;
17
+ disposed = false;
18
+ closing;
19
+ address;
20
+ constructor(options) {
21
+ this.options = options;
22
+ this.maxOutstanding = options.maxOutstanding ?? 32;
23
+ this.timeoutMs = options.timeoutMs ?? 120_000;
24
+ if (!Number.isSafeInteger(this.maxOutstanding) || this.maxOutstanding < 1 || this.maxOutstanding > 32 || !Number.isSafeInteger(this.timeoutMs) || this.timeoutMs < 1 || this.timeoutMs > 120_000)
25
+ throw new ProgramError('INVALID_CONFIG', 'Invalid bridge limits');
26
+ this.server = createServer({ maxHeaderSize: 16 * 1024 }, (request, response) => { void this.handle(request, response); });
27
+ this.server.maxConnections = 128;
28
+ this.server.headersTimeout = 10_000;
29
+ this.server.requestTimeout = 10_000;
30
+ this.server.keepAliveTimeout = 1000;
31
+ this.ready = new Promise((resolve, reject) => {
32
+ this.server.once('error', reject);
33
+ this.server.listen(0, '127.0.0.1', () => {
34
+ const address = this.server.address();
35
+ if (!address || typeof address === 'string') {
36
+ reject(new ProgramError('UNAVAILABLE', 'Bridge did not bind loopback'));
37
+ return;
38
+ }
39
+ this.address = `http://127.0.0.1:${address.port}`;
40
+ resolve();
41
+ });
42
+ });
43
+ void this.ready.catch(() => { });
44
+ }
45
+ register(run, definition) {
46
+ if (this.disposed || !this.address)
47
+ throw new ProgramError('UNAVAILABLE', 'Await bridge.ready before starting programs');
48
+ if (this.registrations.has(key(run)))
49
+ throw new ProgramError('BUSY', 'Program generation already has bridge credentials');
50
+ if (this.registrations.size >= 256)
51
+ throw new ProgramError('LIMIT', 'Bridge registration limit exceeded');
52
+ const token = randomBytes(32).toString('base64url');
53
+ const registration = { run: jsonClone(run), definition: structuredClone(definition), token, controllers: new Set() };
54
+ this.registrations.set(key(run), registration);
55
+ this.tokens.set(token, registration);
56
+ return { env: { DSH_PROGRAM_BRIDGE_URL: this.address, DSH_PROGRAM_BRIDGE_TOKEN: token, DSH_PROGRAM_RUN_ID: run.id, DSH_PROGRAM_GEN: String(run.generation) } };
57
+ }
58
+ revoke(run) {
59
+ const registration = this.registrations.get(key(run));
60
+ if (!registration)
61
+ return;
62
+ this.registrations.delete(key(run));
63
+ this.tokens.delete(registration.token);
64
+ for (const controller of registration.controllers)
65
+ controller.abort(new ProgramError('REVOKED', 'Program generation is no longer active; effect outcome may be unknown'));
66
+ registration.controllers.clear();
67
+ }
68
+ dispose() {
69
+ if (this.closing)
70
+ return this.closing;
71
+ this.disposed = true;
72
+ for (const registration of this.registrations.values())
73
+ this.revoke(registration.run);
74
+ this.closing = (async () => {
75
+ await this.ready.catch(() => { });
76
+ await new Promise((resolve) => {
77
+ this.server.close(() => resolve());
78
+ this.server.closeAllConnections();
79
+ });
80
+ })();
81
+ return this.closing;
82
+ }
83
+ async handle(request, response) {
84
+ let registration;
85
+ let controller;
86
+ let timer;
87
+ let reserved = false;
88
+ let handlerStarted = false;
89
+ const disconnect = () => controller?.abort(new ProgramError('CANCELLED', 'Caller disconnected; effect outcome may be unknown'));
90
+ try {
91
+ if (this.disposed)
92
+ throw new ProgramError('UNAVAILABLE', 'Bridge is closed');
93
+ const streaming = request.url === '/stream' && !!this.options.streamHandler;
94
+ if (request.method !== 'POST' || request.url !== '/call' && !streaming) {
95
+ this.reply(response, 404, { ok: false, error: { code: 'NOT_FOUND', message: 'Unknown bridge route' } });
96
+ return;
97
+ }
98
+ // Browser origins/cookies are not bridge credentials. No CORS or ambient auth.
99
+ if (request.headers.origin !== undefined || request.headers['sec-fetch-site'] !== undefined || request.headers.host !== new URL(this.address).host)
100
+ throw new ProgramError('FORBIDDEN', 'Bridge accepts direct loopback clients only');
101
+ const authorization = request.headers.authorization;
102
+ registration = typeof authorization === 'string' && authorization.startsWith('Bearer ') ? this.tokens.get(authorization.slice(7)) : undefined;
103
+ if (!registration)
104
+ throw new ProgramError('UNAUTHORIZED', 'Missing, invalid, or revoked program credentials');
105
+ if (this.outstanding >= this.maxOutstanding)
106
+ throw new ProgramError('BACKPRESSURE', 'Bridge outstanding call limit exceeded');
107
+ this.outstanding++;
108
+ reserved = true;
109
+ controller = new AbortController();
110
+ registration.controllers.add(controller);
111
+ timer = setTimeout(() => controller.abort(new ProgramError('TIMEOUT', 'Bridge deadline exceeded; effect outcome may be unknown')), this.timeoutMs);
112
+ request.once('aborted', disconnect);
113
+ response.once('close', disconnect);
114
+ const input = await this.read(request, controller.signal);
115
+ assertJson(input);
116
+ if (!isRecord(input) || !exactKeys(input, ['method', 'input']) || !validName(input.method))
117
+ throw new ProgramError('INVALID_INPUT', 'Expected {method,input}');
118
+ if (controller.signal.aborted)
119
+ throw controller.signal.reason;
120
+ const activeRegistration = registration;
121
+ const activeController = controller;
122
+ if (streaming) {
123
+ // Each connection is finite; reconnect reopens a native snapshot. Stops and
124
+ // old-generation revocations use the same controller as unary calls.
125
+ if (timer)
126
+ clearTimeout(timer);
127
+ timer = setTimeout(() => activeController.abort(new ProgramError('STREAM_RECONNECT', 'Refresh conversation stream snapshot')), 120000);
128
+ const source = this.options.streamHandler({ run: jsonClone(activeRegistration.run), definition: structuredClone(activeRegistration.definition) }, input.method, input.input, activeController.signal);
129
+ handlerStarted = true;
130
+ try {
131
+ await writeProgramStream(response, source, activeController);
132
+ }
133
+ finally {
134
+ this.outstanding--;
135
+ }
136
+ return;
137
+ }
138
+ const pending = Promise.resolve().then(() => this.options.handler({ run: jsonClone(activeRegistration.run), definition: structuredClone(activeRegistration.definition) }, input.method, input.input, activeController.signal));
139
+ handlerStarted = true;
140
+ // The slot survives timeout/disconnection until the actual host handler settles.
141
+ // A handler ignoring AbortSignal cannot create unbounded detached work.
142
+ void pending.finally(() => { this.outstanding--; }).catch(() => { });
143
+ const output = await this.abortable(pending, controller.signal);
144
+ if (this.tokens.get(registration.token) !== registration)
145
+ throw new ProgramError('REVOKED', 'Program generation is no longer active');
146
+ assertJson(output);
147
+ this.reply(response, 200, { ok: true, result: output });
148
+ }
149
+ catch (error) {
150
+ const code = error instanceof ProgramError ? error.code : 'CALL_FAILED';
151
+ const status = code === 'UNAUTHORIZED' || code === 'REVOKED' ? 401 : code === 'FORBIDDEN' ? 403 : code === 'BACKPRESSURE' ? 429 : code === 'TIMEOUT' ? 504 : code === 'LIMIT' ? 413 : code === 'INVALID_INPUT' || code === 'INVALID_JSON' ? 400 : 500;
152
+ this.reply(response, status, { ok: false, error: { code, message: safeError(error) } });
153
+ }
154
+ finally {
155
+ if (reserved && !handlerStarted)
156
+ this.outstanding--;
157
+ if (timer)
158
+ clearTimeout(timer);
159
+ if (controller)
160
+ registration?.controllers.delete(controller);
161
+ request.removeListener('aborted', disconnect);
162
+ response.removeListener('close', disconnect);
163
+ // Drain rejected bodies without buffering them, allowing a bounded keep-alive.
164
+ if (!request.complete)
165
+ request.resume();
166
+ }
167
+ }
168
+ read(request, signal) {
169
+ return new Promise((resolve, reject) => {
170
+ const chunks = [];
171
+ let size = 0;
172
+ let done = false;
173
+ const finish = (error, value) => {
174
+ if (done)
175
+ return;
176
+ done = true;
177
+ request.removeListener('data', data);
178
+ request.removeListener('end', end);
179
+ request.removeListener('error', failure);
180
+ signal.removeEventListener('abort', abort);
181
+ if (error)
182
+ reject(error);
183
+ else
184
+ resolve(value);
185
+ };
186
+ const failure = (error) => finish(error);
187
+ const abort = () => finish(signal.reason);
188
+ const data = (chunk) => {
189
+ size += chunk.length;
190
+ if (size > MAX_BYTES) {
191
+ finish(new ProgramError('LIMIT', 'Bridge request exceeds 64 KiB'));
192
+ return;
193
+ }
194
+ chunks.push(chunk);
195
+ };
196
+ const end = () => {
197
+ try {
198
+ finish(undefined, JSON.parse(Buffer.concat(chunks).toString('utf8')));
199
+ }
200
+ catch {
201
+ finish(new ProgramError('INVALID_JSON', 'Malformed bridge JSON'));
202
+ }
203
+ };
204
+ request.on('data', data);
205
+ request.once('end', end);
206
+ request.once('error', failure);
207
+ signal.addEventListener('abort', abort, { once: true });
208
+ if (signal.aborted)
209
+ abort();
210
+ });
211
+ }
212
+ abortable(promise, signal) {
213
+ return new Promise((resolve, reject) => {
214
+ const abort = () => reject(signal.reason);
215
+ signal.addEventListener('abort', abort, { once: true });
216
+ if (signal.aborted)
217
+ abort();
218
+ void promise.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
219
+ });
220
+ }
221
+ reply(response, status, payload) {
222
+ if (response.destroyed || response.writableEnded)
223
+ return;
224
+ let body = JSON.stringify(payload);
225
+ if (Buffer.byteLength(body) > MAX_BYTES) {
226
+ status = 413;
227
+ body = JSON.stringify({ ok: false, error: { code: 'LIMIT', message: 'Bridge response exceeds 64 KiB' } });
228
+ }
229
+ response.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body), 'Cache-Control': 'no-store', 'X-Content-Type-Options': 'nosniff' });
230
+ response.end(body);
231
+ }
232
+ }
233
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/app/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ServerResponse } from 'node:http';
2
+ import type { JsonValue } from '../types.js';
3
+ /** Drain the native iterator independently of HTTP backpressure. Native DSH's
4
+ * follow queue must never become an unbounded slow-browser buffer. */
5
+ export declare function writeProgramStream(response: ServerResponse, source: AsyncIterable<JsonValue>, controller: AbortController, options?: {
6
+ maxFrameBytes?: number;
7
+ maxQueueBytes?: number;
8
+ maxQueueFrames?: number;
9
+ }): Promise<void>;
@@ -0,0 +1,77 @@
1
+ import { assertJson, ProgramError } from '../runtime/protocol.js';
2
+ /** Drain the native iterator independently of HTTP backpressure. Native DSH's
3
+ * follow queue must never become an unbounded slow-browser buffer. */
4
+ export async function writeProgramStream(response, source, controller, options = {}) {
5
+ const maxFrame = options.maxFrameBytes ?? 512 * 1024, maxBytes = options.maxQueueBytes ?? 1024 * 1024, maxFrames = options.maxQueueFrames ?? 128;
6
+ const queue = [];
7
+ let bytes = 0, done = false, failure, wake;
8
+ const notify = () => { wake?.(); wake = undefined; };
9
+ const abort = () => { failure ??= controller.signal.reason; notify(); };
10
+ controller.signal.addEventListener('abort', abort, { once: true });
11
+ const iterator = source[Symbol.asyncIterator]();
12
+ let cleanup;
13
+ const pump = (async () => {
14
+ try {
15
+ while (!controller.signal.aborted) {
16
+ const item = await iterator.next();
17
+ if (item.done)
18
+ break;
19
+ assertJson(item.value);
20
+ const line = Buffer.from(JSON.stringify(item.value) + '\n');
21
+ if (line.length > maxFrame || bytes + line.length > maxBytes || queue.length >= maxFrames)
22
+ throw new ProgramError('STREAM_OVERFLOW', 'Conversation stream exceeded its bounded buffer; reconnect for a fresh native snapshot');
23
+ queue.push(line);
24
+ bytes += line.length;
25
+ notify();
26
+ }
27
+ }
28
+ catch (error) {
29
+ failure = error;
30
+ controller.abort(error);
31
+ }
32
+ finally {
33
+ done = true;
34
+ notify();
35
+ }
36
+ })();
37
+ void pump.catch(() => { });
38
+ response.writeHead(200, { 'Content-Type': 'application/x-ndjson; charset=utf-8', 'Cache-Control': 'no-store', 'X-Content-Type-Options': 'nosniff', 'X-Accel-Buffering': 'no' });
39
+ response.flushHeaders();
40
+ try {
41
+ while (!controller.signal.aborted) {
42
+ if (queue.length) {
43
+ const line = queue.shift();
44
+ bytes -= line.length;
45
+ if (!response.write(line))
46
+ await new Promise((resolve, reject) => { const cleanup = () => { response.off('drain', drain); controller.signal.removeEventListener('abort', cancel); }; const drain = () => { cleanup(); resolve(); }, cancel = () => { cleanup(); reject(controller.signal.reason); }; response.once('drain', drain); controller.signal.addEventListener('abort', cancel, { once: true }); if (controller.signal.aborted)
47
+ cancel(); });
48
+ continue;
49
+ }
50
+ if (done)
51
+ break;
52
+ await new Promise(resolve => { wake = resolve; if (done || controller.signal.aborted || queue.length)
53
+ notify(); });
54
+ }
55
+ }
56
+ catch (error) {
57
+ failure ??= error;
58
+ }
59
+ finally {
60
+ controller.signal.removeEventListener('abort', abort);
61
+ if (!controller.signal.aborted)
62
+ controller.abort(new Error('Stream completed'));
63
+ // A misbehaving iterator may ignore cancellation; retain the caller's resource
64
+ // slot until it actually settles. Never await unbounded cleanup for the socket.
65
+ cleanup = Promise.resolve().then(() => iterator.return?.()).catch(() => { });
66
+ if (!response.destroyed && !response.writableEnded) {
67
+ if (failure) {
68
+ const message = failure instanceof Error ? failure.message : 'Stream interrupted';
69
+ response.write(JSON.stringify({ type: 'stream-error', code: failure instanceof ProgramError ? failure.code : 'INTERRUPTED', message: message.slice(0, 512) }) + '\n');
70
+ }
71
+ response.end();
72
+ }
73
+ }
74
+ await pump;
75
+ await cleanup;
76
+ }
77
+ //# sourceMappingURL=stream-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-server.js","sourceRoot":"","sources":["../../src/app/stream-server.ts"],"names":[],"mappings":"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"}