@amalgm/chat 0.1.0
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/PURPOSE.md +107 -0
- package/README.md +41 -0
- package/dist/contract/chat-input.d.ts +144 -0
- package/dist/contract/chat-input.d.ts.map +1 -0
- package/dist/contract/chat-input.js +261 -0
- package/dist/contract/chat-input.js.map +1 -0
- package/dist/contract/create.d.ts +191 -0
- package/dist/contract/create.d.ts.map +1 -0
- package/dist/contract/create.js +249 -0
- package/dist/contract/create.js.map +1 -0
- package/dist/contract/freeze.d.ts +85 -0
- package/dist/contract/freeze.d.ts.map +1 -0
- package/dist/contract/freeze.js +151 -0
- package/dist/contract/freeze.js.map +1 -0
- package/dist/contract/harnesses.d.ts +21 -0
- package/dist/contract/harnesses.d.ts.map +1 -0
- package/dist/contract/harnesses.js +39 -0
- package/dist/contract/harnesses.js.map +1 -0
- package/dist/contract/index.d.ts +17 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +17 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/input.d.ts +45 -0
- package/dist/contract/input.d.ts.map +1 -0
- package/dist/contract/input.js +78 -0
- package/dist/contract/input.js.map +1 -0
- package/dist/contract/models.d.ts +57 -0
- package/dist/contract/models.d.ts.map +1 -0
- package/dist/contract/models.js +380 -0
- package/dist/contract/models.js.map +1 -0
- package/dist/contract/payload-merge.d.ts +76 -0
- package/dist/contract/payload-merge.d.ts.map +1 -0
- package/dist/contract/payload-merge.js +215 -0
- package/dist/contract/payload-merge.js.map +1 -0
- package/dist/events/constructors.d.ts +53 -0
- package/dist/events/constructors.d.ts.map +1 -0
- package/dist/events/constructors.js +217 -0
- package/dist/events/constructors.js.map +1 -0
- package/dist/events/index.d.ts +12 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +12 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/schema.d.ts +455 -0
- package/dist/events/schema.d.ts.map +1 -0
- package/dist/events/schema.js +228 -0
- package/dist/events/schema.js.map +1 -0
- package/dist/events/tool-display.d.ts +22 -0
- package/dist/events/tool-display.d.ts.map +1 -0
- package/dist/events/tool-display.js +60 -0
- package/dist/events/tool-display.js.map +1 -0
- package/dist/events/tool-shape.d.ts +48 -0
- package/dist/events/tool-shape.d.ts.map +1 -0
- package/dist/events/tool-shape.js +225 -0
- package/dist/events/tool-shape.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/normalizers/claude.d.ts +628 -0
- package/dist/normalizers/claude.d.ts.map +1 -0
- package/dist/normalizers/claude.js +603 -0
- package/dist/normalizers/claude.js.map +1 -0
- package/dist/normalizers/codex.d.ts +352 -0
- package/dist/normalizers/codex.d.ts.map +1 -0
- package/dist/normalizers/codex.js +485 -0
- package/dist/normalizers/codex.js.map +1 -0
- package/dist/normalizers/cursor.d.ts +34 -0
- package/dist/normalizers/cursor.d.ts.map +1 -0
- package/dist/normalizers/cursor.js +197 -0
- package/dist/normalizers/cursor.js.map +1 -0
- package/dist/normalizers/index.d.ts +13 -0
- package/dist/normalizers/index.d.ts.map +1 -0
- package/dist/normalizers/index.js +13 -0
- package/dist/normalizers/index.js.map +1 -0
- package/dist/normalizers/opencode.d.ts +81 -0
- package/dist/normalizers/opencode.d.ts.map +1 -0
- package/dist/normalizers/opencode.js +640 -0
- package/dist/normalizers/opencode.js.map +1 -0
- package/dist/normalizers/pi.d.ts +28 -0
- package/dist/normalizers/pi.d.ts.map +1 -0
- package/dist/normalizers/pi.js +160 -0
- package/dist/normalizers/pi.js.map +1 -0
- package/dist/ports.d.ts +14 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +7 -0
- package/dist/ports.js.map +1 -0
- package/dist/transcript/index.d.ts +14 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +12 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/message-reducer.d.ts +167 -0
- package/dist/transcript/message-reducer.d.ts.map +1 -0
- package/dist/transcript/message-reducer.js +400 -0
- package/dist/transcript/message-reducer.js.map +1 -0
- package/dist/transcript/part-accumulator.d.ts +24 -0
- package/dist/transcript/part-accumulator.d.ts.map +1 -0
- package/dist/transcript/part-accumulator.js +30 -0
- package/dist/transcript/part-accumulator.js.map +1 -0
- package/dist/transcript/tool-display.d.ts +14 -0
- package/dist/transcript/tool-display.d.ts.map +1 -0
- package/dist/transcript/tool-display.js +125 -0
- package/dist/transcript/tool-display.js.map +1 -0
- package/dist/transcript/tool-shape.d.ts +34 -0
- package/dist/transcript/tool-shape.d.ts.map +1 -0
- package/dist/transcript/tool-shape.js +216 -0
- package/dist/transcript/tool-shape.js.map +1 -0
- package/dist/turns/index.d.ts +11 -0
- package/dist/turns/index.d.ts.map +1 -0
- package/dist/turns/index.js +11 -0
- package/dist/turns/index.js.map +1 -0
- package/dist/turns/queries.d.ts +36 -0
- package/dist/turns/queries.d.ts.map +1 -0
- package/dist/turns/queries.js +37 -0
- package/dist/turns/queries.js.map +1 -0
- package/dist/turns/replay.d.ts +105 -0
- package/dist/turns/replay.d.ts.map +1 -0
- package/dist/turns/replay.js +163 -0
- package/dist/turns/replay.js.map +1 -0
- package/dist/turns/status.d.ts +49 -0
- package/dist/turns/status.d.ts.map +1 -0
- package/dist/turns/status.js +56 -0
- package/dist/turns/status.js.map +1 -0
- package/dist/turns/turn-store.d.ts +109 -0
- package/dist/turns/turn-store.d.ts.map +1 -0
- package/dist/turns/turn-store.js +169 -0
- package/dist/turns/turn-store.js.map +1 -0
- package/dist/usage/finalize.d.ts +57 -0
- package/dist/usage/finalize.d.ts.map +1 -0
- package/dist/usage/finalize.js +139 -0
- package/dist/usage/finalize.js.map +1 -0
- package/dist/usage/index.d.ts +11 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +11 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/usage/model-catalog.d.ts +50 -0
- package/dist/usage/model-catalog.d.ts.map +1 -0
- package/dist/usage/model-catalog.js +344 -0
- package/dist/usage/model-catalog.js.map +1 -0
- package/dist/usage/normalize.d.ts +103 -0
- package/dist/usage/normalize.d.ts.map +1 -0
- package/dist/usage/normalize.js +71 -0
- package/dist/usage/normalize.js.map +1 -0
- package/dist/usage/ports.d.ts +141 -0
- package/dist/usage/ports.d.ts.map +1 -0
- package/dist/usage/ports.js +113 -0
- package/dist/usage/ports.js.map +1 -0
- package/dist/usage/tokens.d.ts +79 -0
- package/dist/usage/tokens.d.ts.map +1 -0
- package/dist/usage/tokens.js +98 -0
- package/dist/usage/tokens.js.map +1 -0
- package/dist/warm/client-cache.d.ts +47 -0
- package/dist/warm/client-cache.d.ts.map +1 -0
- package/dist/warm/client-cache.js +48 -0
- package/dist/warm/client-cache.js.map +1 -0
- package/dist/warm/envelope-cache.d.ts +79 -0
- package/dist/warm/envelope-cache.d.ts.map +1 -0
- package/dist/warm/envelope-cache.js +85 -0
- package/dist/warm/envelope-cache.js.map +1 -0
- package/dist/warm/index.d.ts +16 -0
- package/dist/warm/index.d.ts.map +1 -0
- package/dist/warm/index.js +11 -0
- package/dist/warm/index.js.map +1 -0
- package/dist/warm/payload.d.ts +137 -0
- package/dist/warm/payload.d.ts.map +1 -0
- package/dist/warm/payload.js +112 -0
- package/dist/warm/payload.js.map +1 -0
- package/dist/warm/revision.d.ts +70 -0
- package/dist/warm/revision.d.ts.map +1 -0
- package/dist/warm/revision.js +63 -0
- package/dist/warm/revision.js.map +1 -0
- package/dist/warm/store-policy.d.ts +57 -0
- package/dist/warm/store-policy.d.ts.map +1 -0
- package/dist/warm/store-policy.js +89 -0
- package/dist/warm/store-policy.js.map +1 -0
- package/dist/wire/frames.d.ts +208 -0
- package/dist/wire/frames.d.ts.map +1 -0
- package/dist/wire/frames.js +245 -0
- package/dist/wire/frames.js.map +1 -0
- package/dist/wire/index.d.ts +7 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +7 -0
- package/dist/wire/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port of amalgm-engine `runtime/scripts/chat-core/tool-shape.js` (working
|
|
3
|
+
* tree, including the cua/dialog/tab/console browser-tool titles and the
|
|
4
|
+
* apps_register cwd title). Classifies tools into kinds and renders titles.
|
|
5
|
+
* Pure: deterministic mappings only.
|
|
6
|
+
*/
|
|
7
|
+
export interface McpName {
|
|
8
|
+
server: string;
|
|
9
|
+
tool: string;
|
|
10
|
+
}
|
|
11
|
+
export interface NormalizedError {
|
|
12
|
+
message: string;
|
|
13
|
+
code?: string | undefined;
|
|
14
|
+
details?: unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
17
|
+
export declare function hostLabel(url: unknown): string;
|
|
18
|
+
export declare function humanizeToolName(value?: unknown): string;
|
|
19
|
+
export declare function parseMcpName(name?: unknown): McpName | null;
|
|
20
|
+
export declare function normalizeError(error: unknown, fallback?: string): NormalizedError | undefined;
|
|
21
|
+
export declare function toolKind(name?: unknown, input?: unknown, metadata?: unknown): string;
|
|
22
|
+
export interface TitleForToolOptions {
|
|
23
|
+
name?: unknown;
|
|
24
|
+
input?: Record<string, unknown> | undefined;
|
|
25
|
+
output?: unknown;
|
|
26
|
+
error?: unknown;
|
|
27
|
+
metadata?: Record<string, unknown> | undefined;
|
|
28
|
+
fallback?: unknown;
|
|
29
|
+
}
|
|
30
|
+
export declare function titleForTool({ name, input, error, metadata, fallback }?: TitleForToolOptions): string;
|
|
31
|
+
export declare function mcpMetadataFromName(name: unknown): {
|
|
32
|
+
mcp?: McpName;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=tool-shape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-shape.d.ts","sourceRoot":"","sources":["../../src/transcript/tool-shape.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQ9C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,OAAY,GAAG,MAAM,CAS5D;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,OAAY,GAAG,OAAO,GAAG,IAAI,CAO/D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAgB,GAAG,eAAe,GAAG,SAAS,CAYpG;AAED,wBAAgB,QAAQ,CAAC,IAAI,GAAE,OAAY,EAAE,KAAK,GAAE,OAAY,EAAE,QAAQ,GAAE,OAAY,GAAG,MAAM,CAyBhG;AAiDD,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,KAAU,EAAE,KAAK,EAAE,QAAa,EAAE,QAAQ,EAAE,GAAE,mBAAwB,GAAG,MAAM,CAiCnH;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAGpE"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port of amalgm-engine `runtime/scripts/chat-core/tool-shape.js` (working
|
|
3
|
+
* tree, including the cua/dialog/tab/console browser-tool titles and the
|
|
4
|
+
* apps_register cwd title). Classifies tools into kinds and renders titles.
|
|
5
|
+
* Pure: deterministic mappings only.
|
|
6
|
+
*/
|
|
7
|
+
import { compactText, stringifyResult } from './tool-display.js';
|
|
8
|
+
export function isRecord(value) {
|
|
9
|
+
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
10
|
+
}
|
|
11
|
+
export function hostLabel(url) {
|
|
12
|
+
if (url === undefined || url === null || url === '')
|
|
13
|
+
return '';
|
|
14
|
+
try {
|
|
15
|
+
const host = new URL(String(url)).hostname.replace(/^www\./, '');
|
|
16
|
+
return host || String(url);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return compactText(url, 80);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function humanizeToolName(value = '') {
|
|
23
|
+
const text = String(value || '')
|
|
24
|
+
.replace(/^mcp__/, '')
|
|
25
|
+
.replace(/^amalgm[_-]/i, '')
|
|
26
|
+
.replace(/__/g, ' ')
|
|
27
|
+
.replace(/[_-]+/g, ' ')
|
|
28
|
+
.trim();
|
|
29
|
+
if (!text)
|
|
30
|
+
return 'Tool';
|
|
31
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
32
|
+
}
|
|
33
|
+
export function parseMcpName(name = '') {
|
|
34
|
+
const text = String(name || '');
|
|
35
|
+
const mcp = text.match(/^mcp__([^_]+(?:_[^_]+)*)__([\s\S]+)$/);
|
|
36
|
+
if (mcp)
|
|
37
|
+
return { server: mcp[1], tool: mcp[2] };
|
|
38
|
+
const amalgm = text.match(/^amalgm_(.+)$/);
|
|
39
|
+
if (amalgm)
|
|
40
|
+
return { server: 'amalgm', tool: amalgm[1] };
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
export function normalizeError(error, fallback = 'Tool failed') {
|
|
44
|
+
if (!error)
|
|
45
|
+
return undefined;
|
|
46
|
+
if (typeof error === 'string')
|
|
47
|
+
return { message: error };
|
|
48
|
+
if (isRecord(error)) {
|
|
49
|
+
const message = error['message'] || error['error'] || error['details'] || fallback;
|
|
50
|
+
return {
|
|
51
|
+
message: typeof message === 'string' ? message : stringifyResult(message),
|
|
52
|
+
...(error['code'] ? { code: String(error['code']) } : {}),
|
|
53
|
+
details: error,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { message: String(error) || fallback };
|
|
57
|
+
}
|
|
58
|
+
export function toolKind(name = '', input = {}, metadata = {}) {
|
|
59
|
+
const clean = String(name || '').toLowerCase();
|
|
60
|
+
const compact = clean.replace(/[^a-z0-9]/g, '');
|
|
61
|
+
const mcp = metadata['mcp'] || parseMcpName(name);
|
|
62
|
+
const meta = metadata;
|
|
63
|
+
if (meta['subagent'] || clean === 'task' || clean.includes('spawnagent') || clean.includes('collabagent'))
|
|
64
|
+
return 'subagent';
|
|
65
|
+
if (clean.includes('todo'))
|
|
66
|
+
return 'todo';
|
|
67
|
+
if (clean.includes('question') || clean.includes('askuser'))
|
|
68
|
+
return 'question';
|
|
69
|
+
if (compact.includes('toolsearch'))
|
|
70
|
+
return 'search';
|
|
71
|
+
if (clean.includes('bash') || clean.includes('command'))
|
|
72
|
+
return 'bash';
|
|
73
|
+
if (clean.includes('websearch') || clean === 'websearch')
|
|
74
|
+
return 'web_search';
|
|
75
|
+
if (clean.includes('browser') || mcp?.tool?.startsWith?.('browser_'))
|
|
76
|
+
return 'browser';
|
|
77
|
+
if (clean.includes('webfetch') || clean === 'webfetch')
|
|
78
|
+
return 'browser';
|
|
79
|
+
if (clean.includes('read'))
|
|
80
|
+
return 'file_read';
|
|
81
|
+
if (clean.includes('write'))
|
|
82
|
+
return 'file_write';
|
|
83
|
+
if (clean.includes('edit') || clean.includes('filechange'))
|
|
84
|
+
return 'file_edit';
|
|
85
|
+
if (mcp)
|
|
86
|
+
return 'mcp';
|
|
87
|
+
if (input && typeof input === 'object') {
|
|
88
|
+
const args = input;
|
|
89
|
+
if (args['command'] !== undefined)
|
|
90
|
+
return 'bash';
|
|
91
|
+
if (args['url'] !== undefined)
|
|
92
|
+
return 'browser';
|
|
93
|
+
if (args['query'] !== undefined)
|
|
94
|
+
return 'web_search';
|
|
95
|
+
if (args['file_path'] !== undefined || args['filePath'] !== undefined || args['path'] !== undefined)
|
|
96
|
+
return 'file_read';
|
|
97
|
+
}
|
|
98
|
+
return 'unknown';
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Browser action out of a tool name, across naming eras: current
|
|
102
|
+
* toolbox__browser_open, era-2 toolbox__browser_browser_open / browser_open,
|
|
103
|
+
* and bare record_start/cua_click. Null for non-browser tools.
|
|
104
|
+
*/
|
|
105
|
+
function browserAction(name) {
|
|
106
|
+
const match = String(name || '').match(/^(?:toolbox__browser_|browser_)(.+)$/);
|
|
107
|
+
if (match)
|
|
108
|
+
return match[1].replace(/^browser_/, '');
|
|
109
|
+
if (/^(?:record_(?:start|stop|list)|cua(?:_[a-z_]+)?)$/.test(name))
|
|
110
|
+
return name;
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
function titleFromMcp(tool, input = {}) {
|
|
114
|
+
const name = String(tool || '');
|
|
115
|
+
const action = browserAction(name);
|
|
116
|
+
if (action === 'open')
|
|
117
|
+
return input['url'] ? `Opening ${hostLabel(input['url'])}` : 'Opening browser page';
|
|
118
|
+
if (action === 'snapshot')
|
|
119
|
+
return 'Reading browser page';
|
|
120
|
+
if (action === 'screenshot' || action === 'cua_screenshot')
|
|
121
|
+
return 'Taking browser screenshot';
|
|
122
|
+
if (action === 'fill')
|
|
123
|
+
return input['text'] ? `Typing "${compactText(input['text'], 60)}"` : 'Typing in browser';
|
|
124
|
+
if (action === 'click')
|
|
125
|
+
return 'Clicking in browser';
|
|
126
|
+
if (action === 'press')
|
|
127
|
+
return input['key'] ? `Pressing ${compactText(input['key'], 20)}` : 'Pressing key in browser';
|
|
128
|
+
if (action === 'eval')
|
|
129
|
+
return 'Running JavaScript in browser';
|
|
130
|
+
if (action === 'wait')
|
|
131
|
+
return 'Waiting for page';
|
|
132
|
+
if (action === 'cli')
|
|
133
|
+
return Array.isArray(input['args']) ? `Browser: ${compactText(input['args'].join(' '), 60)}` : 'Running browser command';
|
|
134
|
+
if (action === 'cua') {
|
|
135
|
+
const cuaAction = String(input['action'] || '');
|
|
136
|
+
if (cuaAction === 'screenshot')
|
|
137
|
+
return 'Taking browser screenshot';
|
|
138
|
+
if (cuaAction === 'type')
|
|
139
|
+
return input['text'] ? `Typing "${compactText(input['text'], 60)}"` : 'Typing in browser';
|
|
140
|
+
return cuaAction ? `Browser ${cuaAction.replace(/_/g, ' ')} (coordinates)` : 'Browser computer-use action';
|
|
141
|
+
}
|
|
142
|
+
if (action === 'dialog')
|
|
143
|
+
return input['action'] === 'dismiss' ? 'Dismissing browser dialog' : 'Accepting browser dialog';
|
|
144
|
+
if (action === 'tab')
|
|
145
|
+
return `Browser tab ${compactText(String(input['action'] || 'list'), 20)}`;
|
|
146
|
+
if (action === 'console')
|
|
147
|
+
return 'Reading browser console';
|
|
148
|
+
if (action === 'close')
|
|
149
|
+
return 'Closing browser session';
|
|
150
|
+
if (action === 'record_start')
|
|
151
|
+
return 'Starting browser recording';
|
|
152
|
+
if (action === 'record_stop')
|
|
153
|
+
return 'Saving browser recording';
|
|
154
|
+
if (action === 'record_list')
|
|
155
|
+
return 'Listing browser recordings';
|
|
156
|
+
if (action === 'auth_list')
|
|
157
|
+
return 'Listing browser logins';
|
|
158
|
+
if (name === 'apps_register')
|
|
159
|
+
return input['cwd'] ? `Registering app from ${compactText(input['cwd'], 60)}` : 'Registering app';
|
|
160
|
+
if (name === 'apps_start')
|
|
161
|
+
return 'Starting app';
|
|
162
|
+
if (name === 'apps_stop')
|
|
163
|
+
return 'Stopping app';
|
|
164
|
+
if (name === 'apps_list')
|
|
165
|
+
return 'Listing apps';
|
|
166
|
+
if (name === 'agents_list')
|
|
167
|
+
return 'Listing agents';
|
|
168
|
+
if (name === 'talk_to_agent')
|
|
169
|
+
return 'Talking to agent';
|
|
170
|
+
return humanizeToolName(action || name);
|
|
171
|
+
}
|
|
172
|
+
export function titleForTool({ name, input = {}, error, metadata = {}, fallback } = {}) {
|
|
173
|
+
if (metadata['actionDescriptor'])
|
|
174
|
+
return compactText(metadata['actionDescriptor'], 160);
|
|
175
|
+
if (metadata['title'])
|
|
176
|
+
return compactText(metadata['title'], 160);
|
|
177
|
+
const mcp = metadata['mcp'] || parseMcpName(name);
|
|
178
|
+
if (mcp)
|
|
179
|
+
return titleFromMcp(mcp.tool, input);
|
|
180
|
+
const clean = String(name || '').toLowerCase();
|
|
181
|
+
const compact = clean.replace(/[^a-z0-9]/g, '');
|
|
182
|
+
const metaAction = metadata['action'];
|
|
183
|
+
if (metaAction?.['type'] === 'search') {
|
|
184
|
+
return `Searching ${compactText(metaAction['query'] || input['query'] || 'the web', 80)}`;
|
|
185
|
+
}
|
|
186
|
+
if (metaAction?.['type'] === 'openPage') {
|
|
187
|
+
const host = hostLabel(metaAction['url'] || input['url'] || input['query']);
|
|
188
|
+
return host ? `Opening ${host}` : 'Opening web page';
|
|
189
|
+
}
|
|
190
|
+
if (metaAction?.['type'] === 'findInPage') {
|
|
191
|
+
const pattern = metaAction['pattern'] || input['pattern'];
|
|
192
|
+
const url = metaAction['url'] || input['url'];
|
|
193
|
+
const host = hostLabel(url) || 'current page';
|
|
194
|
+
return pattern ? `Finding "${compactText(pattern, 60)}" on ${host}` : `Finding text on ${host}`;
|
|
195
|
+
}
|
|
196
|
+
if (compact.includes('toolsearch')) {
|
|
197
|
+
const selected = String(input['query'] || '').replace(/^select:/i, '').trim();
|
|
198
|
+
return selected ? `Selecting ${compactText(selected, 80)}` : 'Selecting tool';
|
|
199
|
+
}
|
|
200
|
+
if (clean.includes('websearch'))
|
|
201
|
+
return input['query'] ? `Searching ${compactText(input['query'], 80)}` : 'Searching the web';
|
|
202
|
+
if (clean.includes('webfetch'))
|
|
203
|
+
return input['url'] ? `Opening ${hostLabel(input['url'])}` : 'Opening web page';
|
|
204
|
+
if (clean === 'bash' || clean.includes('command'))
|
|
205
|
+
return input['command'] ? `$ ${compactText(input['command'], 120)}` : 'Running command';
|
|
206
|
+
if (clean === 'task' || metadata['subagent'])
|
|
207
|
+
return compactText(input['description'] || metadata['description'] || fallback || 'Running subagent', 120);
|
|
208
|
+
if (error)
|
|
209
|
+
return normalizeError(error)?.message || 'Tool failed';
|
|
210
|
+
return compactText(fallback || humanizeToolName(name), 120);
|
|
211
|
+
}
|
|
212
|
+
export function mcpMetadataFromName(name) {
|
|
213
|
+
const mcp = parseMcpName(name);
|
|
214
|
+
return mcp ? { mcp } : {};
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=tool-shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-shape.js","sourceRoot":"","sources":["../../src/transcript/tool-shape.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @amalgm/chat — turns module barrel. The turn machine's pure laws:
|
|
3
|
+
* the TurnStore tempstore (stores.js), the status vocabulary, the replay
|
|
4
|
+
* grammar (streams.js), and the /active + /runtime-idle query shapes
|
|
5
|
+
* (engine.js:101-118).
|
|
6
|
+
*/
|
|
7
|
+
export { TURN_STATUSES, IDLE_STATUS, ACTIVE_STATUSES, STOP_REASONS, isActiveStatus, isTerminalStatus, type TurnStatus, type QueryStatus, type ActiveStatus, type StopReason, } from './status.js';
|
|
8
|
+
export { TurnStore, addChunkOrThrow, RAW_STREAM_WRITE_FAILED_MESSAGE, type TurnChunk, type TurnEntry, type StartTurnInput, type ChunkFrame, type AddChunkOptions, type TurnListener, } from './turn-store.js';
|
|
9
|
+
export { HEARTBEAT_INTERVAL_MS, KEEP_ALIVE_FRAME, SSE_HEADERS, CHAT_STREAM_FALLBACK_ERROR, jsonSse, namedSse, normalizeAfterIndex, parseAfterIndexParam, findTurn, createTurnTail, createRawTempTail, chatErrorWrites, type ReplayFormat, type TailOutput, type TurnTail, type TurnTailOptions, } from './replay.js';
|
|
10
|
+
export { activeQuery, idleStatusQuery, type ActiveQueryResult, type IdleStatusResult, } from './queries.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/turns/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,SAAS,EACT,eAAe,EACf,+BAA+B,EAC/B,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,0BAA0B,EAC1B,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @amalgm/chat — turns module barrel. The turn machine's pure laws:
|
|
3
|
+
* the TurnStore tempstore (stores.js), the status vocabulary, the replay
|
|
4
|
+
* grammar (streams.js), and the /active + /runtime-idle query shapes
|
|
5
|
+
* (engine.js:101-118).
|
|
6
|
+
*/
|
|
7
|
+
export { TURN_STATUSES, IDLE_STATUS, ACTIVE_STATUSES, STOP_REASONS, isActiveStatus, isTerminalStatus, } from './status.js';
|
|
8
|
+
export { TurnStore, addChunkOrThrow, RAW_STREAM_WRITE_FAILED_MESSAGE, } from './turn-store.js';
|
|
9
|
+
export { HEARTBEAT_INTERVAL_MS, KEEP_ALIVE_FRAME, SSE_HEADERS, CHAT_STREAM_FALLBACK_ERROR, jsonSse, namedSse, normalizeAfterIndex, parseAfterIndexParam, findTurn, createTurnTail, createRawTempTail, chatErrorWrites, } from './replay.js';
|
|
10
|
+
export { activeQuery, idleStatusQuery, } from './queries.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/turns/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,gBAAgB,GAKjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,SAAS,EACT,eAAe,EACf,+BAA+B,GAOhC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,0BAA0B,EAC1B,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,eAAe,GAKhB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,eAAe,GAGhB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn query response shapes — engine `chat-core/engine.js:101-118`, the
|
|
3
|
+
* pure builders behind `GET /active` and `GET /runtime-idle`
|
|
4
|
+
* (server.js:101,45). They read only a TurnStore; the host serializes.
|
|
5
|
+
*/
|
|
6
|
+
import type { TurnStore } from './turn-store.js';
|
|
7
|
+
import { type QueryStatus } from './status.js';
|
|
8
|
+
/** `GET /active` response body (engine.js:101-109). */
|
|
9
|
+
export interface ActiveQueryResult {
|
|
10
|
+
active: boolean;
|
|
11
|
+
codeSessionId: string;
|
|
12
|
+
assistantMessageId: string | null;
|
|
13
|
+
status: QueryStatus;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* `ChatCore.active()` (engine.js:101-109): the session's active entry, with
|
|
17
|
+
* the active flag re-checked against the status predicate (a `cancelling`
|
|
18
|
+
* turn is still active) and `'idle'` synthesized when nothing is stored.
|
|
19
|
+
* Falsy assistantMessageId coerces to null via `||`, as the engine does.
|
|
20
|
+
*/
|
|
21
|
+
export declare function activeQuery(store: TurnStore, sessionId: string): ActiveQueryResult;
|
|
22
|
+
/** `GET /runtime-idle` response body (engine.js:111-118). */
|
|
23
|
+
export interface IdleStatusResult {
|
|
24
|
+
idle: boolean;
|
|
25
|
+
active_turns: number;
|
|
26
|
+
tempstore_count: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `ChatCore.idleStatus()` (engine.js:111-118): idle iff no turn holds a
|
|
30
|
+
* tempstore slot; both counters report the same activeCount. The engine's
|
|
31
|
+
* `typeof this.turns.activeCount === 'function'` guard is dropped — the
|
|
32
|
+
* store is typed here, so activeCount always exists (engineParity: true,
|
|
33
|
+
* guard unreachable).
|
|
34
|
+
*/
|
|
35
|
+
export declare function idleStatusQuery(store: TurnStore): IdleStatusResult;
|
|
36
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/turns/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAe,KAAK,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE5E,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAQlF;AAED,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAOlE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn query response shapes — engine `chat-core/engine.js:101-118`, the
|
|
3
|
+
* pure builders behind `GET /active` and `GET /runtime-idle`
|
|
4
|
+
* (server.js:101,45). They read only a TurnStore; the host serializes.
|
|
5
|
+
*/
|
|
6
|
+
import { IDLE_STATUS, isActiveStatus } from './status.js';
|
|
7
|
+
/**
|
|
8
|
+
* `ChatCore.active()` (engine.js:101-109): the session's active entry, with
|
|
9
|
+
* the active flag re-checked against the status predicate (a `cancelling`
|
|
10
|
+
* turn is still active) and `'idle'` synthesized when nothing is stored.
|
|
11
|
+
* Falsy assistantMessageId coerces to null via `||`, as the engine does.
|
|
12
|
+
*/
|
|
13
|
+
export function activeQuery(store, sessionId) {
|
|
14
|
+
const entry = store.active(sessionId);
|
|
15
|
+
return {
|
|
16
|
+
active: !!entry && isActiveStatus(entry.status),
|
|
17
|
+
codeSessionId: sessionId,
|
|
18
|
+
assistantMessageId: entry?.assistantMessageId || null,
|
|
19
|
+
status: entry?.status || IDLE_STATUS,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `ChatCore.idleStatus()` (engine.js:111-118): idle iff no turn holds a
|
|
24
|
+
* tempstore slot; both counters report the same activeCount. The engine's
|
|
25
|
+
* `typeof this.turns.activeCount === 'function'` guard is dropped — the
|
|
26
|
+
* store is typed here, so activeCount always exists (engineParity: true,
|
|
27
|
+
* guard unreachable).
|
|
28
|
+
*/
|
|
29
|
+
export function idleStatusQuery(store) {
|
|
30
|
+
const tempstoreCount = store.activeCount();
|
|
31
|
+
return {
|
|
32
|
+
idle: tempstoreCount === 0,
|
|
33
|
+
active_turns: tempstoreCount,
|
|
34
|
+
tempstore_count: tempstoreCount,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/turns/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAoB,cAAc,EAAE,MAAM,aAAa,CAAC;AAU5E;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,SAAiB;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/C,aAAa,EAAE,SAAS;QACxB,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,IAAI,IAAI;QACrD,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,WAAW;KACrC,CAAC;AACJ,CAAC;AASD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO;QACL,IAAI,EAAE,cAAc,KAAK,CAAC;QAC1B,YAAY,EAAE,cAAc;QAC5B,eAAe,EAAE,cAAc;KAChC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The replay grammar — engine `chat-core/streams.js` (160 lines), with the
|
|
3
|
+
* host I/O peeled off. streams.js mixes SSE response plumbing (headers,
|
|
4
|
+
* heartbeat timers, `res.write`) with the replay LAW: which payloads a tail
|
|
5
|
+
* emits, in what order, and when the stream closes. This module is the law
|
|
6
|
+
* as pure functions; the host owns the socket, the timer, and the actual
|
|
7
|
+
* subscription wiring.
|
|
8
|
+
*
|
|
9
|
+
* Host contract (mirrors streams.js:97-117):
|
|
10
|
+
* 1. `createTurnTail(entry, options)` — apply `tail.initial` writes; if
|
|
11
|
+
* `initial.end`, close.
|
|
12
|
+
* 2. `store.subscribe(entry.turnId, (chunk, current) => ...)` — feed each
|
|
13
|
+
* emission through `tail.next(chunk, current)`; write its writes; close
|
|
14
|
+
* on `end`. (Subscribe before applying `initial` to match the engine;
|
|
15
|
+
* the cursor guard makes duplicate delivery harmless.)
|
|
16
|
+
* 3. Every `HEARTBEAT_INTERVAL_MS`, write `KEEP_ALIVE_FRAME` while open.
|
|
17
|
+
*/
|
|
18
|
+
import type { TurnChunk, TurnEntry, TurnStore } from './turn-store.js';
|
|
19
|
+
/** Heartbeat cadence (streams.js:5). */
|
|
20
|
+
export declare const HEARTBEAT_INTERVAL_MS = 15000;
|
|
21
|
+
/** The comment frame the heartbeat writes (streams.js:31), byte-exact. */
|
|
22
|
+
export declare const KEEP_ALIVE_FRAME = ": keep-alive\n\n";
|
|
23
|
+
/**
|
|
24
|
+
* The SSE response headers the host must send before any tail write
|
|
25
|
+
* (sse.js:198-204). Documented contract — writing them is host work.
|
|
26
|
+
*/
|
|
27
|
+
export declare const SSE_HEADERS: {
|
|
28
|
+
readonly 'Content-Type': "text/event-stream";
|
|
29
|
+
readonly 'Cache-Control': "no-cache, no-transform";
|
|
30
|
+
readonly Connection: "keep-alive";
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* The two tail formats (streams.js:63):
|
|
34
|
+
* - `frame` — `/chat` live tail: chunk `data` bytes written verbatim.
|
|
35
|
+
* - `raw-temp` — `/raw-temp` replay: named SSE events
|
|
36
|
+
* `existing` {chunks, total} → `chunk` {chunk, total} → `complete` {total}.
|
|
37
|
+
*/
|
|
38
|
+
export type ReplayFormat = 'frame' | 'raw-temp';
|
|
39
|
+
/** Anonymous SSE data frame (streams.js:7-9). */
|
|
40
|
+
export declare function jsonSse(data: unknown): string;
|
|
41
|
+
/** Named SSE event frame (streams.js:11-13). */
|
|
42
|
+
export declare function namedSse(event: string, data: unknown): string;
|
|
43
|
+
/** Cursor normalization (streams.js:58-60): any non-finite value → -1. */
|
|
44
|
+
export declare function normalizeAfterIndex(afterIndex: unknown): number;
|
|
45
|
+
/**
|
|
46
|
+
* Route-layer cursor parse (server.js:43):
|
|
47
|
+
* `Number(searchParams.get('afterIndex') ?? -1)`. A missing param is -1; a
|
|
48
|
+
* garbage param becomes NaN, which {@link normalizeAfterIndex} folds to -1
|
|
49
|
+
* inside the tail. An empty-string param is 0 — engine-faithful quirk.
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseAfterIndexParam(value: string | null): number;
|
|
52
|
+
/**
|
|
53
|
+
* Tail selection (streams.js:120-122): the id is tried as a session first —
|
|
54
|
+
* active turn, else latest-by-session — then as a literal turn id.
|
|
55
|
+
*/
|
|
56
|
+
export declare function findTurn(store: TurnStore, id: string): TurnEntry | null;
|
|
57
|
+
/** One step's output: payloads to write, then whether to close the stream. */
|
|
58
|
+
export interface TailOutput {
|
|
59
|
+
writes: string[];
|
|
60
|
+
end: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface TurnTailOptions {
|
|
63
|
+
/** Defaults to 'frame' (streams.js:63). */
|
|
64
|
+
format?: ReplayFormat;
|
|
65
|
+
/** Replay cursor; non-finite values normalize to -1 (streams.js:64). */
|
|
66
|
+
afterIndex?: number;
|
|
67
|
+
}
|
|
68
|
+
export interface TurnTail {
|
|
69
|
+
/**
|
|
70
|
+
* The backlog pass (streams.js:104-117): existing chunks past the cursor,
|
|
71
|
+
* plus immediate completion when the turn is already terminal.
|
|
72
|
+
*/
|
|
73
|
+
readonly initial: TailOutput;
|
|
74
|
+
/**
|
|
75
|
+
* One subscription emission (streams.js:97-101): a chunk write, or — on a
|
|
76
|
+
* status notification — completion if the status is terminal.
|
|
77
|
+
*/
|
|
78
|
+
next(chunk: TurnChunk | null, current: TurnEntry): TailOutput;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The core of `writeTurnTail` (streams.js:62-118) as a cursor-holding pure
|
|
82
|
+
* state machine. No sockets, no timers: each call returns the exact payload
|
|
83
|
+
* strings the engine would have written.
|
|
84
|
+
*/
|
|
85
|
+
export declare function createTurnTail(entry: TurnEntry, options?: TurnTailOptions): TurnTail;
|
|
86
|
+
/**
|
|
87
|
+
* `writeRawTempStream` selection (streams.js:124-134): resolve the id via
|
|
88
|
+
* {@link findTurn}; `null` means the host answers 404 (no tail exists).
|
|
89
|
+
*/
|
|
90
|
+
export declare function createRawTempTail(store: TurnStore, id: string, afterIndex?: number): {
|
|
91
|
+
entry: TurnEntry;
|
|
92
|
+
tail: TurnTail;
|
|
93
|
+
} | null;
|
|
94
|
+
/**
|
|
95
|
+
* Default error message when a failed turn carries none (streams.js:148).
|
|
96
|
+
*/
|
|
97
|
+
export declare const CHAT_STREAM_FALLBACK_ERROR = "Internal server error";
|
|
98
|
+
/**
|
|
99
|
+
* The frames `/chat` writes when `runTurn` rejects (streams.js:148-152):
|
|
100
|
+
* an error frame, then a complete frame with `stopReason: 'error'`. After
|
|
101
|
+
* writing these the host closes the stream — this is the second half of the
|
|
102
|
+
* save_failed rule: the tail held the socket open so these bytes land first.
|
|
103
|
+
*/
|
|
104
|
+
export declare function chatErrorWrites(message?: string | null): string[];
|
|
105
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/turns/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGvE,wCAAwC;AACxC,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;AAEhD,iDAAiD;AACjD,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED,gDAAgD;AAChD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAE7D;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEvE;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,UAAU,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ,CA4DxF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,MAAM,EACV,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAU7C;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAMjE"}
|