@jini-ai/daemon 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/agent-executor.d.ts +216 -24
  2. package/dist/agent-executor.d.ts.map +1 -1
  3. package/dist/agent-executor.js +373 -38
  4. package/dist/agent-executor.js.map +1 -1
  5. package/dist/run-lifecycle.d.ts +36 -1
  6. package/dist/run-lifecycle.d.ts.map +1 -1
  7. package/dist/run-lifecycle.js +89 -0
  8. package/dist/run-lifecycle.js.map +1 -1
  9. package/package.json +5 -5
  10. package/dist/artifacts/index.d.ts +0 -14
  11. package/dist/artifacts/index.d.ts.map +0 -1
  12. package/dist/artifacts/index.js +0 -14
  13. package/dist/artifacts/index.js.map +0 -1
  14. package/dist/artifacts/manifest.d.ts +0 -90
  15. package/dist/artifacts/manifest.d.ts.map +0 -1
  16. package/dist/artifacts/manifest.js +0 -229
  17. package/dist/artifacts/manifest.js.map +0 -1
  18. package/dist/artifacts/publication-guard.d.ts +0 -28
  19. package/dist/artifacts/publication-guard.d.ts.map +0 -1
  20. package/dist/artifacts/publication-guard.js +0 -77
  21. package/dist/artifacts/publication-guard.js.map +0 -1
  22. package/dist/artifacts/runtime-compat.d.ts +0 -37
  23. package/dist/artifacts/runtime-compat.d.ts.map +0 -1
  24. package/dist/artifacts/runtime-compat.js +0 -33
  25. package/dist/artifacts/runtime-compat.js.map +0 -1
  26. package/dist/artifacts/store.d.ts +0 -85
  27. package/dist/artifacts/store.d.ts.map +0 -1
  28. package/dist/artifacts/store.js +0 -92
  29. package/dist/artifacts/store.js.map +0 -1
  30. package/dist/artifacts/stub-guard.d.ts +0 -73
  31. package/dist/artifacts/stub-guard.d.ts.map +0 -1
  32. package/dist/artifacts/stub-guard.js +0 -198
  33. package/dist/artifacts/stub-guard.js.map +0 -1
  34. package/dist/artifacts/text-suppression.d.ts +0 -68
  35. package/dist/artifacts/text-suppression.d.ts.map +0 -1
  36. package/dist/artifacts/text-suppression.js +0 -184
  37. package/dist/artifacts/text-suppression.js.map +0 -1
