@dxos/assistant 0.8.4-main.e098934 → 0.8.4-main.e8ec1fe
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/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/extraction/index.mjs +118 -161
- package/dist/lib/browser/extraction/index.mjs.map +4 -4
- package/dist/lib/browser/index.mjs +977 -156
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/extraction/index.mjs +118 -161
- package/dist/lib/node-esm/extraction/index.mjs.map +4 -4
- package/dist/lib/node-esm/index.mjs +977 -156
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/conversation/context.d.ts +14 -7
- package/dist/types/src/conversation/context.d.ts.map +1 -1
- package/dist/types/src/conversation/conversation.d.ts +11 -12
- package/dist/types/src/conversation/conversation.d.ts.map +1 -1
- package/dist/types/src/diff.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +14 -18
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/execution-graph.d.ts +85 -0
- package/dist/types/src/execution-graph.d.ts.map +1 -0
- package/dist/types/src/execution-graph.test.d.ts +2 -0
- package/dist/types/src/execution-graph.test.d.ts.map +1 -0
- package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts.map +1 -1
- package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts +60 -52
- package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts.map +1 -1
- package/dist/types/src/extraction/extraction.d.ts +24 -13
- package/dist/types/src/extraction/extraction.d.ts.map +1 -1
- package/dist/types/src/extraction/quotes.d.ts +1 -1
- package/dist/types/src/extraction/quotes.d.ts.map +1 -1
- package/dist/types/src/functions/services.d.ts +18 -5
- package/dist/types/src/functions/services.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/session/GenericToolkit.d.ts +84 -0
- package/dist/types/src/session/GenericToolkit.d.ts.map +1 -0
- package/dist/types/src/session/artifact-diff.d.ts +2 -2
- package/dist/types/src/session/artifact-diff.d.ts.map +1 -1
- package/dist/types/src/session/error-handling.d.ts +2 -2
- package/dist/types/src/session/error-handling.d.ts.map +1 -1
- package/dist/types/src/session/format.d.ts +4 -174
- package/dist/types/src/session/format.d.ts.map +1 -1
- package/dist/types/src/session/index.d.ts +1 -0
- package/dist/types/src/session/index.d.ts.map +1 -1
- package/dist/types/src/session/observer.d.ts +3 -3
- package/dist/types/src/session/observer.d.ts.map +1 -1
- package/dist/types/src/session/session.d.ts +15 -11
- package/dist/types/src/session/session.d.ts.map +1 -1
- package/dist/types/src/session/toolkit.d.ts +7 -6
- package/dist/types/src/session/toolkit.d.ts.map +1 -1
- package/dist/types/src/session/version-pin.d.ts +3 -3
- package/dist/types/src/session/version-pin.d.ts.map +1 -1
- package/dist/types/src/types/artifact.d.ts +20 -0
- package/dist/types/src/types/artifact.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +28 -31
- package/src/conversation/context.ts +49 -17
- package/src/conversation/conversation.ts +28 -23
- package/src/diff.test.ts +3 -3
- package/src/diff.ts +5 -0
- package/src/execution-graph.test.ts +740 -0
- package/src/execution-graph.ts +509 -0
- package/src/extraction/extraction-llm-function/extraction-llm-function.test.ts +2 -2
- package/src/extraction/extraction-llm-function/extraction-llm-function.ts +46 -54
- package/src/extraction/extraction-ner-function/extraction-ner-function.test.ts +10 -9
- package/src/extraction/extraction-ner-function/extraction-ner-function.ts +38 -44
- package/src/extraction/extraction-ner-function/named-entity-recognition.test.ts +12 -6
- package/src/extraction/extraction.ts +7 -6
- package/src/extraction/quotes.ts +2 -2
- package/src/functions/services.ts +93 -50
- package/src/index.ts +2 -1
- package/src/session/GenericToolkit.ts +130 -0
- package/src/session/artifact-diff.ts +2 -2
- package/src/session/error-handling.ts +6 -4
- package/src/session/format.test.ts +5 -4
- package/src/session/format.ts +17 -12
- package/src/session/index.ts +2 -0
- package/src/session/observer.ts +4 -3
- package/src/session/session.conversations.json +1 -0
- package/src/session/session.test.ts +51 -210
- package/src/session/session.ts +40 -28
- package/src/session/toolkit.ts +19 -13
- package/src/session/version-pin.ts +4 -5
- package/src/templates/{format.tpl → instructions/format.tpl} +1 -0
- package/src/templates/{system.tpl → instructions/system.tpl} +10 -12
- package/src/templates/system.ts +2 -2
- package/src/{types.ts → types/artifact.ts} +22 -3
- package/src/types/index.ts +5 -0
- package/dist/lib/browser/chunk-3K5SRE5A.mjs +0 -404
- package/dist/lib/browser/chunk-3K5SRE5A.mjs.map +0 -7
- package/dist/lib/browser/chunk-UB26N5UF.mjs +0 -89
- package/dist/lib/browser/chunk-UB26N5UF.mjs.map +0 -7
- package/dist/lib/browser/named-entity-recognition-QPYHML66.mjs +0 -13
- package/dist/lib/node-esm/chunk-BCFXTNSK.mjs +0 -91
- package/dist/lib/node-esm/chunk-BCFXTNSK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-W7AIB6DP.mjs +0 -406
- package/dist/lib/node-esm/chunk-W7AIB6DP.mjs.map +0 -7
- package/dist/lib/node-esm/named-entity-recognition-2HDF46YX.mjs +0 -14
- package/dist/types/src/session/version-pin.test.d.ts +0 -2
- package/dist/types/src/session/version-pin.test.d.ts.map +0 -1
- package/dist/types/src/summarization/summarization.test.d.ts +0 -2
- package/dist/types/src/summarization/summarization.test.d.ts.map +0 -1
- package/dist/types/src/types.d.ts +0 -16
- package/dist/types/src/types.d.ts.map +0 -1
- package/src/session/__snapshots__/session.test.ts.snap +0 -32
- package/src/session/version-pin.test.ts +0 -7
- package/src/summarization/summarization.test.ts +0 -197
- /package/dist/lib/browser/{named-entity-recognition-QPYHML66.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/node-esm/{named-entity-recognition-2HDF46YX.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
- /package/src/extraction/extraction-llm-function/{instructions.tpl → transcription-instructions.tpl} +0 -0
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
// src/extraction/extraction-ner-function/named-entity-recognition.ts
|
|
2
|
-
import { pipeline } from "@xenova/transformers";
|
|
3
|
-
import { log } from "@dxos/log";
|
|
4
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/core/assistant/src/extraction/extraction-ner-function/named-entity-recognition.ts";
|
|
5
|
-
var _ner;
|
|
6
|
-
var getNer = () => {
|
|
7
|
-
if (!_ner) {
|
|
8
|
-
_ner = pipeline("ner", "Xenova/bert-base-NER").then((ner) => {
|
|
9
|
-
log.info("NER model is ready", void 0, {
|
|
10
|
-
F: __dxlog_file,
|
|
11
|
-
L: 24,
|
|
12
|
-
S: void 0,
|
|
13
|
-
C: (f, a) => f(...a)
|
|
14
|
-
});
|
|
15
|
-
return ner;
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
return _ner;
|
|
19
|
-
};
|
|
20
|
-
var extractFullEntities = async (text) => {
|
|
21
|
-
const ner = await getNer();
|
|
22
|
-
const entities = await ner(text);
|
|
23
|
-
const tokenGroups = createTokenGroups(entities);
|
|
24
|
-
const combinedEntities = tokenGroups.map(combineNerTokens);
|
|
25
|
-
return combinedEntities;
|
|
26
|
-
};
|
|
27
|
-
var createTokenGroups = (tokens) => {
|
|
28
|
-
const tokenGroups = [];
|
|
29
|
-
const canBeCombined = (prevToken, currentToken) => {
|
|
30
|
-
const [currentState, currentEntity] = currentToken.entity.split("-");
|
|
31
|
-
const [prevState, prevEntity] = prevToken.entity.split("-");
|
|
32
|
-
if (prevEntity !== currentEntity) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
if (prevState === "O") {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
if (currentState === "I") {
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
if ((prevState === "B" || prevState === "I") && currentState === "B") {
|
|
42
|
-
return currentToken.word.startsWith("#");
|
|
43
|
-
}
|
|
44
|
-
return false;
|
|
45
|
-
};
|
|
46
|
-
for (const token of tokens) {
|
|
47
|
-
if (tokenGroups.length === 0) {
|
|
48
|
-
tokenGroups.push([
|
|
49
|
-
token
|
|
50
|
-
]);
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
const lastTokenGroup = tokenGroups.at(-1);
|
|
54
|
-
if (canBeCombined(lastTokenGroup.at(-1), token)) {
|
|
55
|
-
lastTokenGroup.push(token);
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
tokenGroups.push([
|
|
59
|
-
token
|
|
60
|
-
]);
|
|
61
|
-
}
|
|
62
|
-
return tokenGroups;
|
|
63
|
-
};
|
|
64
|
-
var combineNerTokens = (group) => {
|
|
65
|
-
const combinedToken = {
|
|
66
|
-
entity: group.at(0).entity.split("-")[1],
|
|
67
|
-
score: group.reduce((acc, token) => acc + token.score, 0) / group.length,
|
|
68
|
-
index: group.at(0).index,
|
|
69
|
-
word: group.at(0).word,
|
|
70
|
-
start: group.at(0).start,
|
|
71
|
-
end: group.at(-1).end
|
|
72
|
-
};
|
|
73
|
-
for (const token of group.slice(1)) {
|
|
74
|
-
if (token.word.startsWith("#")) {
|
|
75
|
-
combinedToken.word += token.word.replace(/^#+/, "");
|
|
76
|
-
} else {
|
|
77
|
-
combinedToken.word += " " + token.word;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return combinedToken;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
export {
|
|
84
|
-
getNer,
|
|
85
|
-
extractFullEntities,
|
|
86
|
-
createTokenGroups,
|
|
87
|
-
combineNerTokens
|
|
88
|
-
};
|
|
89
|
-
//# sourceMappingURL=chunk-UB26N5UF.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/extraction/extraction-ner-function/named-entity-recognition.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n type TokenClassificationOutput,\n type TokenClassificationPipelineType,\n type TokenClassificationSingle,\n pipeline,\n} from '@xenova/transformers';\n\nimport { log } from '@dxos/log';\n\nlet _ner: Promise<TokenClassificationPipelineType>;\n\n/**\n * Named Entity Recognition pipeline.\n * Initializes the pipeline on first call.\n * @returns The singleton promise that resolves to a token classification pipeline.\n */\nexport const getNer = () => {\n if (!_ner) {\n _ner = pipeline('ner', 'Xenova/bert-base-NER').then((ner) => {\n log.info('NER model is ready');\n return ner;\n });\n }\n\n return _ner;\n};\n\n/**\n * Extracts entities from text using the named entity recognition pipeline and does simple grouping of tokens.\n */\nexport const extractFullEntities = async (text: string): Promise<TokenClassificationSingle[]> => {\n const ner = await getNer();\n const entities = (await ner(text)) as TokenClassificationOutput;\n const tokenGroups = createTokenGroups(entities);\n const combinedEntities = tokenGroups.map(combineNerTokens);\n return combinedEntities;\n};\n\nexport const createTokenGroups = (tokens: TokenClassificationSingle[]): TokenClassificationSingle[][] => {\n const tokenGroups: TokenClassificationSingle[][] = [];\n\n const canBeCombined = (prevToken: TokenClassificationSingle, currentToken: TokenClassificationSingle) => {\n const [currentState, currentEntity] = currentToken.entity.split('-'); // B, I, O\n const [prevState, prevEntity] = prevToken.entity.split('-'); // B, I, O\n if (prevEntity !== currentEntity) {\n return false;\n }\n if (prevState === 'O') {\n return false;\n }\n if (currentState === 'I') {\n return true;\n }\n if ((prevState === 'B' || prevState === 'I') && currentState === 'B') {\n return currentToken.word.startsWith('#');\n }\n return false;\n };\n\n for (const token of tokens) {\n if (tokenGroups.length === 0) {\n tokenGroups.push([token]);\n continue;\n }\n const lastTokenGroup = tokenGroups.at(-1)!;\n if (canBeCombined(lastTokenGroup.at(-1)!, token)) {\n lastTokenGroup.push(token);\n continue;\n }\n tokenGroups.push([token]);\n }\n\n return tokenGroups;\n};\n\nexport const combineNerTokens = (group: TokenClassificationSingle[]): TokenClassificationSingle => {\n const combinedToken: TokenClassificationSingle = {\n entity: group.at(0)!.entity.split('-')[1],\n score: group.reduce((acc, token) => acc + token.score, 0) / group.length,\n index: group.at(0)!.index,\n word: group.at(0)!.word,\n start: group.at(0)!.start,\n end: group.at(-1)!.end,\n };\n\n for (const token of group.slice(1)) {\n if (token.word.startsWith('#')) {\n combinedToken.word += token.word.replace(/^#+/, '');\n } else {\n combinedToken.word += ' ' + token.word;\n }\n }\n\n return combinedToken;\n};\n"],
|
|
5
|
-
"mappings": ";AAIA,SAIEA,gBACK;AAEP,SAASC,WAAW;;AAEpB,IAAIC;AAOG,IAAMC,SAAS,MAAA;AACpB,MAAI,CAACD,MAAM;AACTA,WAAOF,SAAS,OAAO,sBAAA,EAAwBI,KAAK,CAACC,QAAAA;AACnDJ,UAAIK,KAAK,sBAAA,QAAA;;;;;;AACT,aAAOD;IACT,CAAA;EACF;AAEA,SAAOH;AACT;AAKO,IAAMK,sBAAsB,OAAOC,SAAAA;AACxC,QAAMH,MAAM,MAAMF,OAAAA;AAClB,QAAMM,WAAY,MAAMJ,IAAIG,IAAAA;AAC5B,QAAME,cAAcC,kBAAkBF,QAAAA;AACtC,QAAMG,mBAAmBF,YAAYG,IAAIC,gBAAAA;AACzC,SAAOF;AACT;AAEO,IAAMD,oBAAoB,CAACI,WAAAA;AAChC,QAAML,cAA6C,CAAA;AAEnD,QAAMM,gBAAgB,CAACC,WAAsCC,iBAAAA;AAC3D,UAAM,CAACC,cAAcC,aAAAA,IAAiBF,aAAaG,OAAOC,MAAM,GAAA;AAChE,UAAM,CAACC,WAAWC,UAAAA,IAAcP,UAAUI,OAAOC,MAAM,GAAA;AACvD,QAAIE,eAAeJ,eAAe;AAChC,aAAO;IACT;AACA,QAAIG,cAAc,KAAK;AACrB,aAAO;IACT;AACA,QAAIJ,iBAAiB,KAAK;AACxB,aAAO;IACT;AACA,SAAKI,cAAc,OAAOA,cAAc,QAAQJ,iBAAiB,KAAK;AACpE,aAAOD,aAAaO,KAAKC,WAAW,GAAA;IACtC;AACA,WAAO;EACT;AAEA,aAAWC,SAASZ,QAAQ;AAC1B,QAAIL,YAAYkB,WAAW,GAAG;AAC5BlB,kBAAYmB,KAAK;QAACF;OAAM;AACxB;IACF;AACA,UAAMG,iBAAiBpB,YAAYqB,GAAG,EAAC;AACvC,QAAIf,cAAcc,eAAeC,GAAG,EAAC,GAAKJ,KAAAA,GAAQ;AAChDG,qBAAeD,KAAKF,KAAAA;AACpB;IACF;AACAjB,gBAAYmB,KAAK;MAACF;KAAM;EAC1B;AAEA,SAAOjB;AACT;AAEO,IAAMI,mBAAmB,CAACkB,UAAAA;AAC/B,QAAMC,gBAA2C;IAC/CZ,QAAQW,MAAMD,GAAG,CAAA,EAAIV,OAAOC,MAAM,GAAA,EAAK,CAAA;IACvCY,OAAOF,MAAMG,OAAO,CAACC,KAAKT,UAAUS,MAAMT,MAAMO,OAAO,CAAA,IAAKF,MAAMJ;IAClES,OAAOL,MAAMD,GAAG,CAAA,EAAIM;IACpBZ,MAAMO,MAAMD,GAAG,CAAA,EAAIN;IACnBa,OAAON,MAAMD,GAAG,CAAA,EAAIO;IACpBC,KAAKP,MAAMD,GAAG,EAAC,EAAIQ;EACrB;AAEA,aAAWZ,SAASK,MAAMQ,MAAM,CAAA,GAAI;AAClC,QAAIb,MAAMF,KAAKC,WAAW,GAAA,GAAM;AAC9BO,oBAAcR,QAAQE,MAAMF,KAAKgB,QAAQ,OAAO,EAAA;IAClD,OAAO;AACLR,oBAAcR,QAAQ,MAAME,MAAMF;IACpC;EACF;AAEA,SAAOQ;AACT;",
|
|
6
|
-
"names": ["pipeline", "log", "_ner", "getNer", "then", "ner", "info", "extractFullEntities", "text", "entities", "tokenGroups", "createTokenGroups", "combinedEntities", "map", "combineNerTokens", "tokens", "canBeCombined", "prevToken", "currentToken", "currentState", "currentEntity", "entity", "split", "prevState", "prevEntity", "word", "startsWith", "token", "length", "push", "lastTokenGroup", "at", "group", "combinedToken", "score", "reduce", "acc", "index", "start", "end", "slice", "replace"]
|
|
7
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
combineNerTokens,
|
|
3
|
-
createTokenGroups,
|
|
4
|
-
extractFullEntities,
|
|
5
|
-
getNer
|
|
6
|
-
} from "./chunk-UB26N5UF.mjs";
|
|
7
|
-
export {
|
|
8
|
-
combineNerTokens,
|
|
9
|
-
createTokenGroups,
|
|
10
|
-
extractFullEntities,
|
|
11
|
-
getNer
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=named-entity-recognition-QPYHML66.mjs.map
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// src/extraction/extraction-ner-function/named-entity-recognition.ts
|
|
4
|
-
import { pipeline } from "@xenova/transformers";
|
|
5
|
-
import { log } from "@dxos/log";
|
|
6
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/core/assistant/src/extraction/extraction-ner-function/named-entity-recognition.ts";
|
|
7
|
-
var _ner;
|
|
8
|
-
var getNer = () => {
|
|
9
|
-
if (!_ner) {
|
|
10
|
-
_ner = pipeline("ner", "Xenova/bert-base-NER").then((ner) => {
|
|
11
|
-
log.info("NER model is ready", void 0, {
|
|
12
|
-
F: __dxlog_file,
|
|
13
|
-
L: 24,
|
|
14
|
-
S: void 0,
|
|
15
|
-
C: (f, a) => f(...a)
|
|
16
|
-
});
|
|
17
|
-
return ner;
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
return _ner;
|
|
21
|
-
};
|
|
22
|
-
var extractFullEntities = async (text) => {
|
|
23
|
-
const ner = await getNer();
|
|
24
|
-
const entities = await ner(text);
|
|
25
|
-
const tokenGroups = createTokenGroups(entities);
|
|
26
|
-
const combinedEntities = tokenGroups.map(combineNerTokens);
|
|
27
|
-
return combinedEntities;
|
|
28
|
-
};
|
|
29
|
-
var createTokenGroups = (tokens) => {
|
|
30
|
-
const tokenGroups = [];
|
|
31
|
-
const canBeCombined = (prevToken, currentToken) => {
|
|
32
|
-
const [currentState, currentEntity] = currentToken.entity.split("-");
|
|
33
|
-
const [prevState, prevEntity] = prevToken.entity.split("-");
|
|
34
|
-
if (prevEntity !== currentEntity) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
if (prevState === "O") {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
if (currentState === "I") {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
if ((prevState === "B" || prevState === "I") && currentState === "B") {
|
|
44
|
-
return currentToken.word.startsWith("#");
|
|
45
|
-
}
|
|
46
|
-
return false;
|
|
47
|
-
};
|
|
48
|
-
for (const token of tokens) {
|
|
49
|
-
if (tokenGroups.length === 0) {
|
|
50
|
-
tokenGroups.push([
|
|
51
|
-
token
|
|
52
|
-
]);
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
const lastTokenGroup = tokenGroups.at(-1);
|
|
56
|
-
if (canBeCombined(lastTokenGroup.at(-1), token)) {
|
|
57
|
-
lastTokenGroup.push(token);
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
tokenGroups.push([
|
|
61
|
-
token
|
|
62
|
-
]);
|
|
63
|
-
}
|
|
64
|
-
return tokenGroups;
|
|
65
|
-
};
|
|
66
|
-
var combineNerTokens = (group) => {
|
|
67
|
-
const combinedToken = {
|
|
68
|
-
entity: group.at(0).entity.split("-")[1],
|
|
69
|
-
score: group.reduce((acc, token) => acc + token.score, 0) / group.length,
|
|
70
|
-
index: group.at(0).index,
|
|
71
|
-
word: group.at(0).word,
|
|
72
|
-
start: group.at(0).start,
|
|
73
|
-
end: group.at(-1).end
|
|
74
|
-
};
|
|
75
|
-
for (const token of group.slice(1)) {
|
|
76
|
-
if (token.word.startsWith("#")) {
|
|
77
|
-
combinedToken.word += token.word.replace(/^#+/, "");
|
|
78
|
-
} else {
|
|
79
|
-
combinedToken.word += " " + token.word;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return combinedToken;
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
export {
|
|
86
|
-
getNer,
|
|
87
|
-
extractFullEntities,
|
|
88
|
-
createTokenGroups,
|
|
89
|
-
combineNerTokens
|
|
90
|
-
};
|
|
91
|
-
//# sourceMappingURL=chunk-BCFXTNSK.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/extraction/extraction-ner-function/named-entity-recognition.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n type TokenClassificationOutput,\n type TokenClassificationPipelineType,\n type TokenClassificationSingle,\n pipeline,\n} from '@xenova/transformers';\n\nimport { log } from '@dxos/log';\n\nlet _ner: Promise<TokenClassificationPipelineType>;\n\n/**\n * Named Entity Recognition pipeline.\n * Initializes the pipeline on first call.\n * @returns The singleton promise that resolves to a token classification pipeline.\n */\nexport const getNer = () => {\n if (!_ner) {\n _ner = pipeline('ner', 'Xenova/bert-base-NER').then((ner) => {\n log.info('NER model is ready');\n return ner;\n });\n }\n\n return _ner;\n};\n\n/**\n * Extracts entities from text using the named entity recognition pipeline and does simple grouping of tokens.\n */\nexport const extractFullEntities = async (text: string): Promise<TokenClassificationSingle[]> => {\n const ner = await getNer();\n const entities = (await ner(text)) as TokenClassificationOutput;\n const tokenGroups = createTokenGroups(entities);\n const combinedEntities = tokenGroups.map(combineNerTokens);\n return combinedEntities;\n};\n\nexport const createTokenGroups = (tokens: TokenClassificationSingle[]): TokenClassificationSingle[][] => {\n const tokenGroups: TokenClassificationSingle[][] = [];\n\n const canBeCombined = (prevToken: TokenClassificationSingle, currentToken: TokenClassificationSingle) => {\n const [currentState, currentEntity] = currentToken.entity.split('-'); // B, I, O\n const [prevState, prevEntity] = prevToken.entity.split('-'); // B, I, O\n if (prevEntity !== currentEntity) {\n return false;\n }\n if (prevState === 'O') {\n return false;\n }\n if (currentState === 'I') {\n return true;\n }\n if ((prevState === 'B' || prevState === 'I') && currentState === 'B') {\n return currentToken.word.startsWith('#');\n }\n return false;\n };\n\n for (const token of tokens) {\n if (tokenGroups.length === 0) {\n tokenGroups.push([token]);\n continue;\n }\n const lastTokenGroup = tokenGroups.at(-1)!;\n if (canBeCombined(lastTokenGroup.at(-1)!, token)) {\n lastTokenGroup.push(token);\n continue;\n }\n tokenGroups.push([token]);\n }\n\n return tokenGroups;\n};\n\nexport const combineNerTokens = (group: TokenClassificationSingle[]): TokenClassificationSingle => {\n const combinedToken: TokenClassificationSingle = {\n entity: group.at(0)!.entity.split('-')[1],\n score: group.reduce((acc, token) => acc + token.score, 0) / group.length,\n index: group.at(0)!.index,\n word: group.at(0)!.word,\n start: group.at(0)!.start,\n end: group.at(-1)!.end,\n };\n\n for (const token of group.slice(1)) {\n if (token.word.startsWith('#')) {\n combinedToken.word += token.word.replace(/^#+/, '');\n } else {\n combinedToken.word += ' ' + token.word;\n }\n }\n\n return combinedToken;\n};\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAIEA,gBACK;AAEP,SAASC,WAAW;;AAEpB,IAAIC;AAOG,IAAMC,SAAS,MAAA;AACpB,MAAI,CAACD,MAAM;AACTA,WAAOF,SAAS,OAAO,sBAAA,EAAwBI,KAAK,CAACC,QAAAA;AACnDJ,UAAIK,KAAK,sBAAA,QAAA;;;;;;AACT,aAAOD;IACT,CAAA;EACF;AAEA,SAAOH;AACT;AAKO,IAAMK,sBAAsB,OAAOC,SAAAA;AACxC,QAAMH,MAAM,MAAMF,OAAAA;AAClB,QAAMM,WAAY,MAAMJ,IAAIG,IAAAA;AAC5B,QAAME,cAAcC,kBAAkBF,QAAAA;AACtC,QAAMG,mBAAmBF,YAAYG,IAAIC,gBAAAA;AACzC,SAAOF;AACT;AAEO,IAAMD,oBAAoB,CAACI,WAAAA;AAChC,QAAML,cAA6C,CAAA;AAEnD,QAAMM,gBAAgB,CAACC,WAAsCC,iBAAAA;AAC3D,UAAM,CAACC,cAAcC,aAAAA,IAAiBF,aAAaG,OAAOC,MAAM,GAAA;AAChE,UAAM,CAACC,WAAWC,UAAAA,IAAcP,UAAUI,OAAOC,MAAM,GAAA;AACvD,QAAIE,eAAeJ,eAAe;AAChC,aAAO;IACT;AACA,QAAIG,cAAc,KAAK;AACrB,aAAO;IACT;AACA,QAAIJ,iBAAiB,KAAK;AACxB,aAAO;IACT;AACA,SAAKI,cAAc,OAAOA,cAAc,QAAQJ,iBAAiB,KAAK;AACpE,aAAOD,aAAaO,KAAKC,WAAW,GAAA;IACtC;AACA,WAAO;EACT;AAEA,aAAWC,SAASZ,QAAQ;AAC1B,QAAIL,YAAYkB,WAAW,GAAG;AAC5BlB,kBAAYmB,KAAK;QAACF;OAAM;AACxB;IACF;AACA,UAAMG,iBAAiBpB,YAAYqB,GAAG,EAAC;AACvC,QAAIf,cAAcc,eAAeC,GAAG,EAAC,GAAKJ,KAAAA,GAAQ;AAChDG,qBAAeD,KAAKF,KAAAA;AACpB;IACF;AACAjB,gBAAYmB,KAAK;MAACF;KAAM;EAC1B;AAEA,SAAOjB;AACT;AAEO,IAAMI,mBAAmB,CAACkB,UAAAA;AAC/B,QAAMC,gBAA2C;IAC/CZ,QAAQW,MAAMD,GAAG,CAAA,EAAIV,OAAOC,MAAM,GAAA,EAAK,CAAA;IACvCY,OAAOF,MAAMG,OAAO,CAACC,KAAKT,UAAUS,MAAMT,MAAMO,OAAO,CAAA,IAAKF,MAAMJ;IAClES,OAAOL,MAAMD,GAAG,CAAA,EAAIM;IACpBZ,MAAMO,MAAMD,GAAG,CAAA,EAAIN;IACnBa,OAAON,MAAMD,GAAG,CAAA,EAAIO;IACpBC,KAAKP,MAAMD,GAAG,EAAC,EAAIQ;EACrB;AAEA,aAAWZ,SAASK,MAAMQ,MAAM,CAAA,GAAI;AAClC,QAAIb,MAAMF,KAAKC,WAAW,GAAA,GAAM;AAC9BO,oBAAcR,QAAQE,MAAMF,KAAKgB,QAAQ,OAAO,EAAA;IAClD,OAAO;AACLR,oBAAcR,QAAQ,MAAME,MAAMF;IACpC;EACF;AAEA,SAAOQ;AACT;",
|
|
6
|
-
"names": ["pipeline", "log", "_ner", "getNer", "then", "ner", "info", "extractFullEntities", "text", "entities", "tokenGroups", "createTokenGroups", "combinedEntities", "map", "combineNerTokens", "tokens", "canBeCombined", "prevToken", "currentToken", "currentState", "currentEntity", "entity", "split", "prevState", "prevEntity", "word", "startsWith", "token", "length", "push", "lastTokenGroup", "at", "group", "combinedToken", "score", "reduce", "acc", "index", "start", "end", "slice", "replace"]
|
|
7
|
-
}
|
|
@@ -1,406 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// src/session/artifact-diff.ts
|
|
4
|
-
import { Context } from "effect";
|
|
5
|
-
var ArtifactDiffResolver = class extends Context.Tag("@dxos/assistant/ArtifactDiffResolver")() {
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
// src/session/observer.ts
|
|
9
|
-
import { Effect, Function } from "effect";
|
|
10
|
-
var GenerationObserver = Object.freeze({
|
|
11
|
-
make: ({ onBegin = Function.constant(Effect.void), onPart = Function.constant(Effect.void), onBlock = Function.constant(Effect.void), onEnd = Function.constant(Effect.void), onMessage = Function.constant(Effect.void) } = {}) => ({
|
|
12
|
-
onBegin,
|
|
13
|
-
onPart,
|
|
14
|
-
onBlock,
|
|
15
|
-
onEnd,
|
|
16
|
-
onMessage
|
|
17
|
-
}),
|
|
18
|
-
noop: () => GenerationObserver.make(),
|
|
19
|
-
/**
|
|
20
|
-
* Debug printer to be used in unit-tests and browser devtools.
|
|
21
|
-
*/
|
|
22
|
-
fromPrinter: (printer) => GenerationObserver.make({
|
|
23
|
-
onBlock: (block) => Effect.sync(() => {
|
|
24
|
-
if (block.pending) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
printer.printContentBlock(block);
|
|
28
|
-
}),
|
|
29
|
-
onMessage: (message) => Effect.sync(() => {
|
|
30
|
-
if (message.sender.role === "assistant") {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
printer.printMessage(message);
|
|
34
|
-
})
|
|
35
|
-
})
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// src/errors.ts
|
|
39
|
-
import { BaseError } from "@dxos/errors";
|
|
40
|
-
var AiModelError = class extends BaseError.extend("AI_MODEL_ERROR", "AI model error") {
|
|
41
|
-
};
|
|
42
|
-
var AiAssistantError = class extends BaseError.extend("AI_ASSISTANT_ERROR", "AI assistant error") {
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
// src/session/session.ts
|
|
46
|
-
import { AiLanguageModel } from "@effect/ai";
|
|
47
|
-
import { Chunk, Effect as Effect4, Stream } from "effect";
|
|
48
|
-
import { AiParser, AiPreprocessor, callTool, getToolCalls } from "@dxos/ai";
|
|
49
|
-
import { todo } from "@dxos/debug";
|
|
50
|
-
import { Obj as Obj2 } from "@dxos/echo";
|
|
51
|
-
import { TracingService } from "@dxos/functions";
|
|
52
|
-
import { log as log2 } from "@dxos/log";
|
|
53
|
-
import { DataType as DataType2 } from "@dxos/schema";
|
|
54
|
-
|
|
55
|
-
// src/session/error-handling.ts
|
|
56
|
-
import { AiError } from "@effect/ai";
|
|
57
|
-
import { HttpClientError } from "@effect/platform";
|
|
58
|
-
import { Effect as Effect2, Schema } from "effect";
|
|
59
|
-
var AnthropicErrorResponse = Schema.Struct({
|
|
60
|
-
type: Schema.Literal("error"),
|
|
61
|
-
error: Schema.Struct({
|
|
62
|
-
type: Schema.String,
|
|
63
|
-
message: Schema.String
|
|
64
|
-
})
|
|
65
|
-
});
|
|
66
|
-
var mapAiError = (err) => Effect2.gen(function* () {
|
|
67
|
-
const cause = err.cause;
|
|
68
|
-
if (HttpClientError.isHttpClientError(cause) && cause.reason === "StatusCode") {
|
|
69
|
-
const body = yield* cause.response.json.pipe(Effect2.flatMap(Schema.decodeUnknown(AnthropicErrorResponse, {
|
|
70
|
-
exact: false
|
|
71
|
-
})));
|
|
72
|
-
const parsedCause = new AiModelError({
|
|
73
|
-
message: body.error.message,
|
|
74
|
-
context: {
|
|
75
|
-
model: "anthropic",
|
|
76
|
-
type: body.error.type
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
return new AiError.AiError({
|
|
80
|
-
description: body.error.message,
|
|
81
|
-
module: err.module,
|
|
82
|
-
method: err.method,
|
|
83
|
-
cause: parsedCause
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return err;
|
|
87
|
-
}).pipe(Effect2.catchAll(() => Effect2.succeed(err)));
|
|
88
|
-
|
|
89
|
-
// src/session/format.ts
|
|
90
|
-
import { Array, Effect as Effect3, Option, pipe } from "effect";
|
|
91
|
-
import { Template } from "@dxos/blueprints";
|
|
92
|
-
import { Obj } from "@dxos/echo";
|
|
93
|
-
import { ObjectVersion } from "@dxos/echo-db";
|
|
94
|
-
import { DatabaseService } from "@dxos/functions";
|
|
95
|
-
import { log } from "@dxos/log";
|
|
96
|
-
import { DataType } from "@dxos/schema";
|
|
97
|
-
import { trim } from "@dxos/util";
|
|
98
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/core/assistant/src/session/format.ts";
|
|
99
|
-
var formatSystemPrompt = ({ system, blueprints = [], objects = [] }) => Effect3.gen(function* () {
|
|
100
|
-
const blueprintDefs = yield* pipe(blueprints, Effect3.forEach((blueprint) => Effect3.succeed(blueprint.instructions)), Effect3.flatMap(Effect3.forEach((template) => DatabaseService.loadOption(template.source))), Effect3.map(Array.filter(Option.isSome)), Effect3.map(Array.map((template) => trim`
|
|
101
|
-
<blueprint>
|
|
102
|
-
${Template.process(template.value.content)}
|
|
103
|
-
</blueprint>
|
|
104
|
-
`)), Effect3.map((blueprints2) => blueprints2.length > 0 ? [
|
|
105
|
-
"## Blueprints Definitions",
|
|
106
|
-
...blueprints2
|
|
107
|
-
].join("\n\n") : void 0));
|
|
108
|
-
const objectDefs = yield* pipe(objects, Effect3.forEach((object) => Effect3.succeed(trim`
|
|
109
|
-
<object>
|
|
110
|
-
<dxn>${Obj.getDXN(object)}</dxn>
|
|
111
|
-
<typename>${Obj.getTypename(object)}</typename>
|
|
112
|
-
</object>
|
|
113
|
-
`)), Effect3.map((objects2) => objects2.length > 0 ? [
|
|
114
|
-
"## Context Objects",
|
|
115
|
-
...objects2
|
|
116
|
-
].join("\n\n") : void 0));
|
|
117
|
-
return yield* pipe(Effect3.succeed([
|
|
118
|
-
system,
|
|
119
|
-
blueprintDefs,
|
|
120
|
-
objectDefs
|
|
121
|
-
].filter((def) => def !== void 0)), Effect3.map((parts) => parts.join("\n\n")));
|
|
122
|
-
});
|
|
123
|
-
var formatUserPrompt = ({ prompt, history = [] }) => Effect3.gen(function* () {
|
|
124
|
-
const blocks = [];
|
|
125
|
-
const artifactDiffResolver = yield* Effect3.serviceOption(ArtifactDiffResolver);
|
|
126
|
-
if (Option.isSome(artifactDiffResolver)) {
|
|
127
|
-
const versions = gatherObjectVersions(history);
|
|
128
|
-
const artifactDiff = yield* Effect3.tryPromise({
|
|
129
|
-
try: () => artifactDiffResolver.value.resolve([
|
|
130
|
-
...versions.entries()
|
|
131
|
-
].map(([id, version]) => ({
|
|
132
|
-
id,
|
|
133
|
-
lastVersion: version
|
|
134
|
-
}))),
|
|
135
|
-
catch: AiAssistantError.wrap({
|
|
136
|
-
message: "Artifact diff resolution error"
|
|
137
|
-
})
|
|
138
|
-
});
|
|
139
|
-
log("version", {
|
|
140
|
-
artifactDiff,
|
|
141
|
-
versions
|
|
142
|
-
}, {
|
|
143
|
-
F: __dxlog_file,
|
|
144
|
-
L: 90,
|
|
145
|
-
S: this,
|
|
146
|
-
C: (f, a) => f(...a)
|
|
147
|
-
});
|
|
148
|
-
for (const [id, { version }] of [
|
|
149
|
-
...artifactDiff.entries()
|
|
150
|
-
]) {
|
|
151
|
-
if (ObjectVersion.equals(version, versions.get(id))) {
|
|
152
|
-
artifactDiff.delete(id);
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
blocks.push({
|
|
156
|
-
_tag: "anchor",
|
|
157
|
-
objectId: id,
|
|
158
|
-
version
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
if (artifactDiff.size > 0) {
|
|
162
|
-
blocks.push(createArtifactUpdateBlock(artifactDiff));
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return Obj.make(DataType.Message, {
|
|
166
|
-
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
167
|
-
sender: {
|
|
168
|
-
role: "user"
|
|
169
|
-
},
|
|
170
|
-
blocks: [
|
|
171
|
-
...blocks,
|
|
172
|
-
{
|
|
173
|
-
_tag: "text",
|
|
174
|
-
text: prompt
|
|
175
|
-
}
|
|
176
|
-
]
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
var gatherObjectVersions = (messages) => {
|
|
180
|
-
const artifactIds = /* @__PURE__ */ new Map();
|
|
181
|
-
for (const message of messages) {
|
|
182
|
-
for (const block of message.blocks) {
|
|
183
|
-
if (block._tag === "anchor") {
|
|
184
|
-
artifactIds.set(block.objectId, block.version);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
return artifactIds;
|
|
189
|
-
};
|
|
190
|
-
var createArtifactUpdateBlock = (artifactDiff) => {
|
|
191
|
-
return {
|
|
192
|
-
_tag: "text",
|
|
193
|
-
// TODO(dmaretskyi): Does this need to be a special content-block?
|
|
194
|
-
disposition: "artifact-update",
|
|
195
|
-
text: trim`
|
|
196
|
-
The following artifacts have been updated since the last message:
|
|
197
|
-
${[
|
|
198
|
-
...artifactDiff.entries()
|
|
199
|
-
].map(([id, { diff }]) => `<changed-artifact id="${id}">${diff ? `
|
|
200
|
-
${diff}` : ""}</changed-artifact>`).join("\n")}
|
|
201
|
-
`
|
|
202
|
-
};
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
// src/session/session.ts
|
|
206
|
-
function _define_property(obj, key, value) {
|
|
207
|
-
if (key in obj) {
|
|
208
|
-
Object.defineProperty(obj, key, {
|
|
209
|
-
value,
|
|
210
|
-
enumerable: true,
|
|
211
|
-
configurable: true,
|
|
212
|
-
writable: true
|
|
213
|
-
});
|
|
214
|
-
} else {
|
|
215
|
-
obj[key] = value;
|
|
216
|
-
}
|
|
217
|
-
return obj;
|
|
218
|
-
}
|
|
219
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/assistant/src/session/session.ts";
|
|
220
|
-
var AiSession = class {
|
|
221
|
-
/**
|
|
222
|
-
* @deprecated
|
|
223
|
-
*/
|
|
224
|
-
// TODO(burdon): Implement or remove.
|
|
225
|
-
async runStructured(_schema, _options) {
|
|
226
|
-
return todo();
|
|
227
|
-
}
|
|
228
|
-
constructor(_options = {}) {
|
|
229
|
-
_define_property(this, "_options", void 0);
|
|
230
|
-
_define_property(this, "_semaphore", void 0);
|
|
231
|
-
_define_property(this, "_history", void 0);
|
|
232
|
-
_define_property(this, "_pending", void 0);
|
|
233
|
-
_define_property(this, "run", void 0);
|
|
234
|
-
this._options = _options;
|
|
235
|
-
this._semaphore = Effect4.runSync(Effect4.makeSemaphore(1));
|
|
236
|
-
this._history = [];
|
|
237
|
-
this._pending = [];
|
|
238
|
-
this.run = ({ prompt, system: systemTemplate, history = [], objects = [], blueprints = [], toolkit, observer = GenerationObserver.noop() }) => Effect4.gen(this, function* () {
|
|
239
|
-
this._history = [
|
|
240
|
-
...history
|
|
241
|
-
];
|
|
242
|
-
this._pending = [];
|
|
243
|
-
const pending = this._pending;
|
|
244
|
-
const submitMessage = Effect4.fnUntraced(function* (message) {
|
|
245
|
-
pending.push(message);
|
|
246
|
-
yield* observer.onMessage(message);
|
|
247
|
-
yield* TracingService.emitConverationMessage(message);
|
|
248
|
-
return message;
|
|
249
|
-
});
|
|
250
|
-
const promptMessage = yield* submitMessage(yield* formatUserPrompt({
|
|
251
|
-
prompt,
|
|
252
|
-
history
|
|
253
|
-
}));
|
|
254
|
-
const system = yield* formatSystemPrompt({
|
|
255
|
-
system: systemTemplate,
|
|
256
|
-
blueprints,
|
|
257
|
-
objects
|
|
258
|
-
});
|
|
259
|
-
do {
|
|
260
|
-
log2("request", {
|
|
261
|
-
prompt: promptMessage,
|
|
262
|
-
system: {
|
|
263
|
-
snippet: createSnippet(system),
|
|
264
|
-
length: system.length
|
|
265
|
-
},
|
|
266
|
-
pending: this._pending.length,
|
|
267
|
-
history: this._history.length,
|
|
268
|
-
objects: objects?.length ?? 0
|
|
269
|
-
}, {
|
|
270
|
-
F: __dxlog_file2,
|
|
271
|
-
L: 104,
|
|
272
|
-
S: this,
|
|
273
|
-
C: (f, a) => f(...a)
|
|
274
|
-
});
|
|
275
|
-
const prompt2 = yield* AiPreprocessor.preprocessAiInput([
|
|
276
|
-
...this._history,
|
|
277
|
-
...this._pending
|
|
278
|
-
]);
|
|
279
|
-
const blocks = yield* AiLanguageModel.streamText({
|
|
280
|
-
prompt: prompt2,
|
|
281
|
-
system,
|
|
282
|
-
toolkit,
|
|
283
|
-
disableToolCallResolution: true
|
|
284
|
-
}).pipe(Stream.catchTag("AiError", Effect4.fnUntraced(function* (err) {
|
|
285
|
-
return yield* Effect4.fail(yield* mapAiError(err));
|
|
286
|
-
})), AiParser.parseResponse({
|
|
287
|
-
onBegin: () => observer.onBegin(),
|
|
288
|
-
onBlock: (block) => observer.onBlock(block),
|
|
289
|
-
onPart: (part) => observer.onPart(part),
|
|
290
|
-
onEnd: (summary) => observer.onEnd(summary)
|
|
291
|
-
}), Stream.runCollect, Effect4.map(Chunk.toArray));
|
|
292
|
-
const response = yield* submitMessage(Obj2.make(DataType2.Message, {
|
|
293
|
-
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
294
|
-
sender: {
|
|
295
|
-
role: "assistant"
|
|
296
|
-
},
|
|
297
|
-
blocks
|
|
298
|
-
}));
|
|
299
|
-
const toolCalls = getToolCalls(response);
|
|
300
|
-
if (toolCalls.length === 0) {
|
|
301
|
-
break;
|
|
302
|
-
} else if (!toolkit) {
|
|
303
|
-
throw new Error("No toolkit provided");
|
|
304
|
-
}
|
|
305
|
-
const toolResults = yield* Effect4.forEach(toolCalls, (toolCall) => {
|
|
306
|
-
return callTool(toolkit, toolCall).pipe(Effect4.provide(TracingService.layerSubframe((context) => ({
|
|
307
|
-
...context,
|
|
308
|
-
parentMessage: response.id,
|
|
309
|
-
toolCallId: toolCall.toolCallId
|
|
310
|
-
}))));
|
|
311
|
-
});
|
|
312
|
-
yield* submitMessage(Obj2.make(DataType2.Message, {
|
|
313
|
-
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
314
|
-
sender: {
|
|
315
|
-
role: "user"
|
|
316
|
-
},
|
|
317
|
-
blocks: toolResults
|
|
318
|
-
}));
|
|
319
|
-
} while (true);
|
|
320
|
-
log2("done", {
|
|
321
|
-
pending: this._pending.length
|
|
322
|
-
}, {
|
|
323
|
-
F: __dxlog_file2,
|
|
324
|
-
L: 178,
|
|
325
|
-
S: this,
|
|
326
|
-
C: (f, a) => f(...a)
|
|
327
|
-
});
|
|
328
|
-
return this._pending;
|
|
329
|
-
}).pipe(this._semaphore.withPermits(1), Effect4.withSpan("AiSession.run"));
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
var createSnippet = (text, len = 32) => text.length <= len * 2 ? text : [
|
|
333
|
-
text.slice(0, len),
|
|
334
|
-
"...",
|
|
335
|
-
text.slice(-len)
|
|
336
|
-
].join("");
|
|
337
|
-
|
|
338
|
-
// src/session/toolkit.ts
|
|
339
|
-
import { AiToolkit } from "@effect/ai";
|
|
340
|
-
import { Effect as Effect5 } from "effect";
|
|
341
|
-
import { ToolExecutionService, ToolResolverService } from "@dxos/ai";
|
|
342
|
-
import { isNotFalsy } from "@dxos/util";
|
|
343
|
-
var createToolkit = ({ toolkit: toolkitParam, toolIds = [], blueprints = [] }) => Effect5.gen(function* () {
|
|
344
|
-
const blueprintToolkit = yield* ToolResolverService.resolveToolkit([
|
|
345
|
-
...blueprints.flatMap(({ tools }) => tools),
|
|
346
|
-
...toolIds
|
|
347
|
-
]);
|
|
348
|
-
const blueprintToolkitHandler = yield* blueprintToolkit.toContext(ToolExecutionService.handlersFor(blueprintToolkit));
|
|
349
|
-
const toolkit = AiToolkit.merge(...[
|
|
350
|
-
toolkitParam,
|
|
351
|
-
blueprintToolkit
|
|
352
|
-
].filter(isNotFalsy));
|
|
353
|
-
return yield* toolkit.pipe(Effect5.provide(blueprintToolkitHandler));
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
// src/session/version-pin.ts
|
|
357
|
-
import { Schema as Schema2 } from "effect";
|
|
358
|
-
import { getVersion } from "@dxos/echo-db";
|
|
359
|
-
import { ObjectId } from "@dxos/echo-schema";
|
|
360
|
-
function _define_property2(obj, key, value) {
|
|
361
|
-
if (key in obj) {
|
|
362
|
-
Object.defineProperty(obj, key, {
|
|
363
|
-
value,
|
|
364
|
-
enumerable: true,
|
|
365
|
-
configurable: true,
|
|
366
|
-
writable: true
|
|
367
|
-
});
|
|
368
|
-
} else {
|
|
369
|
-
obj[key] = value;
|
|
370
|
-
}
|
|
371
|
-
return obj;
|
|
372
|
-
}
|
|
373
|
-
var _class;
|
|
374
|
-
var ObjectVersionSchema = Schema2.Unknown;
|
|
375
|
-
var VersionPinSchema = Schema2.Struct({
|
|
376
|
-
// TODO(dmaretskyi): Use Ref when those support encoding.
|
|
377
|
-
objectId: ObjectId,
|
|
378
|
-
// TODO(dmaretskyi): Could be opaque.
|
|
379
|
-
version: ObjectVersionSchema
|
|
380
|
-
});
|
|
381
|
-
var VersionPin = (_class = class extends VersionPinSchema {
|
|
382
|
-
static fromObject(object) {
|
|
383
|
-
return VersionPin.make({
|
|
384
|
-
objectId: object.id,
|
|
385
|
-
version: getVersion(object)
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
static createBlock(pin) {
|
|
389
|
-
return {
|
|
390
|
-
_tag: "json",
|
|
391
|
-
disposition: VersionPin.DISPOSITION,
|
|
392
|
-
data: JSON.stringify(pin)
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
}, _define_property2(_class, "DISPOSITION", "version-pin"), _class);
|
|
396
|
-
|
|
397
|
-
export {
|
|
398
|
-
ArtifactDiffResolver,
|
|
399
|
-
GenerationObserver,
|
|
400
|
-
AiModelError,
|
|
401
|
-
AiAssistantError,
|
|
402
|
-
AiSession,
|
|
403
|
-
createToolkit,
|
|
404
|
-
VersionPin
|
|
405
|
-
};
|
|
406
|
-
//# sourceMappingURL=chunk-W7AIB6DP.mjs.map
|