@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,253 @@
|
|
|
1
|
+
import { ProgramError } from '../runtime/protocol.js';
|
|
2
|
+
/** ACK may have committed before its response was lost. Neither retry nor NACK is safe. */
|
|
3
|
+
export class SettlementUnknownError extends ProgramError {
|
|
4
|
+
messageId;
|
|
5
|
+
outcome = 'unknown';
|
|
6
|
+
operation = 'ack';
|
|
7
|
+
cause;
|
|
8
|
+
constructor(messageId, cause) {
|
|
9
|
+
super('SETTLEMENT_UNKNOWN', `ACK outcome is unknown for inbox message ${messageId}; do not repeat its callback or automatically retry settlement`);
|
|
10
|
+
this.messageId = messageId;
|
|
11
|
+
this.name = 'SettlementUnknownError';
|
|
12
|
+
this.cause = cause;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const bound = (value, name, min, max) => {
|
|
16
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < min || value > max)
|
|
17
|
+
throw new ProgramError('INVALID_INPUT', `${name} must be an integer from ${min} to ${max}`);
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
const cancelled = () => new ProgramError('CANCELLED', 'Inbox processing was cancelled; a running callback must cooperate with context.signal');
|
|
21
|
+
const processingTimeout = () => new ProgramError('TIMEOUT', 'Inbox processing deadline exceeded; a running callback may still have effects after its lease expires');
|
|
22
|
+
const frozen = (value) => {
|
|
23
|
+
if (value !== null && typeof value === 'object') {
|
|
24
|
+
for (const child of Object.values(value))
|
|
25
|
+
frozen(child);
|
|
26
|
+
Object.freeze(value);
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
};
|
|
30
|
+
const claimArgs = (message, leaseToken) => {
|
|
31
|
+
const value = typeof message === 'string' ? { id: message, leaseToken } : message;
|
|
32
|
+
if (!value || typeof value.id !== 'string' || !value.id || value.id.length > 256 || typeof value.leaseToken !== 'string' || !value.leaseToken || value.leaseToken.length > 256)
|
|
33
|
+
throw new ProgramError('INVALID_INPUT', 'Ack/nack requires the claimed message or its id and leaseToken');
|
|
34
|
+
return { id: value.id, leaseToken: value.leaseToken };
|
|
35
|
+
};
|
|
36
|
+
const optionsFor = (options, managed) => {
|
|
37
|
+
if (!options || typeof options !== 'object' || Array.isArray(options))
|
|
38
|
+
throw new ProgramError('INVALID_INPUT', 'Invalid inbox receive options');
|
|
39
|
+
const waitMs = bound(options.waitMs === undefined ? 0 : options.waitMs, 'waitMs', 0, 30_000);
|
|
40
|
+
const leaseMs = bound(options.leaseMs === undefined ? 60_000 : options.leaseMs, 'leaseMs', managed ? 500 : 1, 300_000);
|
|
41
|
+
const timeoutMs = options.timeoutMs === undefined ? undefined : bound(options.timeoutMs, 'timeoutMs', 1, 120_000);
|
|
42
|
+
if (options.signal !== undefined && (!options.signal || typeof options.signal.aborted !== 'boolean' || typeof options.signal.addEventListener !== 'function' || typeof options.signal.removeEventListener !== 'function'))
|
|
43
|
+
throw new ProgramError('INVALID_INPUT', 'Invalid inbox cancellation signal');
|
|
44
|
+
return { waitMs, leaseMs, timeoutMs, signal: options.signal };
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Managed processing invokes the callback once per claim, renews while it runs, and ACKs
|
|
48
|
+
* only a fulfilled, uninterrupted callback. No bridge effect or callback is retried.
|
|
49
|
+
*
|
|
50
|
+
* This is NOT exactly-once processing: crashes, lease loss, and uncooperative callbacks
|
|
51
|
+
* can cause redelivery and overlapping external effects. Use application idempotency.
|
|
52
|
+
* Cancellation rejects receive promptly but does not NACK a still-running callback.
|
|
53
|
+
* Its claim is renewed only until the processing deadline; then renewal stops and the
|
|
54
|
+
* last lease expires naturally. A late callback never ACKs. Each helper retains one
|
|
55
|
+
* of its 32 slots until the actual callback settles, even after the caller has left.
|
|
56
|
+
*/
|
|
57
|
+
export function createProgramInbox(call) {
|
|
58
|
+
let active = 0;
|
|
59
|
+
const claim = async (options = {}) => {
|
|
60
|
+
const { waitMs, leaseMs, timeoutMs, signal } = optionsFor(options, false);
|
|
61
|
+
return call('inbox.receive', { ...(options.waitMs === undefined ? {} : { waitMs }), ...(options.leaseMs === undefined ? {} : { leaseMs }) }, { timeoutMs, signal });
|
|
62
|
+
};
|
|
63
|
+
const settle = (method, message, leaseToken, options) => call(method, claimArgs(message, leaseToken), options);
|
|
64
|
+
const managed = async (options, handler) => {
|
|
65
|
+
const { waitMs, leaseMs, timeoutMs, signal } = optionsFor(options, true);
|
|
66
|
+
const processingTimeoutMs = bound(options.processingTimeoutMs === undefined ? 120_000 : options.processingTimeoutMs, 'processingTimeoutMs', 1, 3_600_000);
|
|
67
|
+
if (signal?.aborted)
|
|
68
|
+
throw cancelled();
|
|
69
|
+
if (active >= 32)
|
|
70
|
+
throw new ProgramError('BACKPRESSURE', 'Inbox managed callback limit exceeded');
|
|
71
|
+
active++;
|
|
72
|
+
let message;
|
|
73
|
+
try {
|
|
74
|
+
// A claim is acquired before any user code runs. The processing deadline starts
|
|
75
|
+
// after acquisition, independently of long-poll and individual RPC deadlines.
|
|
76
|
+
message = await call('inbox.receive', { waitMs, leaseMs }, { timeoutMs, signal });
|
|
77
|
+
if (message !== null) {
|
|
78
|
+
claimArgs(message);
|
|
79
|
+
const receipt = message.receipt;
|
|
80
|
+
if (!receipt || receipt.id !== message.id || receipt.status !== 'claimed' || typeof receipt.leaseUntil !== 'string' || !Number.isFinite(Date.parse(receipt.leaseUntil)) || Date.parse(receipt.leaseUntil) <= Date.now())
|
|
81
|
+
throw new ProgramError('INVALID_RESPONSE', 'Inbox receive did not confirm a live claim');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
active--;
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
if (message === null) {
|
|
89
|
+
active--;
|
|
90
|
+
if (signal?.aborted)
|
|
91
|
+
throw cancelled();
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const processingDeadline = performance.now() + processingTimeoutMs;
|
|
95
|
+
const context = new AbortController();
|
|
96
|
+
const renewalController = new AbortController();
|
|
97
|
+
let failed = false;
|
|
98
|
+
let failure;
|
|
99
|
+
let ackStarted = false;
|
|
100
|
+
let renewalStopped = false;
|
|
101
|
+
let heartbeatTimer;
|
|
102
|
+
let deadlineTimer;
|
|
103
|
+
let renewal;
|
|
104
|
+
let rejectInterrupted;
|
|
105
|
+
const interrupted = new Promise((_resolve, reject) => { rejectInterrupted = reject; });
|
|
106
|
+
void interrupted.catch(() => { });
|
|
107
|
+
const removeAbort = () => signal?.removeEventListener('abort', onAbort);
|
|
108
|
+
const stopRenewal = (abortPending = false) => {
|
|
109
|
+
renewalStopped = true;
|
|
110
|
+
clearTimeout(heartbeatTimer);
|
|
111
|
+
heartbeatTimer = undefined;
|
|
112
|
+
if (abortPending)
|
|
113
|
+
renewalController.abort();
|
|
114
|
+
};
|
|
115
|
+
const interrupt = (error, stop = false) => {
|
|
116
|
+
if (stop) {
|
|
117
|
+
stopRenewal(true);
|
|
118
|
+
clearTimeout(deadlineTimer);
|
|
119
|
+
deadlineTimer = undefined;
|
|
120
|
+
}
|
|
121
|
+
if (!context.signal.aborted)
|
|
122
|
+
context.abort(error);
|
|
123
|
+
// Once ACK was attempted, only its response can determine the result. A lost
|
|
124
|
+
// response is SettlementUnknownError, never a misleading cancellation + NACK.
|
|
125
|
+
if (ackStarted || failed)
|
|
126
|
+
return;
|
|
127
|
+
failed = true;
|
|
128
|
+
failure = error;
|
|
129
|
+
removeAbort();
|
|
130
|
+
rejectInterrupted(error);
|
|
131
|
+
};
|
|
132
|
+
const onAbort = () => interrupt(cancelled());
|
|
133
|
+
const heartbeatMs = Math.floor(leaseMs / 3);
|
|
134
|
+
const schedule = () => {
|
|
135
|
+
if (!renewalStopped)
|
|
136
|
+
heartbeatTimer = setTimeout(() => {
|
|
137
|
+
heartbeatTimer = undefined;
|
|
138
|
+
renewal = (async () => {
|
|
139
|
+
try {
|
|
140
|
+
const receipt = await call('inbox.renew', { id: message.id, leaseToken: message.leaseToken, leaseMs }, { signal: renewalController.signal, timeoutMs: Math.min(timeoutMs ?? 120_000, heartbeatMs) });
|
|
141
|
+
if (!receipt || receipt.id !== message.id || receipt.status !== 'claimed' || typeof receipt.leaseUntil !== 'string' || !Number.isFinite(Date.parse(receipt.leaseUntil)) || Date.parse(receipt.leaseUntil) <= Date.now())
|
|
142
|
+
throw new ProgramError('INVALID_RESPONSE', 'Inbox renewal did not confirm a live claim');
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (!renewalController.signal.aborted)
|
|
146
|
+
interrupt(error, true);
|
|
147
|
+
}
|
|
148
|
+
})();
|
|
149
|
+
void renewal.then(schedule);
|
|
150
|
+
}, heartbeatMs);
|
|
151
|
+
};
|
|
152
|
+
const cleanup = () => {
|
|
153
|
+
clearTimeout(deadlineTimer);
|
|
154
|
+
deadlineTimer = undefined;
|
|
155
|
+
stopRenewal(true);
|
|
156
|
+
removeAbort();
|
|
157
|
+
};
|
|
158
|
+
const nack = async () => {
|
|
159
|
+
// Never reuse the cancelled callback signal for settlement. One bounded,
|
|
160
|
+
// best-effort NACK is made only AFTER actual user code has stopped running.
|
|
161
|
+
try {
|
|
162
|
+
await settle('inbox.nack', message, undefined, { timeoutMs: timeoutMs ?? 120_000 });
|
|
163
|
+
}
|
|
164
|
+
catch { /* Expiry/revocation may already have fenced this claim. No retries. */ }
|
|
165
|
+
};
|
|
166
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
167
|
+
deadlineTimer = setTimeout(() => {
|
|
168
|
+
deadlineTimer = undefined;
|
|
169
|
+
interrupt(processingTimeout(), true);
|
|
170
|
+
removeAbort();
|
|
171
|
+
}, processingTimeoutMs);
|
|
172
|
+
if (signal?.aborted)
|
|
173
|
+
onAbort();
|
|
174
|
+
schedule();
|
|
175
|
+
const work = (async () => {
|
|
176
|
+
try {
|
|
177
|
+
let result;
|
|
178
|
+
try {
|
|
179
|
+
if (failed)
|
|
180
|
+
throw failure;
|
|
181
|
+
const { leaseToken: _token, ...visible } = message;
|
|
182
|
+
result = await handler(frozen(visible), Object.freeze({ signal: context.signal }));
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (!failed) {
|
|
186
|
+
failed = true;
|
|
187
|
+
failure = error;
|
|
188
|
+
}
|
|
189
|
+
if (!context.signal.aborted)
|
|
190
|
+
context.abort(failure);
|
|
191
|
+
}
|
|
192
|
+
// Drain the one possible renewal before making a settlement decision. A
|
|
193
|
+
// late renewal failure must not be hidden by a callback's successful return.
|
|
194
|
+
stopRenewal();
|
|
195
|
+
if (renewal)
|
|
196
|
+
await renewal;
|
|
197
|
+
if (signal?.aborted && !failed) {
|
|
198
|
+
failed = true;
|
|
199
|
+
failure = cancelled();
|
|
200
|
+
}
|
|
201
|
+
// A synchronous callback may monopolize the event loop past its deadline,
|
|
202
|
+
// preventing the timer from running. It still must never acquire an ACK.
|
|
203
|
+
if (!failed && performance.now() >= processingDeadline) {
|
|
204
|
+
failed = true;
|
|
205
|
+
failure = processingTimeout();
|
|
206
|
+
}
|
|
207
|
+
if (failed) {
|
|
208
|
+
cleanup();
|
|
209
|
+
await nack();
|
|
210
|
+
throw failure;
|
|
211
|
+
}
|
|
212
|
+
ackStarted = true;
|
|
213
|
+
clearTimeout(deadlineTimer);
|
|
214
|
+
deadlineTimer = undefined;
|
|
215
|
+
try {
|
|
216
|
+
const receipt = await settle('inbox.ack', message, undefined, { timeoutMs, signal });
|
|
217
|
+
if (!receipt || receipt.id !== message.id || receipt.status !== 'acked')
|
|
218
|
+
throw new ProgramError('INVALID_RESPONSE', 'Inbox ACK did not confirm settlement');
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
throw new SettlementUnknownError(message.id, error);
|
|
222
|
+
}
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
cleanup();
|
|
227
|
+
active--;
|
|
228
|
+
}
|
|
229
|
+
})();
|
|
230
|
+
return Promise.race([work, interrupted]);
|
|
231
|
+
};
|
|
232
|
+
function receive(optionsOrHandler = {}, handler) {
|
|
233
|
+
if (typeof optionsOrHandler === 'function') {
|
|
234
|
+
if (handler !== undefined)
|
|
235
|
+
return Promise.reject(new ProgramError('INVALID_INPUT', 'Receive expects one handler'));
|
|
236
|
+
return managed({}, optionsOrHandler);
|
|
237
|
+
}
|
|
238
|
+
if (handler === undefined)
|
|
239
|
+
return claim(optionsOrHandler);
|
|
240
|
+
if (typeof handler !== 'function')
|
|
241
|
+
return Promise.reject(new ProgramError('INVALID_INPUT', 'Receive handler must be a function'));
|
|
242
|
+
return managed(optionsOrHandler, handler);
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
receive,
|
|
246
|
+
claim,
|
|
247
|
+
renew: async (message, leaseMs, options) => call('inbox.renew', { ...claimArgs(message), leaseMs: bound(leaseMs, 'leaseMs', 1, 300_000) }, options),
|
|
248
|
+
ack: (message, token, options) => settle('inbox.ack', message, token, options),
|
|
249
|
+
nack: (message, token, options) => settle('inbox.nack', message, token, options),
|
|
250
|
+
receipt: (id, options) => call('inbox.receipt', { id }, options),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/app/inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { JsonValue } from '../types.js';
|
|
2
|
+
import { type LoggerOptions } from '../monitoring/logger.js';
|
|
3
|
+
export * from './models.js';
|
|
4
|
+
export * from './conversations.js';
|
|
5
|
+
export * from './inbox.js';
|
|
6
|
+
export * from './agents.js';
|
|
7
|
+
export * from './tools.js';
|
|
8
|
+
export { installGlobalErrorHandlers } from '../monitoring/fatal.js';
|
|
9
|
+
export { createLogger, StructuredLogger, type LoggerOptions, type LogMetadata } from '../monitoring/logger.js';
|
|
10
|
+
export type { InboxMessage, MessageReceipt, ReceiveOptions } from './mailbox.js';
|
|
11
|
+
export type { JsonValue } from '../types.js';
|
|
12
|
+
export { ProgramError } from '../runtime/protocol.js';
|
|
13
|
+
export { createProgramEndpoints, listenProgramEndpoint, type ProgramEndpoints, type ProgramEndpointBinding, type PublishEndpointOptions, type UnpublishEndpointOptions, type ListeningProgramEndpoint, type EndpointBridgeCall } from './endpoints.js';
|
|
14
|
+
export interface CallOptions {
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ConnectProgramOptions {
|
|
19
|
+
url?: string;
|
|
20
|
+
token?: string;
|
|
21
|
+
runId?: string;
|
|
22
|
+
generation?: number;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
logger?: LoggerOptions;
|
|
25
|
+
}
|
|
26
|
+
export interface AgentInfo {
|
|
27
|
+
id: string;
|
|
28
|
+
name?: string;
|
|
29
|
+
[key: string]: JsonValue | undefined;
|
|
30
|
+
}
|
|
31
|
+
export interface McpToolInfo {
|
|
32
|
+
server: string;
|
|
33
|
+
tool: string;
|
|
34
|
+
name: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
inputSchema?: JsonValue;
|
|
37
|
+
}
|
|
38
|
+
export interface SendOptions extends CallOptions {
|
|
39
|
+
correlationId?: string;
|
|
40
|
+
}
|
|
41
|
+
/** Explicit connection only: ordinary programs require no SDK and gain no implicit permission. */
|
|
42
|
+
export declare function connectProgram(options?: ConnectProgramOptions): {
|
|
43
|
+
id: string | undefined;
|
|
44
|
+
generation: number | undefined;
|
|
45
|
+
call: <T = JsonValue>(method: string, input?: JsonValue, callOptions?: CallOptions) => Promise<T>;
|
|
46
|
+
logger: import("../monitoring/logger.js").StructuredLogger;
|
|
47
|
+
endpoints: import("./endpoints.js").ProgramEndpoints;
|
|
48
|
+
sendSupervisor: (body: JsonValue, sendOptions?: SendOptions) => Promise<JsonValue>;
|
|
49
|
+
supervisor: {
|
|
50
|
+
send: (body: JsonValue, sendOptions?: SendOptions) => Promise<JsonValue>;
|
|
51
|
+
};
|
|
52
|
+
agents: import("./agents.js").ProgramAgents;
|
|
53
|
+
mcp: {
|
|
54
|
+
forServer: (server: string) => import("./tools.js").ProgramToolClient;
|
|
55
|
+
listTools: (params?: {
|
|
56
|
+
cursor?: string;
|
|
57
|
+
}, options?: CallOptions) => Promise<import("./tools.js").ListToolsResult>;
|
|
58
|
+
callTool: (params: import("./tools.js").CallToolRequestParams, options?: CallOptions) => Promise<import("./tools.js").CallToolResult>;
|
|
59
|
+
/** @deprecated Use mcp.forServer(server).listTools(). */
|
|
60
|
+
list: (callOptions?: CallOptions) => Promise<McpToolInfo[]>;
|
|
61
|
+
call: <T = JsonValue>(server: string, tool: string, args?: JsonValue, callOptions?: CallOptions) => Promise<T>;
|
|
62
|
+
};
|
|
63
|
+
models: import("./models.js").ProgramModels;
|
|
64
|
+
conversations: import("./conversations.js").ProgramConversations;
|
|
65
|
+
tools: import("./tools.js").ProgramToolClient;
|
|
66
|
+
inbox: import("./inbox.js").ProgramInbox;
|
|
67
|
+
};
|
|
68
|
+
export type ProgramConnection = ReturnType<typeof connectProgram>;
|
|
69
|
+
/** Convenience for a one-off escalation; uses explicit bridge env and does not retry. */
|
|
70
|
+
export declare function sendSupervisor(body: JsonValue, options?: SendOptions): Promise<JsonValue>;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { assertJson, isRecord, ProgramError, validName } from '../runtime/protocol.js';
|
|
2
|
+
import { createLogger } from '../monitoring/logger.js';
|
|
3
|
+
import { createProgramEndpoints } from './endpoints.js';
|
|
4
|
+
import { createProgramInbox } from './inbox.js';
|
|
5
|
+
import { createProgramAgents } from './agents.js';
|
|
6
|
+
import { createProgramTools } from './tools.js';
|
|
7
|
+
import { createProgramModels } from './models.js';
|
|
8
|
+
import { createProgramConversations } from './conversations.js';
|
|
9
|
+
import { createProgramStream } from './stream.js';
|
|
10
|
+
export * from './models.js';
|
|
11
|
+
export * from './conversations.js';
|
|
12
|
+
export * from './inbox.js';
|
|
13
|
+
export * from './agents.js';
|
|
14
|
+
export * from './tools.js';
|
|
15
|
+
export { installGlobalErrorHandlers } from '../monitoring/fatal.js';
|
|
16
|
+
export { createLogger, StructuredLogger } from '../monitoring/logger.js';
|
|
17
|
+
export { ProgramError } from '../runtime/protocol.js';
|
|
18
|
+
export { createProgramEndpoints, listenProgramEndpoint } from './endpoints.js';
|
|
19
|
+
/** Explicit connection only: ordinary programs require no SDK and gain no implicit permission. */
|
|
20
|
+
export function connectProgram(options = {}) {
|
|
21
|
+
const rawUrl = options.url ?? process.env.DSH_PROGRAM_BRIDGE_URL;
|
|
22
|
+
const token = options.token ?? process.env.DSH_PROGRAM_BRIDGE_TOKEN;
|
|
23
|
+
if (!rawUrl || !token)
|
|
24
|
+
throw new ProgramError('NOT_CONFIGURED', 'Program bridge is not configured; launch under a bridge-enabled supervisor or pass url and token explicitly');
|
|
25
|
+
let url;
|
|
26
|
+
try {
|
|
27
|
+
url = new URL(rawUrl);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new ProgramError('INVALID_CONFIG', 'Invalid program bridge URL');
|
|
31
|
+
}
|
|
32
|
+
if (url.protocol !== 'http:' || url.hostname !== '127.0.0.1' || !url.port || url.username || url.password || url.pathname !== '/' || url.search || url.hash || typeof token !== 'string' || token.length > 1024 || !/^[A-Za-z0-9_-]+$/.test(token))
|
|
33
|
+
throw new ProgramError('INVALID_CONFIG', 'Program bridge requires a direct 127.0.0.1 HTTP endpoint and opaque token');
|
|
34
|
+
const defaultTimeout = options.timeoutMs ?? 120_000;
|
|
35
|
+
if (!Number.isSafeInteger(defaultTimeout) || defaultTimeout < 1 || defaultTimeout > 120_000)
|
|
36
|
+
throw new ProgramError('INVALID_CONFIG', 'Bridge timeout must be between 1 and 120000 ms');
|
|
37
|
+
const generationText = process.env.DSH_PROGRAM_GEN;
|
|
38
|
+
const generation = options.generation ?? (generationText === undefined ? undefined : Number(generationText));
|
|
39
|
+
if (generation !== undefined && (!Number.isSafeInteger(generation) || generation < 1))
|
|
40
|
+
throw new ProgramError('INVALID_CONFIG', 'Invalid bridge generation');
|
|
41
|
+
let pending = 0;
|
|
42
|
+
const logger = createLogger(options.logger);
|
|
43
|
+
const call = async (method, input = null, callOptions = {}) => {
|
|
44
|
+
if (!validName(method))
|
|
45
|
+
throw new ProgramError('INVALID_INPUT', 'Invalid bridge method');
|
|
46
|
+
assertJson(input);
|
|
47
|
+
const body = JSON.stringify({ method, input });
|
|
48
|
+
if (Buffer.byteLength(body) > 64 * 1024)
|
|
49
|
+
throw new ProgramError('LIMIT', 'Bridge request exceeds 64 KiB');
|
|
50
|
+
const timeoutMs = callOptions.timeoutMs ?? defaultTimeout;
|
|
51
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 120_000)
|
|
52
|
+
throw new ProgramError('INVALID_INPUT', 'Bridge timeout must be between 1 and 120000 ms');
|
|
53
|
+
if (callOptions.signal?.aborted)
|
|
54
|
+
throw new ProgramError('CANCELLED', 'Bridge call was cancelled before sending');
|
|
55
|
+
if (pending >= 32)
|
|
56
|
+
throw new ProgramError('BACKPRESSURE', 'Program bridge pending call limit exceeded');
|
|
57
|
+
pending++;
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
const abort = () => controller.abort(new ProgramError('CANCELLED', 'Bridge call cancelled; effect outcome may be unknown'));
|
|
60
|
+
const timer = setTimeout(() => controller.abort(new ProgramError('TIMEOUT', 'Bridge deadline exceeded; effect outcome may be unknown')), timeoutMs);
|
|
61
|
+
callOptions.signal?.addEventListener('abort', abort, { once: true });
|
|
62
|
+
if (callOptions.signal?.aborted)
|
|
63
|
+
abort();
|
|
64
|
+
try {
|
|
65
|
+
// Never retry effects or follow redirects with a run credential.
|
|
66
|
+
const response = await fetch(new URL('/call', url), { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, body, signal: controller.signal, redirect: 'error' });
|
|
67
|
+
const reader = response.body?.getReader();
|
|
68
|
+
if (!reader)
|
|
69
|
+
throw new ProgramError('INVALID_RESPONSE', 'Bridge returned no response body');
|
|
70
|
+
const chunks = [];
|
|
71
|
+
let bytes = 0;
|
|
72
|
+
try {
|
|
73
|
+
for (;;) {
|
|
74
|
+
const item = await reader.read();
|
|
75
|
+
if (item.done)
|
|
76
|
+
break;
|
|
77
|
+
bytes += item.value.length;
|
|
78
|
+
if (bytes > 64 * 1024) {
|
|
79
|
+
await reader.cancel();
|
|
80
|
+
throw new ProgramError('LIMIT', 'Bridge response exceeds 64 KiB');
|
|
81
|
+
}
|
|
82
|
+
chunks.push(item.value);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
reader.releaseLock();
|
|
87
|
+
}
|
|
88
|
+
let payload;
|
|
89
|
+
try {
|
|
90
|
+
payload = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new ProgramError('INVALID_RESPONSE', 'Bridge returned malformed JSON');
|
|
94
|
+
}
|
|
95
|
+
assertJson(payload);
|
|
96
|
+
if (!isRecord(payload) || typeof payload.ok !== 'boolean')
|
|
97
|
+
throw new ProgramError('INVALID_RESPONSE', 'Invalid bridge response envelope');
|
|
98
|
+
if (!payload.ok) {
|
|
99
|
+
if (!isRecord(payload.error) || typeof payload.error.code !== 'string' || typeof payload.error.message !== 'string')
|
|
100
|
+
throw new ProgramError('INVALID_RESPONSE', 'Invalid bridge error envelope');
|
|
101
|
+
throw new ProgramError(payload.error.code, payload.error.message);
|
|
102
|
+
}
|
|
103
|
+
if (!response.ok || !Object.hasOwn(payload, 'result'))
|
|
104
|
+
throw new ProgramError('INVALID_RESPONSE', 'Invalid bridge success response');
|
|
105
|
+
return payload.result;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (controller.signal.aborted)
|
|
109
|
+
throw controller.signal.reason;
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
pending--;
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
callOptions.signal?.removeEventListener('abort', abort);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const sendSupervisor = (body, sendOptions = {}) => call('supervisor.send', { body, ...(sendOptions.correlationId === undefined ? {} : { correlationId: sendOptions.correlationId }) }, sendOptions);
|
|
119
|
+
const tools = createProgramTools(call);
|
|
120
|
+
return {
|
|
121
|
+
id: options.runId ?? process.env.DSH_PROGRAM_RUN_ID,
|
|
122
|
+
generation,
|
|
123
|
+
call,
|
|
124
|
+
logger,
|
|
125
|
+
endpoints: createProgramEndpoints(call),
|
|
126
|
+
sendSupervisor,
|
|
127
|
+
supervisor: { send: sendSupervisor },
|
|
128
|
+
agents: createProgramAgents(call),
|
|
129
|
+
mcp: {
|
|
130
|
+
forServer: (server) => createProgramTools(call, server),
|
|
131
|
+
listTools: tools.listTools,
|
|
132
|
+
callTool: tools.callTool,
|
|
133
|
+
/** @deprecated Use mcp.forServer(server).listTools(). */
|
|
134
|
+
list: (callOptions) => call('mcp.list', null, callOptions),
|
|
135
|
+
call: (server, tool, args = null, callOptions) => call('mcp.call', { server, tool, args }, callOptions),
|
|
136
|
+
},
|
|
137
|
+
models: createProgramModels(call),
|
|
138
|
+
conversations: createProgramConversations(call, createProgramStream(url, token)),
|
|
139
|
+
tools,
|
|
140
|
+
inbox: createProgramInbox(call),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/** Convenience for a one-off escalation; uses explicit bridge env and does not retry. */
|
|
144
|
+
export function sendSupervisor(body, options = {}) {
|
|
145
|
+
return connectProgram().sendSupervisor(body, options);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { JsonValue } from '../types.js';
|
|
2
|
+
/** Namespace persists across run/watch generations. claimant must come from the host, never a request body. */
|
|
3
|
+
export interface MessageScope {
|
|
4
|
+
ownerId: string;
|
|
5
|
+
program: string;
|
|
6
|
+
claimant?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface MessageReceipt {
|
|
9
|
+
id: string;
|
|
10
|
+
status: 'accepted' | 'claimed' | 'acked';
|
|
11
|
+
acceptedAt: string;
|
|
12
|
+
claimedAt?: string;
|
|
13
|
+
ackedAt?: string;
|
|
14
|
+
leaseUntil?: string;
|
|
15
|
+
attempts: number;
|
|
16
|
+
}
|
|
17
|
+
export interface InboxMessage {
|
|
18
|
+
id: string;
|
|
19
|
+
from: string;
|
|
20
|
+
body: JsonValue;
|
|
21
|
+
createdAt: string;
|
|
22
|
+
correlationId?: string;
|
|
23
|
+
leaseToken: string;
|
|
24
|
+
receipt: MessageReceipt;
|
|
25
|
+
}
|
|
26
|
+
export interface ReceiveOptions {
|
|
27
|
+
waitMs?: number;
|
|
28
|
+
leaseMs?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface MessageStoreOptions {
|
|
31
|
+
maxPendingPerProgram?: number;
|
|
32
|
+
maxMessages?: number;
|
|
33
|
+
clock?: () => number;
|
|
34
|
+
}
|
|
35
|
+
/** Durable at-least-once queue. Acceptance is not app processing; only explicit ack records that. */
|
|
36
|
+
export declare class MessageStore {
|
|
37
|
+
private readonly db;
|
|
38
|
+
private readonly maxPending;
|
|
39
|
+
private readonly maxMessages;
|
|
40
|
+
private readonly clock;
|
|
41
|
+
private closed;
|
|
42
|
+
constructor(path: string, options?: MessageStoreOptions);
|
|
43
|
+
send(scope: MessageScope, message: {
|
|
44
|
+
from: string;
|
|
45
|
+
body: JsonValue;
|
|
46
|
+
correlationId?: string;
|
|
47
|
+
}): MessageReceipt;
|
|
48
|
+
receive(scope: MessageScope, options?: ReceiveOptions, signal?: AbortSignal): Promise<InboxMessage | null>;
|
|
49
|
+
/** Extend only an unexpired claim belonging to this exact run and token. Never resurrect a lease. */
|
|
50
|
+
renew(scope: MessageScope, id: string, leaseToken: string, leaseMs: number): MessageReceipt;
|
|
51
|
+
/** Low-level settlement. The exact live token is consumed; never retry an unknown ACK outcome. */
|
|
52
|
+
ack(scope: MessageScope, id: string, leaseToken: string): MessageReceipt;
|
|
53
|
+
nack(scope: MessageScope, id: string, leaseToken: string): MessageReceipt;
|
|
54
|
+
receipt(scope: MessageScope, id: string): MessageReceipt | null;
|
|
55
|
+
/** Release only this revoked run's claims; namespace and unacked messages survive. */
|
|
56
|
+
releaseClaims(scope: MessageScope): void;
|
|
57
|
+
close(): void;
|
|
58
|
+
private row;
|
|
59
|
+
private claim;
|
|
60
|
+
private checkScope;
|
|
61
|
+
private bound;
|
|
62
|
+
private transaction;
|
|
63
|
+
}
|