@kelloggt/dsh-program-agents 0.0.0-stage → 0.1.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 (222) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -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 +84 -0
  93. package/dist/host/index.js.map +1 -0
  94. package/dist/host/installed-v10.js +19797 -0
  95. package/dist/host/installed-v11.js +19797 -0
  96. package/dist/host/installed-v12.js +19797 -0
  97. package/dist/host/installed-v13.js +19797 -0
  98. package/dist/host/installed-v2.js +19797 -0
  99. package/dist/host/installed-v3.js +19797 -0
  100. package/dist/host/installed-v4.js +19797 -0
  101. package/dist/host/installed-v5.js +19797 -0
  102. package/dist/host/installed-v6.js +19797 -0
  103. package/dist/host/installed-v7.js +19797 -0
  104. package/dist/host/installed-v8.js +19797 -0
  105. package/dist/host/installed-v9.js +19797 -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 +19797 -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/tool-client.d.ts +19 -0
  123. package/dist/host/tool-client.js +62 -0
  124. package/dist/host/tool-client.js.map +1 -0
  125. package/dist/host/validation.d.ts +5 -0
  126. package/dist/host/validation.js +42 -0
  127. package/dist/host/validation.js.map +1 -0
  128. package/dist/mcp.d.ts +7 -0
  129. package/dist/mcp.js +2 -0
  130. package/dist/mcp.js.map +1 -0
  131. package/dist/models.d.ts +34 -0
  132. package/dist/models.js +53 -0
  133. package/dist/models.js.map +1 -0
  134. package/dist/monitoring/error-buffer.d.ts +89 -0
  135. package/dist/monitoring/error-buffer.js +355 -0
  136. package/dist/monitoring/error-buffer.js.map +1 -0
  137. package/dist/monitoring/fatal.d.ts +6 -0
  138. package/dist/monitoring/fatal.js +32 -0
  139. package/dist/monitoring/fatal.js.map +1 -0
  140. package/dist/monitoring/index.d.ts +7 -0
  141. package/dist/monitoring/index.js +8 -0
  142. package/dist/monitoring/index.js.map +1 -0
  143. package/dist/monitoring/logger.d.ts +45 -0
  144. package/dist/monitoring/logger.js +174 -0
  145. package/dist/monitoring/logger.js.map +1 -0
  146. package/dist/monitoring/schemas.d.ts +34 -0
  147. package/dist/monitoring/schemas.js +132 -0
  148. package/dist/monitoring/schemas.js.map +1 -0
  149. package/dist/monitoring/standard.d.ts +51 -0
  150. package/dist/monitoring/standard.js +140 -0
  151. package/dist/monitoring/standard.js.map +1 -0
  152. package/dist/monitoring/tailer.d.ts +41 -0
  153. package/dist/monitoring/tailer.js +210 -0
  154. package/dist/monitoring/tailer.js.map +1 -0
  155. package/dist/requests.d.ts +92 -0
  156. package/dist/requests.js +120 -0
  157. package/dist/requests.js.map +1 -0
  158. package/dist/runtime/bootstrap.d.ts +1 -0
  159. package/dist/runtime/bootstrap.js +25 -0
  160. package/dist/runtime/bootstrap.js.map +1 -0
  161. package/dist/runtime/definitions.d.ts +7 -0
  162. package/dist/runtime/definitions.js +138 -0
  163. package/dist/runtime/definitions.js.map +1 -0
  164. package/dist/runtime/index.d.ts +4 -0
  165. package/dist/runtime/index.js +4 -0
  166. package/dist/runtime/index.js.map +1 -0
  167. package/dist/runtime/log-file.d.ts +24 -0
  168. package/dist/runtime/log-file.js +124 -0
  169. package/dist/runtime/log-file.js.map +1 -0
  170. package/dist/runtime/protocol.d.ts +60 -0
  171. package/dist/runtime/protocol.js +155 -0
  172. package/dist/runtime/protocol.js.map +1 -0
  173. package/dist/runtime/registry.d.ts +8 -0
  174. package/dist/runtime/registry.js +38 -0
  175. package/dist/runtime/registry.js.map +1 -0
  176. package/dist/runtime/supervisor.d.ts +74 -0
  177. package/dist/runtime/supervisor.js +881 -0
  178. package/dist/runtime/supervisor.js.map +1 -0
  179. package/dist/sdk/connection.d.ts +33 -0
  180. package/dist/sdk/connection.js +265 -0
  181. package/dist/sdk/connection.js.map +1 -0
  182. package/dist/sdk/index.d.ts +8 -0
  183. package/dist/sdk/index.js +2 -0
  184. package/dist/sdk/index.js.map +1 -0
  185. package/dist/supervision.d.ts +22 -0
  186. package/dist/supervision.js +32 -0
  187. package/dist/supervision.js.map +1 -0
  188. package/dist/types.d.ts +170 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/docs/installation.md +35 -0
  192. package/docs/log-format.md +102 -0
  193. package/docs/publishing.md +45 -0
  194. package/docs/supervision.md +73 -0
  195. package/examples/dashboard.ts +31 -0
  196. package/examples/dsh-web-local.patch.yml +15 -0
  197. package/examples/dynamic-server.ts +13 -0
  198. package/examples/inbox-worker.ts +17 -0
  199. package/examples/model-slots.ts +12 -0
  200. package/examples/standalone-supervisor.ts +14 -0
  201. package/examples/watch-server.ts +12 -0
  202. package/package.json +131 -3
  203. package/schemas/dsh.http.request.v1.schema.json +14 -0
  204. package/schemas/dsh.program.error-batch.v1.schema.json +24 -0
  205. package/schemas/dsh.program.error.v1.schema.json +8 -0
  206. package/schemas/standard-log-record.v1.schema.json +26 -0
  207. package/skills/program-agents/SKILL.md +124 -0
  208. package/skills/program-agents/chat-sidebar.md +23 -0
  209. package/skills/program-agents/endpoints.md +92 -0
  210. package/skills/program-agents/inboxes.md +120 -0
  211. package/skills/program-agents/log-format.md +102 -0
  212. package/skills/program-agents/models.md +59 -0
  213. package/skills/program-agents/references/chat-sidebar/AgentSidebar.tsx +181 -0
  214. package/skills/program-agents/references/chat-sidebar/README.md +181 -0
  215. package/skills/program-agents/references/chat-sidebar/agent-sidebar.css +37 -0
  216. package/skills/program-agents/references/chat-sidebar/backend.ts +184 -0
  217. package/skills/program-agents/references/chat-sidebar/protocol.ts +214 -0
  218. package/skills/program-agents/schemas/dsh.http.request.v1.schema.json +14 -0
  219. package/skills/program-agents/schemas/dsh.program.error-batch.v1.schema.json +24 -0
  220. package/skills/program-agents/schemas/dsh.program.error.v1.schema.json +8 -0
  221. package/skills/program-agents/schemas/standard-log-record.v1.schema.json +26 -0
  222. package/skills/program-agents/ui-patterns.md +39 -0
