@ifc-lite/ids-agent 0.0.0-stage → 0.2.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 +373 -0
- package/README.md +144 -2
- package/dist/bridges.d.ts +163 -0
- package/dist/bridges.d.ts.map +1 -0
- package/dist/bridges.js +6 -0
- package/dist/bridges.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/modes.d.ts +30 -0
- package/dist/modes.d.ts.map +1 -0
- package/dist/modes.js +34 -0
- package/dist/modes.js.map +1 -0
- package/dist/prompts/system-v1.d.ts +19 -0
- package/dist/prompts/system-v1.d.ts.map +1 -0
- package/dist/prompts/system-v1.js +43 -0
- package/dist/prompts/system-v1.js.map +1 -0
- package/dist/proposal/proposal.d.ts +72 -0
- package/dist/proposal/proposal.d.ts.map +1 -0
- package/dist/proposal/proposal.js +60 -0
- package/dist/proposal/proposal.js.map +1 -0
- package/dist/proposal/view-model.d.ts +66 -0
- package/dist/proposal/view-model.d.ts.map +1 -0
- package/dist/proposal/view-model.js +94 -0
- package/dist/proposal/view-model.js.map +1 -0
- package/dist/providers/anthropic.d.ts +45 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +107 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/openai.d.ts +60 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +92 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/runner/context.d.ts +21 -0
- package/dist/runner/context.d.ts.map +1 -0
- package/dist/runner/context.js +25 -0
- package/dist/runner/context.js.map +1 -0
- package/dist/runner/loop.d.ts +96 -0
- package/dist/runner/loop.d.ts.map +1 -0
- package/dist/runner/loop.js +194 -0
- package/dist/runner/loop.js.map +1 -0
- package/dist/runner/privacy.d.ts +71 -0
- package/dist/runner/privacy.d.ts.map +1 -0
- package/dist/runner/privacy.js +72 -0
- package/dist/runner/privacy.js.map +1 -0
- package/dist/runner/receipt.d.ts +48 -0
- package/dist/runner/receipt.d.ts.map +1 -0
- package/dist/runner/receipt.js +29 -0
- package/dist/runner/receipt.js.map +1 -0
- package/dist/sandbox/handles.d.ts +22 -0
- package/dist/sandbox/handles.d.ts.map +1 -0
- package/dist/sandbox/handles.js +67 -0
- package/dist/sandbox/handles.js.map +1 -0
- package/dist/sandbox/nodes.d.ts +11 -0
- package/dist/sandbox/nodes.d.ts.map +1 -0
- package/dist/sandbox/nodes.js +38 -0
- package/dist/sandbox/nodes.js.map +1 -0
- package/dist/sandbox/sandbox.d.ts +110 -0
- package/dist/sandbox/sandbox.d.ts.map +1 -0
- package/dist/sandbox/sandbox.js +125 -0
- package/dist/sandbox/sandbox.js.map +1 -0
- package/dist/testing/doubles.d.ts +20 -0
- package/dist/testing/doubles.d.ts.map +1 -0
- package/dist/testing/doubles.js +105 -0
- package/dist/testing/doubles.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/transports.d.ts +48 -0
- package/dist/testing/transports.d.ts.map +1 -0
- package/dist/testing/transports.js +70 -0
- package/dist/testing/transports.js.map +1 -0
- package/dist/tools/act-tools.d.ts +13 -0
- package/dist/tools/act-tools.d.ts.map +1 -0
- package/dist/tools/act-tools.js +115 -0
- package/dist/tools/act-tools.js.map +1 -0
- package/dist/tools/ask-user.d.ts +3 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +62 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/bsdd-tools.d.ts +8 -0
- package/dist/tools/bsdd-tools.d.ts.map +1 -0
- package/dist/tools/bsdd-tools.js +64 -0
- package/dist/tools/bsdd-tools.js.map +1 -0
- package/dist/tools/context.d.ts +27 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +21 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/ids-read.d.ts +26 -0
- package/dist/tools/ids-read.d.ts.map +1 -0
- package/dist/tools/ids-read.js +74 -0
- package/dist/tools/ids-read.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +22 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/model-tools.d.ts +3 -0
- package/dist/tools/model-tools.d.ts.map +1 -0
- package/dist/tools/model-tools.js +100 -0
- package/dist/tools/model-tools.js.map +1 -0
- package/dist/tools/op-schema.d.ts +23 -0
- package/dist/tools/op-schema.d.ts.map +1 -0
- package/dist/tools/op-schema.js +57 -0
- package/dist/tools/op-schema.js.map +1 -0
- package/dist/tools/rank.d.ts +3 -0
- package/dist/tools/rank.d.ts.map +1 -0
- package/dist/tools/rank.js +66 -0
- package/dist/tools/rank.js.map +1 -0
- package/dist/tools/registry.d.ts +59 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +61 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/schema-tools.d.ts +3 -0
- package/dist/tools/schema-tools.d.ts.map +1 -0
- package/dist/tools/schema-tools.js +127 -0
- package/dist/tools/schema-tools.js.map +1 -0
- package/dist/worker-bridge.d.ts +47 -0
- package/dist/worker-bridge.d.ts.map +1 -0
- package/dist/worker-bridge.js +97 -0
- package/dist/worker-bridge.js.map +1 -0
- package/package.json +79 -3
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Lexical ranking for lookup tools. Deterministic and dependency-free: exact
|
|
6
|
+
* match, then prefix, then every query token contained, then a bounded edit
|
|
7
|
+
* distance for typos. The `Ifc` prefix and case are ignored.
|
|
8
|
+
*/
|
|
9
|
+
function fold(value) {
|
|
10
|
+
return value.toLowerCase().replace(/^ifc/, '').replace(/[\s_-]+/g, '');
|
|
11
|
+
}
|
|
12
|
+
/** Split `FireRating`, `fire rating`, `fire_rating` into lower-case tokens. */
|
|
13
|
+
function tokens(value) {
|
|
14
|
+
return value
|
|
15
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.split(/[^a-z0-9]+/)
|
|
18
|
+
.filter((t) => t.length > 0 && t !== 'ifc');
|
|
19
|
+
}
|
|
20
|
+
function distance(a, b, cap) {
|
|
21
|
+
if (Math.abs(a.length - b.length) > cap)
|
|
22
|
+
return cap + 1;
|
|
23
|
+
let prev = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
24
|
+
for (let i = 1; i <= a.length; i++) {
|
|
25
|
+
const row = [i];
|
|
26
|
+
let best = i;
|
|
27
|
+
for (let j = 1; j <= b.length; j++) {
|
|
28
|
+
row[j] = Math.min(prev[j] + 1, row[j - 1] + 1, prev[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
|
|
29
|
+
best = Math.min(best, row[j]);
|
|
30
|
+
}
|
|
31
|
+
if (best > cap)
|
|
32
|
+
return cap + 1;
|
|
33
|
+
prev = row;
|
|
34
|
+
}
|
|
35
|
+
return prev[b.length];
|
|
36
|
+
}
|
|
37
|
+
function score(query, queryTokens, name) {
|
|
38
|
+
const folded = fold(name);
|
|
39
|
+
if (folded === query)
|
|
40
|
+
return 100;
|
|
41
|
+
if (folded.startsWith(query))
|
|
42
|
+
return 80 - Math.min(20, folded.length - query.length);
|
|
43
|
+
const nameTokens = tokens(name);
|
|
44
|
+
const all = queryTokens.length > 0 && queryTokens.every((q) => nameTokens.some((t) => t.startsWith(q)) || folded.includes(q));
|
|
45
|
+
if (all)
|
|
46
|
+
return 60 - Math.min(20, folded.length - query.length);
|
|
47
|
+
if (folded.includes(query))
|
|
48
|
+
return 50;
|
|
49
|
+
const cap = Math.max(1, Math.floor(query.length / 4));
|
|
50
|
+
const d = distance(query, folded, cap);
|
|
51
|
+
return d <= cap ? 40 - d * 5 : 0;
|
|
52
|
+
}
|
|
53
|
+
/** The best `limit` names for `query`, best first; ties keep the input order. */
|
|
54
|
+
export function rankNames(query, names, limit) {
|
|
55
|
+
const q = fold(query);
|
|
56
|
+
if (!q)
|
|
57
|
+
return [];
|
|
58
|
+
const qt = tokens(query);
|
|
59
|
+
return names
|
|
60
|
+
.map((name, index) => ({ name, index, s: score(q, qt, name) }))
|
|
61
|
+
.filter((r) => r.s > 0)
|
|
62
|
+
.sort((a, b) => b.s - a.s || a.index - b.index)
|
|
63
|
+
.slice(0, limit)
|
|
64
|
+
.map((r) => r.name);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../src/tools/rank.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;GAIG;AAEH,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,+EAA+E;AAC/E,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,GAAW;IACjD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9F,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,IAAI,GAAG,GAAG;YAAE,OAAO,GAAG,GAAG,CAAC,CAAC;QAC/B,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,WAA8B,EAAE,IAAY;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IACjC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9H,IAAI,GAAG;QAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,KAAwB,EAAE,KAAa;IAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SAC9C,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tool registry: every tool is one JSON Schema plus a handler.
|
|
3
|
+
*
|
|
4
|
+
* The workspace has no zod. The schema handed to the provider and the check
|
|
5
|
+
* run before the handler are the same object, interpreted by the op
|
|
6
|
+
* contract's own validator (`validateJson` from `@ifc-lite/ids-authoring`),
|
|
7
|
+
* so a tool definition cannot drift from what it accepts. `ids_apply_ops`
|
|
8
|
+
* embeds the op vocabulary's schema (`getOpJsonSchema`) rather than a copy.
|
|
9
|
+
*
|
|
10
|
+
* A call never throws into the loop: an unknown tool, unparseable JSON, a
|
|
11
|
+
* schema violation and a handler failure all come back as an error result
|
|
12
|
+
* the model reads and can correct.
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolSpec } from '@ifc-lite/ai';
|
|
15
|
+
import { type JsonSchema } from '@ifc-lite/ids-authoring';
|
|
16
|
+
/** Tool names are `[a-z_]` (providers reject dots), grouped by prefix: `schema_`, `ids_`, `model_`, `bsdd_`. */
|
|
17
|
+
export type ToolGroup = 'schema' | 'ids' | 'model' | 'bsdd';
|
|
18
|
+
export interface ToolOutcome {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
/** Serialised as the tool result the model reads. */
|
|
21
|
+
data: unknown;
|
|
22
|
+
/** One line for progress events and receipts; never document content. */
|
|
23
|
+
summary: string;
|
|
24
|
+
/**
|
|
25
|
+
* Stable failure keys (gate code + offending value, diagnostic code + node)
|
|
26
|
+
* used by no-progress detection. Empty or absent on success.
|
|
27
|
+
*/
|
|
28
|
+
signature?: readonly string[];
|
|
29
|
+
}
|
|
30
|
+
export interface AgentTool<Ctx> {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly group: ToolGroup;
|
|
33
|
+
readonly description: string;
|
|
34
|
+
readonly inputSchema: JsonSchema;
|
|
35
|
+
/** Shared `$defs` the input schema refers to. */
|
|
36
|
+
readonly defs?: Readonly<Record<string, JsonSchema>>;
|
|
37
|
+
/** Ask the provider for strict, schema-constrained inputs (small schemas only). */
|
|
38
|
+
readonly strict: boolean;
|
|
39
|
+
/** True when the tool cannot change the sandbox document. */
|
|
40
|
+
readonly readOnly: boolean;
|
|
41
|
+
run(input: unknown, ctx: Ctx): Promise<ToolOutcome> | ToolOutcome;
|
|
42
|
+
}
|
|
43
|
+
export interface ToolDefinition<Input, Ctx> extends Omit<AgentTool<Ctx>, 'run'> {
|
|
44
|
+
/** Called only with input that passed `inputSchema`. */
|
|
45
|
+
run(input: Input, ctx: Ctx): Promise<ToolOutcome> | ToolOutcome;
|
|
46
|
+
}
|
|
47
|
+
/** Declare a tool whose handler receives schema-validated input of type `Input`. */
|
|
48
|
+
export declare function defineTool<Input, Ctx>(definition: ToolDefinition<Input, Ctx>): AgentTool<Ctx>;
|
|
49
|
+
export interface ToolRegistry<Ctx> {
|
|
50
|
+
readonly tools: readonly AgentTool<Ctx>[];
|
|
51
|
+
/** Provider-neutral definitions, in registration order (stable for prompt caching). */
|
|
52
|
+
specs(): ToolSpec[];
|
|
53
|
+
has(name: string): boolean;
|
|
54
|
+
call(name: string, input: unknown, rawInput: string | undefined, ctx: Ctx): Promise<ToolOutcome>;
|
|
55
|
+
}
|
|
56
|
+
export declare function failure(summary: string, data: Record<string, unknown>, signature?: readonly string[]): ToolOutcome;
|
|
57
|
+
export declare function success(summary: string, data: Record<string, unknown>): ToolOutcome;
|
|
58
|
+
export declare function createToolRegistry<Ctx>(tools: readonly AgentTool<Ctx>[]): ToolRegistry<Ctx>;
|
|
59
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAgB,KAAK,UAAU,EAAoB,MAAM,yBAAyB,CAAC;AAE1F,gHAAgH;AAChH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,qDAAqD;IACrD,IAAI,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS,CAAC,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,iDAAiD;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACrD,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;CACnE;AAED,MAAM,WAAW,cAAc,CAAC,KAAK,EAAE,GAAG,CAAE,SAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;IAC7E,wDAAwD;IACxD,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;CACjE;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAI7F;AAED,MAAM,WAAW,YAAY,CAAC,GAAG;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,uFAAuF;IACvF,KAAK,IAAI,QAAQ,EAAE,CAAC;IACpB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAClG;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAElH;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAEnF;AAYD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAgC3F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { validateJson } from '@ifc-lite/ids-authoring';
|
|
5
|
+
/** Declare a tool whose handler receives schema-validated input of type `Input`. */
|
|
6
|
+
export function defineTool(definition) {
|
|
7
|
+
// The registry validates against `inputSchema` before `run`, so the
|
|
8
|
+
// narrowing below is the schema's own guarantee.
|
|
9
|
+
return { ...definition, run: (input, ctx) => definition.run(input, ctx) };
|
|
10
|
+
}
|
|
11
|
+
export function failure(summary, data, signature) {
|
|
12
|
+
return { ok: false, summary, data: { ok: false, ...data }, ...(signature ? { signature } : {}) };
|
|
13
|
+
}
|
|
14
|
+
export function success(summary, data) {
|
|
15
|
+
return { ok: true, summary, data: { ok: true, ...data } };
|
|
16
|
+
}
|
|
17
|
+
function toSpec(tool) {
|
|
18
|
+
const schema = { ...tool.inputSchema };
|
|
19
|
+
if (tool.defs)
|
|
20
|
+
schema.$defs = tool.defs;
|
|
21
|
+
return { name: tool.name, description: tool.description, inputSchema: schema, strict: tool.strict };
|
|
22
|
+
}
|
|
23
|
+
function formatErrors(errors) {
|
|
24
|
+
return errors.slice(0, 20).map((e) => `${e.path}: ${e.message}`);
|
|
25
|
+
}
|
|
26
|
+
export function createToolRegistry(tools) {
|
|
27
|
+
const byName = new Map();
|
|
28
|
+
for (const tool of tools) {
|
|
29
|
+
if (!/^[a-z][a-z0-9_]{0,63}$/.test(tool.name))
|
|
30
|
+
throw new Error(`Invalid tool name "${tool.name}"`);
|
|
31
|
+
if (byName.has(tool.name))
|
|
32
|
+
throw new Error(`Duplicate tool "${tool.name}"`);
|
|
33
|
+
byName.set(tool.name, tool);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
tools,
|
|
37
|
+
specs: () => tools.map(toSpec),
|
|
38
|
+
has: (name) => byName.has(name),
|
|
39
|
+
async call(name, input, rawInput, ctx) {
|
|
40
|
+
const tool = byName.get(name);
|
|
41
|
+
if (!tool) {
|
|
42
|
+
return failure(`unknown tool ${name}`, { error: `There is no tool named "${name}".`, tools: [...byName.keys()] }, [`TOOL:${name}`]);
|
|
43
|
+
}
|
|
44
|
+
if (rawInput !== undefined) {
|
|
45
|
+
return failure(`${name}: invalid JSON`, { error: 'INVALID_JSON', input: rawInput.slice(0, 2000) }, [`JSON:${name}`]);
|
|
46
|
+
}
|
|
47
|
+
const errors = validateJson(input, tool.inputSchema, { ...tool.defs });
|
|
48
|
+
if (errors.length > 0) {
|
|
49
|
+
return failure(`${name}: invalid input`, { error: 'The input does not match the tool schema.', errors: formatErrors(errors) }, errors.slice(0, 5).map((e) => `INPUT:${name}:${e.path}`));
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
return await tool.run(input, ctx);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
56
|
+
return failure(`${name}: failed`, { error: message }, [`FAIL:${name}`]);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-tools.d.ts","sourceRoot":"","sources":["../../src/tools/schema-tools.ts"],"names":[],"mappings":"AAeA,OAAO,EAAkE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAoIjH,eAAO,MAAM,YAAY,EAAE,SAAS,YAAY,EAAmE,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { clampLimit, objectSchema, versionSchema } from './context.js';
|
|
5
|
+
import { defineTool, failure, success } from './registry.js';
|
|
6
|
+
import { rankNames } from './rank.js';
|
|
7
|
+
function tables(ctx, version) {
|
|
8
|
+
return ctx.gate.tables[version];
|
|
9
|
+
}
|
|
10
|
+
function chain(t, name) {
|
|
11
|
+
const out = [];
|
|
12
|
+
const seen = new Set();
|
|
13
|
+
let cursor = t.entities.get(name.toUpperCase());
|
|
14
|
+
while (cursor && !seen.has(cursor.name)) {
|
|
15
|
+
out.push(cursor);
|
|
16
|
+
seen.add(cursor.name);
|
|
17
|
+
cursor = cursor.parent ? t.entities.get(cursor.parent.toUpperCase()) : undefined;
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
function applicablePsets(t, entity) {
|
|
22
|
+
const names = new Set(chain(t, entity).map((e) => e.name.toUpperCase()));
|
|
23
|
+
return [...t.psets.values()].filter((p) => p.applicableEntities.some((a) => names.has(a.toUpperCase())));
|
|
24
|
+
}
|
|
25
|
+
function unknownEntity(t, name, version) {
|
|
26
|
+
return failure(`unknown entity ${name}`, {
|
|
27
|
+
error: `"${name}" is not an entity in ${version}.`,
|
|
28
|
+
candidates: rankNames(name, t.entityNames, 5),
|
|
29
|
+
}, [`SCHEMA-ENT:${name}`]);
|
|
30
|
+
}
|
|
31
|
+
const searchEntities = defineTool({
|
|
32
|
+
name: 'schema_search_entities', group: 'schema', strict: true, readOnly: true,
|
|
33
|
+
description: 'Search IFC entity (class) names of one schema version by a word or partial name. Returns ranked names with parent, abstractness and predefined types.',
|
|
34
|
+
inputSchema: objectSchema({
|
|
35
|
+
query: { type: 'string', minLength: 1 },
|
|
36
|
+
version: versionSchema,
|
|
37
|
+
includeAbstract: { type: 'boolean' },
|
|
38
|
+
limit: { type: 'integer', minimum: 1, description: 'At most 25.' },
|
|
39
|
+
}, ['query', 'version']),
|
|
40
|
+
run(input, ctx) {
|
|
41
|
+
const t = tables(ctx, input.version);
|
|
42
|
+
const names = input.includeAbstract ? t.entityNames : t.entityNames.filter((n) => !t.entities.get(n.toUpperCase())?.abstract);
|
|
43
|
+
const hits = rankNames(input.query, names, clampLimit(input.limit, 10, 25)).map((name) => {
|
|
44
|
+
const e = t.entities.get(name.toUpperCase());
|
|
45
|
+
return { name, parent: e?.parent, abstract: e?.abstract ?? false, predefinedTypes: e?.predefinedTypes.slice(0, 15) ?? [] };
|
|
46
|
+
});
|
|
47
|
+
return success(`${hits.length} entities for "${input.query}"`, { version: input.version, results: hits });
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
const entityCard = defineTool({
|
|
51
|
+
name: 'schema_entity', group: 'schema', strict: true, readOnly: true,
|
|
52
|
+
description: 'The card of one IFC entity: inheritance chain, abstractness, predefined types, attributes (inherited included), direct subtypes, type entity and applicable property sets.',
|
|
53
|
+
inputSchema: objectSchema({ name: { type: 'string', minLength: 1 }, version: versionSchema }, ['name', 'version']),
|
|
54
|
+
run(input, ctx) {
|
|
55
|
+
const t = tables(ctx, input.version);
|
|
56
|
+
const e = t.entities.get(input.name.toUpperCase());
|
|
57
|
+
if (!e)
|
|
58
|
+
return unknownEntity(t, input.name, input.version);
|
|
59
|
+
const subtypes = [...t.entities.values()].filter((s) => s.parent?.toUpperCase() === e.name.toUpperCase()).map((s) => s.name);
|
|
60
|
+
return success(`entity ${e.name}`, {
|
|
61
|
+
version: input.version, name: e.name, abstract: e.abstract,
|
|
62
|
+
inheritance: chain(t, e.name).map((c) => c.name),
|
|
63
|
+
predefinedTypes: e.predefinedTypes, attributes: e.attributes,
|
|
64
|
+
subtypes: subtypes.slice(0, 40), typeEntity: e.typeEntity,
|
|
65
|
+
propertySets: applicablePsets(t, e.name).map((p) => p.name).slice(0, 60),
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const psetsFor = defineTool({
|
|
70
|
+
name: 'schema_psets_for', group: 'schema', strict: true, readOnly: true,
|
|
71
|
+
description: 'Standard property and quantity sets applicable to an entity (through its inheritance), with their property names. Optionally filtered by a word matched against set and property names.',
|
|
72
|
+
inputSchema: objectSchema({ entity: { type: 'string', minLength: 1 }, version: versionSchema, query: { type: 'string' } }, ['entity', 'version']),
|
|
73
|
+
run(input, ctx) {
|
|
74
|
+
const t = tables(ctx, input.version);
|
|
75
|
+
if (!t.entities.has(input.entity.toUpperCase()))
|
|
76
|
+
return unknownEntity(t, input.entity, input.version);
|
|
77
|
+
const q = input.query?.trim().toLowerCase();
|
|
78
|
+
const sets = applicablePsets(t, input.entity)
|
|
79
|
+
.filter((p) => !q || p.name.toLowerCase().includes(q) || p.properties.some((pr) => pr.name.toLowerCase().includes(q)))
|
|
80
|
+
.slice(0, 40)
|
|
81
|
+
.map((p) => ({ name: p.name, properties: p.properties.map((pr) => pr.name).slice(0, 25) }));
|
|
82
|
+
return success(`${sets.length} sets for ${input.entity}`, {
|
|
83
|
+
version: input.version, entity: input.entity, propertySets: sets,
|
|
84
|
+
...(t.hasQuantitySets ? {} : { note: 'Quantity sets (Qto_) are not tabulated for this version and are not listed.' }),
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
const psetCard = defineTool({
|
|
89
|
+
name: 'schema_pset', group: 'schema', strict: true, readOnly: true,
|
|
90
|
+
description: 'The properties of one standard property set: name, kind, data type and enumeration values, plus the entities it applies to.',
|
|
91
|
+
inputSchema: objectSchema({ name: { type: 'string', minLength: 1 }, version: versionSchema }, ['name', 'version']),
|
|
92
|
+
run(input, ctx) {
|
|
93
|
+
const t = tables(ctx, input.version);
|
|
94
|
+
const p = t.psets.get(input.name);
|
|
95
|
+
if (!p) {
|
|
96
|
+
return failure(`unknown set ${input.name}`, {
|
|
97
|
+
error: `"${input.name}" is not a standard property set in ${input.version}.`,
|
|
98
|
+
candidates: rankNames(input.name, t.psetNames, 5),
|
|
99
|
+
}, [`SCHEMA-PSET:${input.name}`]);
|
|
100
|
+
}
|
|
101
|
+
return success(`set ${p.name}`, {
|
|
102
|
+
version: input.version, name: p.name, applicableEntities: p.applicableEntities.slice(0, 30),
|
|
103
|
+
properties: p.properties.map((pr) => ({
|
|
104
|
+
name: pr.name, kind: pr.kind, ...(pr.dataType ? { dataType: pr.dataType } : {}),
|
|
105
|
+
...(pr.enumeration ? { enumeration: pr.enumeration.slice(0, 40) } : {}),
|
|
106
|
+
})),
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
const findProperty = defineTool({
|
|
111
|
+
name: 'schema_find_property', group: 'schema', strict: true, readOnly: true,
|
|
112
|
+
description: 'Find the standard property sets that define a property, by full or partial property name. With an entity, only sets applicable to it are returned.',
|
|
113
|
+
inputSchema: objectSchema({ name: { type: 'string', minLength: 1 }, version: versionSchema, entity: { type: 'string' } }, ['name', 'version']),
|
|
114
|
+
run(input, ctx) {
|
|
115
|
+
const t = tables(ctx, input.version);
|
|
116
|
+
const allowed = input.entity ? new Set(applicablePsets(t, input.entity).map((p) => p.name)) : null;
|
|
117
|
+
const names = rankNames(input.name, [...t.psetsByProperty.keys()], 10);
|
|
118
|
+
const results = names.map((property) => {
|
|
119
|
+
const sets = (t.psetsByProperty.get(property) ?? []).filter((s) => !allowed || allowed.has(s));
|
|
120
|
+
const dataType = sets.map((s) => t.psets.get(s)?.properties.find((pr) => pr.name === property)?.dataType).find(Boolean);
|
|
121
|
+
return { property, propertySets: sets.slice(0, 15), ...(dataType ? { dataType } : {}) };
|
|
122
|
+
}).filter((r) => r.propertySets.length > 0);
|
|
123
|
+
return success(`${results.length} properties for "${input.name}"`, { version: input.version, results });
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
export const SCHEMA_TOOLS = [searchEntities, entityCard, psetsFor, psetCard, findProperty];
|
|
127
|
+
//# sourceMappingURL=schema-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../../src/tools/schema-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ModelBridge` over a message port (IDS-078). The model data lives in the
|
|
3
|
+
* model-loop worker (`04-model-loop.md` §7); the agent runs on the main
|
|
4
|
+
* thread or in Node. `createWorkerModelBridge(port)` is the agent side,
|
|
5
|
+
* `serveModelBridge(port, impl)` the worker side. Requests carry an id;
|
|
6
|
+
* a cancelled request posts `cancel` and resolves as an abort error, and a
|
|
7
|
+
* late answer to it is dropped.
|
|
8
|
+
*
|
|
9
|
+
* Only the `ModelBridge` methods cross the port, with structured-clone data.
|
|
10
|
+
*/
|
|
11
|
+
import type { ModelBridge } from './bridges.js';
|
|
12
|
+
type Method = 'stats' | 'count' | 'distinctValues' | 'infer' | 'coverage';
|
|
13
|
+
export type BridgeRequest = {
|
|
14
|
+
type: 'call';
|
|
15
|
+
id: number;
|
|
16
|
+
method: Method;
|
|
17
|
+
arg: unknown;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'cancel';
|
|
20
|
+
id: number;
|
|
21
|
+
};
|
|
22
|
+
export type BridgeResponse = {
|
|
23
|
+
type: 'result';
|
|
24
|
+
id: number;
|
|
25
|
+
value: unknown;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'error';
|
|
28
|
+
id: number;
|
|
29
|
+
message: string;
|
|
30
|
+
};
|
|
31
|
+
/** The subset of `MessagePort` / `Worker` the bridge needs. */
|
|
32
|
+
export interface BridgePort {
|
|
33
|
+
postMessage(message: unknown): void;
|
|
34
|
+
addEventListener(type: 'message', listener: (event: {
|
|
35
|
+
data: unknown;
|
|
36
|
+
}) => void): void;
|
|
37
|
+
removeEventListener(type: 'message', listener: (event: {
|
|
38
|
+
data: unknown;
|
|
39
|
+
}) => void): void;
|
|
40
|
+
}
|
|
41
|
+
export declare function createWorkerModelBridge(port: BridgePort): ModelBridge & {
|
|
42
|
+
dispose(): void;
|
|
43
|
+
};
|
|
44
|
+
/** Worker side: answer bridge requests from `impl`. Returns a function that stops serving. */
|
|
45
|
+
export declare function serveModelBridge(port: BridgePort, impl: ModelBridge): () => void;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=worker-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-bridge.d.ts","sourceRoot":"","sources":["../src/worker-bridge.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,KAAK,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,gBAAgB,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1E,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACxH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7H,+DAA+D;AAC/D,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACtF,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC1F;AAYD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG;IAAE,OAAO,IAAI,IAAI,CAAA;CAAE,CAwC3F;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CA8BhF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
function isResponse(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null && 'type' in value && 'id' in value
|
|
6
|
+
&& (value.type === 'result' || value.type === 'error');
|
|
7
|
+
}
|
|
8
|
+
function isRequest(value) {
|
|
9
|
+
return typeof value === 'object' && value !== null && 'type' in value && 'id' in value
|
|
10
|
+
&& (value.type === 'call' || value.type === 'cancel');
|
|
11
|
+
}
|
|
12
|
+
export function createWorkerModelBridge(port) {
|
|
13
|
+
let next = 0;
|
|
14
|
+
const pending = new Map();
|
|
15
|
+
const listener = (event) => {
|
|
16
|
+
if (!isResponse(event.data))
|
|
17
|
+
return;
|
|
18
|
+
const entry = pending.get(event.data.id);
|
|
19
|
+
if (!entry)
|
|
20
|
+
return; // a late answer to a cancelled request
|
|
21
|
+
pending.delete(event.data.id);
|
|
22
|
+
if (event.data.type === 'result')
|
|
23
|
+
entry.resolve(event.data.value);
|
|
24
|
+
else
|
|
25
|
+
entry.reject(new Error(event.data.message));
|
|
26
|
+
};
|
|
27
|
+
port.addEventListener('message', listener);
|
|
28
|
+
const call = (method, arg, signal) => new Promise((resolve, reject) => {
|
|
29
|
+
if (signal.aborted) {
|
|
30
|
+
reject(new Error('cancelled'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const id = ++next;
|
|
34
|
+
const onAbort = () => {
|
|
35
|
+
pending.delete(id);
|
|
36
|
+
port.postMessage({ type: 'cancel', id });
|
|
37
|
+
reject(new Error('cancelled'));
|
|
38
|
+
};
|
|
39
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
40
|
+
// The worker answers with the value of `method`, whose type is `T`.
|
|
41
|
+
pending.set(id, {
|
|
42
|
+
resolve: (v) => { signal.removeEventListener('abort', onAbort); resolve(v); },
|
|
43
|
+
reject: (e) => { signal.removeEventListener('abort', onAbort); reject(e); },
|
|
44
|
+
});
|
|
45
|
+
port.postMessage({ type: 'call', id, method, arg });
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
stats: (signal) => call('stats', null, signal),
|
|
49
|
+
count: (query, signal) => call('count', query, signal),
|
|
50
|
+
distinctValues: (query, signal) => call('distinctValues', query, signal),
|
|
51
|
+
infer: (query, signal) => call('infer', query, signal),
|
|
52
|
+
coverage: (query, signal) => call('coverage', query, signal),
|
|
53
|
+
dispose() {
|
|
54
|
+
port.removeEventListener('message', listener);
|
|
55
|
+
for (const entry of pending.values())
|
|
56
|
+
entry.reject(new Error('bridge disposed'));
|
|
57
|
+
pending.clear();
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Worker side: answer bridge requests from `impl`. Returns a function that stops serving. */
|
|
62
|
+
export function serveModelBridge(port, impl) {
|
|
63
|
+
const running = new Map();
|
|
64
|
+
const listener = (event) => {
|
|
65
|
+
const request = event.data;
|
|
66
|
+
if (!isRequest(request))
|
|
67
|
+
return;
|
|
68
|
+
if (request.type === 'cancel') {
|
|
69
|
+
running.get(request.id)?.abort();
|
|
70
|
+
running.delete(request.id);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
running.set(request.id, controller);
|
|
75
|
+
const s = controller.signal;
|
|
76
|
+
// Each method receives the argument the agent side sent for it.
|
|
77
|
+
const work = request.method === 'stats' ? impl.stats(s)
|
|
78
|
+
: request.method === 'count' ? impl.count(request.arg, s)
|
|
79
|
+
: request.method === 'distinctValues' ? impl.distinctValues(request.arg, s)
|
|
80
|
+
: request.method === 'infer' ? impl.infer(request.arg, s)
|
|
81
|
+
: impl.coverage(request.arg, s);
|
|
82
|
+
work.then((value) => { if (running.delete(request.id))
|
|
83
|
+
port.postMessage({ type: 'result', id: request.id, value }); }, (error) => {
|
|
84
|
+
if (running.delete(request.id)) {
|
|
85
|
+
port.postMessage({ type: 'error', id: request.id, message: error instanceof Error ? error.message : String(error) });
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
port.addEventListener('message', listener);
|
|
90
|
+
return () => {
|
|
91
|
+
port.removeEventListener('message', listener);
|
|
92
|
+
for (const c of running.values())
|
|
93
|
+
c.abort();
|
|
94
|
+
running.clear();
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=worker-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-bridge.js","sourceRoot":"","sources":["../src/worker-bridge.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,82 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/ids-agent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Headless IDS authoring agent: a tool-calling loop over the IDS Studio op vocabulary, grounded by the gate, producing reviewable proposals",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./anthropic": {
|
|
16
|
+
"types": "./dist/providers/anthropic.d.ts",
|
|
17
|
+
"import": "./dist/providers/anthropic.js",
|
|
18
|
+
"default": "./dist/providers/anthropic.js"
|
|
19
|
+
},
|
|
20
|
+
"./openai": {
|
|
21
|
+
"types": "./dist/providers/openai.d.ts",
|
|
22
|
+
"import": "./dist/providers/openai.js",
|
|
23
|
+
"default": "./dist/providers/openai.js"
|
|
24
|
+
},
|
|
25
|
+
"./testing": {
|
|
26
|
+
"types": "./dist/testing/index.d.ts",
|
|
27
|
+
"import": "./dist/testing/index.js",
|
|
28
|
+
"default": "./dist/testing/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@ifc-lite/ai": "^0.2.0",
|
|
33
|
+
"@ifc-lite/data": "6.2.0",
|
|
34
|
+
"@ifc-lite/ids": "3.3.1",
|
|
35
|
+
"@ifc-lite/ids-authoring": "0.2.1"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"@anthropic-ai/sdk": ">=0.128.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependenciesMeta": {
|
|
41
|
+
"@anthropic-ai/sdk": {
|
|
42
|
+
"optional": true
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@anthropic-ai/sdk": "^0.132.1",
|
|
47
|
+
"@types/node": "^26.6.5",
|
|
48
|
+
"typescript": "^6.0.3",
|
|
49
|
+
"vitest": "^5.0.3"
|
|
50
|
+
},
|
|
51
|
+
"license": "MPL-2.0",
|
|
52
|
+
"author": "Louis True",
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "https://github.com/LTplus-AG/ifc-lite.git",
|
|
56
|
+
"directory": "packages/ids-agent"
|
|
57
|
+
},
|
|
58
|
+
"homepage": "https://ifclite.dev/docs/",
|
|
59
|
+
"bugs": "https://github.com/LTplus-AG/ifc-lite/issues",
|
|
60
|
+
"keywords": [
|
|
61
|
+
"ifc",
|
|
62
|
+
"bim",
|
|
63
|
+
"ids",
|
|
64
|
+
"buildingsmart",
|
|
65
|
+
"ai",
|
|
66
|
+
"agent",
|
|
67
|
+
"tool-use"
|
|
68
|
+
],
|
|
69
|
+
"publishConfig": {
|
|
70
|
+
"access": "public"
|
|
71
|
+
},
|
|
72
|
+
"files": [
|
|
73
|
+
"dist",
|
|
74
|
+
"README.md"
|
|
75
|
+
],
|
|
76
|
+
"scripts": {
|
|
77
|
+
"build": "pnpm exec tsc",
|
|
78
|
+
"typecheck": "node ../../scripts/typecheck-tests.mjs",
|
|
79
|
+
"dev": "pnpm exec tsc --watch",
|
|
80
|
+
"test": "vitest run"
|
|
81
|
+
}
|
|
6
82
|
}
|