@@ -1,184 +0,0 @@
1
- /**
2
- * @module artifacts/text-suppression
3
- *
4
- * A streaming-text state machine that suppresses a tagged block (matched by
5
- * caller-supplied open/close patterns) from user-visible output while it's
6
- * still arriving — used to hide an artifact's raw markup from chat prose
7
- * while it streams in, without buffering the whole response first. Ported
8
- * from OD's `apps/daemon/src/artifacts/text-suppression.ts`.
9
- *
10
- * The core (`createTaggedTextSuppressor`) was already fully generic in the
11
- * origin — it takes its open/close regexes and open/close prefix-match
12
- * predicates as parameters, no product coupling. What needed de-branding
13
- * were the origin's two pre-built instances: `createDsmlArtifactTextSuppressor`
14
- * hardcoded OD's own "DSML" markup-language tag name family
15
- * (`<|DSML artifact>`/`<artifact>`) as its open/close patterns.
16
- * `createXmlTagTextSuppressor` below replaces it — a generic factory taking
17
- * the caller's own tag-name list instead of a hardcoded vocabulary. The
18
- * `tool_call`/`edit` pairing the origin's other instance
19
- * (`createToolCallTextSuppressor`) suppressed is a generic agent-protocol
20
- * convention, not OD-branded, and is kept as a named default instance.
21
- */
22
- const MAX_CANDIDATE_LENGTH = 512;
23
- /**
24
- * Builds a suppressor for a tagged block delimited by `openRe`/`closeRe`.
25
- * `isPossibleOpen`/`isPossibleClose` decide whether a trailing `<...`
26
- * fragment (with no closing `>` yet) *could* still become a match once more
27
- * text arrives — this is what lets the suppressor hold back a
28
- * not-yet-decidable tail across streaming chunk boundaries instead of
29
- * either emitting a tag fragment early or hanging indefinitely on a `<` that
30
- * turns out to be unrelated text.
31
- */
32
- export function createTaggedTextSuppressor(args) {
33
- let suppressing = false;
34
- let candidate = '';
35
- let suppressedChars = 0;
36
- let suppressedChunks = 0;
37
- let openedBlocks = 0;
38
- let closedBlocks = 0;
39
- function noteSuppressed(text) {
40
- if (text.length <= 0)
41
- return;
42
- suppressedChars += text.length;
43
- suppressedChunks += 1;
44
- }
45
- function strip(text) {
46
- const current = `${candidate}${text}`;
47
- candidate = '';
48
- if (suppressing) {
49
- const close = args.closeRe.exec(current);
50
- if (!close || close.index === undefined) {
51
- const closeCandidateStart = possibleTagStart(current, args.isPossibleClose);
52
- if (closeCandidateStart !== -1) {
53
- candidate = current.slice(closeCandidateStart);
54
- noteSuppressed(current.slice(0, closeCandidateStart));
55
- }
56
- else {
57
- noteSuppressed(current);
58
- }
59
- return '';
60
- }
61
- suppressing = false;
62
- const end = close.index + close[0].length;
63
- closedBlocks += 1;
64
- noteSuppressed(current.slice(0, end));
65
- return strip(current.slice(end));
66
- }
67
- const open = args.openRe.exec(current);
68
- if (open && open.index !== undefined) {
69
- suppressing = true;
70
- openedBlocks += 1;
71
- const prefix = current.slice(0, open.index);
72
- const tail = current.slice(open.index + open[0].length);
73
- noteSuppressed(open[0]);
74
- return `${prefix}${strip(tail)}`;
75
- }
76
- const candidateStart = possibleTagStart(current, args.isPossibleOpen);
77
- if (candidateStart === -1)
78
- return current;
79
- candidate = current.slice(candidateStart);
80
- return current.slice(0, candidateStart);
81
- }
82
- function flush() {
83
- const text = candidate;
84
- candidate = '';
85
- return suppressing ? '' : text;
86
- }
87
- function isSuppressing() {
88
- return suppressing;
89
- }
90
- function hasPendingCandidate() {
91
- return candidate.length > 0;
92
- }
93
- function stats() {
94
- return {
95
- suppressedChars,
96
- suppressedChunks,
97
- openedBlocks,
98
- closedBlocks,
99
- pendingCandidateChars: candidate.length,
100
- suppressing,
101
- };
102
- }
103
- return { strip, flush, isSuppressing, hasPendingCandidate, stats };
104
- }
105
- /** Feeds `text` through `suppressor` and emits a `text_delta` on `onEvent` only when something survives. Returns whether an event was emitted. */
106
- export function emitWithTextSuppressor(suppressor, onEvent, text) {
107
- const delta = suppressor.strip(text);
108
- if (!delta)
109
- return false;
110
- onEvent({ type: 'text_delta', delta });
111
- return true;
112
- }
113
- function possibleTagStart(text, predicate) {
114
- const min = Math.max(0, text.length - MAX_CANDIDATE_LENGTH);
115
- let index = text.lastIndexOf('<');
116
- while (index >= min) {
117
- const tail = text.slice(index);
118
- if (predicate(tail))
119
- return index;
120
- if (index === 0)
121
- break;
122
- index = text.lastIndexOf('<', index - 1);
123
- }
124
- return -1;
125
- }
126
- // `text` is always a `possibleTagStart` tail slice starting at a `<`
127
- // position (its only caller) — no `!text.startsWith('<')` re-check needed.
128
- function compactTagCandidate(text, stripChars) {
129
- if (text.includes('>'))
130
- return null;
131
- return text.toLowerCase().replace(stripChars, '');
132
- }
133
- /**
134
- * Builds a suppressor for an XML-like `<tagName ...>...</tagName>` block (or
135
- * a bracket-pipe variant `<|tagName ...>...<|/tagName|>`), matched
136
- * case-insensitively against any of `tagNames`. Replaces the origin's
137
- * hardcoded "DSML" tag-name family with a caller-supplied vocabulary.
138
- */
139
- export function createXmlTagTextSuppressor(tagNames) {
140
- const canonicals = tagNames.map((t) => t.toLowerCase());
141
- const namesPattern = canonicals.map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
142
- const openRe = new RegExp(`(?:<\\s*\\|?\\s*(?:${namesPattern})\\b[^>]*>)`, 'i');
143
- const closeRe = new RegExp(`(?:<\\/(?:${namesPattern})>|<\\s*\\|?\\s*\\/\\s*(?:${namesPattern})\\s*\\|?\\s*>)`, 'i');
144
- function isPossibleOpen(text) {
145
- const compact = compactTagCandidate(text, /[<|,\s]/g);
146
- if (compact === null)
147
- return false;
148
- return compact.length === 0 || canonicals.some((c) => c.startsWith(compact) || compact.startsWith(c));
149
- }
150
- function isPossibleClose(text) {
151
- const compact = compactTagCandidate(text, /[<|/\s]/g);
152
- if (compact === null)
153
- return false;
154
- return compact.length === 0 || canonicals.some((c) => c.startsWith(compact) || compact.startsWith(c));
155
- }
156
- return createTaggedTextSuppressor({ openRe, closeRe, isPossibleOpen, isPossibleClose });
157
- }
158
- const TOOL_CALL_OPEN_RE = /(?:<\s*tool_call\b[^>]*>|<\s*edit\s*>)/i;
159
- const TOOL_CALL_CLOSE_RE = /(?:<\/\s*tool_call\s*>|<\/\s*edit\s*>)/i;
160
- const TOOL_CALL_CANONICALS = ['toolcall', 'edit'];
161
- // Same reasoning as compactTagCandidate above: `text` always starts with
162
- // `<` here (a `possibleTagStart` tail slice) — no re-check needed.
163
- function isPossibleToolCallOpen(text) {
164
- if (text.includes('>'))
165
- return false;
166
- const compact = text.toLowerCase().replace(/[<|,\s_-]/g, '');
167
- return compact.length === 0 || TOOL_CALL_CANONICALS.some((c) => c.startsWith(compact) || compact.startsWith(c));
168
- }
169
- function isPossibleToolCallClose(text) {
170
- if (text.includes('>'))
171
- return false;
172
- const compact = text.toLowerCase().replace(/[<|/\s_-]/g, '');
173
- return compact.length === 0 || TOOL_CALL_CANONICALS.some((c) => c.startsWith(compact) || compact.startsWith(c));
174
- }
175
- /** Suppresses a `<tool_call>...</tool_call>` or `<edit>...</edit>` block — a generic agent-protocol convention, not product-branded. */
176
- export function createToolCallTextSuppressor() {
177
- return createTaggedTextSuppressor({
178
- openRe: TOOL_CALL_OPEN_RE,
179
- closeRe: TOOL_CALL_CLOSE_RE,
180
- isPossibleOpen: isPossibleToolCallOpen,
181
- isPossibleClose: isPossibleToolCallClose,
182
- });
183
- }
184
- //# sourceMappingURL=text-suppression.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-suppression.js","sourceRoot":"","sources":["../../src/artifacts/text-suppression.ts"],"names":[],"mappings":"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"}