@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,36 @@
1
+ import type { ProgramDefinition, ProgramSnapshot } from '../types.js';
2
+ interface PolicyHost {
3
+ definition(owner: string, program: string): ProgramDefinition | undefined;
4
+ entries(): Array<{
5
+ ownerId: string;
6
+ program: string;
7
+ definition: ProgramDefinition;
8
+ }>;
9
+ eligible(owner: string): boolean;
10
+ live(owner: string, program: string): boolean;
11
+ start(owner: string, program: string): Promise<unknown>;
12
+ restart(run: ProgramSnapshot): Promise<unknown>;
13
+ report(run: ProgramSnapshot, error: unknown): void;
14
+ }
15
+ /** Opt-in process recovery. Never retries individual calls or infers application idempotence. */
16
+ export declare class SupervisionPolicies {
17
+ private host;
18
+ private timers;
19
+ private attempts;
20
+ private suppressed;
21
+ private signatures;
22
+ private closed;
23
+ private starting;
24
+ private startingOwners;
25
+ constructor(host: PolicyHost);
26
+ private key;
27
+ manualStart(owner: string, program: string): void;
28
+ manualStop(run: ProgramSnapshot): void;
29
+ private cancel;
30
+ changed(run: ProgramSnapshot): void;
31
+ /** Called only after archive/session services are available, and on Agent publication. */
32
+ startup(ownerId?: string): Promise<void>;
33
+ archive(ownerId: string): void;
34
+ dispose(): void;
35
+ }
36
+ export {};
@@ -0,0 +1,73 @@
1
+ /** Opt-in process recovery. Never retries individual calls or infers application idempotence. */
2
+ export class SupervisionPolicies {
3
+ host;
4
+ timers = new Map();
5
+ attempts = new Map();
6
+ suppressed = new Set();
7
+ signatures = new Map();
8
+ closed = false;
9
+ starting = new Set();
10
+ startingOwners = new Set();
11
+ constructor(host) {
12
+ this.host = host;
13
+ }
14
+ key(owner, program) { return owner + '\0' + program; }
15
+ manualStart(owner, program) { const k = this.key(owner, program); this.suppressed.delete(k); this.attempts.delete(k); this.cancel(k); }
16
+ manualStop(run) { const k = this.key(run.ownerId, run.program); this.suppressed.add(k); this.cancel(k); }
17
+ cancel(k) { const timer = this.timers.get(k); if (timer)
18
+ clearTimeout(timer); this.timers.delete(k); }
19
+ changed(run) {
20
+ if (this.closed)
21
+ return;
22
+ const k = this.key(run.ownerId, run.program), signature = run.id + ':' + run.generation + ':' + run.state;
23
+ if (this.signatures.get(k) === signature)
24
+ return;
25
+ this.signatures.set(k, signature);
26
+ if (!['failed', 'completed'].includes(run.state) || this.suppressed.has(k) || !this.host.eligible(run.ownerId))
27
+ return;
28
+ const policy = this.host.definition(run.ownerId, run.program)?.supervision;
29
+ if (!policy || policy.restart === 'never' || policy.restart === undefined || policy.restart === 'on-failure' && run.state !== 'failed')
30
+ return;
31
+ const attempts = this.attempts.get(k) ?? 0, max = policy.maxRestarts ?? 3;
32
+ if (attempts >= max)
33
+ return;
34
+ this.cancel(k);
35
+ const delay = Math.min(300000, (policy.restartDelayMs ?? 1000) * 2 ** Math.min(attempts, 8));
36
+ this.attempts.set(k, attempts + 1);
37
+ this.timers.set(k, setTimeout(() => { this.timers.delete(k); if (this.closed || this.suppressed.has(k) || !this.host.eligible(run.ownerId))
38
+ return; void this.host.restart(run).catch(error => this.host.report(run, error)); }, delay));
39
+ }
40
+ /** Called only after archive/session services are available, and on Agent publication. */
41
+ async startup(ownerId) {
42
+ if (this.closed)
43
+ return;
44
+ for (const entry of this.host.entries()) {
45
+ if (ownerId !== undefined && entry.ownerId !== ownerId || !entry.definition.supervision?.startAtStartup || !this.host.eligible(entry.ownerId))
46
+ continue;
47
+ const k = this.key(entry.ownerId, entry.program);
48
+ if (this.startingOwners.has(entry.ownerId) || this.starting.has(k) || this.host.live(entry.ownerId, entry.program) || this.suppressed.has(k))
49
+ continue;
50
+ this.starting.add(k);
51
+ this.startingOwners.add(entry.ownerId);
52
+ try {
53
+ await this.host.start(entry.ownerId, entry.program);
54
+ }
55
+ catch (error) {
56
+ this.host.report({ id: 'startup', generation: 0, ownerId: entry.ownerId, program: entry.program, label: entry.definition.name ?? entry.program, state: 'failed', startedAt: new Date().toISOString(), logs: [], messages: [], resources: [] }, error);
57
+ }
58
+ finally {
59
+ this.starting.delete(k);
60
+ this.startingOwners.delete(entry.ownerId);
61
+ }
62
+ }
63
+ }
64
+ archive(ownerId) { for (const entry of this.host.entries())
65
+ if (entry.ownerId === ownerId) {
66
+ const k = this.key(ownerId, entry.program);
67
+ this.suppressed.add(k);
68
+ this.cancel(k);
69
+ } }
70
+ dispose() { this.closed = true; for (const key of this.timers.keys())
71
+ this.cancel(key); this.starting.clear(); this.startingOwners.clear(); }
72
+ }
73
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../src/host/policies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { JsonValue } from '../types.js';
2
+ import { type CreateRequestOptions, type RequestRecord, type RequestScope, type RequestWaitOptions, type ResponseReceipt } from '../requests.js';
3
+ export type { CreateRequestOptions, RequestRecord, RequestScope, RequestStatus, RequestWaitOptions, ResponseReceipt } from '../requests.js';
4
+ export interface RequestStoreOptions {
5
+ maxRequests?: number;
6
+ maxPendingPerProgram?: number;
7
+ maxPending?: number;
8
+ clock?: () => number;
9
+ }
10
+ /**
11
+ * Durable request/reply state only. No transport, agent creation, dispatch retry,
12
+ * or execution lease lives here. Reopening a store never replays pending work.
13
+ * The first valid assigned-agent reply is irreversible, not exactly-once agent
14
+ * execution. A transport-ambiguous request can still accept its eventual reply.
15
+ */
16
+ export declare class RequestStore {
17
+ private readonly db;
18
+ private readonly maxRequests;
19
+ private readonly maxPendingPerProgram;
20
+ private readonly maxPending;
21
+ private readonly clock;
22
+ private readonly validators;
23
+ private readonly closeSignal;
24
+ private closed;
25
+ constructor(path: string, options?: RequestStoreOptions);
26
+ create(scope: RequestScope, input: CreateRequestOptions): RequestRecord;
27
+ /** Durable binding MUST precede dispatch. It cannot be changed or cleared. */
28
+ assign(scope: RequestScope, id: string, agentId: string): RequestRecord;
29
+ reply(scope: RequestScope, id: string, senderId: string, body: JsonValue): ResponseReceipt;
30
+ get(scope: RequestScope, id: string): RequestRecord | null;
31
+ /** Lookup before create/dispatch to distinguish a recovered request from new work. */
32
+ getByKey(scope: RequestScope, requestKey: string): RequestRecord | null;
33
+ wait(scope: RequestScope, id: string, options?: RequestWaitOptions, signal?: AbortSignal): Promise<RequestRecord>;
34
+ cancel(scope: RequestScope, id: string): RequestRecord;
35
+ fail(scope: RequestScope, id: string, error?: string): RequestRecord;
36
+ dispatchUnknown(scope: RequestScope, id: string, error?: string): RequestRecord;
37
+ dispatchAccepted(scope: RequestScope, id: string): RequestRecord;
38
+ /** Inspection only, including ambiguous dispatches. Nothing here authorizes replay. */
39
+ listPending(scope?: RequestScope): RequestRecord[];
40
+ close(): void;
41
+ private change;
42
+ private expire;
43
+ private assertLive;
44
+ private validator;
45
+ private row;
46
+ private keyRow;
47
+ private required;
48
+ private record;
49
+ private receipt;
50
+ private checkOpen;
51
+ private checkScope;
52
+ private text;
53
+ private bound;
54
+ private configLimit;
55
+ private errorText;
56
+ private transaction;
57
+ }
@@ -0,0 +1,353 @@
1
+ import { createHash, randomUUID } 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
+ import { assertRequestPayload, createResponseValidator, DEFAULT_RESPONSE_SCHEMA, REQUEST_LIMITS } from '../requests.js';
8
+ const live = (status) => status === 'pending' || status === 'dispatch-unknown';
9
+ function canonical(value) {
10
+ if (Array.isArray(value))
11
+ return `[${value.map(canonical).join(',')}]`;
12
+ if (value && typeof value === 'object')
13
+ return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${canonical(value[key])}`).join(',')}}`;
14
+ return JSON.stringify(value);
15
+ }
16
+ function hash(value) { return createHash('sha256').update(value).digest('hex'); }
17
+ /**
18
+ * Durable request/reply state only. No transport, agent creation, dispatch retry,
19
+ * or execution lease lives here. Reopening a store never replays pending work.
20
+ * The first valid assigned-agent reply is irreversible, not exactly-once agent
21
+ * execution. A transport-ambiguous request can still accept its eventual reply.
22
+ */
23
+ export class RequestStore {
24
+ db;
25
+ maxRequests;
26
+ maxPendingPerProgram;
27
+ maxPending;
28
+ clock;
29
+ validators = new Map();
30
+ closeSignal = new AbortController();
31
+ closed = false;
32
+ constructor(path, options = {}) {
33
+ this.maxRequests = this.configLimit(options.maxRequests ?? REQUEST_LIMITS.maxRequests, 'maxRequests', REQUEST_LIMITS.maxRequests);
34
+ this.maxPendingPerProgram = this.configLimit(options.maxPendingPerProgram ?? REQUEST_LIMITS.maxPendingPerProgram, 'maxPendingPerProgram', REQUEST_LIMITS.maxPendingPerProgram);
35
+ this.maxPending = this.configLimit(options.maxPending ?? REQUEST_LIMITS.maxPending, 'maxPending', REQUEST_LIMITS.maxPending);
36
+ this.clock = options.clock ?? Date.now;
37
+ if (path !== ':memory:') {
38
+ path = resolve(path);
39
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
40
+ }
41
+ this.db = new DatabaseSync(path);
42
+ if (path !== ':memory:')
43
+ chmodSync(path, 0o600);
44
+ this.db.exec(`PRAGMA journal_mode = WAL; PRAGMA busy_timeout = 1000;
45
+ CREATE TABLE IF NOT EXISTS agent_requests (
46
+ id TEXT PRIMARY KEY, owner_id TEXT NOT NULL, program TEXT NOT NULL,
47
+ request_key TEXT, fingerprint TEXT NOT NULL, target TEXT NOT NULL,
48
+ body TEXT NOT NULL, response_schema TEXT NOT NULL, prompt TEXT,
49
+ status TEXT NOT NULL CHECK(status IN ('pending','answered','cancelled','expired','failed','dispatch-unknown')),
50
+ agent_id TEXT, created_at INTEGER NOT NULL, deadline INTEGER NOT NULL,
51
+ dispatch_accepted_at INTEGER, answered_at INTEGER, closed_at INTEGER,
52
+ response TEXT, response_hash TEXT, response_id TEXT, error TEXT,
53
+ UNIQUE(owner_id,program,request_key)
54
+ );
55
+ CREATE INDEX IF NOT EXISTS agent_requests_scope ON agent_requests(owner_id,program,status,created_at);
56
+ CREATE INDEX IF NOT EXISTS agent_requests_deadline ON agent_requests(status,deadline);
57
+ `);
58
+ }
59
+ create(scope, input) {
60
+ this.checkScope(scope);
61
+ if (!input || typeof input !== 'object' || Array.isArray(input))
62
+ throw new ProgramError('INVALID_INPUT', 'Expected request options');
63
+ const requestKey = input.requestKey ?? input.requestId;
64
+ if (input.requestKey !== undefined && input.requestId !== undefined && input.requestKey !== input.requestId)
65
+ throw new ProgramError('INVALID_INPUT', 'Conflicting request idempotency keys');
66
+ if (requestKey !== undefined)
67
+ this.text(requestKey, 'request idempotency key', 256);
68
+ assertRequestPayload(input.target);
69
+ assertRequestPayload(input.body);
70
+ if (Buffer.byteLength(JSON.stringify(input.target)) > REQUEST_LIMITS.promptBytes)
71
+ throw new ProgramError('LIMIT', 'Request target exceeds 8 KiB');
72
+ if (Buffer.byteLength(JSON.stringify(input.body)) > REQUEST_LIMITS.bodyBytes)
73
+ throw new ProgramError('LIMIT', 'Request body exceeds 48 KiB');
74
+ if (input.prompt !== undefined && (typeof input.prompt !== 'string' || Buffer.byteLength(input.prompt) > REQUEST_LIMITS.promptBytes))
75
+ throw new ProgramError('INVALID_INPUT', 'Request prompt must be a string no larger than 8 KiB');
76
+ const timeoutMs = this.bound(input.timeoutMs ?? REQUEST_LIMITS.defaultTimeoutMs, 'timeoutMs', 1, REQUEST_LIMITS.maxTimeoutMs);
77
+ const schema = input.responseSchema === undefined ? DEFAULT_RESPONSE_SCHEMA : input.responseSchema;
78
+ this.validator(schema);
79
+ // Reserve at least 8 KiB for routing identity, deadline and the reply contract.
80
+ // Independent body/schema limits alone could persist undispatchable work.
81
+ const content = { target: input.target, body: input.body, responseSchema: schema, prompt: input.prompt ?? null, timeoutMs };
82
+ // Account for aggregate nodes and schema depth in a framed contract as well
83
+ // as isolated payloads. Never accept input that cannot later be dispatched.
84
+ assertJson({ request: content, framingReserve: Array(64).fill(null) });
85
+ if (Buffer.byteLength(JSON.stringify(content)) > REQUEST_LIMITS.requestBytes)
86
+ throw new ProgramError('LIMIT', 'Combined request input exceeds 56 KiB');
87
+ const fingerprint = hash(canonical(content));
88
+ return this.transaction(() => {
89
+ const now = this.clock();
90
+ this.expire(now);
91
+ if (requestKey !== undefined) {
92
+ const existing = this.keyRow(scope, requestKey);
93
+ if (existing) {
94
+ if (existing.fingerprint !== fingerprint)
95
+ throw new ProgramError('IDEMPOTENCY_CONFLICT', 'Request idempotency key is already bound to different input');
96
+ return this.record(existing);
97
+ }
98
+ }
99
+ const pending = this.db.prepare("SELECT count(*) AS count FROM agent_requests WHERE owner_id=? AND program=? AND status IN ('pending','dispatch-unknown')").get(scope.ownerId, scope.program).count;
100
+ if (pending >= this.maxPendingPerProgram)
101
+ throw new ProgramError('BACKPRESSURE', 'Program has too many active requests');
102
+ const global = this.db.prepare("SELECT count(*) AS count FROM agent_requests WHERE status IN ('pending','dispatch-unknown')").get().count;
103
+ if (global >= this.maxPending)
104
+ throw new ProgramError('BACKPRESSURE', 'Global active request limit reached');
105
+ const total = this.db.prepare('SELECT count(*) AS count FROM agent_requests').get().count;
106
+ if (total >= this.maxRequests)
107
+ this.db.prepare("DELETE FROM agent_requests WHERE id IN (SELECT id FROM agent_requests WHERE status NOT IN ('pending','dispatch-unknown') ORDER BY closed_at,created_at,rowid LIMIT ?)").run(total - this.maxRequests + 1);
108
+ if (this.db.prepare('SELECT count(*) AS count FROM agent_requests').get().count >= this.maxRequests)
109
+ throw new ProgramError('BACKPRESSURE', 'Request store is full; active requests cannot be pruned');
110
+ const id = randomUUID();
111
+ this.db.prepare('INSERT INTO agent_requests (id,owner_id,program,request_key,fingerprint,target,body,response_schema,prompt,status,created_at,deadline) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)').run(id, scope.ownerId, scope.program, requestKey ?? null, fingerprint, JSON.stringify(input.target), JSON.stringify(input.body), JSON.stringify(schema), input.prompt ?? null, 'pending', now, now + timeoutMs);
112
+ return this.record(this.row(scope, id));
113
+ });
114
+ }
115
+ /** Durable binding MUST precede dispatch. It cannot be changed or cleared. */
116
+ assign(scope, id, agentId) {
117
+ this.text(agentId, 'agent id', 1024);
118
+ return this.change(scope, id, row => {
119
+ if (row.agent_id === agentId)
120
+ return;
121
+ if (row.agent_id !== null)
122
+ throw new ProgramError('ALREADY_ASSIGNED', 'Request is bound to another agent');
123
+ this.assertLive(row);
124
+ this.db.prepare('UPDATE agent_requests SET agent_id=? WHERE id=?').run(agentId, row.id);
125
+ });
126
+ }
127
+ reply(scope, id, senderId, body) {
128
+ this.checkScope(scope);
129
+ this.text(senderId, 'sender id', 1024);
130
+ const result = this.transaction(() => {
131
+ this.expire(this.clock());
132
+ const row = this.required(scope, id);
133
+ if (row.agent_id === null)
134
+ return new ProgramError('NOT_ASSIGNED', 'Request has not been assigned to an agent');
135
+ if (row.agent_id !== senderId)
136
+ return new ProgramError('WRONG_AGENT', 'Only the exact assigned agent may reply to this request');
137
+ if (!live(row.status) && row.status !== 'answered')
138
+ return new ProgramError(row.status === 'expired' ? 'EXPIRED' : 'REQUEST_CLOSED', `Request is ${row.status}`);
139
+ if (row.status === 'answered') {
140
+ try {
141
+ assertJson(body);
142
+ if (Buffer.byteLength(JSON.stringify(body)) <= REQUEST_LIMITS.bodyBytes && row.response_hash === hash(canonical(body)))
143
+ return this.receipt(row);
144
+ }
145
+ catch { /* A malformed retry is necessarily different from the accepted JSON. */ }
146
+ return new ProgramError('ALREADY_REPLIED', 'A different reply has already been accepted');
147
+ }
148
+ // Invalid replies never close the pending request or reserve a response slot.
149
+ this.validator(JSON.parse(row.response_schema))(body);
150
+ const responseHash = hash(canonical(body));
151
+ const now = this.clock();
152
+ if (now >= row.deadline) {
153
+ this.expire(now);
154
+ return new ProgramError('EXPIRED', 'Request deadline has passed');
155
+ }
156
+ const responseId = hash(`${row.id}\0${senderId}\0${responseHash}`);
157
+ this.db.prepare("UPDATE agent_requests SET status='answered',response=?,response_hash=?,response_id=?,answered_at=?,closed_at=?,error=NULL WHERE id=? AND status IN ('pending','dispatch-unknown')").run(JSON.stringify(body), responseHash, responseId, now, now, row.id);
158
+ return this.receipt(this.row(scope, id));
159
+ });
160
+ if (result instanceof ProgramError)
161
+ throw result;
162
+ return result;
163
+ }
164
+ get(scope, id) {
165
+ this.checkScope(scope);
166
+ return this.transaction(() => { this.expire(this.clock()); const row = this.row(scope, id); return row ? this.record(row) : null; });
167
+ }
168
+ /** Lookup before create/dispatch to distinguish a recovered request from new work. */
169
+ getByKey(scope, requestKey) {
170
+ this.checkScope(scope);
171
+ this.text(requestKey, 'request idempotency key', 256);
172
+ return this.transaction(() => { this.expire(this.clock()); const row = this.keyRow(scope, requestKey); return row ? this.record(row) : null; });
173
+ }
174
+ async wait(scope, id, options = {}, signal) {
175
+ this.checkScope(scope);
176
+ const waitMs = this.bound(options.waitMs ?? REQUEST_LIMITS.maxWaitMs, 'waitMs', 0, REQUEST_LIMITS.maxWaitMs);
177
+ const end = Date.now() + waitMs;
178
+ const combined = signal ? AbortSignal.any([signal, this.closeSignal.signal]) : this.closeSignal.signal;
179
+ for (;;) {
180
+ if (this.closed)
181
+ throw new ProgramError('DISPOSED', 'Request store is closed');
182
+ if (signal?.aborted)
183
+ throw new ProgramError('CANCELLED', 'Request wait was cancelled');
184
+ const row = this.get(scope, id);
185
+ if (!row)
186
+ throw new ProgramError('NOT_FOUND', 'Request not found');
187
+ if (row.status !== 'pending' || Date.now() >= end)
188
+ return row;
189
+ try {
190
+ await delay(Math.min(REQUEST_LIMITS.pollMs, Math.max(1, end - Date.now()), Math.max(1, Date.parse(row.deadline) - this.clock())), undefined, { signal: combined });
191
+ }
192
+ catch {
193
+ throw new ProgramError(this.closed ? 'DISPOSED' : 'CANCELLED', this.closed ? 'Request store is closed' : 'Request wait was cancelled');
194
+ }
195
+ }
196
+ }
197
+ cancel(scope, id) {
198
+ return this.change(scope, id, row => {
199
+ if (!live(row.status))
200
+ return;
201
+ this.db.prepare("UPDATE agent_requests SET status='cancelled',closed_at=?,error=NULL WHERE id=?").run(this.clock(), row.id);
202
+ });
203
+ }
204
+ fail(scope, id, error = 'Request failed') {
205
+ return this.change(scope, id, row => {
206
+ if (!live(row.status))
207
+ return;
208
+ this.db.prepare("UPDATE agent_requests SET status='failed',closed_at=?,error=? WHERE id=?").run(this.clock(), this.errorText(error), row.id);
209
+ });
210
+ }
211
+ dispatchUnknown(scope, id, error = 'Dispatch outcome is unknown; automatic redispatch is disabled') {
212
+ return this.change(scope, id, row => {
213
+ if (!live(row.status))
214
+ return;
215
+ this.db.prepare("UPDATE agent_requests SET status='dispatch-unknown',error=? WHERE id=?").run(this.errorText(error), row.id);
216
+ });
217
+ }
218
+ dispatchAccepted(scope, id) {
219
+ return this.change(scope, id, row => {
220
+ if (row.agent_id === null)
221
+ throw new ProgramError('NOT_ASSIGNED', 'Assign an agent before recording dispatch');
222
+ // A reply may race ahead of the transport receipt; never overwrite it.
223
+ if (row.dispatch_accepted_at === null)
224
+ this.db.prepare('UPDATE agent_requests SET dispatch_accepted_at=? WHERE id=?').run(this.clock(), row.id);
225
+ });
226
+ }
227
+ /** Inspection only, including ambiguous dispatches. Nothing here authorizes replay. */
228
+ listPending(scope) {
229
+ if (scope)
230
+ this.checkScope(scope);
231
+ else
232
+ this.checkOpen();
233
+ return this.transaction(() => {
234
+ this.expire(this.clock());
235
+ const rows = scope
236
+ ? this.db.prepare("SELECT * FROM agent_requests WHERE owner_id=? AND program=? AND status IN ('pending','dispatch-unknown') ORDER BY created_at,rowid").all(scope.ownerId, scope.program)
237
+ : this.db.prepare("SELECT * FROM agent_requests WHERE status IN ('pending','dispatch-unknown') ORDER BY created_at,rowid").all();
238
+ return rows.map(row => this.record(row));
239
+ });
240
+ }
241
+ close() { if (this.closed)
242
+ return; this.closed = true; this.closeSignal.abort(); this.validators.clear(); this.db.close(); }
243
+ change(scope, id, fn) {
244
+ this.checkScope(scope);
245
+ const result = this.transaction(() => {
246
+ this.expire(this.clock());
247
+ const row = this.required(scope, id);
248
+ try {
249
+ fn(row);
250
+ }
251
+ catch (error) {
252
+ if (error instanceof ProgramError)
253
+ return error;
254
+ throw error;
255
+ }
256
+ return this.record(this.row(scope, id));
257
+ });
258
+ if (result instanceof ProgramError)
259
+ throw result;
260
+ return result;
261
+ }
262
+ expire(now) {
263
+ this.db.prepare("UPDATE agent_requests SET status='expired',closed_at=deadline,error='Request deadline has passed' WHERE status IN ('pending','dispatch-unknown') AND deadline<=?").run(now);
264
+ }
265
+ assertLive(row) {
266
+ if (!live(row.status))
267
+ throw new ProgramError(row.status === 'expired' ? 'EXPIRED' : 'REQUEST_CLOSED', `Request is ${row.status}`);
268
+ }
269
+ validator(schema) {
270
+ try {
271
+ assertJson(schema);
272
+ if (Buffer.byteLength(JSON.stringify(schema)) > REQUEST_LIMITS.schemaBytes)
273
+ throw new Error('Response schema exceeds 16 KiB');
274
+ }
275
+ catch {
276
+ throw new ProgramError('INVALID_SCHEMA', 'Response schema must be finite JSON no larger than 16 KiB and depth 32');
277
+ }
278
+ const key = canonical(schema);
279
+ let validate = this.validators.get(key);
280
+ if (!validate) {
281
+ validate = createResponseValidator(schema);
282
+ if (this.validators.size >= 128)
283
+ this.validators.delete(this.validators.keys().next().value);
284
+ this.validators.set(key, validate);
285
+ }
286
+ return validate;
287
+ }
288
+ row(scope, id) {
289
+ this.text(id, 'request id', 256);
290
+ return this.db.prepare('SELECT * FROM agent_requests WHERE owner_id=? AND program=? AND id=?').get(scope.ownerId, scope.program, id);
291
+ }
292
+ keyRow(scope, key) {
293
+ return this.db.prepare('SELECT * FROM agent_requests WHERE owner_id=? AND program=? AND request_key=?').get(scope.ownerId, scope.program, key);
294
+ }
295
+ required(scope, id) {
296
+ const row = this.row(scope, id);
297
+ if (!row)
298
+ throw new ProgramError('NOT_FOUND', 'Request not found');
299
+ return row;
300
+ }
301
+ record(row) {
302
+ return {
303
+ id: row.id, requestId: row.id, ownerId: row.owner_id, program: row.program,
304
+ ...(row.request_key === null ? {} : { requestKey: row.request_key }),
305
+ target: JSON.parse(row.target), body: JSON.parse(row.body),
306
+ responseSchema: JSON.parse(row.response_schema),
307
+ ...(row.prompt === null ? {} : { prompt: row.prompt }), status: row.status,
308
+ ...(row.agent_id === null ? {} : { agentId: row.agent_id }),
309
+ createdAt: new Date(row.created_at).toISOString(), deadline: new Date(row.deadline).toISOString(),
310
+ ...(row.dispatch_accepted_at === null ? {} : { dispatchAcceptedAt: new Date(row.dispatch_accepted_at).toISOString() }),
311
+ ...(row.answered_at === null ? {} : { answeredAt: new Date(row.answered_at).toISOString() }),
312
+ ...(row.closed_at === null ? {} : { closedAt: new Date(row.closed_at).toISOString() }),
313
+ ...(row.response === null ? {} : { response: JSON.parse(row.response) }),
314
+ ...(row.status === 'answered' ? { receipt: this.receipt(row) } : {}),
315
+ ...(row.error === null ? {} : { error: row.error }),
316
+ };
317
+ }
318
+ receipt(row) { return { id: row.response_id, requestId: row.id, status: 'answered', agentId: row.agent_id, answeredAt: new Date(row.answered_at).toISOString() }; }
319
+ checkOpen() { if (this.closed)
320
+ throw new ProgramError('DISPOSED', 'Request store is closed'); }
321
+ checkScope(scope) {
322
+ this.checkOpen();
323
+ if (!scope || typeof scope.ownerId !== 'string' || !scope.ownerId || scope.ownerId.length > 1024 || typeof scope.program !== 'string' || !scope.program || scope.program.length > 256)
324
+ throw new ProgramError('INVALID_INPUT', 'Invalid request namespace');
325
+ }
326
+ text(value, name, max) { if (typeof value !== 'string' || !value || value.length > max)
327
+ throw new ProgramError('INVALID_INPUT', `Invalid ${name}`); }
328
+ bound(value, name, min, max) {
329
+ if (!Number.isSafeInteger(value) || value < min || value > max)
330
+ throw new ProgramError('INVALID_INPUT', `${name} must be an integer from ${min} to ${max}`);
331
+ return value;
332
+ }
333
+ configLimit(value, name, max) {
334
+ if (!Number.isSafeInteger(value) || value < 1 || value > max)
335
+ throw new ProgramError('INVALID_CONFIG', `${name} must be an integer from 1 to ${max}`);
336
+ return value;
337
+ }
338
+ errorText(value) { return (typeof value === 'string' ? value : 'Request failed').replace(/[\u0000-\u001f\u007f]/g, ' ').slice(0, 1024); }
339
+ transaction(fn) {
340
+ this.checkOpen();
341
+ this.db.exec('BEGIN IMMEDIATE');
342
+ try {
343
+ const result = fn();
344
+ this.db.exec('COMMIT');
345
+ return result;
346
+ }
347
+ catch (error) {
348
+ this.db.exec('ROLLBACK');
349
+ throw error;
350
+ }
351
+ }
352
+ }
353
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../../src/host/requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Agent } from '@deepseek-ai/dsh-agent';
2
+ import type { Tool } from '../mcp.js';
3
+ import type { JsonValue } from '../types.js';
4
+ interface Access {
5
+ tools?: string[];
6
+ mcp?: Array<{
7
+ server: string;
8
+ tools: string[];
9
+ }>;
10
+ }
11
+ /** Discover only tools already visible in the exact parent's DSH tool runtime. */
12
+ export declare function listToolEntries(owner: Agent, access: Access, server?: string): Tool[];
13
+ export declare function listTools(owner: Agent, access: Access, input: Record<string, unknown>): JsonValue;
14
+ export declare function callTool(owner: Agent, access: Access, input: Record<string, unknown>, signal: AbortSignal, execute: (name: string, args: JsonValue) => Promise<{
15
+ isError?: boolean;
16
+ content?: unknown;
17
+ value?: unknown;
18
+ }>): Promise<JsonValue>;
19
+ export {};