@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.
- package/LICENSE +21 -0
- package/README.md +90 -2
- package/cordis.patch.yml +5 -0
- package/dist/app/agents.d.ts +50 -0
- package/dist/app/agents.js +70 -0
- package/dist/app/agents.js.map +1 -0
- package/dist/app/conversations.d.ts +8 -0
- package/dist/app/conversations.js +26 -0
- package/dist/app/conversations.js.map +1 -0
- package/dist/app/endpoints.d.ts +36 -0
- package/dist/app/endpoints.js +162 -0
- package/dist/app/endpoints.js.map +1 -0
- package/dist/app/inbox.d.ts +61 -0
- package/dist/app/inbox.js +253 -0
- package/dist/app/inbox.js.map +1 -0
- package/dist/app/index.d.ts +70 -0
- package/dist/app/index.js +147 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/mailbox.d.ts +63 -0
- package/dist/app/mailbox.js +173 -0
- package/dist/app/mailbox.js.map +1 -0
- package/dist/app/models.d.ts +32 -0
- package/dist/app/models.js +13 -0
- package/dist/app/models.js.map +1 -0
- package/dist/app/server.d.ts +36 -0
- package/dist/app/server.js +233 -0
- package/dist/app/server.js.map +1 -0
- package/dist/app/stream-server.d.ts +9 -0
- package/dist/app/stream-server.js +77 -0
- package/dist/app/stream-server.js.map +1 -0
- package/dist/app/stream.d.ts +4 -0
- package/dist/app/stream.js +93 -0
- package/dist/app/stream.js.map +1 -0
- package/dist/app/tools.d.ts +16 -0
- package/dist/app/tools.js +24 -0
- package/dist/app/tools.js.map +1 -0
- package/dist/client/controller.d.ts +21 -0
- package/dist/client/controller.js +140 -0
- package/dist/client/controller.js.map +1 -0
- package/dist/client/index.d.ts +22 -0
- package/dist/client/index.js +14 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/model.d.ts +66 -0
- package/dist/client/model.js +147 -0
- package/dist/client/model.js.map +1 -0
- package/dist/client/models.d.ts +11 -0
- package/dist/client/models.js +27 -0
- package/dist/client/models.js.map +1 -0
- package/dist/client/transport.d.ts +64 -0
- package/dist/client/transport.js +141 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/view.d.ts +19 -0
- package/dist/client/view.js +69 -0
- package/dist/client/view.js.map +1 -0
- package/dist/client.js +673 -0
- package/dist/conversations.d.ts +92 -0
- package/dist/conversations.js +6 -0
- package/dist/conversations.js.map +1 -0
- package/dist/endpoints.d.ts +48 -0
- package/dist/endpoints.js +43 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/examples/dashboard.js +42 -0
- package/dist/examples/dynamic-server.js +27 -0
- package/dist/examples/inbox-worker.js +22 -0
- package/dist/examples/model-slots.js +19 -0
- package/dist/examples/standalone-supervisor.js +20 -0
- package/dist/host/adapter.d.ts +195 -0
- package/dist/host/adapter.js +630 -0
- package/dist/host/adapter.js.map +1 -0
- package/dist/host/agents.d.ts +35 -0
- package/dist/host/agents.js +222 -0
- package/dist/host/agents.js.map +1 -0
- package/dist/host/audit.d.ts +14 -0
- package/dist/host/audit.js +39 -0
- package/dist/host/audit.js.map +1 -0
- package/dist/host/catalog.d.ts +53 -0
- package/dist/host/catalog.js +116 -0
- package/dist/host/catalog.js.map +1 -0
- package/dist/host/contracts.d.ts +38 -0
- package/dist/host/contracts.js +2 -0
- package/dist/host/contracts.js.map +1 -0
- package/dist/host/conversations.d.ts +41 -0
- package/dist/host/conversations.js +324 -0
- package/dist/host/conversations.js.map +1 -0
- package/dist/host/events.d.ts +12 -0
- package/dist/host/events.js +106 -0
- package/dist/host/events.js.map +1 -0
- package/dist/host/http.d.ts +14 -0
- package/dist/host/http.js +30 -0
- package/dist/host/http.js.map +1 -0
- package/dist/host/index.d.ts +23 -0
- package/dist/host/index.js +86 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/installed-v10.js +27181 -0
- package/dist/host/installed-v11.js +27181 -0
- package/dist/host/installed-v12.js +27181 -0
- package/dist/host/installed-v13.js +27181 -0
- package/dist/host/installed-v2.js +27181 -0
- package/dist/host/installed-v3.js +27181 -0
- package/dist/host/installed-v4.js +27181 -0
- package/dist/host/installed-v5.js +27181 -0
- package/dist/host/installed-v6.js +27181 -0
- package/dist/host/installed-v7.js +27181 -0
- package/dist/host/installed-v8.js +27181 -0
- package/dist/host/installed-v9.js +27181 -0
- package/dist/host/mcp.d.ts +11 -0
- package/dist/host/mcp.js +42 -0
- package/dist/host/mcp.js.map +1 -0
- package/dist/host/models.d.ts +37 -0
- package/dist/host/models.js +141 -0
- package/dist/host/models.js.map +1 -0
- package/dist/host/operations.d.ts +22 -0
- package/dist/host/operations.js +72 -0
- package/dist/host/operations.js.map +1 -0
- package/dist/host/plugin.js +27181 -0
- package/dist/host/policies.d.ts +36 -0
- package/dist/host/policies.js +73 -0
- package/dist/host/policies.js.map +1 -0
- package/dist/host/requests.d.ts +57 -0
- package/dist/host/requests.js +353 -0
- package/dist/host/requests.js.map +1 -0
- package/dist/host/skills.d.ts +2 -0
- package/dist/host/skills.js +45 -0
- package/dist/host/skills.js.map +1 -0
- package/dist/host/tool-client.d.ts +19 -0
- package/dist/host/tool-client.js +62 -0
- package/dist/host/tool-client.js.map +1 -0
- package/dist/host/validation.d.ts +5 -0
- package/dist/host/validation.js +42 -0
- package/dist/host/validation.js.map +1 -0
- package/dist/mcp.d.ts +7 -0
- package/dist/mcp.js +2 -0
- package/dist/mcp.js.map +1 -0
- package/dist/models.d.ts +34 -0
- package/dist/models.js +53 -0
- package/dist/models.js.map +1 -0
- package/dist/monitoring/error-buffer.d.ts +89 -0
- package/dist/monitoring/error-buffer.js +355 -0
- package/dist/monitoring/error-buffer.js.map +1 -0
- package/dist/monitoring/fatal.d.ts +6 -0
- package/dist/monitoring/fatal.js +32 -0
- package/dist/monitoring/fatal.js.map +1 -0
- package/dist/monitoring/index.d.ts +7 -0
- package/dist/monitoring/index.js +8 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/monitoring/logger.d.ts +45 -0
- package/dist/monitoring/logger.js +174 -0
- package/dist/monitoring/logger.js.map +1 -0
- package/dist/monitoring/schemas.d.ts +34 -0
- package/dist/monitoring/schemas.js +132 -0
- package/dist/monitoring/schemas.js.map +1 -0
- package/dist/monitoring/standard.d.ts +51 -0
- package/dist/monitoring/standard.js +140 -0
- package/dist/monitoring/standard.js.map +1 -0
- package/dist/monitoring/tailer.d.ts +41 -0
- package/dist/monitoring/tailer.js +210 -0
- package/dist/monitoring/tailer.js.map +1 -0
- package/dist/requests.d.ts +92 -0
- package/dist/requests.js +120 -0
- package/dist/requests.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts +1 -0
- package/dist/runtime/bootstrap.js +25 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/definitions.d.ts +7 -0
- package/dist/runtime/definitions.js +138 -0
- package/dist/runtime/definitions.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/log-file.d.ts +24 -0
- package/dist/runtime/log-file.js +124 -0
- package/dist/runtime/log-file.js.map +1 -0
- package/dist/runtime/protocol.d.ts +60 -0
- package/dist/runtime/protocol.js +155 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/runtime/registry.d.ts +8 -0
- package/dist/runtime/registry.js +38 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/supervisor.d.ts +74 -0
- package/dist/runtime/supervisor.js +881 -0
- package/dist/runtime/supervisor.js.map +1 -0
- package/dist/sdk/connection.d.ts +33 -0
- package/dist/sdk/connection.js +265 -0
- package/dist/sdk/connection.js.map +1 -0
- package/dist/sdk/index.d.ts +8 -0
- package/dist/sdk/index.js +2 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/supervision.d.ts +22 -0
- package/dist/supervision.js +32 -0
- package/dist/supervision.js.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/installation.md +37 -0
- package/docs/log-format.md +102 -0
- package/docs/publishing.md +45 -0
- package/docs/supervision.md +73 -0
- package/examples/dashboard.ts +31 -0
- package/examples/dsh-web-local.patch.yml +15 -0
- package/examples/dynamic-server.ts +13 -0
- package/examples/inbox-worker.ts +17 -0
- package/examples/model-slots.ts +12 -0
- package/examples/standalone-supervisor.ts +14 -0
- package/examples/watch-server.ts +12 -0
- package/package.json +134 -3
- package/schemas/dsh.http.request.v1.schema.json +14 -0
- package/schemas/dsh.program.error-batch.v1.schema.json +24 -0
- package/schemas/dsh.program.error.v1.schema.json +8 -0
- package/schemas/standard-log-record.v1.schema.json +26 -0
- package/skills/program-agents/SKILL.md +124 -0
- package/skills/program-agents/chat-sidebar.md +23 -0
- package/skills/program-agents/endpoints.md +92 -0
- package/skills/program-agents/inboxes.md +120 -0
- package/skills/program-agents/log-format.md +102 -0
- package/skills/program-agents/models.md +59 -0
- package/skills/program-agents/references/chat-sidebar/AgentSidebar.tsx +181 -0
- package/skills/program-agents/references/chat-sidebar/README.md +181 -0
- package/skills/program-agents/references/chat-sidebar/agent-sidebar.css +37 -0
- package/skills/program-agents/references/chat-sidebar/backend.ts +184 -0
- package/skills/program-agents/references/chat-sidebar/protocol.ts +214 -0
- package/skills/program-agents/schemas/dsh.http.request.v1.schema.json +14 -0
- package/skills/program-agents/schemas/dsh.program.error-batch.v1.schema.json +24 -0
- package/skills/program-agents/schemas/dsh.program.error.v1.schema.json +8 -0
- package/skills/program-agents/schemas/standard-log-record.v1.schema.json +26 -0
- package/skills/program-agents/ui-patterns.md +39 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { JsonValue } from '../types.js';
|
|
2
|
+
import type { CallOptions } from './index.js';
|
|
3
|
+
export type ProgramStreamCall = (method: string, input?: JsonValue, options?: CallOptions) => AsyncIterable<JsonValue>;
|
|
4
|
+
export declare function createProgramStream(url: URL, token: string): ProgramStreamCall;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { assertJson, ProgramError, validName, isRecord } from '../runtime/protocol.js';
|
|
2
|
+
export function createProgramStream(url, token) {
|
|
3
|
+
let active = 0;
|
|
4
|
+
return async function* (method, input = null, options = {}) {
|
|
5
|
+
if (!validName(method))
|
|
6
|
+
throw new ProgramError('INVALID_INPUT', 'Invalid stream method');
|
|
7
|
+
assertJson(input);
|
|
8
|
+
const body = JSON.stringify({ method, input });
|
|
9
|
+
if (Buffer.byteLength(body) > 65536)
|
|
10
|
+
throw new ProgramError('LIMIT', 'Stream request exceeds64KiB');
|
|
11
|
+
if (active >= 8)
|
|
12
|
+
throw new ProgramError('BACKPRESSURE', 'Program stream limit reached');
|
|
13
|
+
options.signal?.throwIfAborted();
|
|
14
|
+
const timeout = options.timeoutMs ?? 120000;
|
|
15
|
+
if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 120000)
|
|
16
|
+
throw new ProgramError('INVALID_INPUT', 'Stream connection timeout must be1..120000ms');
|
|
17
|
+
active++;
|
|
18
|
+
const controller = new AbortController(), abort = () => controller.abort(options.signal?.reason), timer = setTimeout(() => controller.abort(new ProgramError('STREAM_RECONNECT', 'Refresh conversation snapshot')), timeout);
|
|
19
|
+
options.signal?.addEventListener('abort', abort, { once: true });
|
|
20
|
+
let reader;
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch(new URL('/stream', url), { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', Accept: 'application/x-ndjson' }, body, signal: controller.signal, redirect: 'error' });
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const errorReader = response.body?.getReader();
|
|
25
|
+
const chunks = [];
|
|
26
|
+
let size = 0;
|
|
27
|
+
try {
|
|
28
|
+
while (errorReader) {
|
|
29
|
+
const item = await errorReader.read();
|
|
30
|
+
if (item.done)
|
|
31
|
+
break;
|
|
32
|
+
size += item.value.byteLength;
|
|
33
|
+
if (size > 65536) {
|
|
34
|
+
await errorReader.cancel();
|
|
35
|
+
throw new ProgramError('LIMIT', 'Stream error response too large');
|
|
36
|
+
}
|
|
37
|
+
chunks.push(item.value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
errorReader?.releaseLock();
|
|
42
|
+
}
|
|
43
|
+
const text = Buffer.concat(chunks).toString('utf8');
|
|
44
|
+
let parsed;
|
|
45
|
+
try {
|
|
46
|
+
parsed = JSON.parse(text);
|
|
47
|
+
}
|
|
48
|
+
catch { }
|
|
49
|
+
if (isRecord(parsed) && isRecord(parsed.error))
|
|
50
|
+
throw new ProgramError(String(parsed.error.code), String(parsed.error.message));
|
|
51
|
+
throw new ProgramError('STREAM_FAILED', `Conversation stream HTTP${response.status}`);
|
|
52
|
+
}
|
|
53
|
+
if (!response.headers.get('content-type')?.startsWith('application/x-ndjson') || !response.body)
|
|
54
|
+
throw new ProgramError('INVALID_RESPONSE', 'Expected conversation NDJSON stream');
|
|
55
|
+
reader = response.body.getReader();
|
|
56
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
57
|
+
let pending = '';
|
|
58
|
+
while (true) {
|
|
59
|
+
const item = await reader.read();
|
|
60
|
+
if (item.done)
|
|
61
|
+
break;
|
|
62
|
+
pending += decoder.decode(item.value, { stream: true });
|
|
63
|
+
while (pending.includes('\n')) {
|
|
64
|
+
const end = pending.indexOf('\n');
|
|
65
|
+
if (Buffer.byteLength(pending.slice(0, end)) > 512 * 1024)
|
|
66
|
+
throw new ProgramError('LIMIT', 'Conversation frame too large');
|
|
67
|
+
const line = pending.slice(0, end);
|
|
68
|
+
pending = pending.slice(end + 1);
|
|
69
|
+
if (!line)
|
|
70
|
+
continue;
|
|
71
|
+
const value = JSON.parse(line);
|
|
72
|
+
assertJson(value);
|
|
73
|
+
if (isRecord(value) && value.type === 'stream-error')
|
|
74
|
+
throw new ProgramError(String(value.code), String(value.message));
|
|
75
|
+
yield value;
|
|
76
|
+
}
|
|
77
|
+
if (Buffer.byteLength(pending) > 512 * 1024)
|
|
78
|
+
throw new ProgramError('LIMIT', 'Conversation frame too large');
|
|
79
|
+
}
|
|
80
|
+
if (pending.trim())
|
|
81
|
+
throw new ProgramError('INVALID_RESPONSE', 'Conversation stream ended mid-frame');
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
controller.abort();
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
options.signal?.removeEventListener('abort', abort);
|
|
87
|
+
await reader?.cancel().catch(() => { });
|
|
88
|
+
reader?.releaseLock();
|
|
89
|
+
active--;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/app/stream.ts"],"names":[],"mappings":"AAEA,OAAM,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,QAAQ,EAAC,MAAI,wBAAwB,CAAC;AAE/E,MAAM,UAAU,mBAAmB,CAAC,GAAO,EAAC,KAAY;IACvD,IAAI,MAAM,GAAC,CAAC,CAAC;IACb,OAAO,KAAK,SAAS,CAAC,EAAC,MAAM,EAAC,KAAK,GAAC,IAAI,EAAC,OAAO,GAAC,EAAE;QAClD,IAAG,CAAC,SAAS,CAAC,MAAM,CAAC;YAAC,MAAM,IAAI,YAAY,CAAC,eAAe,EAAC,uBAAuB,CAAC,CAAC;QAAA,UAAU,CAAC,KAAK,CAAC,CAAC;QAAA,MAAM,IAAI,GAAC,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,CAAC,CAAC;QAAA,IAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAC,KAAK;YAAC,MAAM,IAAI,YAAY,CAAC,OAAO,EAAC,6BAA6B,CAAC,CAAC;QACjP,IAAG,MAAM,IAAE,CAAC;YAAC,MAAM,IAAI,YAAY,CAAC,cAAc,EAAC,8BAA8B,CAAC,CAAC;QAAA,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACpH,MAAM,OAAO,GAAC,OAAO,CAAC,SAAS,IAAE,MAAM,CAAC;QAAA,IAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAE,OAAO,GAAC,CAAC,IAAE,OAAO,GAAC,MAAM;YAAC,MAAM,IAAI,YAAY,CAAC,eAAe,EAAC,8CAA8C,CAAC,CAAC;QAC5L,MAAM,EAAE,CAAC;QAAA,MAAM,UAAU,GAAC,IAAI,eAAe,EAAE,EAAC,KAAK,GAAC,GAAE,EAAE,CAAA,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAC,KAAK,GAAC,UAAU,CAAC,GAAE,EAAE,CAAA,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,kBAAkB,EAAC,+BAA+B,CAAC,CAAC,EAAC,OAAO,CAAC,CAAC;QAAA,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAC,KAAK,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC;QAAA,IAAI,MAAwD,CAAC;QACjV,IAAG,CAAC;YACH,MAAM,QAAQ,GAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,EAAC,aAAa,EAAC,UAAU,KAAK,EAAE,EAAC,cAAc,EAAC,kBAAkB,EAAC,MAAM,EAAC,sBAAsB,EAAC,EAAC,IAAI,EAAC,MAAM,EAAC,UAAU,CAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAC,CAAC,CAAC;YAC5N,IAAG,CAAC,QAAQ,CAAC,EAAE,EAAC,CAAC;gBAAA,MAAM,WAAW,GAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;gBAAA,MAAM,MAAM,GAAc,EAAE,CAAC;gBAAA,IAAI,IAAI,GAAC,CAAC,CAAC;gBAAA,IAAG,CAAC;oBAAA,OAAM,WAAW,EAAC,CAAC;wBAAA,MAAM,IAAI,GAAC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;wBAAA,IAAG,IAAI,CAAC,IAAI;4BAAC,MAAM;wBAAA,IAAI,IAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;wBAAA,IAAG,IAAI,GAAC,KAAK,EAAC,CAAC;4BAAA,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;4BAAA,MAAM,IAAI,YAAY,CAAC,OAAO,EAAC,iCAAiC,CAAC,CAAC;wBAAA,CAAC;wBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAA,CAAC;gBAAA,CAAC;wBAAO,CAAC;oBAAA,WAAW,EAAE,WAAW,EAAE,CAAC;gBAAA,CAAC;gBAAA,MAAM,IAAI,GAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAAA,IAAI,MAAc,CAAC;gBAAA,IAAG,CAAC;oBAAA,MAAM,GAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAA,CAAC;gBAAA,MAAK,CAAC,CAAA,CAAC;gBAAA,IAAG,QAAQ,CAAC,MAAM,CAAC,IAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;oBAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAA,MAAM,IAAI,YAAY,CAAC,eAAe,EAAC,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAAA,CAAC;YACrrB,IAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,sBAAsB,CAAC,IAAE,CAAC,QAAQ,CAAC,IAAI;gBAAC,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAC,qCAAqC,CAAC,CAAC;YAC9K,MAAM,GAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAAA,MAAM,OAAO,GAAC,IAAI,WAAW,CAAC,OAAO,EAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;YAAA,IAAI,OAAO,GAAC,EAAE,CAAC;YACpG,OAAM,IAAI,EAAC,CAAC;gBAAA,MAAM,IAAI,GAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAAA,IAAG,IAAI,CAAC,IAAI;oBAAC,MAAM;gBAAA,OAAO,IAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAC,EAAC,MAAM,EAAC,IAAI,EAAC,CAAC,CAAC;gBAAA,OAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,CAAC;oBAAA,MAAM,GAAG,GAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAAA,IAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAC,GAAG,CAAC,CAAC,GAAC,GAAG,GAAC,IAAI;wBAAC,MAAM,IAAI,YAAY,CAAC,OAAO,EAAC,8BAA8B,CAAC,CAAC;oBAAA,MAAM,IAAI,GAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAC,GAAG,CAAC,CAAC;oBAAA,OAAO,GAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAC,CAAC,CAAC,CAAC;oBAAA,IAAG,CAAC,IAAI;wBAAC,SAAS;oBAAA,MAAM,KAAK,GAAS,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAAA,UAAU,CAAC,KAAK,CAAC,CAAC;oBAAA,IAAG,QAAQ,CAAC,KAAK,CAAC,IAAE,KAAK,CAAC,IAAI,KAAG,cAAc;wBAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBAAA,MAAM,KAAK,CAAC;gBAAA,CAAC;gBAAA,IAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAC,GAAG,GAAC,IAAI;oBAAC,MAAM,IAAI,YAAY,CAAC,OAAO,EAAC,8BAA8B,CAAC,CAAC;YAAA,CAAC;YAC5oB,IAAG,OAAO,CAAC,IAAI,EAAE;gBAAC,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAC,qCAAqC,CAAC,CAAC;QACpG,CAAC;gBAAO,CAAC;YAAA,UAAU,CAAC,KAAK,EAAE,CAAC;YAAA,YAAY,CAAC,KAAK,CAAC,CAAC;YAAA,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAC,KAAK,CAAC,CAAC;YAAA,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAE,EAAE,GAAC,CAAC,CAAC,CAAC;YAAA,MAAM,EAAE,WAAW,EAAE,CAAC;YAAA,MAAM,EAAE,CAAC;QAAA,CAAC;IACzK,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CallToolRequestParams, CallToolResult, ListToolsResult } from '../mcp.js';
|
|
2
|
+
import type { JsonValue } from '../types.js';
|
|
3
|
+
import type { CallOptions } from './index.js';
|
|
4
|
+
export type { CallToolRequestParams, CallToolResult, ListToolsResult, Tool } from '../mcp.js';
|
|
5
|
+
export type ToolBridgeCall = <T = JsonValue>(method: string, input?: JsonValue, options?: CallOptions) => Promise<T>;
|
|
6
|
+
/** MCP Client-shaped tool subset over DSH's authenticated, policy-gated bridge.
|
|
7
|
+
* Not a full MCP Client/transport: no initialize/resources/prompts/sampling/tasks. */
|
|
8
|
+
export interface ProgramToolClient {
|
|
9
|
+
listTools(params?: {
|
|
10
|
+
cursor?: string;
|
|
11
|
+
}, options?: CallOptions): Promise<ListToolsResult>;
|
|
12
|
+
callTool(params: CallToolRequestParams, options?: CallOptions): Promise<CallToolResult>;
|
|
13
|
+
/** @deprecated Use callTool({name,arguments}). Kept for old programs. */
|
|
14
|
+
call<T = JsonValue>(name: string, args?: JsonValue, options?: CallOptions): Promise<T>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createProgramTools(call: ToolBridgeCall, server?: string): ProgramToolClient;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function createProgramTools(call, server) {
|
|
2
|
+
return {
|
|
3
|
+
listTools: async (params = {}, options) => {
|
|
4
|
+
if (params.cursor !== undefined)
|
|
5
|
+
return call('tools.listTools', { ...params, ...server === undefined ? {} : { server } }, options);
|
|
6
|
+
const tools = [], seen = new Set();
|
|
7
|
+
let cursor;
|
|
8
|
+
for (let page = 0; page < 64; page++) {
|
|
9
|
+
const result = await call('tools.listTools', { ...cursor === undefined ? {} : { cursor }, ...server === undefined ? {} : { server } }, options);
|
|
10
|
+
tools.push(...result.tools);
|
|
11
|
+
if (result.nextCursor === undefined)
|
|
12
|
+
return { tools };
|
|
13
|
+
if (seen.has(result.nextCursor))
|
|
14
|
+
throw new Error('Tool listing repeated a pagination cursor');
|
|
15
|
+
seen.add(result.nextCursor);
|
|
16
|
+
cursor = result.nextCursor;
|
|
17
|
+
}
|
|
18
|
+
throw new Error('Tool listing exceeded 64 pages');
|
|
19
|
+
},
|
|
20
|
+
callTool: (params, options) => call('tools.callTool', { ...params, ...server === undefined ? {} : { server } }, options),
|
|
21
|
+
call: (name, args = {}, options) => server === undefined ? call('tools.call', { name, args }, options) : call('mcp.call', { server, tool: name, args }, options),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/app/tools.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAC,MAAc;IACpE,OAAM;QACL,SAAS,EAAC,KAAK,EAAC,MAAM,GAAC,EAAE,EAAC,OAAO,EAAC,EAAE;YACnC,IAAG,MAAM,CAAC,MAAM,KAAG,SAAS;gBAAC,OAAO,IAAI,CAAkB,iBAAiB,EAAC,EAAC,GAAG,MAAM,EAAC,GAAG,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,MAAM,EAAC,EAAa,EAAC,OAAO,CAAC,CAAC;YAC/I,MAAM,KAAK,GAAQ,EAAE,EAAC,IAAI,GAAC,IAAI,GAAG,EAAU,CAAC;YAAA,IAAI,MAAuB,CAAC;YACzE,KAAI,IAAI,IAAI,GAAC,CAAC,EAAC,IAAI,GAAC,EAAE,EAAC,IAAI,EAAE,EAAC,CAAC;gBAC9B,MAAM,MAAM,GAAC,MAAM,IAAI,CAAkB,iBAAiB,EAAC,EAAC,GAAG,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,MAAM,EAAC,EAAC,GAAG,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,MAAM,EAAC,EAAa,EAAC,OAAO,CAAC,CAAC;gBAAA,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClL,IAAG,MAAM,CAAC,UAAU,KAAG,SAAS;oBAAC,OAAM,EAAC,KAAK,EAAC,CAAC;gBAAA,IAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAAA,MAAM,GAAC,MAAM,CAAC,UAAU,CAAC;YACjM,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACnD,CAAC;QACD,QAAQ,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,EAAE,CAAA,IAAI,CAAiB,gBAAgB,EAAC,EAAC,GAAG,MAAM,EAAC,GAAG,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,MAAM,EAAC,EAAa,EAAC,OAAO,CAAC;QACnI,IAAI,EAAC,CAAC,IAAI,EAAC,IAAI,GAAC,EAAE,EAAC,OAAO,EAAC,EAAE,CAAA,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,IAAI,CAAC,YAAY,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,EAAC,OAAO,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC,UAAU,EAAC,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,EAAC,OAAO,CAAC;KACvI,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ProgramAction, type ProgramItem, type ProgramRun, type RunList } from './model.js';
|
|
2
|
+
import type { ProgramClient } from './transport.js';
|
|
3
|
+
export interface ProgramPanelState extends RunList {
|
|
4
|
+
loading: boolean;
|
|
5
|
+
stale: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
pending: Readonly<Record<string, ProgramAction>>;
|
|
8
|
+
actionErrors: Readonly<Record<string, string>>;
|
|
9
|
+
}
|
|
10
|
+
export declare const actionKey: (item: ProgramItem | ProgramRun) => string;
|
|
11
|
+
/** One Session's SSE lifecycle. Timers retry disconnected streams, never poll state
|
|
12
|
+
* or replay effects. Every replacement stream owns a fresh snapshot epoch. */
|
|
13
|
+
export declare function createPanelController(client: ProgramClient, reconnectDelayMs?: number): {
|
|
14
|
+
getSnapshot: () => ProgramPanelState;
|
|
15
|
+
subscribe(listener: () => void): () => void;
|
|
16
|
+
start(): void;
|
|
17
|
+
stop(): void;
|
|
18
|
+
setVisible(next: boolean): void;
|
|
19
|
+
action(action: ProgramAction, target: ProgramItem | ProgramRun): Promise<boolean>;
|
|
20
|
+
};
|
|
21
|
+
export type PanelController = ReturnType<typeof createPanelController>;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { boundedText, runControls } from './model.js';
|
|
2
|
+
export const actionKey = (item) => item.program;
|
|
3
|
+
const errorText = (error) => boundedText(error instanceof Error ? error.message : 'Connection unavailable.', 180);
|
|
4
|
+
/** One Session's SSE lifecycle. Timers retry disconnected streams, never poll state
|
|
5
|
+
* or replay effects. Every replacement stream owns a fresh snapshot epoch. */
|
|
6
|
+
export function createPanelController(client, reconnectDelayMs = 1_000) {
|
|
7
|
+
let state = { runs: [], programs: [], items: [], loading: true, stale: true, truncated: false, pending: {}, actionErrors: {} };
|
|
8
|
+
const listeners = new Set();
|
|
9
|
+
let active = false, visible = true, epoch = 0, failures = 0;
|
|
10
|
+
let timer;
|
|
11
|
+
let stream;
|
|
12
|
+
const actions = new Map();
|
|
13
|
+
// A fast RPC acknowledgement must not reopen Start before its pushed state
|
|
14
|
+
// arrives. Keep the effect single-flight through authoritative transition.
|
|
15
|
+
const awaiting = new Map();
|
|
16
|
+
const sameRun = (left, right) => left?.id === right?.id && left?.generation === right?.generation && left?.state === right?.state;
|
|
17
|
+
const publish = (patch) => {
|
|
18
|
+
state = { ...state, ...patch };
|
|
19
|
+
for (const listener of listeners)
|
|
20
|
+
listener();
|
|
21
|
+
};
|
|
22
|
+
const clearTimer = () => { if (timer !== undefined)
|
|
23
|
+
clearTimeout(timer); timer = undefined; };
|
|
24
|
+
const invalidate = () => { epoch++; clearTimer(); stream?.abort(); };
|
|
25
|
+
function connect() {
|
|
26
|
+
if (!active || !visible)
|
|
27
|
+
return;
|
|
28
|
+
invalidate();
|
|
29
|
+
const abort = new AbortController();
|
|
30
|
+
stream = abort;
|
|
31
|
+
const current = epoch;
|
|
32
|
+
let baseline = true;
|
|
33
|
+
publish({ loading: true, stale: true });
|
|
34
|
+
const latest = () => active && visible && !abort.signal.aborted && current === epoch;
|
|
35
|
+
void (async () => {
|
|
36
|
+
try {
|
|
37
|
+
await client.subscribe(result => {
|
|
38
|
+
if (!latest())
|
|
39
|
+
return;
|
|
40
|
+
failures = 0;
|
|
41
|
+
const errors = Object.fromEntries(Object.entries(state.actionErrors).filter(([key]) => {
|
|
42
|
+
const before = state.items.find(item => item.program === key)?.run;
|
|
43
|
+
const after = result.items.find(item => item.program === key)?.run;
|
|
44
|
+
return before?.id === after?.id && before?.generation === after?.generation;
|
|
45
|
+
}));
|
|
46
|
+
const pending = { ...state.pending };
|
|
47
|
+
for (const [key, before] of awaiting) {
|
|
48
|
+
const after = result.items.find(item => item.program === key)?.run;
|
|
49
|
+
if (baseline || !sameRun(before, after)) {
|
|
50
|
+
awaiting.delete(key);
|
|
51
|
+
delete pending[key];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
baseline = false;
|
|
55
|
+
publish({ ...result, loading: false, stale: false, error: undefined, actionErrors: errors, pending });
|
|
56
|
+
}, abort.signal);
|
|
57
|
+
if (latest())
|
|
58
|
+
throw new Error('Connection interrupted.');
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (!latest())
|
|
62
|
+
return;
|
|
63
|
+
publish({ loading: false, stale: true, error: errorText(error) });
|
|
64
|
+
// End this epoch immediately: a carrier ignoring cancellation cannot
|
|
65
|
+
// re-enable controls during backoff with a late snapshot.
|
|
66
|
+
abort.abort();
|
|
67
|
+
epoch++;
|
|
68
|
+
const delay = Math.min(30_000, Math.max(1, reconnectDelayMs) * 2 ** Math.min(failures++, 5));
|
|
69
|
+
timer = setTimeout(() => { timer = undefined; connect(); }, delay);
|
|
70
|
+
}
|
|
71
|
+
})();
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
getSnapshot: () => state,
|
|
75
|
+
subscribe(listener) { listeners.add(listener); return () => { listeners.delete(listener); }; },
|
|
76
|
+
start() { if (active)
|
|
77
|
+
return; active = true; connect(); },
|
|
78
|
+
stop() {
|
|
79
|
+
active = false;
|
|
80
|
+
invalidate();
|
|
81
|
+
for (const action of actions.values())
|
|
82
|
+
action.abort();
|
|
83
|
+
actions.clear();
|
|
84
|
+
awaiting.clear();
|
|
85
|
+
publish({ loading: false, stale: true, pending: {} });
|
|
86
|
+
},
|
|
87
|
+
setVisible(next) {
|
|
88
|
+
if (visible === next)
|
|
89
|
+
return;
|
|
90
|
+
visible = next;
|
|
91
|
+
if (next)
|
|
92
|
+
connect();
|
|
93
|
+
else {
|
|
94
|
+
invalidate();
|
|
95
|
+
publish({ loading: false, stale: true });
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
async action(action, target) {
|
|
99
|
+
const key = actionKey(target);
|
|
100
|
+
const latest = state.items.find(item => item.program === target.program);
|
|
101
|
+
const expected = 'ownerId' in target ? target : target.run;
|
|
102
|
+
if (!active || !visible || !latest || actions.has(key) || state.pending[key] ||
|
|
103
|
+
latest.run?.id !== expected?.id || latest.run?.generation !== expected?.generation ||
|
|
104
|
+
!runControls(latest.run?.state ?? 'configured', false, state.stale)[action])
|
|
105
|
+
return false;
|
|
106
|
+
const abort = new AbortController();
|
|
107
|
+
actions.set(key, abort);
|
|
108
|
+
publish({ pending: { ...state.pending, [key]: action }, actionErrors: { ...state.actionErrors, [key]: '' } });
|
|
109
|
+
try {
|
|
110
|
+
await client.action(action, latest, abort.signal);
|
|
111
|
+
if (!active || abort.signal.aborted)
|
|
112
|
+
return false;
|
|
113
|
+
const after = state.items.find(item => item.program === key)?.run;
|
|
114
|
+
if (sameRun(expected, after))
|
|
115
|
+
awaiting.set(key, expected);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (active && !abort.signal.aborted) {
|
|
120
|
+
publish({ stale: true, actionErrors: { ...state.actionErrors, [key]: errorText(error) } });
|
|
121
|
+
// A fresh stream baseline self-heals ambiguous results; never retry the
|
|
122
|
+
// action and never start a list polling loop.
|
|
123
|
+
connect();
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
if (actions.get(key) === abort) {
|
|
129
|
+
actions.delete(key);
|
|
130
|
+
const next = { ...state.pending };
|
|
131
|
+
if (!awaiting.has(key))
|
|
132
|
+
delete next[key];
|
|
133
|
+
if (active)
|
|
134
|
+
publish({ pending: next });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/client/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createProgramClient, type RpcTransport } from './transport.js';
|
|
2
|
+
import { ProgramAgentsDock } from './view.js';
|
|
3
|
+
interface ClientContext {
|
|
4
|
+
connection: {
|
|
5
|
+
rpc: RpcTransport;
|
|
6
|
+
};
|
|
7
|
+
slots: {
|
|
8
|
+
inject(name: string, register: () => unknown): unknown;
|
|
9
|
+
register(options: {
|
|
10
|
+
name: string;
|
|
11
|
+
id: string;
|
|
12
|
+
order: number;
|
|
13
|
+
inject(sessionId: string): {
|
|
14
|
+
programClient: ReturnType<typeof createProgramClient>;
|
|
15
|
+
};
|
|
16
|
+
}, component: typeof ProgramAgentsDock): unknown;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare const inject: string[];
|
|
20
|
+
/** Real DSH contribution: strict Session-scoped full-width dock above the composer. */
|
|
21
|
+
export declare function apply(ctx: ClientContext): void;
|
|
22
|
+
export { ProgramAgentsDock, ProgramAgentsPanel } from './view.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createProgramClient } from './transport.js';
|
|
2
|
+
import { ProgramAgentsDock } from './view.js';
|
|
3
|
+
export const inject = ['slots', 'connection'];
|
|
4
|
+
/** Real DSH contribution: strict Session-scoped full-width dock above the composer. */
|
|
5
|
+
export function apply(ctx) {
|
|
6
|
+
ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({
|
|
7
|
+
name: 'conversation.input.dock',
|
|
8
|
+
id: 'program-agents',
|
|
9
|
+
order: 30,
|
|
10
|
+
inject: (sessionId) => ({ programClient: createProgramClient(ctx.connection, sessionId) }),
|
|
11
|
+
}, ProgramAgentsDock));
|
|
12
|
+
}
|
|
13
|
+
export { ProgramAgentsDock, ProgramAgentsPanel } from './view.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAqB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAgB9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC9C,uFAAuF;AACvF,MAAM,UAAU,KAAK,CAAC,GAAkB;IACtC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACnE,IAAI,EAAE,yBAAyB;QAC/B,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;KAC3F,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACzB,CAAC;AACD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ResolvedEndpointAddress } from '../endpoints.js';
|
|
2
|
+
export type ProgramState = 'starting' | 'running' | 'blocked' | 'stopping' | 'stopped' | 'completed' | 'failed';
|
|
3
|
+
export type ProgramAction = 'start' | 'stop' | 'restart';
|
|
4
|
+
export interface ProgramResource {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
type: 'ui' | 'api' | 'docs';
|
|
8
|
+
url: string;
|
|
9
|
+
docs?: string;
|
|
10
|
+
endpoint?: string;
|
|
11
|
+
path?: string;
|
|
12
|
+
address?: ResolvedEndpointAddress;
|
|
13
|
+
available: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ProgramDescriptor {
|
|
16
|
+
program: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
command: string[];
|
|
20
|
+
urls: ProgramResource[];
|
|
21
|
+
logsPath?: string;
|
|
22
|
+
hasModelSlots?: boolean;
|
|
23
|
+
modelRevision?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ProgramRun {
|
|
26
|
+
id: string;
|
|
27
|
+
generation: number;
|
|
28
|
+
program: string;
|
|
29
|
+
ownerId: string;
|
|
30
|
+
label: string;
|
|
31
|
+
state: ProgramState;
|
|
32
|
+
name?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
command?: string[];
|
|
35
|
+
logsPath?: string;
|
|
36
|
+
status?: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
startedAt: string;
|
|
39
|
+
resources: ProgramResource[];
|
|
40
|
+
}
|
|
41
|
+
/** One row per configured program, merged with its newest owned run. */
|
|
42
|
+
export interface ProgramItem extends ProgramDescriptor {
|
|
43
|
+
run?: ProgramRun;
|
|
44
|
+
}
|
|
45
|
+
export declare const CLIENT_LIMITS: {
|
|
46
|
+
readonly runs: 100;
|
|
47
|
+
readonly programs: 100;
|
|
48
|
+
readonly resources: 30;
|
|
49
|
+
readonly textCharacters: 2000;
|
|
50
|
+
readonly frameBytes: number;
|
|
51
|
+
};
|
|
52
|
+
export declare const isTerminal: (state: ProgramState) => boolean;
|
|
53
|
+
export declare function record(value: unknown): value is Record<string, unknown>;
|
|
54
|
+
export declare function boundedText(value: unknown, max?: number): string;
|
|
55
|
+
/** Only absolute HTTP(S), never local paths, credentials, controls or scheme-relative URLs. */
|
|
56
|
+
export declare function safeResourceUrl(value: unknown): string | undefined;
|
|
57
|
+
export declare function resourceLink(item: ProgramItem, resource: ProgramResource, stale?: boolean, pending?: ProgramAction, browserHostname?: string): string | undefined;
|
|
58
|
+
export declare function runControls(state: ProgramState | 'configured', pending?: boolean, stale?: boolean): Record<ProgramAction, boolean>;
|
|
59
|
+
export interface RunList {
|
|
60
|
+
runs: ProgramRun[];
|
|
61
|
+
programs: ProgramDescriptor[];
|
|
62
|
+
items: ProgramItem[];
|
|
63
|
+
truncated: boolean;
|
|
64
|
+
}
|
|
65
|
+
/** Full compact snapshots; legacy {runs} is accepted without fabricating configured entries. */
|
|
66
|
+
export declare function parseRunList(value: unknown, sessionId: string): RunList;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { endpointUrl, endpointName, normalizeEndpointPath, normalizeHostname } from '../endpoints.js';
|
|
2
|
+
export const CLIENT_LIMITS = { runs: 100, programs: 100, resources: 30, textCharacters: 2_000, frameBytes: 128 * 1024 };
|
|
3
|
+
const states = ['starting', 'running', 'blocked', 'stopping', 'stopped', 'completed', 'failed'];
|
|
4
|
+
export const isTerminal = (state) => ['stopped', 'completed', 'failed'].includes(state);
|
|
5
|
+
export function record(value) {
|
|
6
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
export function boundedText(value, max = CLIENT_LIMITS.textCharacters) {
|
|
9
|
+
return typeof value === 'string' ? value.slice(0, max) : '';
|
|
10
|
+
}
|
|
11
|
+
/** Only absolute HTTP(S), never local paths, credentials, controls or scheme-relative URLs. */
|
|
12
|
+
export function safeResourceUrl(value) {
|
|
13
|
+
if (typeof value !== 'string' || value.length > 8_192 || !/^https?:\/\//i.test(value) || /[\u0000-\u0020\u007f\\]/.test(value))
|
|
14
|
+
return undefined;
|
|
15
|
+
try {
|
|
16
|
+
const url = new URL(value);
|
|
17
|
+
return (url.protocol === 'https:' || url.protocol === 'http:') && url.hostname && !url.username && !url.password ? url.href : undefined;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function resourceLink(item, resource, stale = false, pending, browserHostname) {
|
|
24
|
+
if (stale || pending || !resource.available || !item.run || !['running', 'blocked'].includes(item.run.state))
|
|
25
|
+
return undefined;
|
|
26
|
+
if (resource.endpoint) {
|
|
27
|
+
if (!resource.address || resource.address.endpoint !== resource.endpoint || resource.address.path !== (resource.path ?? '/'))
|
|
28
|
+
return undefined;
|
|
29
|
+
return endpointUrl(resource.address, browserHostname ?? (typeof location === 'undefined' ? undefined : location.hostname));
|
|
30
|
+
}
|
|
31
|
+
return safeResourceUrl(resource.url);
|
|
32
|
+
}
|
|
33
|
+
export function runControls(state, pending = false, stale = false) {
|
|
34
|
+
const ready = !pending && !stale;
|
|
35
|
+
return {
|
|
36
|
+
start: ready && (state === 'configured' || isTerminal(state)),
|
|
37
|
+
stop: ready && ['starting', 'running', 'blocked'].includes(state),
|
|
38
|
+
restart: ready && state !== 'configured' && state !== 'stopping',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function requiredString(value, name) {
|
|
42
|
+
if (typeof value !== 'string' || !value || value.length > 512)
|
|
43
|
+
throw new Error(`Invalid program snapshot ${name}.`);
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
const command = (value) => (Array.isArray(value) ? value : []).slice(0, 100).map(part => boundedText(part));
|
|
47
|
+
function address(value) {
|
|
48
|
+
if (!record(value) || !endpointName(value.endpoint) || !['http', 'https'].includes(String(value.protocol)) || !Number.isSafeInteger(value.port) || Number(value.port) < 1 || Number(value.port) > 65535 || typeof value.host !== 'string')
|
|
49
|
+
return undefined;
|
|
50
|
+
try {
|
|
51
|
+
const host = value.host === 'browser' ? 'browser' : normalizeHostname(value.host);
|
|
52
|
+
return { endpoint: value.endpoint, host, protocol: value.protocol, port: Number(value.port), path: normalizeEndpointPath(value.path) };
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function resources(value) {
|
|
59
|
+
return (Array.isArray(value) ? value : []).slice(0, CLIENT_LIMITS.resources).flatMap((raw) => {
|
|
60
|
+
if (!record(raw))
|
|
61
|
+
return [];
|
|
62
|
+
let recipe;
|
|
63
|
+
if (raw.endpoint !== undefined) {
|
|
64
|
+
if (!endpointName(raw.endpoint))
|
|
65
|
+
return [];
|
|
66
|
+
try {
|
|
67
|
+
recipe = { endpoint: raw.endpoint, path: normalizeEndpointPath(raw.path) };
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const resolved = address(raw.address);
|
|
74
|
+
return [{ id: boundedText(raw.id, 200), title: boundedText(raw.title, 300),
|
|
75
|
+
type: (['ui', 'api', 'docs'].includes(String(raw.type)) ? raw.type : 'ui'),
|
|
76
|
+
url: boundedText(raw.url, 8_192), ...(typeof raw.docs === 'string' ? { docs: boundedText(raw.docs, 8_192) } : {}), ...(recipe ?? {}), ...(resolved ? { address: resolved } : {}), available: raw.available === true }];
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function normalizeRun(raw, sessionId) {
|
|
80
|
+
const id = requiredString(raw.id, 'id');
|
|
81
|
+
if (!Number.isSafeInteger(raw.generation) || raw.generation < 1 || !states.includes(String(raw.state)))
|
|
82
|
+
throw new Error('Invalid program snapshot state or generation.');
|
|
83
|
+
return {
|
|
84
|
+
id, generation: raw.generation, ownerId: sessionId, program: requiredString(raw.program, 'program'),
|
|
85
|
+
label: boundedText(raw.label, 200), state: raw.state,
|
|
86
|
+
...(typeof raw.name === 'string' ? { name: boundedText(raw.name, 200) } : {}),
|
|
87
|
+
...(typeof raw.description === 'string' ? { description: boundedText(raw.description) } : {}),
|
|
88
|
+
...(Array.isArray(raw.command) ? { command: command(raw.command) } : {}),
|
|
89
|
+
...(typeof raw.logsPath === 'string' ? { logsPath: boundedText(raw.logsPath, 8_192) } : {}),
|
|
90
|
+
status: boundedText(raw.status, 200), error: boundedText(raw.error, 240), startedAt: boundedText(raw.startedAt, 100),
|
|
91
|
+
resources: resources(raw.resources ?? raw.urls),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Full compact snapshots; legacy {runs} is accepted without fabricating configured entries. */
|
|
95
|
+
export function parseRunList(value, sessionId) {
|
|
96
|
+
if (!record(value) || !Array.isArray(value.runs) || (value.programs !== undefined && !Array.isArray(value.programs)))
|
|
97
|
+
throw new Error('Program agents API returned an invalid list.');
|
|
98
|
+
const scoped = value.runs.filter((raw) => record(raw) && raw.ownerId === sessionId);
|
|
99
|
+
scoped.sort((left, right) => String(right.startedAt ?? '').localeCompare(String(left.startedAt ?? '')) || Number(right.generation) - Number(left.generation));
|
|
100
|
+
// Bound history only after reserving each program's newest run, so one noisy
|
|
101
|
+
// program cannot crowd another program's current state out of the foldout.
|
|
102
|
+
const newest = new Map();
|
|
103
|
+
for (const raw of scoped)
|
|
104
|
+
if (!newest.has(String(raw.program)))
|
|
105
|
+
newest.set(String(raw.program), raw);
|
|
106
|
+
const first = new Set(newest.values());
|
|
107
|
+
const ordered = [...first, ...scoped.filter(raw => !first.has(raw))];
|
|
108
|
+
const runs = [];
|
|
109
|
+
const ids = new Set();
|
|
110
|
+
for (const raw of ordered.slice(0, CLIENT_LIMITS.runs)) {
|
|
111
|
+
const run = normalizeRun(raw, sessionId);
|
|
112
|
+
if (!ids.has(run.id)) {
|
|
113
|
+
runs.push(run);
|
|
114
|
+
ids.add(run.id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const programs = [];
|
|
118
|
+
const keys = new Set();
|
|
119
|
+
const definitions = Array.isArray(value.programs) ? value.programs : [];
|
|
120
|
+
for (const raw of definitions.slice(0, CLIENT_LIMITS.programs)) {
|
|
121
|
+
if (!record(raw))
|
|
122
|
+
throw new Error('Invalid program descriptor.');
|
|
123
|
+
const program = requiredString(raw.program, 'program');
|
|
124
|
+
if (keys.has(program))
|
|
125
|
+
continue;
|
|
126
|
+
programs.push({ program, name: boundedText(raw.name, 200) || program, description: boundedText(raw.description), command: command(raw.command), urls: resources(raw.urls), ...(raw.hasModelSlots === true ? { hasModelSlots: true, modelRevision: boundedText(raw.modelRevision, 2000) } : {}), ...(typeof raw.logsPath === 'string' ? { logsPath: boundedText(raw.logsPath, 8_192) } : {}) });
|
|
127
|
+
keys.add(program);
|
|
128
|
+
}
|
|
129
|
+
const latest = new Map();
|
|
130
|
+
for (const run of runs)
|
|
131
|
+
if (!latest.has(run.program))
|
|
132
|
+
latest.set(run.program, run);
|
|
133
|
+
const items = programs.map(descriptor => {
|
|
134
|
+
const run = latest.get(descriptor.program);
|
|
135
|
+
latest.delete(descriptor.program);
|
|
136
|
+
const merged = new Map(descriptor.urls.map(resource => [resource.id, resource]));
|
|
137
|
+
for (const resource of run?.resources ?? []) {
|
|
138
|
+
const configured = merged.get(resource.id);
|
|
139
|
+
merged.set(resource.id, { ...resource, ...resource.docs === undefined && configured?.docs !== undefined ? { docs: configured.docs } : {} });
|
|
140
|
+
}
|
|
141
|
+
return { ...descriptor, urls: [...merged.values()].slice(0, CLIENT_LIMITS.resources), ...(run ? { run, logsPath: run.logsPath || descriptor.logsPath } : {}) };
|
|
142
|
+
});
|
|
143
|
+
for (const run of latest.values())
|
|
144
|
+
items.push({ program: run.program, name: run.name || run.label || run.program, description: run.description || '', command: run.command ?? [], logsPath: run.logsPath, urls: run.resources, run });
|
|
145
|
+
return { runs, programs, items: items.slice(0, CLIENT_LIMITS.programs), truncated: scoped.length > CLIENT_LIMITS.runs || definitions.length > CLIENT_LIMITS.programs || items.length > CLIENT_LIMITS.programs };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/client/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProgramClient } from './transport.js';
|
|
2
|
+
export declare function ProgramModels({ client, program, revision }: {
|
|
3
|
+
client: ProgramClient;
|
|
4
|
+
program: string;
|
|
5
|
+
revision?: string;
|
|
6
|
+
}): import("react").DetailedReactHTMLElement<{
|
|
7
|
+
'aria-label': string;
|
|
8
|
+
style: {
|
|
9
|
+
marginTop: number;
|
|
10
|
+
};
|
|
11
|
+
}, HTMLElement>;
|