@forgeax/engine-intelligence 0.1.2
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 +202 -0
- package/README.md +36 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/intelligence-error-code-owner.test-d.d.ts +33 -0
- package/dist/__tests__/intelligence-error-code-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/runtime.test.d.ts +2 -0
- package/dist/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/transport.test.d.ts +2 -0
- package/dist/__tests__/transport.test.d.ts.map +1 -0
- package/dist/errors.d.ts +74 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +538 -0
- package/dist/index.mjs.map +1 -0
- package/dist/plugin.d.ts +10 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/runtime.d.ts +30 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/transport.d.ts +61 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +56 -0
- package/src/__tests__/intelligence-error-code-owner.test-d.ts +143 -0
- package/src/__tests__/runtime.test.ts +504 -0
- package/src/__tests__/transport.test.ts +130 -0
- package/src/errors.ts +147 -0
- package/src/index.ts +36 -0
- package/src/plugin.ts +20 -0
- package/src/runtime.ts +293 -0
- package/src/transport.ts +282 -0
- package/src/types.ts +104 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
import { ok, err } from '@forgeax/engine-types';
|
|
2
|
+
|
|
3
|
+
// src/errors.ts
|
|
4
|
+
var policy = {
|
|
5
|
+
"intelligence-invalid-request": {
|
|
6
|
+
expected: "activity input must be a non-empty string within the configured bound",
|
|
7
|
+
hint: "validate and bound player input before submitting the activity"
|
|
8
|
+
},
|
|
9
|
+
"intelligence-session-provider-mismatch": {
|
|
10
|
+
expected: "a session reference must be resumed by the provider that created it",
|
|
11
|
+
hint: "discard the incompatible session or select its original provider"
|
|
12
|
+
},
|
|
13
|
+
"intelligence-capacity-exceeded": {
|
|
14
|
+
expected: "active intelligence work must remain within the configured concurrency bound",
|
|
15
|
+
hint: "wait for an activity to finish or raise the explicit provider capacity"
|
|
16
|
+
},
|
|
17
|
+
"intelligence-activity-not-found": {
|
|
18
|
+
expected: "the activity must still be running when cancellation is requested",
|
|
19
|
+
hint: "ignore an already observed terminal activity or retain the correct ActivityId"
|
|
20
|
+
},
|
|
21
|
+
"intelligence-provider-failed": {
|
|
22
|
+
expected: "the selected provider must complete or report a structured failure",
|
|
23
|
+
hint: "inspect detail.cause and provider configuration, then retry or select another provider"
|
|
24
|
+
},
|
|
25
|
+
"intelligence-output-overflow": {
|
|
26
|
+
expected: "incremental and final output must remain within configured queue and text bounds",
|
|
27
|
+
hint: "consume events every frame or raise the explicit bound for this application"
|
|
28
|
+
},
|
|
29
|
+
"intelligence-closed": {
|
|
30
|
+
expected: "the intelligence service must be open for submit and cancel operations",
|
|
31
|
+
hint: "create a new service after its Cordis realm or owner has been disposed"
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var INTELLIGENCE_EXPECTED = Object.fromEntries(
|
|
35
|
+
Object.entries(policy).map(([code, value]) => [code, value.expected])
|
|
36
|
+
);
|
|
37
|
+
var INTELLIGENCE_ERROR_HINTS = Object.fromEntries(
|
|
38
|
+
Object.entries(policy).map(([code, value]) => [code, value.hint])
|
|
39
|
+
);
|
|
40
|
+
var IntelligenceErrorClass = class extends Error {
|
|
41
|
+
code;
|
|
42
|
+
expected;
|
|
43
|
+
hint;
|
|
44
|
+
detail;
|
|
45
|
+
constructor(args) {
|
|
46
|
+
const selected = policy[args.code];
|
|
47
|
+
super(
|
|
48
|
+
`[IntelligenceError ${args.code}] expected: ${selected.expected}; hint: ${selected.hint}`
|
|
49
|
+
);
|
|
50
|
+
this.name = "IntelligenceError";
|
|
51
|
+
this.code = args.code;
|
|
52
|
+
this.expected = selected.expected;
|
|
53
|
+
this.hint = selected.hint;
|
|
54
|
+
this.detail = args.detail;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var IntelligenceError = IntelligenceErrorClass;
|
|
58
|
+
function intelligenceFailure(error) {
|
|
59
|
+
if (error.code === "intelligence-provider-failed") {
|
|
60
|
+
return {
|
|
61
|
+
code: error.code,
|
|
62
|
+
expected: error.expected,
|
|
63
|
+
hint: error.hint,
|
|
64
|
+
detail: {
|
|
65
|
+
providerId: error.detail.providerId,
|
|
66
|
+
cause: error.detail.cause instanceof Error ? error.detail.cause.message : String(error.detail.cause)
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
code: error.code,
|
|
72
|
+
expected: error.expected,
|
|
73
|
+
hint: error.hint,
|
|
74
|
+
detail: error.detail
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function providerError(providerId, cause) {
|
|
78
|
+
return new IntelligenceError({
|
|
79
|
+
code: "intelligence-provider-failed",
|
|
80
|
+
detail: { providerId, cause }
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/plugin.ts
|
|
85
|
+
function intelligencePlugin(service) {
|
|
86
|
+
return {
|
|
87
|
+
name: "intelligence",
|
|
88
|
+
provide: "intelligence",
|
|
89
|
+
apply(ctx) {
|
|
90
|
+
ctx.provide("intelligence", service);
|
|
91
|
+
ctx.effect(() => () => service.close(), "intelligence/service");
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/types.ts
|
|
97
|
+
var DEFAULT_INTELLIGENCE_LIMITS = {
|
|
98
|
+
maxInputChars: 16384,
|
|
99
|
+
maxOutputChars: 65536,
|
|
100
|
+
maxConcurrentActivities: 8,
|
|
101
|
+
maxPendingEventsPerActivity: 256,
|
|
102
|
+
maxPollEvents: 64
|
|
103
|
+
};
|
|
104
|
+
function activityId(value) {
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// src/runtime.ts
|
|
109
|
+
var fallbackIdentity = 0;
|
|
110
|
+
function nextIdentity(prefix) {
|
|
111
|
+
const uuid = globalThis.crypto?.randomUUID?.();
|
|
112
|
+
if (uuid !== void 0) return `${prefix}-${uuid}`;
|
|
113
|
+
fallbackIdentity += 1;
|
|
114
|
+
return `${prefix}-${Date.now().toString(36)}-${fallbackIdentity.toString(36)}`;
|
|
115
|
+
}
|
|
116
|
+
function resolveIntelligenceLimits(overrides) {
|
|
117
|
+
const limits = { ...DEFAULT_INTELLIGENCE_LIMITS, ...overrides };
|
|
118
|
+
for (const [name, value] of Object.entries(limits)) {
|
|
119
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
120
|
+
throw new RangeError(`${name} must be a positive integer`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (limits.maxPendingEventsPerActivity < 2) {
|
|
124
|
+
throw new RangeError(
|
|
125
|
+
"maxPendingEventsPerActivity must reserve at least one data and terminal event"
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
return limits;
|
|
129
|
+
}
|
|
130
|
+
var IntelligenceRuntime = class {
|
|
131
|
+
constructor(provider, options = {}) {
|
|
132
|
+
this.provider = provider;
|
|
133
|
+
this.providerId = provider.id;
|
|
134
|
+
this.limits = resolveIntelligenceLimits(options.limits);
|
|
135
|
+
this.createActivityId = options.createActivityId ?? (() => activityId(nextIdentity("activity")));
|
|
136
|
+
this.createSessionId = options.createSessionId ?? (() => nextIdentity("session"));
|
|
137
|
+
}
|
|
138
|
+
provider;
|
|
139
|
+
providerId;
|
|
140
|
+
limits;
|
|
141
|
+
records = /* @__PURE__ */ new Map();
|
|
142
|
+
createActivityId;
|
|
143
|
+
createSessionId;
|
|
144
|
+
closed = false;
|
|
145
|
+
closeTask;
|
|
146
|
+
submit(request) {
|
|
147
|
+
const validated = this.validateRequest(request);
|
|
148
|
+
if (!validated.ok) return validated;
|
|
149
|
+
const ref = {
|
|
150
|
+
id: this.createActivityId(),
|
|
151
|
+
session: request.session ?? { providerId: this.providerId, id: this.createSessionId() }
|
|
152
|
+
};
|
|
153
|
+
const accepted = this.accept({ ...ref, input: request.input });
|
|
154
|
+
return accepted.ok ? ok(ref) : accepted;
|
|
155
|
+
}
|
|
156
|
+
/** Accept an already identified request from a realm transport. */
|
|
157
|
+
accept(submission) {
|
|
158
|
+
const validated = this.validateRequest({
|
|
159
|
+
input: submission.input,
|
|
160
|
+
session: submission.session
|
|
161
|
+
});
|
|
162
|
+
if (!validated.ok) return validated;
|
|
163
|
+
if (this.records.has(submission.id)) {
|
|
164
|
+
return err(
|
|
165
|
+
providerError(this.providerId, `duplicate activity identity: ${String(submission.id)}`)
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
if (this.runningCount >= this.limits.maxConcurrentActivities) {
|
|
169
|
+
return err(
|
|
170
|
+
new IntelligenceError({
|
|
171
|
+
code: "intelligence-capacity-exceeded",
|
|
172
|
+
detail: { limit: this.limits.maxConcurrentActivities }
|
|
173
|
+
})
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
const record = {
|
|
177
|
+
ref: { id: submission.id, session: submission.session },
|
|
178
|
+
events: [],
|
|
179
|
+
sequence: 0,
|
|
180
|
+
outputChars: 0,
|
|
181
|
+
terminal: false
|
|
182
|
+
};
|
|
183
|
+
this.records.set(submission.id, record);
|
|
184
|
+
let started;
|
|
185
|
+
try {
|
|
186
|
+
started = this.provider.start(submission, this.createSink(record));
|
|
187
|
+
} catch (cause) {
|
|
188
|
+
this.records.delete(submission.id);
|
|
189
|
+
return err(providerError(this.providerId, cause));
|
|
190
|
+
}
|
|
191
|
+
if (!started.ok) {
|
|
192
|
+
this.records.delete(submission.id);
|
|
193
|
+
return started;
|
|
194
|
+
}
|
|
195
|
+
return ok(void 0);
|
|
196
|
+
}
|
|
197
|
+
poll(maxEvents = this.limits.maxPollEvents) {
|
|
198
|
+
if (!Number.isInteger(maxEvents) || maxEvents <= 0) return [];
|
|
199
|
+
const bounded = Math.min(maxEvents, this.limits.maxPollEvents);
|
|
200
|
+
const events = [];
|
|
201
|
+
for (const [id, record] of this.records) {
|
|
202
|
+
while (record.events.length > 0 && events.length < bounded) {
|
|
203
|
+
const event = record.events.shift();
|
|
204
|
+
if (event !== void 0) events.push(event);
|
|
205
|
+
}
|
|
206
|
+
if (record.terminal && record.events.length === 0) this.records.delete(id);
|
|
207
|
+
if (events.length === bounded) break;
|
|
208
|
+
}
|
|
209
|
+
return events;
|
|
210
|
+
}
|
|
211
|
+
cancel(activity) {
|
|
212
|
+
if (this.closed) return err(this.closedError());
|
|
213
|
+
const record = this.records.get(activity);
|
|
214
|
+
if (record === void 0 || record.terminal) {
|
|
215
|
+
return err(
|
|
216
|
+
new IntelligenceError({
|
|
217
|
+
code: "intelligence-activity-not-found",
|
|
218
|
+
detail: { activityId: activity }
|
|
219
|
+
})
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
return this.provider.cancel(activity);
|
|
224
|
+
} catch (cause) {
|
|
225
|
+
return err(providerError(this.providerId, cause));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
close() {
|
|
229
|
+
this.closeTask ??= this.performClose();
|
|
230
|
+
return this.closeTask;
|
|
231
|
+
}
|
|
232
|
+
async performClose() {
|
|
233
|
+
this.closed = true;
|
|
234
|
+
await this.provider.close();
|
|
235
|
+
this.records.clear();
|
|
236
|
+
}
|
|
237
|
+
get runningCount() {
|
|
238
|
+
let count = 0;
|
|
239
|
+
for (const record of this.records.values()) if (!record.terminal) count += 1;
|
|
240
|
+
return count;
|
|
241
|
+
}
|
|
242
|
+
validateRequest(request) {
|
|
243
|
+
if (this.closed) return err(this.closedError());
|
|
244
|
+
if (request.input.length === 0 || request.input.length > this.limits.maxInputChars) {
|
|
245
|
+
return err(
|
|
246
|
+
new IntelligenceError({
|
|
247
|
+
code: "intelligence-invalid-request",
|
|
248
|
+
detail: {
|
|
249
|
+
field: "input",
|
|
250
|
+
reason: request.input.length === 0 ? "input is empty" : `input exceeds ${this.limits.maxInputChars} characters`
|
|
251
|
+
}
|
|
252
|
+
})
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
if (request.session !== void 0 && request.session.providerId !== this.providerId) {
|
|
256
|
+
return err(
|
|
257
|
+
new IntelligenceError({
|
|
258
|
+
code: "intelligence-session-provider-mismatch",
|
|
259
|
+
detail: {
|
|
260
|
+
expectedProviderId: this.providerId,
|
|
261
|
+
receivedProviderId: request.session.providerId
|
|
262
|
+
}
|
|
263
|
+
})
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
return ok(void 0);
|
|
267
|
+
}
|
|
268
|
+
createSink(record) {
|
|
269
|
+
return {
|
|
270
|
+
text: (text) => {
|
|
271
|
+
if (record.terminal || text.length === 0) return;
|
|
272
|
+
if (record.outputChars + text.length > this.limits.maxOutputChars) {
|
|
273
|
+
this.overflow(record, "output-chars", this.limits.maxOutputChars);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (record.events.length >= this.limits.maxPendingEventsPerActivity - 1) {
|
|
277
|
+
this.overflow(record, "pending-events", this.limits.maxPendingEventsPerActivity);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
record.outputChars += text.length;
|
|
281
|
+
this.push(record, { type: "text-delta", text });
|
|
282
|
+
},
|
|
283
|
+
complete: (output) => {
|
|
284
|
+
if (record.terminal) return;
|
|
285
|
+
if (output.length > this.limits.maxOutputChars) {
|
|
286
|
+
this.overflow(record, "output-chars", this.limits.maxOutputChars);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
record.terminal = true;
|
|
290
|
+
this.push(record, { type: "completed", session: record.ref.session, output });
|
|
291
|
+
},
|
|
292
|
+
fail: (cause) => {
|
|
293
|
+
if (record.terminal) return;
|
|
294
|
+
record.terminal = true;
|
|
295
|
+
const error = providerError(this.providerId, cause);
|
|
296
|
+
this.push(record, { type: "failed", error: intelligenceFailure(error) });
|
|
297
|
+
},
|
|
298
|
+
cancelled: () => {
|
|
299
|
+
if (record.terminal) return;
|
|
300
|
+
record.terminal = true;
|
|
301
|
+
this.push(record, { type: "cancelled" });
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
overflow(record, bound, limit) {
|
|
306
|
+
if (record.terminal) return;
|
|
307
|
+
record.terminal = true;
|
|
308
|
+
const error = new IntelligenceError({
|
|
309
|
+
code: "intelligence-output-overflow",
|
|
310
|
+
detail: { activityId: record.ref.id, bound, limit }
|
|
311
|
+
});
|
|
312
|
+
if (record.events.length >= this.limits.maxPendingEventsPerActivity) record.events.pop();
|
|
313
|
+
this.push(record, { type: "failed", error: intelligenceFailure(error) });
|
|
314
|
+
try {
|
|
315
|
+
this.provider.cancel(record.ref.id);
|
|
316
|
+
} catch {
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
push(record, event) {
|
|
320
|
+
record.sequence += 1;
|
|
321
|
+
record.events.push({
|
|
322
|
+
...event,
|
|
323
|
+
activityId: record.ref.id,
|
|
324
|
+
sequence: record.sequence
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
closedError() {
|
|
328
|
+
return new IntelligenceError({ code: "intelligence-closed", detail: {} });
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
function createIntelligenceRuntime(provider, options = {}) {
|
|
332
|
+
return new IntelligenceRuntime(provider, options);
|
|
333
|
+
}
|
|
334
|
+
function bindIntelligencePort(port, runtime) {
|
|
335
|
+
let closed = false;
|
|
336
|
+
const listener = (event) => {
|
|
337
|
+
const message = event.data;
|
|
338
|
+
if (message.kind === "intelligence-submit") {
|
|
339
|
+
const accepted = runtime.accept(message.submission);
|
|
340
|
+
if (!accepted.ok) {
|
|
341
|
+
const failure = importFailure(accepted.error);
|
|
342
|
+
port.postMessage({
|
|
343
|
+
kind: "intelligence-rejected",
|
|
344
|
+
activityId: message.submission.id,
|
|
345
|
+
error: failure
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (message.kind === "intelligence-poll") {
|
|
351
|
+
port.postMessage({ kind: "intelligence-events", events: runtime.poll(message.maxEvents) });
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (message.kind === "intelligence-cancel") {
|
|
355
|
+
runtime.cancel(message.activityId);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (message.kind === "intelligence-close") void close(true);
|
|
359
|
+
};
|
|
360
|
+
const close = async (notifyRealm = false) => {
|
|
361
|
+
if (closed) return;
|
|
362
|
+
closed = true;
|
|
363
|
+
port.removeEventListener("message", listener);
|
|
364
|
+
await runtime.close();
|
|
365
|
+
if (notifyRealm) {
|
|
366
|
+
port.postMessage({ kind: "intelligence-closed" });
|
|
367
|
+
setTimeout(() => port.close(), 0);
|
|
368
|
+
} else {
|
|
369
|
+
port.close();
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
port.addEventListener("message", listener);
|
|
373
|
+
port.start?.();
|
|
374
|
+
return { close };
|
|
375
|
+
}
|
|
376
|
+
function importFailure(error) {
|
|
377
|
+
if (error.code === "intelligence-provider-failed") {
|
|
378
|
+
return {
|
|
379
|
+
code: error.code,
|
|
380
|
+
expected: error.expected,
|
|
381
|
+
hint: error.hint,
|
|
382
|
+
detail: {
|
|
383
|
+
providerId: error.detail.providerId,
|
|
384
|
+
cause: error.detail.cause instanceof Error ? error.detail.cause.message : String(error.detail.cause)
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
return {
|
|
389
|
+
code: error.code,
|
|
390
|
+
expected: error.expected,
|
|
391
|
+
hint: error.hint,
|
|
392
|
+
detail: error.detail
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
var portIdentity = 0;
|
|
396
|
+
function nextPortIdentity(prefix) {
|
|
397
|
+
const uuid = globalThis.crypto?.randomUUID?.();
|
|
398
|
+
if (uuid !== void 0) return `${prefix}-${uuid}`;
|
|
399
|
+
portIdentity += 1;
|
|
400
|
+
return `${prefix}-${portIdentity}`;
|
|
401
|
+
}
|
|
402
|
+
var IntelligencePortClient = class {
|
|
403
|
+
constructor(providerId, port, options = {}) {
|
|
404
|
+
this.providerId = providerId;
|
|
405
|
+
this.port = port;
|
|
406
|
+
this.limits = resolveIntelligenceLimits(options.limits);
|
|
407
|
+
this.createActivityId = options.createActivityId ?? (() => activityId(nextPortIdentity("activity")));
|
|
408
|
+
this.createSessionId = options.createSessionId ?? (() => nextPortIdentity("session"));
|
|
409
|
+
this.listener = (event) => {
|
|
410
|
+
const message = event.data;
|
|
411
|
+
if (message.kind === "intelligence-events") {
|
|
412
|
+
this.pollPending = false;
|
|
413
|
+
for (const item of message.events) {
|
|
414
|
+
this.received.push(item);
|
|
415
|
+
if (item.type !== "text-delta") this.active.delete(item.activityId);
|
|
416
|
+
}
|
|
417
|
+
} else if (message.kind === "intelligence-rejected") {
|
|
418
|
+
this.active.delete(message.activityId);
|
|
419
|
+
this.rejected.set(message.activityId, message);
|
|
420
|
+
} else if (message.kind === "intelligence-closed") {
|
|
421
|
+
this.port.removeEventListener("message", this.listener);
|
|
422
|
+
this.received.length = 0;
|
|
423
|
+
this.active.clear();
|
|
424
|
+
this.rejected.clear();
|
|
425
|
+
this.port.close();
|
|
426
|
+
this.closeResolve?.();
|
|
427
|
+
this.closeResolve = void 0;
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
port.addEventListener("message", this.listener);
|
|
431
|
+
port.start?.();
|
|
432
|
+
}
|
|
433
|
+
providerId;
|
|
434
|
+
port;
|
|
435
|
+
limits;
|
|
436
|
+
received = [];
|
|
437
|
+
active = /* @__PURE__ */ new Set();
|
|
438
|
+
rejected = /* @__PURE__ */ new Map();
|
|
439
|
+
createActivityId;
|
|
440
|
+
createSessionId;
|
|
441
|
+
listener;
|
|
442
|
+
closed = false;
|
|
443
|
+
pollPending = false;
|
|
444
|
+
closeTask;
|
|
445
|
+
closeResolve;
|
|
446
|
+
submit(request) {
|
|
447
|
+
if (this.closed) return err(new IntelligenceError({ code: "intelligence-closed", detail: {} }));
|
|
448
|
+
if (request.input.length === 0 || request.input.length > this.limits.maxInputChars) {
|
|
449
|
+
return err(
|
|
450
|
+
new IntelligenceError({
|
|
451
|
+
code: "intelligence-invalid-request",
|
|
452
|
+
detail: {
|
|
453
|
+
field: "input",
|
|
454
|
+
reason: request.input.length === 0 ? "input is empty" : `input exceeds ${this.limits.maxInputChars} characters`
|
|
455
|
+
}
|
|
456
|
+
})
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
if (request.session !== void 0 && request.session.providerId !== this.providerId) {
|
|
460
|
+
return err(
|
|
461
|
+
new IntelligenceError({
|
|
462
|
+
code: "intelligence-session-provider-mismatch",
|
|
463
|
+
detail: {
|
|
464
|
+
expectedProviderId: this.providerId,
|
|
465
|
+
receivedProviderId: request.session.providerId
|
|
466
|
+
}
|
|
467
|
+
})
|
|
468
|
+
);
|
|
469
|
+
}
|
|
470
|
+
if (this.active.size >= this.limits.maxConcurrentActivities) {
|
|
471
|
+
return err(
|
|
472
|
+
new IntelligenceError({
|
|
473
|
+
code: "intelligence-capacity-exceeded",
|
|
474
|
+
detail: { limit: this.limits.maxConcurrentActivities }
|
|
475
|
+
})
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
const ref = {
|
|
479
|
+
id: this.createActivityId(),
|
|
480
|
+
session: request.session ?? { providerId: this.providerId, id: this.createSessionId() }
|
|
481
|
+
};
|
|
482
|
+
this.active.add(ref.id);
|
|
483
|
+
this.port.postMessage({
|
|
484
|
+
kind: "intelligence-submit",
|
|
485
|
+
submission: { ...ref, input: request.input }
|
|
486
|
+
});
|
|
487
|
+
return ok(ref);
|
|
488
|
+
}
|
|
489
|
+
poll(maxEvents = this.limits.maxPollEvents) {
|
|
490
|
+
if (this.closed || !Number.isInteger(maxEvents) || maxEvents <= 0) return [];
|
|
491
|
+
const count = Math.min(maxEvents, this.limits.maxPollEvents);
|
|
492
|
+
const events = this.received.splice(0, count);
|
|
493
|
+
for (const [id, rejection] of this.rejected) {
|
|
494
|
+
if (events.length >= count) break;
|
|
495
|
+
this.rejected.delete(id);
|
|
496
|
+
events.push({
|
|
497
|
+
type: "failed",
|
|
498
|
+
activityId: id,
|
|
499
|
+
sequence: 1,
|
|
500
|
+
error: rejection.error
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
if (!this.pollPending) {
|
|
504
|
+
this.pollPending = true;
|
|
505
|
+
this.port.postMessage({ kind: "intelligence-poll", maxEvents: count });
|
|
506
|
+
}
|
|
507
|
+
return events;
|
|
508
|
+
}
|
|
509
|
+
cancel(id) {
|
|
510
|
+
if (this.closed) return err(new IntelligenceError({ code: "intelligence-closed", detail: {} }));
|
|
511
|
+
if (!this.active.has(id)) {
|
|
512
|
+
return err(
|
|
513
|
+
new IntelligenceError({
|
|
514
|
+
code: "intelligence-activity-not-found",
|
|
515
|
+
detail: { activityId: id }
|
|
516
|
+
})
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
this.port.postMessage({ kind: "intelligence-cancel", activityId: id });
|
|
520
|
+
return ok(void 0);
|
|
521
|
+
}
|
|
522
|
+
close() {
|
|
523
|
+
if (this.closeTask !== void 0) return this.closeTask;
|
|
524
|
+
this.closed = true;
|
|
525
|
+
this.closeTask = new Promise((resolve) => {
|
|
526
|
+
this.closeResolve = resolve;
|
|
527
|
+
this.port.postMessage({ kind: "intelligence-close" });
|
|
528
|
+
});
|
|
529
|
+
return this.closeTask;
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
function createIntelligencePortClient(providerId, port, options = {}) {
|
|
533
|
+
return new IntelligencePortClient(providerId, port, options);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export { DEFAULT_INTELLIGENCE_LIMITS, INTELLIGENCE_ERROR_HINTS, INTELLIGENCE_EXPECTED, IntelligenceError, IntelligencePortClient, IntelligenceRuntime, activityId, bindIntelligencePort, createIntelligencePortClient, createIntelligenceRuntime, intelligenceFailure, intelligencePlugin, providerError };
|
|
537
|
+
//# sourceMappingURL=index.mjs.map
|
|
538
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/plugin.ts","../src/types.ts","../src/runtime.ts","../src/transport.ts"],"names":["err","ok"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ActivityId } from './types';\n\nexport interface IntelligenceErrorDetailMap {\n readonly 'intelligence-invalid-request': { readonly field: 'input'; readonly reason: string };\n readonly 'intelligence-session-provider-mismatch': {\n readonly expectedProviderId: string;\n readonly receivedProviderId: string;\n };\n readonly 'intelligence-capacity-exceeded': { readonly limit: number };\n readonly 'intelligence-activity-not-found': { readonly activityId: ActivityId };\n readonly 'intelligence-provider-failed': { readonly providerId: string; readonly cause: unknown };\n readonly 'intelligence-output-overflow': {\n readonly activityId: ActivityId;\n readonly bound: 'output-chars' | 'pending-events';\n readonly limit: number;\n };\n readonly 'intelligence-closed': Readonly<Record<string, never>>;\n}\n\nexport type IntelligenceErrorCode = keyof IntelligenceErrorDetailMap;\n\nexport type IntelligenceErrorDetailFor<C extends IntelligenceErrorCode> =\n IntelligenceErrorDetailMap[C];\n\nconst policy = {\n 'intelligence-invalid-request': {\n expected: 'activity input must be a non-empty string within the configured bound',\n hint: 'validate and bound player input before submitting the activity',\n },\n 'intelligence-session-provider-mismatch': {\n expected: 'a session reference must be resumed by the provider that created it',\n hint: 'discard the incompatible session or select its original provider',\n },\n 'intelligence-capacity-exceeded': {\n expected: 'active intelligence work must remain within the configured concurrency bound',\n hint: 'wait for an activity to finish or raise the explicit provider capacity',\n },\n 'intelligence-activity-not-found': {\n expected: 'the activity must still be running when cancellation is requested',\n hint: 'ignore an already observed terminal activity or retain the correct ActivityId',\n },\n 'intelligence-provider-failed': {\n expected: 'the selected provider must complete or report a structured failure',\n hint: 'inspect detail.cause and provider configuration, then retry or select another provider',\n },\n 'intelligence-output-overflow': {\n expected: 'incremental and final output must remain within configured queue and text bounds',\n hint: 'consume events every frame or raise the explicit bound for this application',\n },\n 'intelligence-closed': {\n expected: 'the intelligence service must be open for submit and cancel operations',\n hint: 'create a new service after its Cordis realm or owner has been disposed',\n },\n} satisfies Record<IntelligenceErrorCode, { readonly expected: string; readonly hint: string }>;\n\nexport const INTELLIGENCE_EXPECTED = Object.fromEntries(\n Object.entries(policy).map(([code, value]) => [code, value.expected]),\n) as Readonly<Record<IntelligenceErrorCode, string>>;\n\nexport const INTELLIGENCE_ERROR_HINTS = Object.fromEntries(\n Object.entries(policy).map(([code, value]) => [code, value.hint]),\n) as Readonly<Record<IntelligenceErrorCode, string>>;\n\nclass IntelligenceErrorClass extends Error {\n readonly code: IntelligenceErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: IntelligenceErrorDetailFor<IntelligenceErrorCode>;\n\n constructor(args: {\n code: IntelligenceErrorCode;\n detail: IntelligenceErrorDetailFor<IntelligenceErrorCode>;\n }) {\n const selected = policy[args.code];\n super(\n `[IntelligenceError ${args.code}] expected: ${selected.expected}; hint: ${selected.hint}`,\n );\n this.name = 'IntelligenceError';\n this.code = args.code;\n this.expected = selected.expected;\n this.hint = selected.hint;\n this.detail = args.detail;\n }\n}\n\ntype IntelligenceErrorVariant<C extends IntelligenceErrorCode> = IntelligenceErrorClass & {\n readonly code: C;\n readonly detail: IntelligenceErrorDetailFor<C>;\n};\n\nexport type IntelligenceError = {\n [C in IntelligenceErrorCode]: IntelligenceErrorVariant<C>;\n}[IntelligenceErrorCode];\n\ninterface IntelligenceErrorConstructor {\n new <C extends IntelligenceErrorCode>(args: {\n code: C;\n detail: IntelligenceErrorDetailFor<C>;\n }): IntelligenceErrorVariant<C>;\n readonly prototype: IntelligenceErrorClass;\n}\n\nexport const IntelligenceError: IntelligenceErrorConstructor =\n IntelligenceErrorClass as unknown as IntelligenceErrorConstructor;\n\ntype PodDetailMap = Omit<IntelligenceErrorDetailMap, 'intelligence-provider-failed'> & {\n readonly 'intelligence-provider-failed': { readonly providerId: string; readonly cause: string };\n};\n\nexport type IntelligenceFailure = {\n [C in IntelligenceErrorCode]: {\n readonly code: C;\n readonly expected: string;\n readonly hint: string;\n readonly detail: PodDetailMap[C];\n };\n}[IntelligenceErrorCode];\n\nexport function intelligenceFailure(error: IntelligenceError): IntelligenceFailure {\n if (error.code === 'intelligence-provider-failed') {\n return {\n code: error.code,\n expected: error.expected,\n hint: error.hint,\n detail: {\n providerId: error.detail.providerId,\n cause:\n error.detail.cause instanceof Error\n ? error.detail.cause.message\n : String(error.detail.cause),\n },\n };\n }\n return {\n code: error.code,\n expected: error.expected,\n hint: error.hint,\n detail: error.detail,\n } as IntelligenceFailure;\n}\n\nexport function providerError(providerId: string, cause: unknown): IntelligenceError {\n return new IntelligenceError({\n code: 'intelligence-provider-failed',\n detail: { providerId, cause },\n });\n}\n","import type { Plugin } from '@forgeax/engine-plugin';\nimport type { IntelligenceService } from './types';\n\ndeclare module '@forgeax/engine-plugin' {\n interface EngineContextServices {\n intelligence?: IntelligenceService;\n }\n}\n\n/** Install one optional intelligence service and bind its lifetime to this Cordis Fiber. */\nexport function intelligencePlugin(service: IntelligenceService): Plugin {\n return {\n name: 'intelligence',\n provide: 'intelligence',\n apply(ctx) {\n ctx.provide('intelligence', service);\n ctx.effect(() => () => service.close(), 'intelligence/service');\n },\n };\n}\n","import type { Result } from '@forgeax/engine-types';\nimport type { IntelligenceError, IntelligenceFailure } from './errors';\n\ndeclare const activityIdBrand: unique symbol;\n\n/** Opaque identity of one bounded asynchronous operation. */\nexport type ActivityId = string & { readonly [activityIdBrand]: true };\n\n/** Provider-scoped durable conversation identity. */\nexport interface SessionRef {\n readonly providerId: string;\n readonly id: string;\n}\n\nexport interface ActivityRef {\n readonly id: ActivityId;\n readonly session: SessionRef;\n}\n\nexport interface ActivityRequest {\n readonly input: string;\n readonly session?: SessionRef;\n}\n\n/** Fully identified request used by realm transports and provider dispatch. */\nexport interface ActivitySubmission extends ActivityRef {\n readonly input: string;\n}\n\nexport type ActivityEvent =\n | {\n readonly type: 'text-delta';\n readonly activityId: ActivityId;\n readonly sequence: number;\n readonly text: string;\n }\n | {\n readonly type: 'completed';\n readonly activityId: ActivityId;\n readonly sequence: number;\n readonly session: SessionRef;\n readonly output: string;\n }\n | {\n readonly type: 'failed';\n readonly activityId: ActivityId;\n readonly sequence: number;\n readonly error: IntelligenceFailure;\n }\n | {\n readonly type: 'cancelled';\n readonly activityId: ActivityId;\n readonly sequence: number;\n };\n\nexport interface ActivitySink {\n text(text: string): void;\n complete(output: string): void;\n fail(cause: unknown): void;\n cancelled(): void;\n}\n\n/** Provider implementation boundary. It never receives World or Renderer authority. */\nexport interface IntelligenceProvider {\n readonly id: string;\n start(submission: ActivitySubmission, sink: ActivitySink): Result<void, IntelligenceError>;\n cancel(activityId: ActivityId): Result<void, IntelligenceError>;\n close(): Promise<void>;\n}\n\n/** Frame-safe consumer surface. No method waits for provider work. */\nexport interface IntelligenceService {\n readonly providerId: string;\n submit(request: ActivityRequest): Result<ActivityRef, IntelligenceError>;\n poll(maxEvents?: number): readonly ActivityEvent[];\n cancel(activityId: ActivityId): Result<void, IntelligenceError>;\n close(): Promise<void>;\n}\n\nexport interface IntelligenceLimits {\n readonly maxInputChars: number;\n readonly maxOutputChars: number;\n readonly maxConcurrentActivities: number;\n readonly maxPendingEventsPerActivity: number;\n readonly maxPollEvents: number;\n}\n\nexport const DEFAULT_INTELLIGENCE_LIMITS: IntelligenceLimits = {\n maxInputChars: 16_384,\n maxOutputChars: 65_536,\n maxConcurrentActivities: 8,\n maxPendingEventsPerActivity: 256,\n maxPollEvents: 64,\n};\n\nexport interface IntelligenceRuntimeOptions {\n readonly limits?: Partial<IntelligenceLimits>;\n readonly createActivityId?: () => ActivityId;\n readonly createSessionId?: () => string;\n}\n\nexport function activityId(value: string): ActivityId {\n return value as ActivityId;\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { IntelligenceError, intelligenceFailure, providerError } from './errors';\nimport {\n type ActivityEvent,\n type ActivityId,\n type ActivityRef,\n type ActivityRequest,\n type ActivitySink,\n type ActivitySubmission,\n activityId,\n DEFAULT_INTELLIGENCE_LIMITS,\n type IntelligenceLimits,\n type IntelligenceProvider,\n type IntelligenceRuntimeOptions,\n type IntelligenceService,\n} from './types';\n\ninterface ActivityRecord {\n readonly ref: ActivityRef;\n readonly events: ActivityEvent[];\n sequence: number;\n outputChars: number;\n terminal: boolean;\n}\n\nlet fallbackIdentity = 0;\n\nfunction nextIdentity(prefix: string): string {\n const uuid = globalThis.crypto?.randomUUID?.();\n if (uuid !== undefined) return `${prefix}-${uuid}`;\n fallbackIdentity += 1;\n return `${prefix}-${Date.now().toString(36)}-${fallbackIdentity.toString(36)}`;\n}\n\nexport function resolveIntelligenceLimits(\n overrides: Partial<IntelligenceLimits> | undefined,\n): IntelligenceLimits {\n const limits = { ...DEFAULT_INTELLIGENCE_LIMITS, ...overrides };\n for (const [name, value] of Object.entries(limits)) {\n if (!Number.isInteger(value) || value <= 0) {\n throw new RangeError(`${name} must be a positive integer`);\n }\n }\n if (limits.maxPendingEventsPerActivity < 2) {\n throw new RangeError(\n 'maxPendingEventsPerActivity must reserve at least one data and terminal event',\n );\n }\n return limits;\n}\n\nexport class IntelligenceRuntime implements IntelligenceService {\n readonly providerId: string;\n readonly limits: IntelligenceLimits;\n private readonly records = new Map<ActivityId, ActivityRecord>();\n private readonly createActivityId: () => ActivityId;\n private readonly createSessionId: () => string;\n private closed = false;\n private closeTask: Promise<void> | undefined;\n\n constructor(\n private readonly provider: IntelligenceProvider,\n options: IntelligenceRuntimeOptions = {},\n ) {\n this.providerId = provider.id;\n this.limits = resolveIntelligenceLimits(options.limits);\n this.createActivityId =\n options.createActivityId ?? (() => activityId(nextIdentity('activity')));\n this.createSessionId = options.createSessionId ?? (() => nextIdentity('session'));\n }\n\n submit(request: ActivityRequest): Result<ActivityRef, IntelligenceError> {\n const validated = this.validateRequest(request);\n if (!validated.ok) return validated;\n const ref: ActivityRef = {\n id: this.createActivityId(),\n session: request.session ?? { providerId: this.providerId, id: this.createSessionId() },\n };\n const accepted = this.accept({ ...ref, input: request.input });\n return accepted.ok ? ok(ref) : accepted;\n }\n\n /** Accept an already identified request from a realm transport. */\n accept(submission: ActivitySubmission): Result<void, IntelligenceError> {\n const validated = this.validateRequest({\n input: submission.input,\n session: submission.session,\n });\n if (!validated.ok) return validated;\n if (this.records.has(submission.id)) {\n return err(\n providerError(this.providerId, `duplicate activity identity: ${String(submission.id)}`),\n );\n }\n if (this.runningCount >= this.limits.maxConcurrentActivities) {\n return err(\n new IntelligenceError({\n code: 'intelligence-capacity-exceeded',\n detail: { limit: this.limits.maxConcurrentActivities },\n }),\n );\n }\n const record: ActivityRecord = {\n ref: { id: submission.id, session: submission.session },\n events: [],\n sequence: 0,\n outputChars: 0,\n terminal: false,\n };\n this.records.set(submission.id, record);\n let started: Result<void, IntelligenceError>;\n try {\n started = this.provider.start(submission, this.createSink(record));\n } catch (cause) {\n this.records.delete(submission.id);\n return err(providerError(this.providerId, cause));\n }\n if (!started.ok) {\n this.records.delete(submission.id);\n return started;\n }\n return ok(undefined);\n }\n\n poll(maxEvents = this.limits.maxPollEvents): readonly ActivityEvent[] {\n if (!Number.isInteger(maxEvents) || maxEvents <= 0) return [];\n const bounded = Math.min(maxEvents, this.limits.maxPollEvents);\n const events: ActivityEvent[] = [];\n for (const [id, record] of this.records) {\n while (record.events.length > 0 && events.length < bounded) {\n const event = record.events.shift();\n if (event !== undefined) events.push(event);\n }\n if (record.terminal && record.events.length === 0) this.records.delete(id);\n if (events.length === bounded) break;\n }\n return events;\n }\n\n cancel(activity: ActivityId): Result<void, IntelligenceError> {\n if (this.closed) return err(this.closedError());\n const record = this.records.get(activity);\n if (record === undefined || record.terminal) {\n return err(\n new IntelligenceError({\n code: 'intelligence-activity-not-found',\n detail: { activityId: activity },\n }),\n );\n }\n try {\n return this.provider.cancel(activity);\n } catch (cause) {\n return err(providerError(this.providerId, cause));\n }\n }\n\n close(): Promise<void> {\n this.closeTask ??= this.performClose();\n return this.closeTask;\n }\n\n private async performClose(): Promise<void> {\n this.closed = true;\n await this.provider.close();\n this.records.clear();\n }\n\n private get runningCount(): number {\n let count = 0;\n for (const record of this.records.values()) if (!record.terminal) count += 1;\n return count;\n }\n\n private validateRequest(request: ActivityRequest): Result<void, IntelligenceError> {\n if (this.closed) return err(this.closedError());\n if (request.input.length === 0 || request.input.length > this.limits.maxInputChars) {\n return err(\n new IntelligenceError({\n code: 'intelligence-invalid-request',\n detail: {\n field: 'input',\n reason:\n request.input.length === 0\n ? 'input is empty'\n : `input exceeds ${this.limits.maxInputChars} characters`,\n },\n }),\n );\n }\n if (request.session !== undefined && request.session.providerId !== this.providerId) {\n return err(\n new IntelligenceError({\n code: 'intelligence-session-provider-mismatch',\n detail: {\n expectedProviderId: this.providerId,\n receivedProviderId: request.session.providerId,\n },\n }),\n );\n }\n return ok(undefined);\n }\n\n private createSink(record: ActivityRecord): ActivitySink {\n return {\n text: (text) => {\n if (record.terminal || text.length === 0) return;\n if (record.outputChars + text.length > this.limits.maxOutputChars) {\n this.overflow(record, 'output-chars', this.limits.maxOutputChars);\n return;\n }\n if (record.events.length >= this.limits.maxPendingEventsPerActivity - 1) {\n this.overflow(record, 'pending-events', this.limits.maxPendingEventsPerActivity);\n return;\n }\n record.outputChars += text.length;\n this.push(record, { type: 'text-delta', text });\n },\n complete: (output) => {\n if (record.terminal) return;\n if (output.length > this.limits.maxOutputChars) {\n this.overflow(record, 'output-chars', this.limits.maxOutputChars);\n return;\n }\n record.terminal = true;\n this.push(record, { type: 'completed', session: record.ref.session, output });\n },\n fail: (cause) => {\n if (record.terminal) return;\n record.terminal = true;\n const error = providerError(this.providerId, cause);\n this.push(record, { type: 'failed', error: intelligenceFailure(error) });\n },\n cancelled: () => {\n if (record.terminal) return;\n record.terminal = true;\n this.push(record, { type: 'cancelled' });\n },\n };\n }\n\n private overflow(\n record: ActivityRecord,\n bound: 'output-chars' | 'pending-events',\n limit: number,\n ): void {\n if (record.terminal) return;\n record.terminal = true;\n const error = new IntelligenceError({\n code: 'intelligence-output-overflow',\n detail: { activityId: record.ref.id, bound, limit },\n });\n if (record.events.length >= this.limits.maxPendingEventsPerActivity) record.events.pop();\n this.push(record, { type: 'failed', error: intelligenceFailure(error) });\n try {\n this.provider.cancel(record.ref.id);\n } catch {\n // The overflow terminal already owns the activity outcome.\n }\n }\n\n private push(\n record: ActivityRecord,\n event:\n | { readonly type: 'text-delta'; readonly text: string }\n | {\n readonly type: 'completed';\n readonly session: ActivityRef['session'];\n readonly output: string;\n }\n | { readonly type: 'failed'; readonly error: ReturnType<typeof intelligenceFailure> }\n | { readonly type: 'cancelled' },\n ): void {\n record.sequence += 1;\n record.events.push({\n ...event,\n activityId: record.ref.id,\n sequence: record.sequence,\n } as ActivityEvent);\n }\n\n private closedError(): IntelligenceError {\n return new IntelligenceError({ code: 'intelligence-closed', detail: {} });\n }\n}\n\nexport function createIntelligenceRuntime(\n provider: IntelligenceProvider,\n options: IntelligenceRuntimeOptions = {},\n): IntelligenceRuntime {\n return new IntelligenceRuntime(provider, options);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { IntelligenceError } from './errors';\nimport { type IntelligenceRuntime, resolveIntelligenceLimits } from './runtime';\nimport {\n type ActivityEvent,\n type ActivityId,\n type ActivityRef,\n type ActivityRequest,\n type ActivitySubmission,\n activityId,\n type IntelligenceLimits,\n type IntelligenceRuntimeOptions,\n type IntelligenceService,\n} from './types';\n\nexport type IntelligenceHostCommand =\n | { readonly kind: 'intelligence-submit'; readonly submission: ActivitySubmission }\n | { readonly kind: 'intelligence-poll'; readonly maxEvents: number }\n | { readonly kind: 'intelligence-cancel'; readonly activityId: ActivityId }\n | { readonly kind: 'intelligence-close' };\n\nexport type IntelligenceRealmMessage =\n | { readonly kind: 'intelligence-events'; readonly events: readonly ActivityEvent[] }\n | { readonly kind: 'intelligence-closed' }\n | {\n readonly kind: 'intelligence-rejected';\n readonly activityId: ActivityId;\n readonly error: import('./errors').IntelligenceFailure;\n };\n\nexport interface IntelligenceMessagePort {\n postMessage(message: IntelligenceHostCommand | IntelligenceRealmMessage): void;\n addEventListener(\n type: 'message',\n listener: (event: MessageEvent<IntelligenceHostCommand | IntelligenceRealmMessage>) => void,\n ): void;\n removeEventListener(\n type: 'message',\n listener: (event: MessageEvent<IntelligenceHostCommand | IntelligenceRealmMessage>) => void,\n ): void;\n start?(): void;\n close(): void;\n}\n\nexport interface IntelligencePortBinding {\n close(): Promise<void>;\n}\n\n/** Bind a Host-owned runtime to the realm side of a MessageChannel. */\nexport function bindIntelligencePort(\n port: IntelligenceMessagePort,\n runtime: IntelligenceRuntime,\n): IntelligencePortBinding {\n let closed = false;\n const listener = (\n event: MessageEvent<IntelligenceHostCommand | IntelligenceRealmMessage>,\n ): void => {\n const message = event.data;\n if (message.kind === 'intelligence-submit') {\n const accepted = runtime.accept(message.submission);\n if (!accepted.ok) {\n const failure = importFailure(accepted.error);\n port.postMessage({\n kind: 'intelligence-rejected',\n activityId: message.submission.id,\n error: failure,\n });\n }\n return;\n }\n if (message.kind === 'intelligence-poll') {\n port.postMessage({ kind: 'intelligence-events', events: runtime.poll(message.maxEvents) });\n return;\n }\n if (message.kind === 'intelligence-cancel') {\n runtime.cancel(message.activityId);\n return;\n }\n if (message.kind === 'intelligence-close') void close(true);\n };\n const close = async (notifyRealm = false): Promise<void> => {\n if (closed) return;\n closed = true;\n port.removeEventListener('message', listener);\n await runtime.close();\n if (notifyRealm) {\n port.postMessage({ kind: 'intelligence-closed' });\n setTimeout(() => port.close(), 0);\n } else {\n port.close();\n }\n };\n port.addEventListener('message', listener);\n port.start?.();\n return { close };\n}\n\nfunction importFailure(error: import('./errors').IntelligenceError) {\n if (error.code === 'intelligence-provider-failed') {\n return {\n code: error.code,\n expected: error.expected,\n hint: error.hint,\n detail: {\n providerId: error.detail.providerId,\n cause:\n error.detail.cause instanceof Error\n ? error.detail.cause.message\n : String(error.detail.cause),\n },\n } as const;\n }\n return {\n code: error.code,\n expected: error.expected,\n hint: error.hint,\n detail: error.detail,\n } as import('./errors').IntelligenceFailure;\n}\n\nlet portIdentity = 0;\n\nfunction nextPortIdentity(prefix: string): string {\n const uuid = globalThis.crypto?.randomUUID?.();\n if (uuid !== undefined) return `${prefix}-${uuid}`;\n portIdentity += 1;\n return `${prefix}-${portIdentity}`;\n}\n\n/** Worker/main-realm client. Polling is request/response and never awaits a Host provider. */\nexport class IntelligencePortClient implements IntelligenceService {\n readonly limits: IntelligenceLimits;\n private readonly received: ActivityEvent[] = [];\n private readonly active = new Set<ActivityId>();\n private readonly rejected = new Map<\n ActivityId,\n IntelligenceRealmMessage & { kind: 'intelligence-rejected' }\n >();\n private readonly createActivityId: () => ActivityId;\n private readonly createSessionId: () => string;\n private readonly listener: (\n event: MessageEvent<IntelligenceHostCommand | IntelligenceRealmMessage>,\n ) => void;\n private closed = false;\n private pollPending = false;\n private closeTask: Promise<void> | undefined;\n private closeResolve: (() => void) | undefined;\n\n constructor(\n readonly providerId: string,\n private readonly port: IntelligenceMessagePort,\n options: IntelligenceRuntimeOptions = {},\n ) {\n this.limits = resolveIntelligenceLimits(options.limits);\n this.createActivityId =\n options.createActivityId ?? (() => activityId(nextPortIdentity('activity')));\n this.createSessionId = options.createSessionId ?? (() => nextPortIdentity('session'));\n this.listener = (event) => {\n const message = event.data;\n if (message.kind === 'intelligence-events') {\n this.pollPending = false;\n for (const item of message.events) {\n this.received.push(item);\n if (item.type !== 'text-delta') this.active.delete(item.activityId);\n }\n } else if (message.kind === 'intelligence-rejected') {\n this.active.delete(message.activityId);\n this.rejected.set(message.activityId, message);\n } else if (message.kind === 'intelligence-closed') {\n this.port.removeEventListener('message', this.listener);\n this.received.length = 0;\n this.active.clear();\n this.rejected.clear();\n this.port.close();\n this.closeResolve?.();\n this.closeResolve = undefined;\n }\n };\n port.addEventListener('message', this.listener);\n port.start?.();\n }\n\n submit(request: ActivityRequest): Result<ActivityRef, IntelligenceError> {\n if (this.closed) return err(new IntelligenceError({ code: 'intelligence-closed', detail: {} }));\n if (request.input.length === 0 || request.input.length > this.limits.maxInputChars) {\n return err(\n new IntelligenceError({\n code: 'intelligence-invalid-request',\n detail: {\n field: 'input',\n reason:\n request.input.length === 0\n ? 'input is empty'\n : `input exceeds ${this.limits.maxInputChars} characters`,\n },\n }),\n );\n }\n if (request.session !== undefined && request.session.providerId !== this.providerId) {\n return err(\n new IntelligenceError({\n code: 'intelligence-session-provider-mismatch',\n detail: {\n expectedProviderId: this.providerId,\n receivedProviderId: request.session.providerId,\n },\n }),\n );\n }\n if (this.active.size >= this.limits.maxConcurrentActivities) {\n return err(\n new IntelligenceError({\n code: 'intelligence-capacity-exceeded',\n detail: { limit: this.limits.maxConcurrentActivities },\n }),\n );\n }\n const ref: ActivityRef = {\n id: this.createActivityId(),\n session: request.session ?? { providerId: this.providerId, id: this.createSessionId() },\n };\n this.active.add(ref.id);\n this.port.postMessage({\n kind: 'intelligence-submit',\n submission: { ...ref, input: request.input },\n });\n return ok(ref);\n }\n\n poll(maxEvents = this.limits.maxPollEvents): readonly ActivityEvent[] {\n if (this.closed || !Number.isInteger(maxEvents) || maxEvents <= 0) return [];\n const count = Math.min(maxEvents, this.limits.maxPollEvents);\n const events = this.received.splice(0, count);\n for (const [id, rejection] of this.rejected) {\n if (events.length >= count) break;\n this.rejected.delete(id);\n events.push({\n type: 'failed',\n activityId: id,\n sequence: 1,\n error: rejection.error,\n });\n }\n if (!this.pollPending) {\n this.pollPending = true;\n this.port.postMessage({ kind: 'intelligence-poll', maxEvents: count });\n }\n return events;\n }\n\n cancel(id: ActivityId): Result<void, IntelligenceError> {\n if (this.closed) return err(new IntelligenceError({ code: 'intelligence-closed', detail: {} }));\n if (!this.active.has(id)) {\n return err(\n new IntelligenceError({\n code: 'intelligence-activity-not-found',\n detail: { activityId: id },\n }),\n );\n }\n this.port.postMessage({ kind: 'intelligence-cancel', activityId: id });\n return ok(undefined);\n }\n\n close(): Promise<void> {\n if (this.closeTask !== undefined) return this.closeTask;\n this.closed = true;\n this.closeTask = new Promise((resolve) => {\n this.closeResolve = resolve;\n this.port.postMessage({ kind: 'intelligence-close' });\n });\n return this.closeTask;\n }\n}\n\nexport function createIntelligencePortClient(\n providerId: string,\n port: IntelligenceMessagePort,\n options: IntelligenceRuntimeOptions = {},\n): IntelligencePortClient {\n return new IntelligencePortClient(providerId, port, options);\n}\n"]}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Plugin } from '@forgeax/engine-plugin';
|
|
2
|
+
import type { IntelligenceService } from './types';
|
|
3
|
+
declare module '@forgeax/engine-plugin' {
|
|
4
|
+
interface EngineContextServices {
|
|
5
|
+
intelligence?: IntelligenceService;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/** Install one optional intelligence service and bind its lifetime to this Cordis Fiber. */
|
|
9
|
+
export declare function intelligencePlugin(service: IntelligenceService): Plugin;
|
|
10
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,QAAQ,wBAAwB,CAAC;IACtC,UAAU,qBAAqB;QAC7B,YAAY,CAAC,EAAE,mBAAmB,CAAC;KACpC;CACF;AAED,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CASvE"}
|