@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.
Files changed (112) hide show
  1. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  2. package/dist/lib/browser/extraction/index.mjs +118 -161
  3. package/dist/lib/browser/extraction/index.mjs.map +4 -4
  4. package/dist/lib/browser/index.mjs +977 -156
  5. package/dist/lib/browser/index.mjs.map +4 -4
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  8. package/dist/lib/node-esm/extraction/index.mjs +118 -161
  9. package/dist/lib/node-esm/extraction/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/index.mjs +977 -156
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/types/src/conversation/context.d.ts +14 -7
  14. package/dist/types/src/conversation/context.d.ts.map +1 -1
  15. package/dist/types/src/conversation/conversation.d.ts +11 -12
  16. package/dist/types/src/conversation/conversation.d.ts.map +1 -1
  17. package/dist/types/src/diff.d.ts.map +1 -1
  18. package/dist/types/src/errors.d.ts +14 -18
  19. package/dist/types/src/errors.d.ts.map +1 -1
  20. package/dist/types/src/execution-graph.d.ts +85 -0
  21. package/dist/types/src/execution-graph.d.ts.map +1 -0
  22. package/dist/types/src/execution-graph.test.d.ts +2 -0
  23. package/dist/types/src/execution-graph.test.d.ts.map +1 -0
  24. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts.map +1 -1
  25. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts +60 -52
  26. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts.map +1 -1
  27. package/dist/types/src/extraction/extraction.d.ts +24 -13
  28. package/dist/types/src/extraction/extraction.d.ts.map +1 -1
  29. package/dist/types/src/extraction/quotes.d.ts +1 -1
  30. package/dist/types/src/extraction/quotes.d.ts.map +1 -1
  31. package/dist/types/src/functions/services.d.ts +18 -5
  32. package/dist/types/src/functions/services.d.ts.map +1 -1
  33. package/dist/types/src/index.d.ts +2 -1
  34. package/dist/types/src/index.d.ts.map +1 -1
  35. package/dist/types/src/session/GenericToolkit.d.ts +84 -0
  36. package/dist/types/src/session/GenericToolkit.d.ts.map +1 -0
  37. package/dist/types/src/session/artifact-diff.d.ts +2 -2
  38. package/dist/types/src/session/artifact-diff.d.ts.map +1 -1
  39. package/dist/types/src/session/error-handling.d.ts +2 -2
  40. package/dist/types/src/session/error-handling.d.ts.map +1 -1
  41. package/dist/types/src/session/format.d.ts +4 -174
  42. package/dist/types/src/session/format.d.ts.map +1 -1
  43. package/dist/types/src/session/index.d.ts +1 -0
  44. package/dist/types/src/session/index.d.ts.map +1 -1
  45. package/dist/types/src/session/observer.d.ts +3 -3
  46. package/dist/types/src/session/observer.d.ts.map +1 -1
  47. package/dist/types/src/session/session.d.ts +15 -11
  48. package/dist/types/src/session/session.d.ts.map +1 -1
  49. package/dist/types/src/session/toolkit.d.ts +7 -6
  50. package/dist/types/src/session/toolkit.d.ts.map +1 -1
  51. package/dist/types/src/session/version-pin.d.ts +3 -3
  52. package/dist/types/src/session/version-pin.d.ts.map +1 -1
  53. package/dist/types/src/types/artifact.d.ts +20 -0
  54. package/dist/types/src/types/artifact.d.ts.map +1 -0
  55. package/dist/types/src/types/index.d.ts +2 -0
  56. package/dist/types/src/types/index.d.ts.map +1 -0
  57. package/dist/types/tsconfig.tsbuildinfo +1 -1
  58. package/package.json +28 -31
  59. package/src/conversation/context.ts +49 -17
  60. package/src/conversation/conversation.ts +28 -23
  61. package/src/diff.test.ts +3 -3
  62. package/src/diff.ts +5 -0
  63. package/src/execution-graph.test.ts +740 -0
  64. package/src/execution-graph.ts +509 -0
  65. package/src/extraction/extraction-llm-function/extraction-llm-function.test.ts +2 -2
  66. package/src/extraction/extraction-llm-function/extraction-llm-function.ts +46 -54
  67. package/src/extraction/extraction-ner-function/extraction-ner-function.test.ts +10 -9
  68. package/src/extraction/extraction-ner-function/extraction-ner-function.ts +38 -44
  69. package/src/extraction/extraction-ner-function/named-entity-recognition.test.ts +12 -6
  70. package/src/extraction/extraction.ts +7 -6
  71. package/src/extraction/quotes.ts +2 -2
  72. package/src/functions/services.ts +93 -50
  73. package/src/index.ts +2 -1
  74. package/src/session/GenericToolkit.ts +130 -0
  75. package/src/session/artifact-diff.ts +2 -2
  76. package/src/session/error-handling.ts +6 -4
  77. package/src/session/format.test.ts +5 -4
  78. package/src/session/format.ts +17 -12
  79. package/src/session/index.ts +2 -0
  80. package/src/session/observer.ts +4 -3
  81. package/src/session/session.conversations.json +1 -0
  82. package/src/session/session.test.ts +51 -210
  83. package/src/session/session.ts +40 -28
  84. package/src/session/toolkit.ts +19 -13
  85. package/src/session/version-pin.ts +4 -5
  86. package/src/templates/{format.tpl → instructions/format.tpl} +1 -0
  87. package/src/templates/{system.tpl → instructions/system.tpl} +10 -12
  88. package/src/templates/system.ts +2 -2
  89. package/src/{types.ts → types/artifact.ts} +22 -3
  90. package/src/types/index.ts +5 -0
  91. package/dist/lib/browser/chunk-3K5SRE5A.mjs +0 -404
  92. package/dist/lib/browser/chunk-3K5SRE5A.mjs.map +0 -7
  93. package/dist/lib/browser/chunk-UB26N5UF.mjs +0 -89
  94. package/dist/lib/browser/chunk-UB26N5UF.mjs.map +0 -7
  95. package/dist/lib/browser/named-entity-recognition-QPYHML66.mjs +0 -13
  96. package/dist/lib/node-esm/chunk-BCFXTNSK.mjs +0 -91
  97. package/dist/lib/node-esm/chunk-BCFXTNSK.mjs.map +0 -7
  98. package/dist/lib/node-esm/chunk-W7AIB6DP.mjs +0 -406
  99. package/dist/lib/node-esm/chunk-W7AIB6DP.mjs.map +0 -7
  100. package/dist/lib/node-esm/named-entity-recognition-2HDF46YX.mjs +0 -14
  101. package/dist/types/src/session/version-pin.test.d.ts +0 -2
  102. package/dist/types/src/session/version-pin.test.d.ts.map +0 -1
  103. package/dist/types/src/summarization/summarization.test.d.ts +0 -2
  104. package/dist/types/src/summarization/summarization.test.d.ts.map +0 -1
  105. package/dist/types/src/types.d.ts +0 -16
  106. package/dist/types/src/types.d.ts.map +0 -1
  107. package/src/session/__snapshots__/session.test.ts.snap +0 -32
  108. package/src/session/version-pin.test.ts +0 -7
  109. package/src/summarization/summarization.test.ts +0 -197
  110. /package/dist/lib/browser/{named-entity-recognition-QPYHML66.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  111. /package/dist/lib/node-esm/{named-entity-recognition-2HDF46YX.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
  112. /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