@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,27 @@
|
|
|
1
|
+
import { createElement as h, useEffect, useState } from 'react';
|
|
2
|
+
const control = { font: 'inherit', color: 'inherit', background: 'var(--dsw-specific-menu, Canvas)', border: '1px solid #8885', borderRadius: 5, padding: '3px 6px', maxWidth: '100%' };
|
|
3
|
+
const routeKey = (route) => JSON.stringify([route.provider, route.model]);
|
|
4
|
+
function Slot({ slot, config, client, program, onSaved }) {
|
|
5
|
+
const [selected, setSelected] = useState(slot.selection), [pending, setPending] = useState(false), [error, setError] = useState('');
|
|
6
|
+
useEffect(() => { setSelected(slot.selection); setError(''); }, [slot.revision]);
|
|
7
|
+
const model = config.catalog.groups.find(g => g.id === selected.provider)?.models.find(m => m.id === selected.model), unavailable = !model;
|
|
8
|
+
const save = async (reset = false) => { setPending(true); setError(''); try {
|
|
9
|
+
await client.setModel(program, slot.id, reset ? null : selected, slot.revision, new AbortController().signal);
|
|
10
|
+
onSaved();
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
setError(e instanceof Error ? e.message : 'Model change failed');
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
setPending(false);
|
|
17
|
+
} };
|
|
18
|
+
return h('fieldset', { style: { border: '1px solid #8884', borderRadius: 6, margin: '6px 0', padding: 8 }, disabled: pending }, h('legend', null, slot.id), h('div', { style: { opacity: .8, marginBottom: 5 } }, slot.description), h('div', { style: { display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' } }, h('label', null, 'Model ', h('select', { 'aria-label': `Model for ${slot.id}`, style: control, value: routeKey(selected), onChange: (event) => { const [provider, model] = JSON.parse(event.target.value); setSelected({ provider, model }); } }, unavailable ? h('option', { value: routeKey(selected) }, `${selected.provider} / ${selected.model} (unavailable)`) : null, ...config.catalog.groups.map(group => h('optgroup', { key: group.id, label: group.name }, ...group.models.map(item => h('option', { key: item.id, value: routeKey({ provider: group.id, model: item.id }) }, item.name))))), h('label', null, 'Reasoning ', h('select', { 'aria-label': `Reasoning for ${slot.id}`, style: control, value: selected.reasoningEffort ?? '', onChange: (event) => setSelected(({ provider, model }) => ({ provider, model, ...event.target.value ? { reasoningEffort: event.target.value } : {} })) }, h('option', { value: '' }, 'Model default'), ...(selected.reasoningEffort && !model?.reasoning?.efforts.some(e => e.id === selected.reasoningEffort) ? [h('option', { key: 'unavailable', value: selected.reasoningEffort }, selected.reasoningEffort + ' (unavailable)')] : []), ...(model?.reasoning?.efforts ?? []).map(e => h('option', { key: e.id, value: e.id }, e.name))))), h('button', { type: 'button', style: control, onClick: () => void save(), disabled: pending || unavailable }, pending ? 'Saving…' : 'Save'), h('button', { type: 'button', style: control, onClick: () => void save(true), disabled: pending || !slot.overridden }, 'Use program default')), h('div', { style: { opacity: .65, fontSize: 11, marginTop: 5 } }, `Default: ${slot.default.provider} / ${slot.default.model}${slot.default.reasoningEffort ? ' / ' + slot.default.reasoningEffort : ''}${slot.overridden ? ' · User override' : ''}`), unavailable ? h('p', { role: 'status' }, 'Saved model is unavailable. It will not silently fall back.') : null, error ? h('p', { role: 'alert' }, error) : null);
|
|
19
|
+
}
|
|
20
|
+
export function ProgramModels({ client, program, revision }) {
|
|
21
|
+
const [config, setConfig] = useState(), [error, setError] = useState(''), [refresh, setRefresh] = useState(0);
|
|
22
|
+
useEffect(() => { const abort = new AbortController(); setError(''); void client.modelConfiguration(program, abort.signal).then(value => { if (!abort.signal.aborted)
|
|
23
|
+
setConfig(value); }, e => { if (!abort.signal.aborted)
|
|
24
|
+
setError(e instanceof Error ? e.message : 'Model configuration unavailable'); }); return () => abort.abort(); }, [client, program, revision, refresh]);
|
|
25
|
+
return h('div', { 'aria-label': 'Program model configuration', style: { marginTop: 6 } }, h('p', { style: { opacity: .75 } }, 'Selections affect future model-slot calls and newly created conversations. Existing conversations retain their model.'), error ? h('p', { role: 'alert' }, error) : null, !config && !error ? h('p', null, 'Loading models…') : null, ...(config?.slots ?? []).map(slot => h(Slot, { key: slot.id, slot, config: config, client, program, onSaved: () => setRefresh(n => n + 1) })), ...(config?.catalog.failures ?? []).map(f => h('p', { key: f.id, role: 'status' }, `${f.name}: ${f.message}`)));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/client/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { ModelSlotView, ModelSelection } from '../models.js';
|
|
2
|
+
import { type ProgramAction, type ProgramItem, type ProgramRun, type RunList } from './model.js';
|
|
3
|
+
/** Public structural face of DSH ClientConnectionRpc; supplied by ctx.connection. */
|
|
4
|
+
export interface RpcTransport {
|
|
5
|
+
call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<{
|
|
6
|
+
readonly ok: true;
|
|
7
|
+
readonly value: unknown;
|
|
8
|
+
} | {
|
|
9
|
+
readonly ok: false;
|
|
10
|
+
readonly error: {
|
|
11
|
+
readonly code: string;
|
|
12
|
+
readonly message: string;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export type StreamingFetch = (input: URL, init: RequestInit) => Promise<Response>;
|
|
17
|
+
export interface ProgramModelCatalog {
|
|
18
|
+
default: ModelSelection;
|
|
19
|
+
routableProviders: readonly string[];
|
|
20
|
+
groups: readonly {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
models: readonly {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
reasoning?: {
|
|
28
|
+
efforts: readonly {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
}[];
|
|
32
|
+
defaultEffort?: string;
|
|
33
|
+
};
|
|
34
|
+
}[];
|
|
35
|
+
}[];
|
|
36
|
+
failures: readonly {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
message: string;
|
|
40
|
+
}[];
|
|
41
|
+
}
|
|
42
|
+
export interface ProgramModelConfiguration {
|
|
43
|
+
slots: ModelSlotView[];
|
|
44
|
+
catalog: ProgramModelCatalog;
|
|
45
|
+
}
|
|
46
|
+
export interface ProgramClient {
|
|
47
|
+
readonly sessionId: string;
|
|
48
|
+
list(signal: AbortSignal): Promise<RunList>;
|
|
49
|
+
subscribe(snapshot: (value: RunList) => void, signal: AbortSignal): Promise<void>;
|
|
50
|
+
action(action: ProgramAction, target: ProgramItem | ProgramRun, signal: AbortSignal): Promise<void>;
|
|
51
|
+
modelConfiguration?(program: string, signal: AbortSignal): Promise<ProgramModelConfiguration>;
|
|
52
|
+
setModel?(program: string, slot: string, selection: ModelSelection | null, revision: number, signal: AbortSignal): Promise<ModelSlotView>;
|
|
53
|
+
}
|
|
54
|
+
export declare class ProgramApiError extends Error {
|
|
55
|
+
readonly code: string;
|
|
56
|
+
constructor(code: string, message: string);
|
|
57
|
+
}
|
|
58
|
+
/** Bounded SSE parser: comments are heartbeats, only complete snapshot events apply. */
|
|
59
|
+
export declare function consumeSnapshots(response: Response, snapshot: (value: unknown) => void, signal: AbortSignal): Promise<void>;
|
|
60
|
+
/** rc.2's public ConnectionHandle has RPC but no streaming HTTP facade. Use the
|
|
61
|
+
* documented same-origin browser carrier fallback; no private connection fields. */
|
|
62
|
+
export declare function createProgramClient(connection: {
|
|
63
|
+
rpc: RpcTransport;
|
|
64
|
+
} | RpcTransport, sessionId: string, streamingFetch?: StreamingFetch, timeoutMs?: number): ProgramClient;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { CLIENT_LIMITS, parseRunList } from './model.js';
|
|
2
|
+
export class ProgramApiError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) { super(message); this.name = 'ProgramApiError'; this.code = code; }
|
|
5
|
+
}
|
|
6
|
+
const cancelled = () => new ProgramApiError('cancelled', 'Program agents request cancelled.');
|
|
7
|
+
/** Abort even when a broken carrier ignores its signal. Always remove our listener. */
|
|
8
|
+
async function abortable(operation, signal) {
|
|
9
|
+
if (signal.aborted)
|
|
10
|
+
throw cancelled();
|
|
11
|
+
let onAbort;
|
|
12
|
+
try {
|
|
13
|
+
return await Promise.race([operation(), new Promise((_resolve, reject) => {
|
|
14
|
+
onAbort = () => reject(cancelled());
|
|
15
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
16
|
+
if (signal.aborted)
|
|
17
|
+
onAbort();
|
|
18
|
+
})]);
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
if (onAbort)
|
|
22
|
+
signal.removeEventListener('abort', onAbort);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Bounded SSE parser: comments are heartbeats, only complete snapshot events apply. */
|
|
26
|
+
export async function consumeSnapshots(response, snapshot, signal) {
|
|
27
|
+
if (!response.ok || !/^text\/event-stream(?:\s*;|$)/i.test(response.headers.get('content-type') ?? '') || !response.body)
|
|
28
|
+
throw new ProgramApiError('stream', 'Program agents connection unavailable.');
|
|
29
|
+
const reader = response.body.getReader();
|
|
30
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
31
|
+
let line = '', event = '', data = [], frameBytes = 0;
|
|
32
|
+
const abort = () => { void reader.cancel().catch(() => { }); };
|
|
33
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
34
|
+
const completeLine = () => {
|
|
35
|
+
const text = line.endsWith('\r') ? line.slice(0, -1) : line;
|
|
36
|
+
line = '';
|
|
37
|
+
if (!text) {
|
|
38
|
+
if (event === 'snapshot' && data.length)
|
|
39
|
+
snapshot(JSON.parse(data.join('\n')));
|
|
40
|
+
event = '';
|
|
41
|
+
data = [];
|
|
42
|
+
frameBytes = 0;
|
|
43
|
+
}
|
|
44
|
+
else if (!text.startsWith(':')) {
|
|
45
|
+
const separator = text.indexOf(':');
|
|
46
|
+
const field = separator < 0 ? text : text.slice(0, separator);
|
|
47
|
+
let value = separator < 0 ? '' : text.slice(separator + 1);
|
|
48
|
+
if (value.startsWith(' '))
|
|
49
|
+
value = value.slice(1);
|
|
50
|
+
if (field === 'event')
|
|
51
|
+
event = value;
|
|
52
|
+
if (field === 'data')
|
|
53
|
+
data.push(value);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
try {
|
|
57
|
+
while (!signal.aborted) {
|
|
58
|
+
const { done, value } = await abortable(() => reader.read(), signal);
|
|
59
|
+
if (done)
|
|
60
|
+
break;
|
|
61
|
+
let start = 0;
|
|
62
|
+
for (let index = 0; index < value.length; index++) {
|
|
63
|
+
if (value[index] !== 10)
|
|
64
|
+
continue;
|
|
65
|
+
frameBytes += index + 1 - start;
|
|
66
|
+
if (frameBytes > CLIENT_LIMITS.frameBytes)
|
|
67
|
+
throw new ProgramApiError('stream', 'Program agents snapshot is too large.');
|
|
68
|
+
line += decoder.decode(value.subarray(start, index), { stream: true });
|
|
69
|
+
completeLine();
|
|
70
|
+
start = index + 1;
|
|
71
|
+
}
|
|
72
|
+
frameBytes += value.length - start;
|
|
73
|
+
if (frameBytes > CLIENT_LIMITS.frameBytes)
|
|
74
|
+
throw new ProgramApiError('stream', 'Program agents snapshot is too large.');
|
|
75
|
+
line += decoder.decode(value.subarray(start), { stream: true });
|
|
76
|
+
}
|
|
77
|
+
if (signal.aborted)
|
|
78
|
+
throw cancelled();
|
|
79
|
+
// EOF without a blank line is an incomplete event, never an authoritative state.
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
signal.removeEventListener('abort', abort);
|
|
83
|
+
void reader.cancel().catch(() => { });
|
|
84
|
+
reader.releaseLock();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** rc.2's public ConnectionHandle has RPC but no streaming HTTP facade. Use the
|
|
88
|
+
* documented same-origin browser carrier fallback; no private connection fields. */
|
|
89
|
+
export function createProgramClient(connection, sessionId, streamingFetch = (input, init) => globalThis.fetch(input, init), timeoutMs = 20_000) {
|
|
90
|
+
if (!sessionId)
|
|
91
|
+
throw new Error('Program agents require a selected Session.');
|
|
92
|
+
const rpc = 'rpc' in connection ? connection.rpc : connection;
|
|
93
|
+
const call = async (method, payload, signal) => {
|
|
94
|
+
const abort = new AbortController();
|
|
95
|
+
const cancel = () => abort.abort();
|
|
96
|
+
signal.addEventListener('abort', cancel, { once: true });
|
|
97
|
+
if (signal.aborted)
|
|
98
|
+
abort.abort();
|
|
99
|
+
const deadline = setTimeout(cancel, timeoutMs);
|
|
100
|
+
try {
|
|
101
|
+
const reply = await abortable(() => rpc.call('/api', `programAgents/${method}`, payload, abort.signal), abort.signal);
|
|
102
|
+
if (!reply.ok)
|
|
103
|
+
throw new ProgramApiError(reply.error.code, reply.error.message);
|
|
104
|
+
return reply.value;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (abort.signal.aborted && !signal.aborted)
|
|
108
|
+
throw new ProgramApiError('timeout', 'Program action timed out. Check status before retrying.');
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
clearTimeout(deadline);
|
|
113
|
+
signal.removeEventListener('abort', cancel);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
sessionId,
|
|
118
|
+
async modelConfiguration(program, signal) { return await call('models', { sessionId, program }, signal); },
|
|
119
|
+
async setModel(program, slot, selection, revision, signal) { return await call('modelSet', { sessionId, program, slot, selection, revision }, signal); },
|
|
120
|
+
async list(signal) { return parseRunList(await call('list', { sessionId }, signal), sessionId); },
|
|
121
|
+
async subscribe(snapshot, signal) {
|
|
122
|
+
const url = new URL('api/programAgents/events', document.baseURI);
|
|
123
|
+
const response = await abortable(() => streamingFetch(url, {
|
|
124
|
+
method: 'POST', credentials: 'same-origin', redirect: 'error', cache: 'no-store',
|
|
125
|
+
headers: { 'content-type': 'application/json', accept: 'text/event-stream' },
|
|
126
|
+
body: JSON.stringify({ sessionId }), signal,
|
|
127
|
+
}), signal);
|
|
128
|
+
await consumeSnapshots(response, value => { if (!signal.aborted)
|
|
129
|
+
snapshot(parseRunList(value, sessionId)); }, signal);
|
|
130
|
+
},
|
|
131
|
+
async action(action, target, signal) {
|
|
132
|
+
const run = 'ownerId' in target ? target : target.run;
|
|
133
|
+
if (run && run.ownerId !== sessionId)
|
|
134
|
+
throw new Error('Program does not belong to this Session.');
|
|
135
|
+
if (action !== 'start' && !run)
|
|
136
|
+
throw new Error('Program has no current run.');
|
|
137
|
+
await call(action, action === 'start' ? { sessionId, program: target.program } : { sessionId, id: run.id, generation: run.generation }, signal);
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
import type { ProgramClient } from './transport.js';
|
|
3
|
+
/** Tiny status strip in the existing Session composer slot. Foldout state is
|
|
4
|
+
* independent of snapshots, and rows are keyed by definition, never generation. */
|
|
5
|
+
export declare function ProgramAgentsPanel({ client, reconnectDelayMs }: {
|
|
6
|
+
client: ProgramClient;
|
|
7
|
+
reconnectDelayMs?: number;
|
|
8
|
+
}): import("react").DetailedReactHTMLElement<{
|
|
9
|
+
'aria-label': string;
|
|
10
|
+
'data-session-id': string;
|
|
11
|
+
style: CSSProperties;
|
|
12
|
+
}, HTMLElement>;
|
|
13
|
+
/** A Session switch remounts local state; no previous owner's content can flash. */
|
|
14
|
+
export declare function ProgramAgentsDock({ programClient }: {
|
|
15
|
+
programClient: ProgramClient;
|
|
16
|
+
}): import("react").FunctionComponentElement<{
|
|
17
|
+
client: ProgramClient;
|
|
18
|
+
reconnectDelayMs?: number;
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createElement as h, useEffect, useMemo, useState, useSyncExternalStore } from 'react';
|
|
2
|
+
import { actionKey, createPanelController } from './controller.js';
|
|
3
|
+
import { resourceLink, runControls, safeResourceUrl } from './model.js';
|
|
4
|
+
import { ProgramModels } from './models.js';
|
|
5
|
+
// The conversation.input.dock lives inside DSH's bottom-anchored composer seat.
|
|
6
|
+
// Stay in that layout flow: no global selectors, fixed positioning or overlay.
|
|
7
|
+
const panelStyle = {
|
|
8
|
+
boxSizing: 'border-box', width: '100%', maxWidth: 'var(--dsh-composer-card-max-width, 960px)',
|
|
9
|
+
margin: '0 auto 4px', border: '1px solid var(--dsw-alias-border-l1, #8884)', borderRadius: 8,
|
|
10
|
+
background: 'var(--dsw-specific-menu, Canvas)', color: 'var(--dsw-alias-label-primary, CanvasText)', fontSize: 12,
|
|
11
|
+
};
|
|
12
|
+
const rowStyle = { display: 'flex', gap: 8, alignItems: 'center', minWidth: 0 };
|
|
13
|
+
const buttonStyle = { font: 'inherit', color: 'inherit', background: 'transparent', border: '1px solid var(--dsw-alias-border-l1, #8885)', borderRadius: 5, padding: '2px 6px', cursor: 'pointer', whiteSpace: 'nowrap' };
|
|
14
|
+
const mutedStyle = { opacity: 0.65, fontSize: 11 };
|
|
15
|
+
const linkStyle = { color: 'var(--dsw-alias-link-primary, LinkText)', whiteSpace: 'nowrap' };
|
|
16
|
+
const errorStyle = { color: 'var(--dsw-alias-state-error-primary, #bc3333)', fontSize: 11, margin: '3px 0 0', overflowWrap: 'anywhere' };
|
|
17
|
+
function button(label, disabled, onClick, extra = {}) {
|
|
18
|
+
return h('button', { type: 'button', style: { ...buttonStyle, opacity: disabled ? 0.5 : 1 }, disabled, onClick, ...extra }, label);
|
|
19
|
+
}
|
|
20
|
+
function ProgramRow({ item, state, controller, client }) {
|
|
21
|
+
const key = actionKey(item), pending = state.pending[key];
|
|
22
|
+
const status = item.run?.state ?? 'configured';
|
|
23
|
+
const controls = runControls(status, Boolean(pending), state.stale);
|
|
24
|
+
const [more, setMore] = useState(false);
|
|
25
|
+
const [models, setModels] = useState(false);
|
|
26
|
+
const [copied, setCopied] = useState('');
|
|
27
|
+
const localDocs = [...new Set(item.urls.flatMap(resource => [
|
|
28
|
+
...(resource.docs && !safeResourceUrl(resource.docs) ? [resource.docs] : []),
|
|
29
|
+
...(resource.type === 'docs' && /^(?:\/|[A-Za-z]:[\\/])/.test(resource.url) && !safeResourceUrl(resource.url) ? [resource.url] : []),
|
|
30
|
+
]))];
|
|
31
|
+
const hasMore = Boolean(item.description || item.command.length || item.logsPath || localDocs.length);
|
|
32
|
+
const perform = (action) => { void controller.action(action, item); };
|
|
33
|
+
const copy = (text) => {
|
|
34
|
+
if (typeof navigator.clipboard?.writeText === 'function')
|
|
35
|
+
void navigator.clipboard.writeText(text).then(() => setCopied(text), () => { });
|
|
36
|
+
};
|
|
37
|
+
return h('article', { 'data-program-key': item.program, style: { padding: '6px 9px', borderTop: '1px solid var(--dsw-alias-border-l1, #8883)' } }, h('div', { style: rowStyle }, h('strong', { title: item.name, style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', flex: '1 1 100px' } }, item.name), h('span', { 'data-program-state': status, title: item.run?.status, style: mutedStyle }, status), h('span', { 'aria-label': 'Program resources', style: { ...rowStyle, gap: 6, flexWrap: 'wrap' } }, ...item.urls.flatMap((resource, index) => {
|
|
38
|
+
const href = resourceLink(item, resource, state.stale, pending);
|
|
39
|
+
const label = resource.type.toUpperCase();
|
|
40
|
+
const docsHref = resource.docs && safeResourceUrl(resource.docs);
|
|
41
|
+
return [href
|
|
42
|
+
? h('a', { key: `${index}:url`, href, target: '_blank', rel: 'noopener noreferrer', referrerPolicy: 'no-referrer', title: resource.title, style: linkStyle }, label)
|
|
43
|
+
: h('span', { key: `${index}:url`, 'aria-disabled': true, title: resource.title, style: mutedStyle }, label),
|
|
44
|
+
...(docsHref && resource.type !== 'docs' ? [href
|
|
45
|
+
? h('a', { key: `${index}:docs`, href: docsHref, target: '_blank', rel: 'noopener noreferrer', referrerPolicy: 'no-referrer', style: linkStyle }, 'Docs')
|
|
46
|
+
: h('span', { key: `${index}:docs`, 'aria-disabled': true, style: mutedStyle }, 'Docs')] : []),
|
|
47
|
+
];
|
|
48
|
+
})), (status === 'configured' || ['stopped', 'completed', 'failed'].includes(status)) ? button(pending === 'start' ? 'Starting…' : 'Start', !controls.start, () => perform('start')) : null, status !== 'configured' && !['stopped', 'completed', 'failed'].includes(status) ? button(pending === 'stop' ? 'Stopping…' : 'Stop', !controls.stop, () => perform('stop')) : null, status !== 'configured' ? button(pending === 'restart' ? 'Restarting…' : 'Restart', !controls.restart, () => perform('restart')) : null, item.hasModelSlots && client.modelConfiguration && client.setModel ? button('Models', state.stale, () => setModels(!models), { 'aria-expanded': models, 'aria-label': `Configure models for ${item.name}` }) : null, hasMore ? button('More', false, () => setMore(!more), { 'aria-expanded': more, 'aria-label': `More about ${item.name}`, style: { ...buttonStyle, border: 0, padding: '2px 0', ...mutedStyle } }) : null), (state.actionErrors[key] || item.run?.error) ? h('p', { role: 'alert', style: errorStyle }, state.actionErrors[key] || item.run?.error) : null, models && item.hasModelSlots ? h(ProgramModels, { client, program: item.program, revision: item.modelRevision }) : null, more ? h('div', { 'aria-label': `${item.name} details`, style: { ...mutedStyle, marginTop: 5, overflowWrap: 'anywhere' } }, item.description ? h('div', null, item.description) : null, item.command.length ? h('div', null, h('code', null, item.command.join(' '))) : null, item.logsPath ? h('div', null, 'Logs: ', h('code', null, item.logsPath)) : null, ...localDocs.map((path, index) => h('div', { key: index }, 'Docs: ', h('code', null, path), ' ', button(copied === path ? 'Copied' : 'Copy', false, () => copy(path))))) : null);
|
|
49
|
+
}
|
|
50
|
+
/** Tiny status strip in the existing Session composer slot. Foldout state is
|
|
51
|
+
* independent of snapshots, and rows are keyed by definition, never generation. */
|
|
52
|
+
export function ProgramAgentsPanel({ client, reconnectDelayMs }) {
|
|
53
|
+
const controller = useMemo(() => createPanelController(client, reconnectDelayMs), [client, reconnectDelayMs]);
|
|
54
|
+
const state = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
const changed = () => controller.setVisible(document.visibilityState !== 'hidden');
|
|
57
|
+
changed();
|
|
58
|
+
controller.start();
|
|
59
|
+
document.addEventListener('visibilitychange', changed);
|
|
60
|
+
return () => { document.removeEventListener('visibilitychange', changed); controller.stop(); };
|
|
61
|
+
}, [controller]);
|
|
62
|
+
const [open, setOpen] = useState(false);
|
|
63
|
+
return h('section', { 'aria-label': 'Program agents', 'data-session-id': client.sessionId, style: panelStyle }, h('div', { style: { ...rowStyle, padding: '3px 8px' } }, button(`${open ? '▾' : '▸'} Program agents (${state.items.length})`, false, () => setOpen(!open), { 'aria-expanded': open, style: { ...buttonStyle, border: 0, flex: 1, textAlign: 'left', padding: '2px 0' } }), state.stale ? h('span', { role: 'status', title: state.error, style: mutedStyle }, state.error ? 'Reconnecting…' : state.loading ? 'Connecting…' : 'Paused') : null), open ? h('div', { 'data-program-foldout': true, style: { maxHeight: 'min(240px, 35vh)', overflowY: 'auto', overscrollBehavior: 'contain' } }, !state.items.length && !state.loading ? h('div', { style: { padding: '5px 9px', ...mutedStyle } }, 'No programs configured.') : null, state.truncated ? h('div', { style: { padding: '3px 9px', ...mutedStyle } }, 'Showing the most recent programs.') : null, ...state.items.map(item => h(ProgramRow, { key: item.program, item, state, controller, client }))) : null);
|
|
64
|
+
}
|
|
65
|
+
/** A Session switch remounts local state; no previous owner's content can flash. */
|
|
66
|
+
export function ProgramAgentsDock({ programClient }) {
|
|
67
|
+
return h(ProgramAgentsPanel, { key: programClient.sessionId, client: programClient });
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/client/view.ts"],"names":[],"mappings":"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"}
|