@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,92 @@
1
+ import type { ModelSelection } from './models.js';
2
+ import type { JsonValue } from './types.js';
3
+ import type { SessionFollowFrame, SessionPage } from '@deepseek-ai/dsh-api-session-controller/types';
4
+ export type { SessionFollowFrame, SessionPage } from '@deepseek-ai/dsh-api-session-controller/types';
5
+ export type { ModelSelection } from './models.js';
6
+ /** A real, continuable DSH child, privately bound to this parent + program. */
7
+ export interface ConversationOpenOptions {
8
+ name: string;
9
+ instructions?: string;
10
+ /** Creation-time route or a declared program model slot. Existing routes are immutable. */
11
+ model?: ModelSelection | string;
12
+ }
13
+ export interface ConversationInfo {
14
+ id: string;
15
+ name: string;
16
+ model?: ModelSelection;
17
+ }
18
+ export interface ConversationMessage {
19
+ text: string;
20
+ /** App-owned data, delivered as untrusted context on this exact prompt. */
21
+ context?: {
22
+ revision?: string | number;
23
+ state: JsonValue;
24
+ };
25
+ }
26
+ export interface ConversationReceipt {
27
+ requestId: string;
28
+ messageId: string;
29
+ }
30
+ export interface ConversationHistoryOptions {
31
+ /** Inclusive durable cut from the opening native snapshot; -1 means empty. */
32
+ throughSeq: number;
33
+ beforeSeq?: number;
34
+ maxMessages?: number;
35
+ }
36
+ export interface ConversationEventsOptions {
37
+ signal?: AbortSignal;
38
+ maxMessages?: number;
39
+ }
40
+ export interface ConversationSendOptions {
41
+ signal?: AbortSignal;
42
+ requestId?: string;
43
+ /** Queue owns a separate turn. Steering joins the nearest active step. */
44
+ mode?: 'queue' | 'steer';
45
+ }
46
+ /** Native history/stream vocabulary, plus the accepted prompt's durable identity. */
47
+ export type ConversationFrame = SessionFollowFrame | ({
48
+ type: 'receipt';
49
+ } & ConversationReceipt);
50
+ export interface ConversationHandle extends ConversationInfo {
51
+ history(options: ConversationHistoryOptions, callOptions?: {
52
+ signal?: AbortSignal;
53
+ timeoutMs?: number;
54
+ }): Promise<SessionPage>;
55
+ /** Reconnection starts with a fresh native snapshot, not token replay. */
56
+ events(options?: ConversationEventsOptions): AsyncIterable<SessionFollowFrame>;
57
+ send(message: ConversationMessage, options?: ConversationSendOptions): Promise<ConversationReceipt>;
58
+ /** Subscribe before queueing; ends at this accepted message's native turn/end. */
59
+ ask(message: ConversationMessage, options?: Omit<ConversationSendOptions, 'mode'>): AsyncIterable<ConversationFrame>;
60
+ /** Requests cancellation; pending work survives and external effects are not undone. */
61
+ interrupt(options?: {
62
+ signal?: AbortSignal;
63
+ timeoutMs?: number;
64
+ }): Promise<{
65
+ accepted: true;
66
+ }>;
67
+ }
68
+ export interface ProgramConversations {
69
+ open(options: ConversationOpenOptions, callOptions?: {
70
+ signal?: AbortSignal;
71
+ timeoutMs?: number;
72
+ }): Promise<ConversationHandle>;
73
+ get(id: string, options?: {
74
+ signal?: AbortSignal;
75
+ timeoutMs?: number;
76
+ }): Promise<ConversationHandle | null>;
77
+ list(options?: {
78
+ signal?: AbortSignal;
79
+ timeoutMs?: number;
80
+ }): Promise<ConversationInfo[]>;
81
+ }
82
+ export declare const CONVERSATION_LIMITS: Readonly<{
83
+ bindings: 1024;
84
+ perProgram: 64;
85
+ activeStreams: 32;
86
+ streamsPerProgram: 4;
87
+ frameBytes: number;
88
+ messageBytes: number;
89
+ contextBytes: number;
90
+ defaultMessages: 20;
91
+ maxMessages: 100;
92
+ }>;
@@ -0,0 +1,6 @@
1
+ export const CONVERSATION_LIMITS = Object.freeze({
2
+ bindings: 1024, perProgram: 64, activeStreams: 32, streamsPerProgram: 4,
3
+ frameBytes: 512 * 1024, messageBytes: 48 * 1024, contextBytes: 16 * 1024,
4
+ defaultMessages: 20, maxMessages: 100,
5
+ });
6
+ //# sourceMappingURL=conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../src/conversations.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC;IACvE,UAAU,EAAE,GAAG,GAAG,IAAI,EAAE,YAAY,EAAE,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,EAAE,GAAG,IAAI;IACxE,eAAe,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG;CACtC,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /** Persist recipes, never evaluated JavaScript or a previous process's port. */
2
+ export interface ProgramEndpointDefinition {
3
+ port: 'dynamic' | number;
4
+ }
5
+ export interface EndpointNetworking {
6
+ /** Trusted harness setting; program metadata cannot expose a new interface. */
7
+ bindHost?: string;
8
+ /** Browser hostname by default, or an explicit reachable DNS/IP hostname. */
9
+ publicHost?: string;
10
+ /** Direct app protocol, not necessarily the DSH browser's protocol. Default http. */
11
+ protocol?: 'http' | 'https';
12
+ }
13
+ export type ProgramUrlDefinition = {
14
+ id: string;
15
+ title: string;
16
+ type: 'ui' | 'api' | 'docs';
17
+ docs?: string;
18
+ } & (
19
+ /** Legacy absolute URL / informational docs path. Exclusive with endpoint+path. */
20
+ {
21
+ url: string;
22
+ endpoint?: never;
23
+ path?: never;
24
+ } | {
25
+ url?: never;
26
+ endpoint: string;
27
+ path?: string;
28
+ });
29
+ export interface ResolvedEndpointAddress {
30
+ endpoint: string;
31
+ host: string;
32
+ protocol: 'http' | 'https';
33
+ port: number;
34
+ path: string;
35
+ }
36
+ export interface ProgramEndpointBinding {
37
+ id: string;
38
+ bindHost: string;
39
+ requestedPort: number;
40
+ port?: number;
41
+ publicHost: string;
42
+ protocol: 'http' | 'https';
43
+ }
44
+ export declare function endpointName(value: unknown): value is string;
45
+ export declare function normalizeEndpointPath(value: unknown): string;
46
+ export declare function normalizeHostname(value: unknown): string;
47
+ /** Browser-safe; caller supplies browser hostname explicitly for deterministic tests. */
48
+ export declare function endpointUrl(address: ResolvedEndpointAddress, browserHostname?: string): string | undefined;
@@ -0,0 +1,43 @@
1
+ const controls = /[\u0000-\u0020\u007f\\]/;
2
+ export function endpointName(value) { return typeof value === 'string' && /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(value); }
3
+ export function normalizeEndpointPath(value) {
4
+ if (value === undefined)
5
+ return '/';
6
+ if (typeof value !== 'string' || !value.startsWith('/') || value.startsWith('//') || value.length > 4096 || controls.test(value) || /%(?:0[0-9a-f]|1[0-9a-f]|7f|5c)/i.test(value))
7
+ throw Error('Endpoint path must be a bounded absolute path, not a URL or authority');
8
+ const u = new URL(value, 'http://endpoint.invalid');
9
+ if (u.origin !== 'http://endpoint.invalid')
10
+ throw Error('Invalid endpoint path');
11
+ return u.pathname + u.search + u.hash;
12
+ }
13
+ export function normalizeHostname(value) {
14
+ if (typeof value !== 'string' || !value || value.length > 253 || controls.test(value) || /[/?#@%]/.test(value))
15
+ throw Error('Invalid endpoint hostname');
16
+ const bracketed = value.includes(':') && !value.startsWith('[') ? '[' + value + ']' : value;
17
+ let u;
18
+ try {
19
+ u = new URL('http://' + bracketed + '/');
20
+ }
21
+ catch {
22
+ throw Error('Invalid endpoint hostname');
23
+ }
24
+ if (u.port || u.username || u.password || u.pathname !== '/' || !u.hostname)
25
+ throw Error('Hostname must not include a scheme, port or credentials');
26
+ return u.hostname;
27
+ }
28
+ /** Browser-safe; caller supplies browser hostname explicitly for deterministic tests. */
29
+ export function endpointUrl(address, browserHostname) {
30
+ try {
31
+ if (!address || !endpointName(address.endpoint) || !['http', 'https'].includes(address.protocol) || !Number.isSafeInteger(address.port) || address.port < 1 || address.port > 65535)
32
+ return undefined;
33
+ const host = normalizeHostname(address.host === 'browser' ? browserHostname : address.host);
34
+ if (['0.0.0.0', '[::]', 'browser'].includes(host))
35
+ return undefined;
36
+ const path = normalizeEndpointPath(address.path);
37
+ return new URL(`${address.protocol}://${host}:${address.port}${path}`).href;
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ }
43
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../src/endpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { createServer } from "node:http";
2
+ async function main(ctx) {
3
+ let processed = 0;
4
+ let lastInput = null;
5
+ const server = createServer((req, res) => {
6
+ if (req.url !== "/") {
7
+ res.writeHead(404);
8
+ res.end();
9
+ return;
10
+ }
11
+ const data = JSON.stringify({ processed, lastInput, generation: ctx.generation }).replaceAll("<", "\\u003c");
12
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8", "Content-Security-Policy": "default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'", "Cache-Control": "no-store" });
13
+ res.end(`<!doctype html><title>Program dashboard</title><style>body{font:18px system-ui;max-width:700px;margin:3rem auto;background:#15171c;color:#eee}pre{white-space:pre-wrap}</style><h1>Supervised program</h1><p>Reload to see the latest state. Send JSON from DSH.</p><pre id="data"></pre><script>document.getElementById('data').textContent=JSON.stringify(${data},null,2)</script>`);
14
+ });
15
+ await new Promise((resolve, reject) => {
16
+ server.once("error", reject);
17
+ server.listen(0, "127.0.0.1", () => resolve());
18
+ });
19
+ const address = server.address();
20
+ if (!address || typeof address === "string") throw new Error("No server address");
21
+ await ctx.resources.publish({ id: "dashboard", title: "Program dashboard", url: `http://127.0.0.1:${address.port}/` });
22
+ await ctx.status("running", "Dashboard ready; waiting for JSON input");
23
+ try {
24
+ for await (const message of ctx.inbox) {
25
+ lastInput = message.body;
26
+ processed++;
27
+ if (message.body && typeof message.body === "object" && !Array.isArray(message.body) && message.body.action === "help") {
28
+ await ctx.status("blocked", "Waiting for supervisor advice");
29
+ await ctx.parent.send({ type: "needs_help", reason: "Example explicit escalation", processed });
30
+ } else {
31
+ await ctx.status("running", `Processed ${processed} message(s)`);
32
+ console.log(`Processed message ${processed}`);
33
+ }
34
+ }
35
+ } finally {
36
+ await new Promise((resolve) => server.close(() => resolve()));
37
+ }
38
+ return { processed };
39
+ }
40
+ export {
41
+ main as default
42
+ };
@@ -0,0 +1,27 @@
1
+ import { createServer } from "node:http";
2
+ import { connectProgram, installGlobalErrorHandlers } from "@kelloggt/dsh-program-agents/app";
3
+ const app = connectProgram();
4
+ installGlobalErrorHandlers(app.logger);
5
+ const startedAt = (/* @__PURE__ */ new Date()).toISOString();
6
+ const server = createServer((req, res) => {
7
+ if (req.url === "/api/status") {
8
+ res.writeHead(200, { "content-type": "application/json", "cache-control": "no-store" });
9
+ res.end(JSON.stringify({ pid: process.pid, startedAt, message: "Harness endpoint is bound and advertised" }));
10
+ return;
11
+ }
12
+ if (req.url !== "/") {
13
+ res.writeHead(404);
14
+ res.end();
15
+ return;
16
+ }
17
+ res.writeHead(200, { "content-type": "text/html; charset=utf-8", "cache-control": "no-store", "content-security-policy": "default-src 'none'; style-src 'unsafe-inline'" });
18
+ res.end('<!doctype html><title>Dynamic endpoint demo</title><style>body{font:18px system-ui;max-width:700px;margin:4rem auto}a{color:#368}</style><h1>Dynamic endpoint demo</h1><p>This server uses a harness-supplied interface and an OS-assigned port. Restarting resolves the endpoint again.</p><a href="/api/status">API status</a>');
19
+ });
20
+ const listener = await app.endpoints.listen("web", server);
21
+ app.logger.info("Endpoint ready", { port: listener.port, bind_host: listener.host, local_url: listener.localUrl }, { log_type: "com.example.endpoint.ready.v1" });
22
+ let closing = false;
23
+ for (const signal of ["SIGINT", "SIGTERM"]) process.on(signal, () => {
24
+ if (closing) return;
25
+ closing = true;
26
+ void listener.close().finally(() => app.logger.close()).finally(() => process.exit(0));
27
+ });
@@ -0,0 +1,22 @@
1
+ import { connectProgram, installGlobalErrorHandlers } from "@kelloggt/dsh-program-agents/app";
2
+ const program = connectProgram({ logger: { logsPath: "./logs", stdout: true, private: true } });
3
+ installGlobalErrorHandlers(program.logger);
4
+ program.logger.info("Inbox worker ready", { pid: process.pid }, { log_type: "com.example.inbox.ready.v1" });
5
+ const abort = new AbortController();
6
+ for (const signal of ["SIGINT", "SIGTERM"]) process.on(signal, () => abort.abort());
7
+ try {
8
+ while (!abort.signal.aborted) {
9
+ await program.inbox.receive({ waitMs: 25e3, leaseMs: 6e4, signal: abort.signal }, async (message, { signal }) => {
10
+ signal.throwIfAborted();
11
+ program.logger.info("Received application work", { message_id: message.id }, { log_type: "com.example.inbox.processed.v1", operation_id: message.correlationId ?? message.id });
12
+ return "processed";
13
+ });
14
+ }
15
+ } catch (error) {
16
+ if (!abort.signal.aborted) {
17
+ program.logger.error("Inbox worker failed", {}, { error });
18
+ throw error;
19
+ }
20
+ } finally {
21
+ await program.logger.close();
22
+ }
@@ -0,0 +1,19 @@
1
+ import { connectProgram, installGlobalErrorHandlers } from "@kelloggt/dsh-program-agents/app";
2
+ const dsh = connectProgram({ logger: { logsPath: "./logs/model-slots", stdout: true, private: true } });
3
+ installGlobalErrorHandlers(dsh.logger);
4
+ await dsh.models.declare({
5
+ "smart-model": { description: "Difficult judgments and multi-step planning.", default: { provider: "codex", model: "gpt-6.1-sol", reasoningEffort: "xhigh" } },
6
+ "cheap-local": { description: "Private, low-cost classification and short summaries.", default: { provider: "local-mlx", model: "Qwen3.8-27B-4bit" } }
7
+ });
8
+ dsh.logger.info("Model slots ready; configure selections with the program Models button", {}, { log_type: "com.example.models.ready.v1" });
9
+ const stop = new AbortController();
10
+ for (const signal of ["SIGINT", "SIGTERM"]) process.on(signal, () => stop.abort());
11
+ await new Promise((resolve) => {
12
+ const timer = setInterval(() => {
13
+ }, 6e4);
14
+ stop.signal.addEventListener("abort", () => {
15
+ clearInterval(timer);
16
+ resolve();
17
+ }, { once: true });
18
+ });
19
+ await dsh.logger.close();
@@ -0,0 +1,20 @@
1
+ import { resolve } from "node:path";
2
+ import { ProgramSupervisor } from "@kelloggt/dsh-program-agents/runtime";
3
+ const supervisor = new ProgramSupervisor({
4
+ programs: { dashboard: { entry: resolve("examples/dashboard.ts"), allowedCapabilities: [] } },
5
+ onParentMessage: async (_owner, body) => {
6
+ console.log("Program asks parent:", body);
7
+ }
8
+ });
9
+ const run = await supervisor.start({ program: "dashboard", ownerId: "demo", input: null });
10
+ console.log("Started", run.id, "\u2014 press Ctrl+C to stop.");
11
+ const timer = setInterval(() => {
12
+ const r = supervisor.get(run.id, "demo");
13
+ for (const resource of r.resources) if (resource.available) console.log("Dashboard:", resource.url);
14
+ }, 3e3);
15
+ timer.unref();
16
+ await supervisor.send(run.id, "demo", { hello: "world" });
17
+ process.once("SIGINT", () => {
18
+ clearInterval(timer);
19
+ void supervisor.dispose().then(() => process.exit(0));
20
+ });
@@ -0,0 +1,195 @@
1
+ import { AuditJournal } from './audit.js';
2
+ import { ProgramCatalog } from './catalog.js';
3
+ import { ProgramEvents } from './events.js';
4
+ import { AppBridgeServer } from '../app/server.js';
5
+ import { MessageStore } from '../app/mailbox.js';
6
+ import { SupervisorRouter } from './agents.js';
7
+ import { SupervisionPolicies } from './policies.js';
8
+ import { ProgramOperations } from './operations.js';
9
+ import { RequestStore } from './requests.js';
10
+ import { ProgramModelStore } from './models.js';
11
+ import { ConversationService } from './conversations.js';
12
+ import type { ProgramDefinition } from '../types.js';
13
+ import type { Agent } from '@deepseek-ai/dsh-agent';
14
+ import type { Context } from '@deepseek-ai/cordis';
15
+ import type { PluginConfig } from './contracts.js';
16
+ import { CapabilityRegistry, ProgramSupervisor } from '../runtime/index.js';
17
+ import type { JsonValue, ProgramSnapshot } from '../types.js';
18
+ declare module '@deepseek-ai/dsh-llm' {
19
+ interface MessageSourceMap {
20
+ 'program-agent': {
21
+ kind: 'program-agent';
22
+ runId: string;
23
+ generation: number;
24
+ };
25
+ }
26
+ }
27
+ /** No stale ToolRunContext is retained: every operation belongs to this run. */
28
+ export declare class DshProgramAdapter {
29
+ readonly ctx: Context;
30
+ readonly config: PluginConfig;
31
+ readonly capabilities: CapabilityRegistry;
32
+ readonly supervisor: ProgramSupervisor;
33
+ readonly journal: AuditJournal;
34
+ private owners;
35
+ private lifecycle;
36
+ private notices;
37
+ private revoking;
38
+ private uiStarts;
39
+ readonly catalog: ProgramCatalog;
40
+ readonly events: ProgramEvents;
41
+ readonly bridge: AppBridgeServer;
42
+ readonly mailbox: MessageStore;
43
+ readonly requests: RequestStore;
44
+ readonly modelSlots: ProgramModelStore;
45
+ readonly conversations: ConversationService;
46
+ private requestDispatches;
47
+ readonly router: SupervisorRouter;
48
+ readonly policies: SupervisionPolicies;
49
+ readonly operations: ProgramOperations;
50
+ private disposed;
51
+ private resumed;
52
+ private servicesReady;
53
+ constructor(ctx: Context, config: PluginConfig);
54
+ private disposePartial;
55
+ definition(ownerId: string, program: string): ProgramDefinition | undefined;
56
+ eligible(ownerId: string): boolean;
57
+ resolveOwner(ownerId: string): Promise<Agent>;
58
+ executeAgentTool(agent: Agent, name: string, args: JsonValue, signal: AbortSignal): Promise<unknown>;
59
+ restoreStartup(): Promise<void>;
60
+ sessionCreated(agent: Agent): Promise<void>;
61
+ stopSession(ownerId: string): Promise<void>;
62
+ stop(id: string, ownerId: string): Promise<ProgramSnapshot>;
63
+ restart(id: string, ownerId: string): Promise<ProgramSnapshot>;
64
+ appCall(run: ProgramSnapshot, method: string, input: JsonValue, signal: AbortSignal): Promise<JsonValue>;
65
+ private appStream;
66
+ modelConfiguration(ownerId: string, program: string): Promise<{
67
+ slots: import("../models.js").ModelSlotView[];
68
+ catalog: any;
69
+ }>;
70
+ setModelConfiguration(ownerId: string, program: string, slot: string, selection: unknown, revision: number, signal: AbortSignal): Promise<import("../models.js").ModelSlotView>;
71
+ private resolveModelSelection;
72
+ private requestView;
73
+ private askAgent;
74
+ replyToRequest(sender: Agent, parentId: string, program: string, requestId: string, body: JsonValue): Promise<import("./requests.js").ResponseReceipt>;
75
+ private dispatchTool;
76
+ sendInbox(sender: Agent, parentId: string, program: string, body: JsonValue, correlationId?: string): Promise<import("../app/mailbox.js").MessageReceipt>;
77
+ dispose(): Promise<void>;
78
+ view(ownerId: string): {
79
+ runs: {
80
+ logs: never[];
81
+ messages: never[];
82
+ id: string;
83
+ generation: number;
84
+ program: string;
85
+ ownerId: string;
86
+ label: string;
87
+ name?: string;
88
+ description?: string;
89
+ command?: string[];
90
+ logsPath?: string;
91
+ supervision?: import("../supervision.js").SupervisionSettings;
92
+ state: import("../types.js").ProgramState;
93
+ status?: string;
94
+ pid?: number;
95
+ startedAt: string;
96
+ endedAt?: string;
97
+ error?: string;
98
+ resources: import("../types.js").ProgramResource[];
99
+ endpoints?: import("../endpoints.js").ProgramEndpointBinding[];
100
+ }[];
101
+ programs: {
102
+ hasModelSlots: boolean;
103
+ modelRevision: string;
104
+ program: string;
105
+ name: string;
106
+ description: string;
107
+ command: string[];
108
+ urls: import("../types.js").ProgramResource[];
109
+ endpoints?: Record<string, import("../endpoints.js").ProgramEndpointDefinition>;
110
+ logsPath?: string;
111
+ supervision?: import("../supervision.js").SupervisionSettings;
112
+ }[];
113
+ };
114
+ bindOwner(agent: Agent): Promise<Agent>;
115
+ register(agent: Agent, input: unknown, signal?: AbortSignal): Promise<import("../types.js").ProgramDescriptor>;
116
+ /** UI start traverses the exact parent's public tool policy, not a shell escape. */
117
+ startFromUi(ownerId: string, program: string, signal: AbortSignal): Promise<{
118
+ runs: {
119
+ logs: never[];
120
+ messages: never[];
121
+ id: string;
122
+ generation: number;
123
+ program: string;
124
+ ownerId: string;
125
+ label: string;
126
+ name?: string;
127
+ description?: string;
128
+ command?: string[];
129
+ logsPath?: string;
130
+ supervision?: import("../supervision.js").SupervisionSettings;
131
+ state: import("../types.js").ProgramState;
132
+ status?: string;
133
+ pid?: number;
134
+ startedAt: string;
135
+ endedAt?: string;
136
+ error?: string;
137
+ resources: import("../types.js").ProgramResource[];
138
+ endpoints?: import("../endpoints.js").ProgramEndpointBinding[];
139
+ }[];
140
+ programs: {
141
+ hasModelSlots: boolean;
142
+ modelRevision: string;
143
+ program: string;
144
+ name: string;
145
+ description: string;
146
+ command: string[];
147
+ urls: import("../types.js").ProgramResource[];
148
+ endpoints?: Record<string, import("../endpoints.js").ProgramEndpointDefinition>;
149
+ logsPath?: string;
150
+ supervision?: import("../supervision.js").SupervisionSettings;
151
+ }[];
152
+ }>;
153
+ controlFromUi(agent: Agent, action: 'start' | 'stop' | 'restart', args: JsonValue, signal: AbortSignal): Promise<{
154
+ runs: {
155
+ logs: never[];
156
+ messages: never[];
157
+ id: string;
158
+ generation: number;
159
+ program: string;
160
+ ownerId: string;
161
+ label: string;
162
+ name?: string;
163
+ description?: string;
164
+ command?: string[];
165
+ logsPath?: string;
166
+ supervision?: import("../supervision.js").SupervisionSettings;
167
+ state: import("../types.js").ProgramState;
168
+ status?: string;
169
+ pid?: number;
170
+ startedAt: string;
171
+ endedAt?: string;
172
+ error?: string;
173
+ resources: import("../types.js").ProgramResource[];
174
+ endpoints?: import("../endpoints.js").ProgramEndpointBinding[];
175
+ }[];
176
+ programs: {
177
+ hasModelSlots: boolean;
178
+ modelRevision: string;
179
+ program: string;
180
+ name: string;
181
+ description: string;
182
+ command: string[];
183
+ urls: import("../types.js").ProgramResource[];
184
+ endpoints?: Record<string, import("../endpoints.js").ProgramEndpointDefinition>;
185
+ logsPath?: string;
186
+ supervision?: import("../supervision.js").SupervisionSettings;
187
+ }[];
188
+ }>;
189
+ owner(id: string): Agent;
190
+ start(agent: Agent, program: string, input?: JsonValue, label?: string, signal?: AbortSignal): Promise<ProgramSnapshot>;
191
+ ownerDisposed(agent: Agent): Promise<void>;
192
+ private audit;
193
+ private model;
194
+ private tool;
195
+ }