@@ -0,0 +1,62 @@
1
+ import { ToolSchema } from '@modelcontextprotocol/core';
2
+ import { mcpPublicName, mcpResult, mcpTool } from './mcp.js';
3
+ import { json, object, text } from './validation.js';
4
+ const allowedNative = (name) => !name.startsWith('program_') && name !== 'run_code';
5
+ /** Discover only tools already visible in the exact parent's DSH tool runtime. */
6
+ export function listToolEntries(owner, access, server) {
7
+ const schemas = owner.ctx.tools.schemas(owner), result = [];
8
+ if (server === undefined)
9
+ for (const schema of schemas) {
10
+ if (!access.tools?.includes(schema.name) || !allowedNative(schema.name))
11
+ continue;
12
+ result.push(mcpTool(schema));
13
+ }
14
+ for (const row of access.mcp ?? []) {
15
+ if (server !== undefined && server !== row.server)
16
+ continue;
17
+ for (const name of row.tools) {
18
+ const publicName = mcpPublicName(row.server, name), schema = schemas.find(s => s.name === publicName);
19
+ if (!schema)
20
+ continue;
21
+ const tool = mcpTool(schema), exposed = server === undefined ? publicName : name;
22
+ if (result.some(t => t.name === exposed))
23
+ continue;
24
+ result.push({ ...tool, name: exposed });
25
+ }
26
+ }
27
+ return result.map(tool => { const parsed = ToolSchema.safeParse(tool); if (!parsed.success)
28
+ throw Error('Tool definition is not a valid MCP tool'); return parsed.data; });
29
+ }
30
+ export function listTools(owner, access, input) {
31
+ const server = input.server === undefined ? undefined : text(input.server, 'MCP server', 32), all = listToolEntries(owner, access, server);
32
+ const cursor = input.cursor === undefined ? 0 : Number(text(input.cursor, 'cursor', 8));
33
+ if (!Number.isSafeInteger(cursor) || cursor < 0 || cursor > all.length)
34
+ throw Error('Invalid tool cursor');
35
+ const tools = [];
36
+ let index = cursor;
37
+ while (index < all.length && tools.length < 64) {
38
+ const candidate = [...tools, all[index]];
39
+ if (Buffer.byteLength(JSON.stringify(candidate)) > 48000) {
40
+ if (!tools.length)
41
+ throw Error('Tool definition exceeds bridge budget');
42
+ break;
43
+ }
44
+ tools.push(all[index++]);
45
+ }
46
+ return json({ tools, ...index < all.length ? { nextCursor: String(index) } : {} });
47
+ }
48
+ export async function callTool(owner, access, input, signal, execute) {
49
+ signal.throwIfAborted();
50
+ const name = text(input.name, 'tool name', 256), args = json(input.arguments ?? {});
51
+ object(args);
52
+ if (input._meta !== undefined)
53
+ object(input._meta);
54
+ const server = input.server === undefined ? undefined : text(input.server, 'MCP server', 32);
55
+ const entries = listToolEntries(owner, access, server);
56
+ if (!entries.some(t => t.name === name))
57
+ throw Error('Tool unavailable or not granted');
58
+ const publicName = server === undefined ? name : mcpPublicName(server, name);
59
+ const result = mcpResult(await execute(publicName, args), publicName.startsWith('mcp__'));
60
+ return json(result, 57344);
61
+ }
62
+ //# sourceMappingURL=tool-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-client.js","sourceRoot":"","sources":["../../src/host/tool-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { JsonValue } from '../types.js';
2
+ export declare function object(value: unknown): Record<string, unknown>;
3
+ export declare function text(value: unknown, name: string, max?: number): string;
4
+ export declare function json(value: unknown, maxBytes?: number): JsonValue;
5
+ export declare function exactKeys(o: Record<string, unknown>, keys: string[]): void;
@@ -0,0 +1,42 @@
1
+ export function object(value) {
2
+ if (!value || typeof value !== 'object' || Array.isArray(value))
3
+ throw new Error('Expected object');
4
+ return value;
5
+ }
6
+ export function text(value, name, max = 256) {
7
+ if (typeof value !== 'string' || !value.length || value.length > max)
8
+ throw new Error(`Invalid ${name}`);
9
+ return value;
10
+ }
11
+ export function json(value, maxBytes = 65536) {
12
+ const wire = JSON.stringify(value);
13
+ if (wire === undefined || Buffer.byteLength(wire) > maxBytes)
14
+ throw new Error('JSON value too large or missing');
15
+ // Values arrive from a JSON protocol; reject non-JSON callers as well.
16
+ function check(v, depth = 0) {
17
+ if (depth > 32)
18
+ throw new Error('JSON nesting limit');
19
+ if (v === null || typeof v === 'string' || typeof v === 'boolean')
20
+ return;
21
+ if (typeof v === 'number' && Number.isFinite(v))
22
+ return;
23
+ if (Array.isArray(v)) {
24
+ for (const x of v)
25
+ check(x, depth + 1);
26
+ return;
27
+ }
28
+ if (v && typeof v === 'object' && (Object.getPrototypeOf(v) === Object.prototype || Object.getPrototypeOf(v) === null)) {
29
+ for (const x of Object.values(v))
30
+ check(x, depth + 1);
31
+ return;
32
+ }
33
+ throw new Error('Expected lossless JSON');
34
+ }
35
+ check(value);
36
+ return JSON.parse(wire);
37
+ }
38
+ export function exactKeys(o, keys) {
39
+ if (Object.keys(o).some(k => !keys.includes(k)))
40
+ throw new Error('Unknown argument');
41
+ }
42
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/host/validation.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpG,OAAO,KAA+B,CAAC;AACzC,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,KAAc,EAAE,IAAY,EAAE,GAAG,GAAC,GAAG;IACxD,IAAG,OAAO,KAAK,KAAG,QAAQ,IAAE,CAAC,KAAK,CAAC,MAAM,IAAE,KAAK,CAAC,MAAM,GAAC,GAAG;QAAC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAC/F,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,KAAc,EAAE,QAAQ,GAAC,KAAK;IACjD,MAAM,IAAI,GAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,IAAG,IAAI,KAAG,SAAS,IAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAC,QAAQ;QAAC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACzG,uEAAuE;IACvE,SAAS,KAAK,CAAC,CAAS,EAAC,KAAK,GAAC,CAAC;QAC9B,IAAG,KAAK,GAAC,EAAE;YAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAClD,IAAG,CAAC,KAAG,IAAI,IAAE,OAAO,CAAC,KAAG,QAAQ,IAAE,OAAO,CAAC,KAAG,SAAS;YAAC,OAAO;QAC9D,IAAG,OAAO,CAAC,KAAG,QAAQ,IAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAC,OAAO;QAClD,IAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,CAAC;YAAA,KAAI,MAAM,CAAC,IAAI,CAAC;gBAAC,KAAK,CAAC,CAAC,EAAC,KAAK,GAAC,CAAC,CAAC,CAAC;YAAA,OAAO;QAAA,CAAC;QAC/D,IAAG,CAAC,IAAE,OAAO,CAAC,KAAG,QAAQ,IAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,SAAS,IAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAG,IAAI,CAAC,EAAC,CAAC;YAAA,KAAI,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAC,KAAK,CAAC,CAAC,EAAC,KAAK,GAAC,CAAC,CAAC,CAAC;YAAA,OAAO;QAAA,CAAC;QACpK,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAC;IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;AACpD,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,CAAwB,EAAC,IAAa;IAC9D,IAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;AACnF,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /** Types inferred directly from the official MCP SDK's published schemas. */
2
+ import type { z } from 'zod';
3
+ import type { CallToolRequestParamsSchema, CallToolResultSchema, ListToolsResultSchema, ToolSchema } from '@modelcontextprotocol/core';
4
+ export type CallToolRequestParams = z.infer<typeof CallToolRequestParamsSchema>;
5
+ export type CallToolResult = z.infer<typeof CallToolResultSchema>;
6
+ export type ListToolsResult = z.infer<typeof ListToolsResultSchema>;
7
+ export type Tool = z.infer<typeof ToolSchema>;
package/dist/mcp.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ /** Browser-safe named model-slot contracts. Routes are adapter-owned opaque ids. */
2
+ export interface ModelSelection {
3
+ provider: string;
4
+ model: string;
5
+ reasoningEffort?: string;
6
+ }
7
+ export interface ModelSlotDeclaration {
8
+ /** Why this program uses the slot, shown beside its editable selection. */
9
+ description: string;
10
+ default: ModelSelection;
11
+ }
12
+ export type ModelsDeclaration = Record<string, ModelSlotDeclaration>;
13
+ export interface ModelSlotView extends ModelSlotDeclaration {
14
+ id: string;
15
+ /** User override when present, otherwise the latest declared default. */
16
+ selection: ModelSelection;
17
+ overridden: boolean;
18
+ /** Optimistic-concurrency fence for declaration and preference changes. */
19
+ revision: number;
20
+ }
21
+ export declare const MODEL_SLOT_LIMITS: {
22
+ readonly slots: 32;
23
+ readonly id: 120;
24
+ readonly description: 1200;
25
+ readonly route: 512;
26
+ readonly declarationBytes: number;
27
+ readonly snapshotBytes: number;
28
+ };
29
+ export declare function parseModelSlotId(value: unknown): string;
30
+ /** Copy and validate wire input without retaining caller-owned objects. */
31
+ export declare function parseModelSelection(value: unknown): ModelSelection;
32
+ /** A declaration is a complete snapshot, not a merge or a preference mutation. */
33
+ export declare function parseModelsDeclaration(value: unknown): ModelsDeclaration;
34
+ export declare function modelSelectionsEqual(left: ModelSelection | undefined, right: ModelSelection | undefined): boolean;
package/dist/models.js ADDED
@@ -0,0 +1,53 @@
1
+ export const MODEL_SLOT_LIMITS = { slots: 32, id: 120, description: 1_200, route: 512, declarationBytes: 48 * 1024, snapshotBytes: 56 * 1024 };
2
+ function record(value) {
3
+ return value !== null && typeof value === 'object' && !Array.isArray(value) &&
4
+ (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
5
+ }
6
+ function keys(value, allowed) {
7
+ if (Object.keys(value).some(key => !allowed.includes(key)))
8
+ throw new Error('Unknown model selection field');
9
+ }
10
+ function text(value, field, limit) {
11
+ if (typeof value !== 'string' || !value.trim() || value.length > limit || /[\u0000-\u001f\u007f]/.test(value))
12
+ throw new Error(`Invalid model ${field}`);
13
+ return value;
14
+ }
15
+ export function parseModelSlotId(value) {
16
+ if (typeof value !== 'string' || !/^[A-Za-z][A-Za-z0-9_.:-]{0,119}$/.test(value))
17
+ throw new Error('Invalid model slot id');
18
+ return value;
19
+ }
20
+ /** Copy and validate wire input without retaining caller-owned objects. */
21
+ export function parseModelSelection(value) {
22
+ if (!record(value))
23
+ throw new Error('Invalid model selection');
24
+ keys(value, ['provider', 'model', 'reasoningEffort']);
25
+ return {
26
+ provider: text(value.provider, 'provider', MODEL_SLOT_LIMITS.route),
27
+ model: text(value.model, 'model', MODEL_SLOT_LIMITS.route),
28
+ ...(value.reasoningEffort === undefined ? {} : { reasoningEffort: text(value.reasoningEffort, 'reasoning effort', MODEL_SLOT_LIMITS.route) }),
29
+ };
30
+ }
31
+ /** A declaration is a complete snapshot, not a merge or a preference mutation. */
32
+ export function parseModelsDeclaration(value) {
33
+ if (!record(value))
34
+ throw new Error('Invalid model slot declarations');
35
+ const entries = Object.entries(value);
36
+ if (entries.length > MODEL_SLOT_LIMITS.slots)
37
+ throw new Error('At most 32 model slots per program');
38
+ const result = Object.create(null);
39
+ for (const [id, raw] of entries) {
40
+ parseModelSlotId(id);
41
+ if (!record(raw))
42
+ throw new Error('Invalid model slot declaration');
43
+ keys(raw, ['description', 'default']);
44
+ result[id] = { description: text(raw.description, 'slot description', MODEL_SLOT_LIMITS.description), default: parseModelSelection(raw.default) };
45
+ }
46
+ if (new TextEncoder().encode(JSON.stringify(result)).byteLength > MODEL_SLOT_LIMITS.declarationBytes)
47
+ throw new Error('Model slot declarations exceed 48 KiB');
48
+ return result;
49
+ }
50
+ export function modelSelectionsEqual(left, right) {
51
+ return left === right || left !== undefined && right !== undefined && left.provider === right.provider && left.model === right.model && left.reasoningEffort === right.reasoningEffort;
52
+ }
53
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type JsonValue, type StandardLogRecord } from './standard.js';
2
+ export interface LogPointer {
3
+ path?: string;
4
+ offset?: number;
5
+ run?: string | {
6
+ id: string;
7
+ generation: number;
8
+ };
9
+ }
10
+ export interface ErrorGroup {
11
+ fingerprint: string;
12
+ count: number;
13
+ sample: StandardLogRecord;
14
+ range: {
15
+ first: string;
16
+ last: string;
17
+ };
18
+ source?: LogPointer;
19
+ }
20
+ export interface ErrorBatch extends StandardLogRecord {
21
+ log_type: 'dsh.program.error-batch.v1';
22
+ data: {
23
+ key: string;
24
+ groups: ErrorGroup[];
25
+ count: number;
26
+ range: {
27
+ first: string;
28
+ last: string;
29
+ };
30
+ dropped: number;
31
+ [key: string]: unknown;
32
+ } & JsonValue;
33
+ }
34
+ export interface ErrorBufferOptions {
35
+ /** Parent supplies an owner+program-scoped key, never a global singleton. */
36
+ key: string;
37
+ directory: string;
38
+ /** Resolve only when the recipient has actually accepted the batch. */
39
+ deliver: (batch: ErrorBatch, signal?: AbortSignal) => Promise<unknown> | unknown;
40
+ deliveryTimeoutMs?: number;
41
+ enabled?: boolean;
42
+ bufferMs?: number;
43
+ maxBatch?: number;
44
+ cooldownMs?: number;
45
+ retryMs?: number;
46
+ maxOutboxBytes?: number;
47
+ maxOutboxBatches?: number;
48
+ maxPendingGroups?: number;
49
+ clock?: () => number;
50
+ onError?: (error: unknown) => void;
51
+ }
52
+ /** Durable, bounded, per-program at-least-once delivery. No parent routing policy here. */
53
+ export declare class ErrorBuffer {
54
+ private readonly options;
55
+ readonly ready: Promise<void>;
56
+ readonly outboxPath: string;
57
+ private state;
58
+ private queue;
59
+ private timer?;
60
+ private closed;
61
+ private closing;
62
+ private lastFailure;
63
+ private startupFailure;
64
+ private queuedAdds;
65
+ private ingressDropped;
66
+ private delivery?;
67
+ /** A deadline releases the waiter, never this real callback resource slot. */
68
+ private activeHandler?;
69
+ private closeUntil;
70
+ private readonly now;
71
+ constructor(options: ErrorBufferOptions);
72
+ private report;
73
+ private load;
74
+ /** Fast enqueue. flush()/close() await persistence; failures remain observable. */
75
+ add(record: StandardLogRecord, pointer?: LogPointer): boolean;
76
+ private enqueue;
77
+ private trim;
78
+ private persist;
79
+ private schedule;
80
+ private makeBatch;
81
+ private deliver;
82
+ private drain;
83
+ /** Await queued ingestion becoming durable without forcing delivery/cooldown. */
84
+ checkpoint(): Promise<void>;
85
+ /** Force the normal buffer window, but preserve per-fingerprint cooldown. */
86
+ flush(): Promise<void>;
87
+ /** Final errors bypass cooldown; rejected deliveries stay on disk for restart. */
88
+ close(): Promise<void>;
89
+ }