@amalgm/shell 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 +73 -0
- package/README.md +33 -0
- package/dist/automations-host.d.ts +19 -0
- package/dist/automations-host.js +41 -0
- package/dist/automations-host.js.map +1 -0
- package/dist/boot.d.ts +53 -0
- package/dist/boot.js +249 -0
- package/dist/boot.js.map +1 -0
- package/dist/bundle-apps.d.ts +12 -0
- package/dist/bundle-apps.js +71 -0
- package/dist/bundle-apps.js.map +1 -0
- package/dist/bundle-automations.d.ts +8 -0
- package/dist/bundle-automations.js +106 -0
- package/dist/bundle-automations.js.map +1 -0
- package/dist/bundle-bindings.d.ts +8 -0
- package/dist/bundle-bindings.js +101 -0
- package/dist/bundle-bindings.js.map +1 -0
- package/dist/bundle-port.d.ts +14 -0
- package/dist/bundle-port.js +166 -0
- package/dist/bundle-port.js.map +1 -0
- package/dist/chat-host.d.ts +32 -0
- package/dist/chat-host.js +167 -0
- package/dist/chat-host.js.map +1 -0
- package/dist/chat-payloads-host.d.ts +8 -0
- package/dist/chat-payloads-host.js +76 -0
- package/dist/chat-payloads-host.js.map +1 -0
- package/dist/chat-relay-host.d.ts +24 -0
- package/dist/chat-relay-host.js +90 -0
- package/dist/chat-relay-host.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +157 -0
- package/dist/cli.js.map +1 -0
- package/dist/compose.d.ts +32 -0
- package/dist/compose.js +35 -0
- package/dist/compose.js.map +1 -0
- package/dist/credentials-host.d.ts +7 -0
- package/dist/credentials-host.js +143 -0
- package/dist/credentials-host.js.map +1 -0
- package/dist/diagnostics-host.d.ts +3 -0
- package/dist/diagnostics-host.js +92 -0
- package/dist/diagnostics-host.js.map +1 -0
- package/dist/drivers/claude-code.d.ts +27 -0
- package/dist/drivers/claude-code.js +72 -0
- package/dist/drivers/claude-code.js.map +1 -0
- package/dist/event-triggers-host.d.ts +4 -0
- package/dist/event-triggers-host.js +48 -0
- package/dist/event-triggers-host.js.map +1 -0
- package/dist/events-host.d.ts +9 -0
- package/dist/events-host.js +34 -0
- package/dist/events-host.js.map +1 -0
- package/dist/external-proxy-host.d.ts +15 -0
- package/dist/external-proxy-host.js +166 -0
- package/dist/external-proxy-host.js.map +1 -0
- package/dist/filesystem.d.ts +7 -0
- package/dist/filesystem.js +71 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/forward.d.ts +11 -0
- package/dist/forward.js +36 -0
- package/dist/forward.js.map +1 -0
- package/dist/gateway.d.ts +33 -0
- package/dist/gateway.js +85 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/local-host.d.ts +8 -0
- package/dist/local-host.js +101 -0
- package/dist/local-host.js.map +1 -0
- package/dist/machine-host.d.ts +56 -0
- package/dist/machine-host.js +340 -0
- package/dist/machine-host.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -0
- package/dist/parity.d.ts +40 -0
- package/dist/parity.js +108 -0
- package/dist/parity.js.map +1 -0
- package/dist/ports-host.d.ts +8 -0
- package/dist/ports-host.js +26 -0
- package/dist/ports-host.js.map +1 -0
- package/dist/pty-host.d.ts +14 -0
- package/dist/pty-host.js +141 -0
- package/dist/pty-host.js.map +1 -0
- package/dist/release-catalog.d.ts +5 -0
- package/dist/release-catalog.js +23 -0
- package/dist/release-catalog.js.map +1 -0
- package/dist/state-host.d.ts +4 -0
- package/dist/state-host.js +67 -0
- package/dist/state-host.js.map +1 -0
- package/dist/state-store.d.ts +15 -0
- package/dist/state-store.js +63 -0
- package/dist/state-store.js.map +1 -0
- package/dist/user-ground-host.d.ts +58 -0
- package/dist/user-ground-host.js +809 -0
- package/dist/user-ground-host.js.map +1 -0
- package/dist/wire-client.d.ts +44 -0
- package/dist/wire-client.js +235 -0
- package/dist/wire-client.js.map +1 -0
- package/dist/workspace-host.d.ts +5 -0
- package/dist/workspace-host.js +73 -0
- package/dist/workspace-host.js.map +1 -0
- package/dist/workspace-store.d.ts +10 -0
- package/dist/workspace-store.js +47 -0
- package/dist/workspace-store.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
function toolIds(value, found = new Set()) {
|
|
3
|
+
if (Array.isArray(value))
|
|
4
|
+
value.forEach((item) => toolIds(item, found));
|
|
5
|
+
else if (value && typeof value === "object") {
|
|
6
|
+
for (const [key, child] of Object.entries(value)) {
|
|
7
|
+
if ((key === "toolId" || key === "tool_id") && typeof child === "string" && child.trim()) {
|
|
8
|
+
found.add(child.trim());
|
|
9
|
+
}
|
|
10
|
+
toolIds(child, found);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return [...found];
|
|
14
|
+
}
|
|
15
|
+
export async function exportBundleAutomation(crud, automationId) {
|
|
16
|
+
const automation = await crud.automations.get(automationId);
|
|
17
|
+
if (!automation)
|
|
18
|
+
throw new Error(`Automation not found: ${automationId}`);
|
|
19
|
+
const triggers = await crud.triggers.list(automationId);
|
|
20
|
+
const workflow = await crud.workflow.get(automationId);
|
|
21
|
+
if (!triggers.length)
|
|
22
|
+
throw new Error(`Automation has no shareable triggers: ${automationId}`);
|
|
23
|
+
if (!workflow?.script.trim())
|
|
24
|
+
throw new Error(`Automation has no shareable workflow: ${automationId}`);
|
|
25
|
+
const refs = toolIds(workflow.compiled);
|
|
26
|
+
return {
|
|
27
|
+
entry: {
|
|
28
|
+
sourceAutomationId: automation.id,
|
|
29
|
+
automation: { name: automation.name || "Automation", description: automation.description || "" },
|
|
30
|
+
triggers: triggers.map((trigger) => trigger.kind === "schedule" ? {
|
|
31
|
+
kind: "scheduled", enabled: trigger.enabled,
|
|
32
|
+
schedule: { kind: "cron", expr: trigger.cron, tz: trigger.timezone },
|
|
33
|
+
} : {
|
|
34
|
+
kind: "event", enabled: trigger.enabled, source: trigger.source, event: trigger.event,
|
|
35
|
+
}),
|
|
36
|
+
workflows: [{
|
|
37
|
+
name: workflow.name || "Workflow", enabled: true, workflowText: workflow.script,
|
|
38
|
+
allowlist: workflow.allowlist || {}, limits: workflow.limits || {},
|
|
39
|
+
}],
|
|
40
|
+
toolIds: refs,
|
|
41
|
+
},
|
|
42
|
+
toolIds: refs,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async function uniqueName(crud, value) {
|
|
46
|
+
const base = String(value || "Imported automation").trim() || "Imported automation";
|
|
47
|
+
const names = new Set((await crud.automations.list({ limit: 100 })).items
|
|
48
|
+
.map((item) => String(item.name || "").toLowerCase()));
|
|
49
|
+
if (!names.has(base.toLowerCase()))
|
|
50
|
+
return base;
|
|
51
|
+
if (!names.has(`${base} (imported)`.toLowerCase()))
|
|
52
|
+
return `${base} (imported)`;
|
|
53
|
+
for (let index = 2; index < 1000; index += 1) {
|
|
54
|
+
const candidate = `${base} (imported ${index})`;
|
|
55
|
+
if (!names.has(candidate.toLowerCase()))
|
|
56
|
+
return candidate;
|
|
57
|
+
}
|
|
58
|
+
return `${base} (${crypto.randomUUID().slice(0, 8)})`;
|
|
59
|
+
}
|
|
60
|
+
export async function installBundleAutomations(crud, entries, targetId) {
|
|
61
|
+
const installed = [];
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
if (!Array.isArray(entry.triggers) || !entry.triggers.length) {
|
|
64
|
+
throw new Error("automation entry must include at least one trigger");
|
|
65
|
+
}
|
|
66
|
+
if (!Array.isArray(entry.workflows) || entry.workflows.length !== 1) {
|
|
67
|
+
throw new Error("automation entry must include exactly one workflow");
|
|
68
|
+
}
|
|
69
|
+
const workflow = entry.workflows[0];
|
|
70
|
+
if (typeof workflow.workflowText !== "string" || !workflow.workflowText.trim()) {
|
|
71
|
+
throw new Error("automation entry workflows must include workflowText");
|
|
72
|
+
}
|
|
73
|
+
const automation = await crud.automations.create({
|
|
74
|
+
targetId,
|
|
75
|
+
name: await uniqueName(crud, entry.automation?.name),
|
|
76
|
+
description: entry.automation?.description || "",
|
|
77
|
+
enabled: true,
|
|
78
|
+
});
|
|
79
|
+
for (const trigger of entry.triggers) {
|
|
80
|
+
if (trigger.kind === "scheduled" || trigger.kind === "schedule") {
|
|
81
|
+
await crud.triggers.schedule.create(automation.id, {
|
|
82
|
+
cron: trigger.schedule?.expr || trigger.cron,
|
|
83
|
+
timezone: trigger.schedule?.tz || trigger.timezone || "UTC",
|
|
84
|
+
enabled: true,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
await crud.triggers.webhook.create(automation.id, {
|
|
89
|
+
source: trigger.source || "*",
|
|
90
|
+
event: trigger.event || "*",
|
|
91
|
+
secret: crypto.randomBytes(32).toString("hex"),
|
|
92
|
+
enabled: true,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await crud.workflow.create(automation.id, {
|
|
97
|
+
name: workflow.name || "Workflow",
|
|
98
|
+
script: workflow.workflowText,
|
|
99
|
+
allowlist: workflow.allowlist || {},
|
|
100
|
+
limits: workflow.limits || {},
|
|
101
|
+
});
|
|
102
|
+
installed.push(JSON.parse(JSON.stringify(automation)));
|
|
103
|
+
}
|
|
104
|
+
return installed;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=bundle-automations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-automations.js","sourceRoot":"","sources":["../src/bundle-automations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type Json = Record<string, any>;
|
|
2
|
+
/** Engine reference: agent-bundles/tool-bindings.js. */
|
|
3
|
+
export declare function bindAppPaths(record: Json, appDirectories: Map<string, string>): string[];
|
|
4
|
+
export declare function rewriteAppPaths(record: Json, appDirectories: Map<string, string>): {
|
|
5
|
+
record: Json;
|
|
6
|
+
warnings: string[];
|
|
7
|
+
};
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
function object(value) {
|
|
4
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
function canonical(value) {
|
|
7
|
+
try {
|
|
8
|
+
return fs.realpathSync.native(path.resolve(value));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return path.resolve(value);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function relativeWithin(root, target) {
|
|
15
|
+
const relative = path.relative(canonical(root), canonical(target));
|
|
16
|
+
if (relative === "")
|
|
17
|
+
return "";
|
|
18
|
+
if (!relative || relative.startsWith("..") || path.isAbsolute(relative))
|
|
19
|
+
return null;
|
|
20
|
+
return relative;
|
|
21
|
+
}
|
|
22
|
+
function get(record, address) {
|
|
23
|
+
let current = record;
|
|
24
|
+
for (const step of address)
|
|
25
|
+
current = current?.[step];
|
|
26
|
+
return current;
|
|
27
|
+
}
|
|
28
|
+
function set(record, address, value) {
|
|
29
|
+
let current = record;
|
|
30
|
+
for (const step of address.slice(0, -1))
|
|
31
|
+
current = current[step];
|
|
32
|
+
current[address[address.length - 1]] = value;
|
|
33
|
+
}
|
|
34
|
+
function* strings(value, address) {
|
|
35
|
+
if (typeof value === "string") {
|
|
36
|
+
yield [address, value];
|
|
37
|
+
}
|
|
38
|
+
else if (Array.isArray(value)) {
|
|
39
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
40
|
+
yield* strings(value[index], [...address, index]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (object(value)) {
|
|
44
|
+
for (const [key, child] of Object.entries(value))
|
|
45
|
+
yield* strings(child, [...address, key]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function* candidates(record) {
|
|
49
|
+
for (const section of ["source", "sourceAction", "target"]) {
|
|
50
|
+
if (record[section] !== undefined)
|
|
51
|
+
yield* strings(record[section], [section]);
|
|
52
|
+
}
|
|
53
|
+
for (const address of [["guidePath"], ["skillPath"], ["guide", "path"], ["skill", "path"]]) {
|
|
54
|
+
const value = get(record, address);
|
|
55
|
+
if (typeof value === "string")
|
|
56
|
+
yield [address, value];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function label(address) {
|
|
60
|
+
if (address[0] === "source" && address[1] === "cwd")
|
|
61
|
+
return "cwd";
|
|
62
|
+
return address.reduce((result, step) => (typeof step === "number" ? `${result}[${step}]` : result ? `${result}.${step}` : step), "");
|
|
63
|
+
}
|
|
64
|
+
/** Engine reference: agent-bundles/tool-bindings.js. */
|
|
65
|
+
export function bindAppPaths(record, appDirectories) {
|
|
66
|
+
const bindings = [];
|
|
67
|
+
const unbound = [];
|
|
68
|
+
for (const [address, value] of candidates(record)) {
|
|
69
|
+
if (!path.isAbsolute(value))
|
|
70
|
+
continue;
|
|
71
|
+
let found = false;
|
|
72
|
+
for (const [appId, directory] of appDirectories) {
|
|
73
|
+
const relative = relativeWithin(directory, value);
|
|
74
|
+
if (relative === null)
|
|
75
|
+
continue;
|
|
76
|
+
bindings.push({ appId, path: address, relative });
|
|
77
|
+
found = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
if (!found)
|
|
81
|
+
unbound.push(label(address));
|
|
82
|
+
}
|
|
83
|
+
if (bindings.length)
|
|
84
|
+
record.appPathBindings = bindings;
|
|
85
|
+
return unbound;
|
|
86
|
+
}
|
|
87
|
+
export function rewriteAppPaths(record, appDirectories) {
|
|
88
|
+
const rewritten = structuredClone(record);
|
|
89
|
+
const warnings = [];
|
|
90
|
+
for (const binding of Array.isArray(rewritten.appPathBindings) ? rewritten.appPathBindings : []) {
|
|
91
|
+
const directory = appDirectories.get(String(binding.appId));
|
|
92
|
+
if (!directory) {
|
|
93
|
+
warnings.push(`${record.id || "tool"}: ${label(binding.path)} is bound to missing app ${binding.appId}`);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
set(rewritten, binding.path, binding.relative ? path.join(directory, binding.relative) : directory);
|
|
97
|
+
}
|
|
98
|
+
delete rewritten.appPathBindings;
|
|
99
|
+
return { record: rewritten, warnings };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=bundle-bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-bindings.js","sourceRoot":"","sources":["../src/bundle-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,MAAc;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,GAAG,CAAC,MAAY,EAAE,OAAgB;IACzC,IAAI,OAAO,GAAQ,MAAM,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,OAAO;QAAE,OAAO,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,GAAG,CAAC,MAAY,EAAE,OAAgB,EAAE,KAAa;IACxD,IAAI,OAAO,GAAQ,MAAM,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC;AAChD,CAAC;AAED,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAc,EAAE,OAAgB;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,CAAC,UAAU,CAAC,MAAY;IAC/B,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3D,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QAC3F,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,OAAgB;IAC7B,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,OAAO,CAAC,MAAM,CAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAC9C,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACtF,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,MAAY,EAAE,cAAmC;IAC5E,MAAM,QAAQ,GAA8D,EAAE,CAAC;IAC/E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QACtC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,cAAc,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,QAAQ,KAAK,IAAI;gBAAE,SAAS;YAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,KAAK,GAAG,IAAI,CAAC;YACb,MAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM;QAAE,MAAM,CAAC,eAAe,GAAG,QAAQ,CAAC;IACvD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAY,EACZ,cAAmC;IAEnC,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChG,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACzG,SAAS;QACX,CAAC;QACD,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,SAAS,CAAC,eAAe,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentBundlePort } from "@amalgm/agents";
|
|
2
|
+
import type { Apps } from "@amalgm/apps";
|
|
3
|
+
import type { AutomationCrud } from "@amalgm/automations";
|
|
4
|
+
import type { Toolbox } from "@amalgm/tools";
|
|
5
|
+
export interface ShellBundlePortOptions {
|
|
6
|
+
apps: Apps;
|
|
7
|
+
toolbox: Toolbox;
|
|
8
|
+
automations?: {
|
|
9
|
+
crud: AutomationCrud;
|
|
10
|
+
targetId?: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Host composition for Engine's agent-bundles export/install resource ports. */
|
|
14
|
+
export declare function createShellBundlePort(options: ShellBundlePortOptions): AgentBundlePort;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { exportBundleApp, installBundleApps } from "./bundle-apps.js";
|
|
2
|
+
import { exportBundleAutomation, installBundleAutomations } from "./bundle-automations.js";
|
|
3
|
+
import { bindAppPaths, rewriteAppPaths } from "./bundle-bindings.js";
|
|
4
|
+
function emptyRequirements() {
|
|
5
|
+
return { bindings: [], systemTools: [], systemActions: [], missingTools: [] };
|
|
6
|
+
}
|
|
7
|
+
function clone(value) {
|
|
8
|
+
return structuredClone(value);
|
|
9
|
+
}
|
|
10
|
+
function toolDefinition(record, actions, installedAppId) {
|
|
11
|
+
if (!record.source || typeof record.source !== "object")
|
|
12
|
+
throw new Error(`Tool ${record.id} has no source`);
|
|
13
|
+
return {
|
|
14
|
+
id: String(record.id),
|
|
15
|
+
name: String(record.name || record.id),
|
|
16
|
+
description: record.description,
|
|
17
|
+
owner: record.owner,
|
|
18
|
+
origin: record.origin === "catalog" ? "catalog" : "user",
|
|
19
|
+
status: record.status === "disabled" ? "disabled" : "enabled",
|
|
20
|
+
source: record.source,
|
|
21
|
+
display: record.display,
|
|
22
|
+
policy: record.policy,
|
|
23
|
+
metadata: {
|
|
24
|
+
...(record.metadata || {}),
|
|
25
|
+
...(installedAppId ? { appId: installedAppId } : {}),
|
|
26
|
+
},
|
|
27
|
+
actions: actions.map((action) => ({
|
|
28
|
+
id: action.id,
|
|
29
|
+
name: action.name,
|
|
30
|
+
displayName: action.displayName,
|
|
31
|
+
description: action.description,
|
|
32
|
+
inputSchema: action.inputSchema,
|
|
33
|
+
outputSchema: action.outputSchema,
|
|
34
|
+
status: action.status,
|
|
35
|
+
target: action.target,
|
|
36
|
+
policy: action.policy,
|
|
37
|
+
metadata: action.metadata,
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Host composition for Engine's agent-bundles export/install resource ports. */
|
|
42
|
+
export function createShellBundlePort(options) {
|
|
43
|
+
return {
|
|
44
|
+
async exportResources(input) {
|
|
45
|
+
const requirements = emptyRequirements();
|
|
46
|
+
const automationEntries = [];
|
|
47
|
+
const toolRefs = [...input.toolIds];
|
|
48
|
+
for (const id of input.automationIds) {
|
|
49
|
+
if (!options.automations)
|
|
50
|
+
throw new Error("Automations bundle export requires an Automations host");
|
|
51
|
+
const exported = await exportBundleAutomation(options.automations.crud, id);
|
|
52
|
+
automationEntries.push(exported.entry);
|
|
53
|
+
toolRefs.push(...exported.toolIds);
|
|
54
|
+
requirements.bindings.push(`automation:${id}:targetId`);
|
|
55
|
+
}
|
|
56
|
+
const catalog = options.toolbox.catalog();
|
|
57
|
+
const toolById = new Map(catalog.tools.map((tool) => [tool.id, tool]));
|
|
58
|
+
const actionById = new Map(catalog.actions.map((action) => [action.id, action]));
|
|
59
|
+
const appById = new Map(options.apps.list().map((app) => [app.id, app]));
|
|
60
|
+
const toolIds = [];
|
|
61
|
+
const appIds = [...input.appIds];
|
|
62
|
+
const appExports = new Map();
|
|
63
|
+
let toolCursor = 0;
|
|
64
|
+
let appCursor = 0;
|
|
65
|
+
while (toolCursor < toolRefs.length || appCursor < appIds.length) {
|
|
66
|
+
if (toolCursor < toolRefs.length) {
|
|
67
|
+
const ref = toolRefs[toolCursor++];
|
|
68
|
+
const action = actionById.get(ref);
|
|
69
|
+
const tool = toolById.get(ref) || (action ? toolById.get(action.toolId) : undefined);
|
|
70
|
+
if (!tool) {
|
|
71
|
+
if (!requirements.missingTools.includes(ref))
|
|
72
|
+
requirements.missingTools.push(ref);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
if (!toolIds.includes(tool.id))
|
|
76
|
+
toolIds.push(tool.id);
|
|
77
|
+
const metadataAppId = typeof tool.metadata?.appId === "string" ? tool.metadata.appId : "";
|
|
78
|
+
const owner = metadataAppId || [...appById.values()].find((app) => app.toolIds.includes(tool.id))?.id;
|
|
79
|
+
if (owner && !appIds.includes(owner))
|
|
80
|
+
appIds.push(owner);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (appCursor < appIds.length) {
|
|
84
|
+
const id = appIds[appCursor++];
|
|
85
|
+
if (!appById.has(id))
|
|
86
|
+
throw new Error(`App not found: ${id}`);
|
|
87
|
+
const exported = exportBundleApp(options.apps, id);
|
|
88
|
+
appExports.set(id, exported);
|
|
89
|
+
for (const toolId of exported.entry.toolIds) {
|
|
90
|
+
if (!toolRefs.includes(toolId))
|
|
91
|
+
toolRefs.push(toolId);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const appDirectories = new Map([...appExports].map(([id, value]) => [id, value.sourceDir]));
|
|
96
|
+
const tools = toolIds.map((id) => {
|
|
97
|
+
const tool = clone(toolById.get(id));
|
|
98
|
+
const owner = [...appExports].find(([, value]) => value.entry.toolIds.includes(id))?.[0];
|
|
99
|
+
if (owner)
|
|
100
|
+
tool.appId = owner;
|
|
101
|
+
if (tool.origin === "system")
|
|
102
|
+
requirements.systemTools.push(id);
|
|
103
|
+
for (const field of bindAppPaths(tool, appDirectories)) {
|
|
104
|
+
requirements.bindings.push(`tool:${id}:${field}`);
|
|
105
|
+
}
|
|
106
|
+
return tool;
|
|
107
|
+
});
|
|
108
|
+
const actions = catalog.actions.filter((action) => toolIds.includes(action.toolId)).map((action) => {
|
|
109
|
+
const record = clone(action);
|
|
110
|
+
const owner = tools.find((tool) => tool.id === action.toolId)?.appId;
|
|
111
|
+
if (owner)
|
|
112
|
+
record.appId = owner;
|
|
113
|
+
for (const field of bindAppPaths(record, appDirectories)) {
|
|
114
|
+
requirements.bindings.push(`toolAction:${action.id}:${field}`);
|
|
115
|
+
}
|
|
116
|
+
return record;
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
automations: automationEntries,
|
|
120
|
+
apps: [...appExports.values()].map((value) => value.entry),
|
|
121
|
+
tools,
|
|
122
|
+
toolActions: actions,
|
|
123
|
+
requires: requirements,
|
|
124
|
+
warnings: [
|
|
125
|
+
...(automationEntries.length ? ["This bundle includes executable automation workflows."] : []),
|
|
126
|
+
...(appExports.size ? ["This bundle includes app build and start commands."] : []),
|
|
127
|
+
],
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
async installResources(bundle) {
|
|
131
|
+
const appResult = await installBundleApps(options.apps, bundle.apps);
|
|
132
|
+
const warnings = [];
|
|
133
|
+
const installedTools = [];
|
|
134
|
+
const actionsByTool = new Map();
|
|
135
|
+
for (const action of bundle.toolActions) {
|
|
136
|
+
actionsByTool.set(String(action.toolId), [...(actionsByTool.get(String(action.toolId)) || []), action]);
|
|
137
|
+
}
|
|
138
|
+
for (const bundled of bundle.tools) {
|
|
139
|
+
if (bundled.origin === "system")
|
|
140
|
+
continue;
|
|
141
|
+
const rewritten = rewriteAppPaths(bundled, appResult.directories);
|
|
142
|
+
warnings.push(...rewritten.warnings);
|
|
143
|
+
const sourceAppId = typeof bundled.appId === "string" ? bundled.appId : "";
|
|
144
|
+
const installedAppId = sourceAppId ? appResult.ids.get(sourceAppId) : undefined;
|
|
145
|
+
const result = await options.toolbox.apply(toolDefinition(rewritten.record, actionsByTool.get(String(bundled.id)) || [], installedAppId));
|
|
146
|
+
installedTools.push(JSON.parse(JSON.stringify(result.tool)));
|
|
147
|
+
}
|
|
148
|
+
let installedAutomations = [];
|
|
149
|
+
if (bundle.automations.length) {
|
|
150
|
+
if (!options.automations)
|
|
151
|
+
throw new Error("Automations bundle install requires an Automations host");
|
|
152
|
+
if (!options.automations.targetId) {
|
|
153
|
+
throw new Error("Automations bundle install requires an owner-selected targetId");
|
|
154
|
+
}
|
|
155
|
+
installedAutomations = await installBundleAutomations(options.automations.crud, bundle.automations, options.automations.targetId);
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
installedApps: appResult.installed,
|
|
159
|
+
installedTools,
|
|
160
|
+
installedAutomations,
|
|
161
|
+
warnings,
|
|
162
|
+
};
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=bundle-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-port.js","sourceRoot":"","sources":["../src/bundle-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TurnStore } from "@amalgm/chat/turns";
|
|
2
|
+
import type { TurnEntry } from "@amalgm/chat/turns";
|
|
3
|
+
import type { ChatRelayHostConfig } from "./chat-relay-host.js";
|
|
4
|
+
import type { BrickMount } from "./gateway.js";
|
|
5
|
+
/** The one capability the shell injects: something that runs a turn. */
|
|
6
|
+
export interface ChatDriver {
|
|
7
|
+
run(input: {
|
|
8
|
+
sessionId: string;
|
|
9
|
+
turnId: string;
|
|
10
|
+
prompt: string;
|
|
11
|
+
}, emit: (event: Record<string, unknown>) => void): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface ChatHostConfig {
|
|
14
|
+
driver: ChatDriver;
|
|
15
|
+
clockMs?: () => number;
|
|
16
|
+
relay: Omit<ChatRelayHostConfig, "turnForSession">;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The chat brick's documented host contract, composed: TurnStore holds the
|
|
20
|
+
* raw stream, the replay tail decides every byte written, the driver is the
|
|
21
|
+
* only injected behavior. Socket, timer, and subscription wiring live here —
|
|
22
|
+
* nothing else does.
|
|
23
|
+
*/
|
|
24
|
+
export declare class ChatHost {
|
|
25
|
+
#private;
|
|
26
|
+
readonly store: TurnStore;
|
|
27
|
+
constructor(config: ChatHostConfig);
|
|
28
|
+
startTurn(sessionId: string, prompt: string): TurnEntry;
|
|
29
|
+
stop(sessionId: string): boolean;
|
|
30
|
+
/** The chat service surface as gateway mounts, one per engine prefix. */
|
|
31
|
+
mounts(): BrickMount[];
|
|
32
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { HEARTBEAT_INTERVAL_MS, KEEP_ALIVE_FRAME, TurnStore, activeQuery, addChunkOrThrow, chatErrorWrites, createRawTempTail, createTurnTail, findTurn, parseAfterIndexParam, } from "@amalgm/chat/turns";
|
|
3
|
+
import { frameFor, withSseId, writeSseHeaders } from "@amalgm/chat/wire";
|
|
4
|
+
import { ChatRelayHost } from "./chat-relay-host.js";
|
|
5
|
+
/**
|
|
6
|
+
* The chat brick's documented host contract, composed: TurnStore holds the
|
|
7
|
+
* raw stream, the replay tail decides every byte written, the driver is the
|
|
8
|
+
* only injected behavior. Socket, timer, and subscription wiring live here —
|
|
9
|
+
* nothing else does.
|
|
10
|
+
*/
|
|
11
|
+
export class ChatHost {
|
|
12
|
+
store;
|
|
13
|
+
#driver;
|
|
14
|
+
#relay;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.#driver = config.driver;
|
|
17
|
+
this.store = new TurnStore(config.clockMs ?? (() => Date.now()));
|
|
18
|
+
this.#relay = new ChatRelayHost({
|
|
19
|
+
...config.relay,
|
|
20
|
+
turnForSession: (sessionId) => {
|
|
21
|
+
const turn = this.store.active(sessionId) ?? this.store.latest(sessionId);
|
|
22
|
+
return turn ? {
|
|
23
|
+
turnId: turn.turnId,
|
|
24
|
+
assistantMessageId: turn.assistantMessageId ?? undefined,
|
|
25
|
+
} : null;
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
startTurn(sessionId, prompt) {
|
|
30
|
+
const turnId = randomUUID();
|
|
31
|
+
const entry = this.store.start({
|
|
32
|
+
sessionId,
|
|
33
|
+
turnId,
|
|
34
|
+
assistantMessageId: randomUUID(),
|
|
35
|
+
userMessageId: randomUUID(),
|
|
36
|
+
});
|
|
37
|
+
void this.#run(sessionId, turnId, prompt);
|
|
38
|
+
return entry;
|
|
39
|
+
}
|
|
40
|
+
async #run(sessionId, turnId, prompt) {
|
|
41
|
+
try {
|
|
42
|
+
await this.#driver.run({ sessionId, turnId, prompt }, (event) => {
|
|
43
|
+
addChunkOrThrow(this.store, turnId, (index) => withSseId(frameFor(event), index));
|
|
44
|
+
});
|
|
45
|
+
this.store.mark(turnId, "complete");
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const message = error instanceof Error ? error.message : null;
|
|
49
|
+
for (const frame of chatErrorWrites(message)) {
|
|
50
|
+
this.store.addChunk(turnId, frame);
|
|
51
|
+
}
|
|
52
|
+
this.store.mark(turnId, "error");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
stop(sessionId) {
|
|
56
|
+
const active = this.store.active(sessionId);
|
|
57
|
+
if (!active)
|
|
58
|
+
return false;
|
|
59
|
+
this.store.mark(active.turnId, "cancelled");
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
/** Tail a turn onto an SSE response per the replay contract. */
|
|
63
|
+
#tail(entry, res, format, afterIndex) {
|
|
64
|
+
writeSseHeaders(res);
|
|
65
|
+
const tail = format === "raw-temp"
|
|
66
|
+
? createRawTempTail(this.store, entry.turnId, afterIndex).tail
|
|
67
|
+
: createTurnTail(entry, { format, afterIndex });
|
|
68
|
+
let open = true;
|
|
69
|
+
const heartbeat = setInterval(() => {
|
|
70
|
+
if (open)
|
|
71
|
+
res.write(KEEP_ALIVE_FRAME);
|
|
72
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
73
|
+
const close = () => {
|
|
74
|
+
if (!open)
|
|
75
|
+
return;
|
|
76
|
+
open = false;
|
|
77
|
+
clearInterval(heartbeat);
|
|
78
|
+
unsubscribe();
|
|
79
|
+
res.end();
|
|
80
|
+
};
|
|
81
|
+
// Subscribe before applying `initial` — the cursor guard makes duplicate
|
|
82
|
+
// delivery harmless, exactly as the contract prescribes.
|
|
83
|
+
const unsubscribe = this.store.subscribe(entry.turnId, (chunk, current) => {
|
|
84
|
+
const out = tail.next(chunk, current);
|
|
85
|
+
for (const write of out.writes)
|
|
86
|
+
res.write(write);
|
|
87
|
+
if (out.end)
|
|
88
|
+
close();
|
|
89
|
+
});
|
|
90
|
+
res.on("close", close);
|
|
91
|
+
for (const write of tail.initial.writes)
|
|
92
|
+
res.write(write);
|
|
93
|
+
if (tail.initial.end)
|
|
94
|
+
close();
|
|
95
|
+
}
|
|
96
|
+
/** The chat service surface as gateway mounts, one per engine prefix. */
|
|
97
|
+
mounts() {
|
|
98
|
+
const dispatch = async (req, res, pathname) => {
|
|
99
|
+
const url = new URL(req.url ?? "/", "http://localhost");
|
|
100
|
+
const respond = (status, body) => {
|
|
101
|
+
res.writeHead(status, { "Content-Type": "application/json" });
|
|
102
|
+
res.end(JSON.stringify(body));
|
|
103
|
+
};
|
|
104
|
+
if (pathname === "/chat" && req.method === "POST") {
|
|
105
|
+
const body = await readJson(req);
|
|
106
|
+
const sessionId = String(body.sessionId ?? "");
|
|
107
|
+
const prompt = String(body.prompt ?? "");
|
|
108
|
+
if (!sessionId)
|
|
109
|
+
return respond(400, { error: "sessionId is required" });
|
|
110
|
+
const contract = this.#relay.registerInput(body, sessionId);
|
|
111
|
+
if (contract && contract.sessionId !== sessionId) {
|
|
112
|
+
return respond(400, { error: "relay contract sessionId does not match chat sessionId" });
|
|
113
|
+
}
|
|
114
|
+
const entry = this.startTurn(sessionId, prompt);
|
|
115
|
+
this.#tail(entry, res, "frame", -1);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const id = pathname.split("/")[2] ?? "";
|
|
119
|
+
if (pathname.startsWith("/raw-temp/") && req.method === "GET") {
|
|
120
|
+
const afterIndex = parseAfterIndexParam(url.searchParams.get("afterIndex"));
|
|
121
|
+
const found = createRawTempTail(this.store, id, afterIndex);
|
|
122
|
+
if (!found)
|
|
123
|
+
return respond(404, { error: "not found" });
|
|
124
|
+
this.#tail(found.entry, res, "raw-temp", afterIndex);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (pathname.startsWith("/active/") && req.method === "GET") {
|
|
128
|
+
return respond(200, activeQuery(this.store, id));
|
|
129
|
+
}
|
|
130
|
+
if (pathname.startsWith("/stop/") && req.method === "POST") {
|
|
131
|
+
return respond(200, { stopped: this.stop(id) });
|
|
132
|
+
}
|
|
133
|
+
if (pathname.startsWith("/destroy/") && req.method === "POST") {
|
|
134
|
+
this.stop(id);
|
|
135
|
+
const latest = this.store.latest(id);
|
|
136
|
+
if (latest)
|
|
137
|
+
this.store.clear(latest.turnId);
|
|
138
|
+
this.#relay.forget(id);
|
|
139
|
+
return respond(200, { destroyed: true });
|
|
140
|
+
}
|
|
141
|
+
if (findTurn(this.store, id))
|
|
142
|
+
return respond(405, { error: "method not allowed" });
|
|
143
|
+
return respond(404, { error: "not found" });
|
|
144
|
+
};
|
|
145
|
+
return [
|
|
146
|
+
...["/chat", "/raw-temp", "/active", "/stop", "/destroy"].map((prefix) => ({
|
|
147
|
+
prefix,
|
|
148
|
+
stream: dispatch,
|
|
149
|
+
})),
|
|
150
|
+
...this.#relay.mounts(),
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function readJson(req) {
|
|
155
|
+
const chunks = [];
|
|
156
|
+
for await (const chunk of req)
|
|
157
|
+
chunks.push(chunk);
|
|
158
|
+
const raw = Buffer.concat(chunks).toString("utf8");
|
|
159
|
+
try {
|
|
160
|
+
const parsed = raw ? JSON.parse(raw) : {};
|
|
161
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return {};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=chat-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-host.js","sourceRoot":"","sources":["../src/chat-host.ts"],"names":[],"mappings":"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"}
|