@corenel/harness 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/dist/compression.d.ts +11 -0
- package/dist/compression.d.ts.map +1 -0
- package/dist/compression.js +27 -0
- package/dist/compression.js.map +1 -0
- package/dist/conversation.d.ts +29 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +25 -0
- package/dist/conversation.js.map +1 -0
- package/dist/core/loop.d.ts +31 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +237 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/dag/executeNode.d.ts +41 -0
- package/dist/dag/executeNode.d.ts.map +1 -0
- package/dist/dag/executeNode.js +81 -0
- package/dist/dag/executeNode.js.map +1 -0
- package/dist/fileSchema.d.ts +7 -0
- package/dist/fileSchema.d.ts.map +1 -0
- package/dist/fileSchema.js +40 -0
- package/dist/fileSchema.js.map +1 -0
- package/dist/guardrail/builtins.d.ts +9 -0
- package/dist/guardrail/builtins.d.ts.map +1 -0
- package/dist/guardrail/builtins.js +61 -0
- package/dist/guardrail/builtins.js.map +1 -0
- package/dist/guardrail/glob.d.ts +3 -0
- package/dist/guardrail/glob.d.ts.map +1 -0
- package/dist/guardrail/glob.js +33 -0
- package/dist/guardrail/glob.js.map +1 -0
- package/dist/guardrail/guardrail.d.ts +25 -0
- package/dist/guardrail/guardrail.d.ts.map +1 -0
- package/dist/guardrail/guardrail.js +67 -0
- package/dist/guardrail/guardrail.js.map +1 -0
- package/dist/guardrail/index.d.ts +9 -0
- package/dist/guardrail/index.d.ts.map +1 -0
- package/dist/guardrail/index.js +11 -0
- package/dist/guardrail/index.js.map +1 -0
- package/dist/guardrail/permission-service.d.ts +53 -0
- package/dist/guardrail/permission-service.d.ts.map +1 -0
- package/dist/guardrail/permission-service.js +147 -0
- package/dist/guardrail/permission-service.js.map +1 -0
- package/dist/guardrail/serialize.d.ts +9 -0
- package/dist/guardrail/serialize.d.ts.map +1 -0
- package/dist/guardrail/serialize.js +53 -0
- package/dist/guardrail/serialize.js.map +1 -0
- package/dist/guardrail/store.d.ts +26 -0
- package/dist/guardrail/store.d.ts.map +1 -0
- package/dist/guardrail/store.js +109 -0
- package/dist/guardrail/store.js.map +1 -0
- package/dist/guardrail/validate.d.ts +8 -0
- package/dist/guardrail/validate.d.ts.map +1 -0
- package/dist/guardrail/validate.js +105 -0
- package/dist/guardrail/validate.js.map +1 -0
- package/dist/guards.d.ts +37 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +45 -0
- package/dist/guards.js.map +1 -0
- package/dist/log.d.ts +4 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +22 -0
- package/dist/log.js.map +1 -0
- package/dist/promptCompiler.d.ts +18 -0
- package/dist/promptCompiler.d.ts.map +1 -0
- package/dist/promptCompiler.js +11 -0
- package/dist/promptCompiler.js.map +1 -0
- package/dist/prompts/config.d.ts +63 -0
- package/dist/prompts/config.d.ts.map +1 -0
- package/dist/prompts/config.js +268 -0
- package/dist/prompts/config.js.map +1 -0
- package/dist/prompts/host.d.ts +30 -0
- package/dist/prompts/host.d.ts.map +1 -0
- package/dist/prompts/host.js +11 -0
- package/dist/prompts/host.js.map +1 -0
- package/dist/prompts/index.d.ts +50 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +105 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/library/defaults.generated.d.ts +2 -0
- package/dist/prompts/library/defaults.generated.d.ts.map +1 -0
- package/dist/prompts/library/defaults.generated.js +31 -0
- package/dist/prompts/library/defaults.generated.js.map +1 -0
- package/dist/prompts/library/index.d.ts +8 -0
- package/dist/prompts/library/index.d.ts.map +1 -0
- package/dist/prompts/library/index.js +28 -0
- package/dist/prompts/library/index.js.map +1 -0
- package/dist/providers/gateway.d.ts +58 -0
- package/dist/providers/gateway.d.ts.map +1 -0
- package/dist/providers/gateway.js +145 -0
- package/dist/providers/gateway.js.map +1 -0
- package/dist/services.d.ts +29 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +22 -0
- package/dist/services.js.map +1 -0
- package/dist/sidecar/host.d.ts +69 -0
- package/dist/sidecar/host.d.ts.map +1 -0
- package/dist/sidecar/host.js +228 -0
- package/dist/sidecar/host.js.map +1 -0
- package/dist/sidecar/server.d.ts +42 -0
- package/dist/sidecar/server.d.ts.map +1 -0
- package/dist/sidecar/server.js +267 -0
- package/dist/sidecar/server.js.map +1 -0
- package/dist/skills.d.ts +39 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +216 -0
- package/dist/skills.js.map +1 -0
- package/dist/systemParts.d.ts +10 -0
- package/dist/systemParts.d.ts.map +1 -0
- package/dist/systemParts.js +21 -0
- package/dist/systemParts.js.map +1 -0
- package/dist/todos.d.ts +34 -0
- package/dist/todos.d.ts.map +1 -0
- package/dist/todos.js +112 -0
- package/dist/todos.js.map +1 -0
- package/dist/tools/builtins.d.ts +20 -0
- package/dist/tools/builtins.d.ts.map +1 -0
- package/dist/tools/builtins.js +335 -0
- package/dist/tools/builtins.js.map +1 -0
- package/dist/tools/files.d.ts +11 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +161 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/http.d.ts +3 -0
- package/dist/tools/http.d.ts.map +1 -0
- package/dist/tools/http.js +71 -0
- package/dist/tools/http.js.map +1 -0
- package/dist/tools/namespaces.d.ts +27 -0
- package/dist/tools/namespaces.d.ts.map +1 -0
- package/dist/tools/namespaces.js +83 -0
- package/dist/tools/namespaces.js.map +1 -0
- package/dist/tools/registry.d.ts +8 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +14 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/sessions.d.ts +3 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +149 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/todo.d.ts +3 -0
- package/dist/tools/todo.d.ts.map +1 -0
- package/dist/tools/todo.js +38 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/urlGuard.d.ts +9 -0
- package/dist/tools/urlGuard.d.ts.map +1 -0
- package/dist/tools/urlGuard.js +80 -0
- package/dist/tools/urlGuard.js.map +1 -0
- package/dist/tools/web.d.ts +3 -0
- package/dist/tools/web.d.ts.map +1 -0
- package/dist/tools/web.js +35 -0
- package/dist/tools/web.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AgentTool } from '@corenel/protocol';
|
|
2
|
+
import { type SidecarChannel } from '@corenel/protocol';
|
|
3
|
+
export interface SidecarServerOptions {
|
|
4
|
+
channel: SidecarChannel;
|
|
5
|
+
/** The pairing token a connecting host must present. */
|
|
6
|
+
token: string;
|
|
7
|
+
/** The tools this sidecar exposes — real implementations. */
|
|
8
|
+
tools: AgentTool[];
|
|
9
|
+
}
|
|
10
|
+
export declare class SidecarServer {
|
|
11
|
+
private readonly ch;
|
|
12
|
+
private readonly opts;
|
|
13
|
+
private readonly tools;
|
|
14
|
+
private authed;
|
|
15
|
+
private hostSeq;
|
|
16
|
+
private readonly hostPending;
|
|
17
|
+
constructor(opts: SidecarServerOptions);
|
|
18
|
+
private onMessage;
|
|
19
|
+
private onHello;
|
|
20
|
+
/** Proxy a host HTTP request server-side. Restricted to LOOPBACK targets — the
|
|
21
|
+
* sidecar must never be usable as an SSRF pivot to internal/metadata hosts. The
|
|
22
|
+
* response streams back (http-res -> http-chunk* -> http-end). */
|
|
23
|
+
private onHttpReq;
|
|
24
|
+
private onInvoke;
|
|
25
|
+
/** A ToolContext whose capabilities proxy back to the host (persist-nothing).
|
|
26
|
+
* The stores, the host's file workspace, and the user prompts (confirm/ask) all
|
|
27
|
+
* round-trip over the channel. confirm/ask default to allow/dismiss when the
|
|
28
|
+
* host wired no handler — the host already gated the tool call before dispatch,
|
|
29
|
+
* so an unwired secondary prompt must not deadlock the tool. */
|
|
30
|
+
private makeContext;
|
|
31
|
+
private hostCall;
|
|
32
|
+
private readonly memory;
|
|
33
|
+
private readonly kv;
|
|
34
|
+
private readonly search;
|
|
35
|
+
private readonly sessions;
|
|
36
|
+
/** The host's file workspace, proxied. Metadata is a default — the methods are
|
|
37
|
+
* what a sidecar tool uses; onChange is a no-op (the host UI owns refresh). */
|
|
38
|
+
private readonly files;
|
|
39
|
+
private readonly confirm;
|
|
40
|
+
private readonly ask;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../sidecar/server.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,SAAS,EAGV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAuBD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,IAAI,EAAE,oBAAoB;IAOtC,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,OAAO;IAgBf;;sEAEkE;YACpD,SAAS;YAwBT,QAAQ;IActB;;;;oEAIgE;IAChE,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAKrB;IAEF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAKjB;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IAEF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAOvB;IAEF;mFAC+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAcpB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC2D;IAEnF,OAAO,CAAC,QAAQ,CAAC,GAAG,CACuE;CAC5F"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { SIDECAR_PROTOCOL, errMessage, isLoopbackHost, } from '@corenel/protocol';
|
|
2
|
+
/** Base64-encode bytes without a Node Buffer (btoa is in the browser + Node 18+),
|
|
3
|
+
* so this module stays free of node:* types for the shared harness build. */
|
|
4
|
+
function bytesToB64(bytes) {
|
|
5
|
+
let bin = '';
|
|
6
|
+
for (let i = 0; i < bytes.length; i++)
|
|
7
|
+
bin += String.fromCharCode(bytes[i]);
|
|
8
|
+
return btoa(bin);
|
|
9
|
+
}
|
|
10
|
+
/** Constant-time string compare for the pairing token — avoids leaking it via the
|
|
11
|
+
* early-exit timing of `!==`. Pure JS so this stays host-agnostic (no node:crypto in
|
|
12
|
+
* a possibly-bundled module). The token is a fixed-length hex string, so comparing
|
|
13
|
+
* lengths first reveals nothing secret. */
|
|
14
|
+
function safeEqual(a, b) {
|
|
15
|
+
if (a.length !== b.length)
|
|
16
|
+
return false;
|
|
17
|
+
let diff = 0;
|
|
18
|
+
for (let i = 0; i < a.length; i++)
|
|
19
|
+
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
20
|
+
return diff === 0;
|
|
21
|
+
}
|
|
22
|
+
export class SidecarServer {
|
|
23
|
+
constructor(opts) {
|
|
24
|
+
Object.defineProperty(this, "ch", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
configurable: true,
|
|
27
|
+
writable: true,
|
|
28
|
+
value: void 0
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(this, "opts", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
configurable: true,
|
|
33
|
+
writable: true,
|
|
34
|
+
value: void 0
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(this, "tools", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
writable: true,
|
|
40
|
+
value: new Map()
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(this, "authed", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
configurable: true,
|
|
45
|
+
writable: true,
|
|
46
|
+
value: false
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(this, "hostSeq", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
configurable: true,
|
|
51
|
+
writable: true,
|
|
52
|
+
value: 0
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(this, "hostPending", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
configurable: true,
|
|
57
|
+
writable: true,
|
|
58
|
+
value: new Map()
|
|
59
|
+
});
|
|
60
|
+
Object.defineProperty(this, "memory", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
configurable: true,
|
|
63
|
+
writable: true,
|
|
64
|
+
value: {
|
|
65
|
+
save: (text, tags) => this.hostCall('memory', 'save', [text, tags]),
|
|
66
|
+
recall: (query, limit) => this.hostCall('memory', 'recall', [query, limit]),
|
|
67
|
+
list: (limit) => this.hostCall('memory', 'list', [limit]),
|
|
68
|
+
forget: (id) => this.hostCall('memory', 'forget', [id]),
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
Object.defineProperty(this, "kv", {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
configurable: true,
|
|
74
|
+
writable: true,
|
|
75
|
+
value: {
|
|
76
|
+
get: (key) => this.hostCall('kv', 'get', [key]),
|
|
77
|
+
set: (key, value) => this.hostCall('kv', 'set', [key, value]),
|
|
78
|
+
delete: (key) => this.hostCall('kv', 'delete', [key]),
|
|
79
|
+
keys: (prefix) => this.hostCall('kv', 'keys', [prefix]),
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
Object.defineProperty(this, "search", {
|
|
83
|
+
enumerable: true,
|
|
84
|
+
configurable: true,
|
|
85
|
+
writable: true,
|
|
86
|
+
value: {
|
|
87
|
+
searchPackages: (query) => this.hostCall('search', 'searchPackages', [query]),
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(this, "sessions", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
configurable: true,
|
|
93
|
+
writable: true,
|
|
94
|
+
value: {
|
|
95
|
+
create: (title, surface) => this.hostCall('sessions', 'create', [title, surface]),
|
|
96
|
+
get: (id) => this.hostCall('sessions', 'get', [id]),
|
|
97
|
+
list: (surface) => this.hostCall('sessions', 'list', [surface]),
|
|
98
|
+
save: (session) => this.hostCall('sessions', 'save', [session]),
|
|
99
|
+
rename: (id, title) => this.hostCall('sessions', 'rename', [id, title]),
|
|
100
|
+
delete: (id) => this.hostCall('sessions', 'delete', [id]),
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
/** The host's file workspace, proxied. Metadata is a default — the methods are
|
|
104
|
+
* what a sidecar tool uses; onChange is a no-op (the host UI owns refresh). */
|
|
105
|
+
Object.defineProperty(this, "files", {
|
|
106
|
+
enumerable: true,
|
|
107
|
+
configurable: true,
|
|
108
|
+
writable: true,
|
|
109
|
+
value: {
|
|
110
|
+
kind: 'directory',
|
|
111
|
+
label: 'host workspace',
|
|
112
|
+
isLocalDisk: false,
|
|
113
|
+
writable: true,
|
|
114
|
+
list: (dir) => this.hostCall('files', 'list', [dir]),
|
|
115
|
+
read: (path) => this.hostCall('files', 'read', [path]),
|
|
116
|
+
stat: (path) => this.hostCall('files', 'stat', [path]),
|
|
117
|
+
write: (path, content) => this.hostCall('files', 'write', [path, content]),
|
|
118
|
+
create: (path, content) => this.hostCall('files', 'create', [path, content]),
|
|
119
|
+
remove: (path) => this.hostCall('files', 'remove', [path]),
|
|
120
|
+
rename: (from, to) => this.hostCall('files', 'rename', [from, to]),
|
|
121
|
+
search: (query) => this.hostCall('files', 'search', [query]),
|
|
122
|
+
onChange: () => () => { },
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
Object.defineProperty(this, "confirm", {
|
|
126
|
+
enumerable: true,
|
|
127
|
+
configurable: true,
|
|
128
|
+
writable: true,
|
|
129
|
+
value: (req) => this.hostCall('confirm', 'confirm', [req]).then((v) => v, () => true)
|
|
130
|
+
});
|
|
131
|
+
Object.defineProperty(this, "ask", {
|
|
132
|
+
enumerable: true,
|
|
133
|
+
configurable: true,
|
|
134
|
+
writable: true,
|
|
135
|
+
value: (questions) => this.hostCall('ask', 'ask', [questions]).then((v) => v, () => null)
|
|
136
|
+
});
|
|
137
|
+
this.opts = opts;
|
|
138
|
+
this.ch = opts.channel;
|
|
139
|
+
for (const t of opts.tools)
|
|
140
|
+
this.tools.set(t.name, t);
|
|
141
|
+
this.ch.onMessage((m) => this.onMessage(m));
|
|
142
|
+
}
|
|
143
|
+
onMessage(m) {
|
|
144
|
+
switch (m.t) {
|
|
145
|
+
case 'hello':
|
|
146
|
+
this.onHello(m);
|
|
147
|
+
return;
|
|
148
|
+
case 'invoke':
|
|
149
|
+
if (!this.authed) {
|
|
150
|
+
this.ch.send({ t: 'invoke-result', id: m.id, ok: false, error: 'not authenticated' });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
void this.onInvoke(m);
|
|
154
|
+
return;
|
|
155
|
+
case 'host-call-result': {
|
|
156
|
+
const p = this.hostPending.get(m.id);
|
|
157
|
+
if (!p)
|
|
158
|
+
return;
|
|
159
|
+
this.hostPending.delete(m.id);
|
|
160
|
+
if (m.ok)
|
|
161
|
+
p.resolve(m.result);
|
|
162
|
+
else
|
|
163
|
+
p.reject(new Error(m.error || 'host call failed'));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
case 'http-req':
|
|
167
|
+
if (!this.authed) {
|
|
168
|
+
this.ch.send({ t: 'http-err', id: m.id, error: 'not authenticated' });
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
void this.onHttpReq(m);
|
|
172
|
+
return;
|
|
173
|
+
default:
|
|
174
|
+
return; // welcome / denied / invoke-result / host-call are host-side
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
onHello(m) {
|
|
178
|
+
if (m.protocol !== SIDECAR_PROTOCOL) {
|
|
179
|
+
this.ch.send({ t: 'denied', reason: `protocol ${m.protocol} unsupported` });
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (!safeEqual(m.token ?? '', this.opts.token)) {
|
|
183
|
+
this.ch.send({ t: 'denied', reason: 'invalid token' });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.authed = true;
|
|
187
|
+
const tools = [...this.tools.values()].map(({ run: _run, ...decl }) => decl);
|
|
188
|
+
// Advertise the loopback HTTP proxy so the host can route local-LLM calls
|
|
189
|
+
// through us (server-side fetch, no browser CORS) instead of failing.
|
|
190
|
+
this.ch.send({ t: 'welcome', tools, features: ['http-proxy'] });
|
|
191
|
+
}
|
|
192
|
+
/** Proxy a host HTTP request server-side. Restricted to LOOPBACK targets — the
|
|
193
|
+
* sidecar must never be usable as an SSRF pivot to internal/metadata hosts. The
|
|
194
|
+
* response streams back (http-res -> http-chunk* -> http-end). */
|
|
195
|
+
async onHttpReq(m) {
|
|
196
|
+
try {
|
|
197
|
+
let u;
|
|
198
|
+
try {
|
|
199
|
+
u = new URL(m.url);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
throw new Error(`invalid URL: ${m.url}`);
|
|
203
|
+
}
|
|
204
|
+
if (u.protocol !== 'http:' && u.protocol !== 'https:')
|
|
205
|
+
throw new Error('http(s) URLs only');
|
|
206
|
+
if (!isLoopbackHost(u.hostname))
|
|
207
|
+
throw new Error(`the sidecar proxy only reaches loopback hosts, not "${u.hostname}"`);
|
|
208
|
+
const res = await fetch(m.url, { method: m.method, headers: m.headers, body: m.body });
|
|
209
|
+
const headers = {};
|
|
210
|
+
res.headers.forEach((v, k) => { headers[k] = v; });
|
|
211
|
+
this.ch.send({ t: 'http-res', id: m.id, status: res.status, statusText: res.statusText, headers });
|
|
212
|
+
if (res.body) {
|
|
213
|
+
const reader = res.body.getReader();
|
|
214
|
+
for (;;) {
|
|
215
|
+
const { done, value } = await reader.read();
|
|
216
|
+
if (done)
|
|
217
|
+
break;
|
|
218
|
+
if (value && value.length)
|
|
219
|
+
this.ch.send({ t: 'http-chunk', id: m.id, b64: bytesToB64(value) });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
this.ch.send({ t: 'http-end', id: m.id });
|
|
223
|
+
}
|
|
224
|
+
catch (e) {
|
|
225
|
+
this.ch.send({ t: 'http-err', id: m.id, error: errMessage(e) });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async onInvoke(m) {
|
|
229
|
+
const tool = this.tools.get(m.name);
|
|
230
|
+
if (!tool) {
|
|
231
|
+
this.ch.send({ t: 'invoke-result', id: m.id, ok: false, error: `unknown tool ${m.name}` });
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const result = await tool.run(m.args, this.makeContext());
|
|
236
|
+
this.ch.send({ t: 'invoke-result', id: m.id, ok: true, result });
|
|
237
|
+
}
|
|
238
|
+
catch (e) {
|
|
239
|
+
this.ch.send({ t: 'invoke-result', id: m.id, ok: false, error: errMessage(e) });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/** A ToolContext whose capabilities proxy back to the host (persist-nothing).
|
|
243
|
+
* The stores, the host's file workspace, and the user prompts (confirm/ask) all
|
|
244
|
+
* round-trip over the channel. confirm/ask default to allow/dismiss when the
|
|
245
|
+
* host wired no handler — the host already gated the tool call before dispatch,
|
|
246
|
+
* so an unwired secondary prompt must not deadlock the tool. */
|
|
247
|
+
makeContext() {
|
|
248
|
+
return {
|
|
249
|
+
signal: new AbortController().signal,
|
|
250
|
+
memory: this.memory,
|
|
251
|
+
kv: this.kv,
|
|
252
|
+
search: this.search,
|
|
253
|
+
sessions: this.sessions,
|
|
254
|
+
files: this.files,
|
|
255
|
+
confirm: this.confirm,
|
|
256
|
+
ask: this.ask,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
hostCall(provider, method, args) {
|
|
260
|
+
const id = ++this.hostSeq;
|
|
261
|
+
return new Promise((resolve, reject) => {
|
|
262
|
+
this.hostPending.set(id, { resolve, reject });
|
|
263
|
+
this.ch.send({ t: 'host-call', id, provider, method, args });
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../sidecar/server.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type ScriptKind = 'js' | 'python' | 'shell';
|
|
2
|
+
export interface SkillScript {
|
|
3
|
+
path: string;
|
|
4
|
+
kind: ScriptKind;
|
|
5
|
+
runnable: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface InstalledSkill {
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
/** config-workspace path to SKILL.md, or null when the skill ships none. */
|
|
11
|
+
instructions: string | null;
|
|
12
|
+
scripts: SkillScript[];
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Classify a file as a runnable/gated script, or null if it's a plain resource.
|
|
16
|
+
* Only JS/TS runs in the browser sandbox; Python/shell are gated. */
|
|
17
|
+
export declare function classifyScript(path: string): SkillScript | null;
|
|
18
|
+
/** Sanitize an arbitrary string into a safe skill folder name. */
|
|
19
|
+
export declare function safeName(s: string): string;
|
|
20
|
+
/** Strip a single common top-level folder from zip paths so a wrapped skill flattens. */
|
|
21
|
+
export declare function stripCommonRoot(paths: string[]): (p: string) => string;
|
|
22
|
+
export declare function stripFrontmatter(src: string): string;
|
|
23
|
+
/** Resolve a skill's name: manifest.json `name` > SKILL.md frontmatter > fallback. */
|
|
24
|
+
export declare function resolveSkillName(read: (path: string) => Promise<string | null>, fallback: string): Promise<string>;
|
|
25
|
+
/** Extract a skill .pdpkg (zip) into the config workspace at skills/<name>/.
|
|
26
|
+
* Replaces any prior install of the same skill. Returns the installed name. */
|
|
27
|
+
export declare function installSkillZip(bytes: ArrayBuffer | Uint8Array, fallbackName?: string): Promise<string>;
|
|
28
|
+
export declare function removeSkill(name: string): Promise<void>;
|
|
29
|
+
export declare function isSkillEnabled(name: string): boolean;
|
|
30
|
+
export declare function setSkillEnabled(name: string, on: boolean): void;
|
|
31
|
+
export declare function subscribeSkills(cb: () => void): () => void;
|
|
32
|
+
/** Every installed skill (each a folder under config `skills/`), with its scripts
|
|
33
|
+
* and enabled state. */
|
|
34
|
+
export declare function listSkills(): Promise<InstalledSkill[]>;
|
|
35
|
+
/** The combined instruction block for ENABLED skills — injected into the system
|
|
36
|
+
* prompt. Includes an explicit note about any gated (non-JS) scripts so Corenel
|
|
37
|
+
* never claims to have run something the browser can't. Empty when none enabled. */
|
|
38
|
+
export declare function enabledSkillInstructions(): Promise<string>;
|
|
39
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../skills.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;AACnD,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE;AAClF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD;qEACqE;AACrE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAK/D;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAOtE;AAcD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,sFAAsF;AACtF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,GAC/D,OAAO,CAAC,MAAM,CAAC,CAMjB;AAID;+EAC+E;AAC/E,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,EAAE,YAAY,SAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB9G;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAmC;AACxF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAK/D;AAGD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAqD;AAchH;wBACwB;AACxB,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAmB5D;AAED;;oFAEoF;AACpF,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBhE"}
|
package/dist/skills.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/* Skills (B1).
|
|
2
|
+
*
|
|
3
|
+
* A skill is a folder in the config workspace at `skills/<name>/` — a SKILL.md
|
|
4
|
+
* (instructions) plus optional scripts/resources — extracted from a .pdpkg (a
|
|
5
|
+
* ZIP) on install. No backend: the registry serves the zip, the browser unzips it
|
|
6
|
+
* into the config workspace.
|
|
7
|
+
*
|
|
8
|
+
* Two layers, mirroring the host/extension split:
|
|
9
|
+
* - INSTRUCTIONS: an enabled skill's SKILL.md injects into Corenel's system prompt
|
|
10
|
+
* (composeAgentSystem). Always safe.
|
|
11
|
+
* - SCRIPTS: JS/TS scripts run in the in-browser sandbox (pd exec); Python/shell
|
|
12
|
+
* are surfaced but GATED (no runtime in the zero-install host) — and Corenel is
|
|
13
|
+
* told it can't run them, so it won't pretend to.
|
|
14
|
+
*
|
|
15
|
+
* JSZip is imported lazily (only install needs it), so reading/injecting skills
|
|
16
|
+
* never pulls it into the bundle.
|
|
17
|
+
*/
|
|
18
|
+
import { configWorkspace } from './prompts/host';
|
|
19
|
+
const ROOT = 'skills';
|
|
20
|
+
const ENABLED_LS = 'prompd.web.skills.enabled';
|
|
21
|
+
const SCRIPT_KIND = {
|
|
22
|
+
js: 'js', jsx: 'js', ts: 'js', tsx: 'js', mjs: 'js', cjs: 'js',
|
|
23
|
+
py: 'python', shell: 'shell', sh: 'shell', bash: 'shell',
|
|
24
|
+
};
|
|
25
|
+
/** Classify a file as a runnable/gated script, or null if it's a plain resource.
|
|
26
|
+
* Only JS/TS runs in the browser sandbox; Python/shell are gated. */
|
|
27
|
+
export function classifyScript(path) {
|
|
28
|
+
const ext = (path.split('.').pop() || '').toLowerCase();
|
|
29
|
+
const kind = SCRIPT_KIND[ext];
|
|
30
|
+
if (!kind)
|
|
31
|
+
return null;
|
|
32
|
+
return { path, kind, runnable: kind === 'js' };
|
|
33
|
+
}
|
|
34
|
+
/** Sanitize an arbitrary string into a safe skill folder name. */
|
|
35
|
+
export function safeName(s) {
|
|
36
|
+
return (s || '').trim().toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^[-.]+|[-.]+$/g, '').slice(0, 64) || 'skill';
|
|
37
|
+
}
|
|
38
|
+
/** Strip a single common top-level folder from zip paths so a wrapped skill flattens. */
|
|
39
|
+
export function stripCommonRoot(paths) {
|
|
40
|
+
const tops = new Set(paths.map((p) => p.split('/')[0]));
|
|
41
|
+
if (tops.size === 1 && paths.every((p) => p.includes('/'))) {
|
|
42
|
+
const prefix = [...tops][0] + '/';
|
|
43
|
+
return (p) => p.slice(prefix.length);
|
|
44
|
+
}
|
|
45
|
+
return (p) => p;
|
|
46
|
+
}
|
|
47
|
+
function parseFrontmatter(src) {
|
|
48
|
+
const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(src || '');
|
|
49
|
+
if (!m)
|
|
50
|
+
return {};
|
|
51
|
+
// Tiny key: value reader — enough for SKILL.md name/description without pulling yaml.
|
|
52
|
+
const out = {};
|
|
53
|
+
for (const line of m[1].split(/\r?\n/)) {
|
|
54
|
+
const kv = /^([A-Za-z_][\w-]*):\s*(.*)$/.exec(line);
|
|
55
|
+
if (kv)
|
|
56
|
+
out[kv[1]] = kv[2].replace(/^["']|["']$/g, '').trim();
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
export function stripFrontmatter(src) {
|
|
61
|
+
return src.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '').trim();
|
|
62
|
+
}
|
|
63
|
+
/** Resolve a skill's name: manifest.json `name` > SKILL.md frontmatter > fallback. */
|
|
64
|
+
export async function resolveSkillName(read, fallback) {
|
|
65
|
+
const manifest = await read('manifest.json');
|
|
66
|
+
if (manifest) {
|
|
67
|
+
try {
|
|
68
|
+
const j = JSON.parse(manifest);
|
|
69
|
+
if (j?.name)
|
|
70
|
+
return safeName(String(j.name));
|
|
71
|
+
}
|
|
72
|
+
catch { /* ignore */ }
|
|
73
|
+
}
|
|
74
|
+
const skill = await read('SKILL.md');
|
|
75
|
+
if (skill) {
|
|
76
|
+
const fm = parseFrontmatter(skill);
|
|
77
|
+
const n = fm.name || fm.id;
|
|
78
|
+
if (n)
|
|
79
|
+
return safeName(String(n));
|
|
80
|
+
}
|
|
81
|
+
return safeName(fallback);
|
|
82
|
+
}
|
|
83
|
+
/* ---- install ---- */
|
|
84
|
+
/** Extract a skill .pdpkg (zip) into the config workspace at skills/<name>/.
|
|
85
|
+
* Replaces any prior install of the same skill. Returns the installed name. */
|
|
86
|
+
export async function installSkillZip(bytes, fallbackName = 'skill') {
|
|
87
|
+
const { default: JSZip } = await import('jszip');
|
|
88
|
+
const zip = await JSZip.loadAsync(bytes);
|
|
89
|
+
const files = [];
|
|
90
|
+
zip.forEach((path, file) => { if (!file.dir)
|
|
91
|
+
files.push({ path, read: () => file.async('string') }); });
|
|
92
|
+
if (!files.length)
|
|
93
|
+
throw new Error('The skill archive is empty.');
|
|
94
|
+
const rel = stripCommonRoot(files.map((f) => f.path));
|
|
95
|
+
const flat = files.map((f) => ({ path: rel(f.path), read: f.read })).filter((f) => f.path);
|
|
96
|
+
const byPath = new Map(flat.map((f) => [f.path.toLowerCase(), f]));
|
|
97
|
+
const readRel = async (p) => {
|
|
98
|
+
const hit = byPath.get(p.toLowerCase());
|
|
99
|
+
return hit ? hit.read() : null;
|
|
100
|
+
};
|
|
101
|
+
const topFolder = files[0].path.includes('/') ? files[0].path.split('/')[0] : fallbackName;
|
|
102
|
+
const name = await resolveSkillName(readRel, topFolder);
|
|
103
|
+
await configWorkspace().remove(`${ROOT}/${name}`).catch(() => { });
|
|
104
|
+
for (const f of flat) {
|
|
105
|
+
await configWorkspace().write(`${ROOT}/${name}/${f.path}`, await f.read());
|
|
106
|
+
}
|
|
107
|
+
notify();
|
|
108
|
+
return name;
|
|
109
|
+
}
|
|
110
|
+
export async function removeSkill(name) {
|
|
111
|
+
await configWorkspace().remove(`${ROOT}/${safeName(name)}`).catch(() => { });
|
|
112
|
+
setSkillEnabled(name, false);
|
|
113
|
+
notify();
|
|
114
|
+
}
|
|
115
|
+
/* ---- enable state (localStorage) ---- */
|
|
116
|
+
function enabledSet() {
|
|
117
|
+
try {
|
|
118
|
+
return new Set(JSON.parse(localStorage.getItem(ENABLED_LS) || '[]'));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return new Set();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export function isSkillEnabled(name) { return enabledSet().has(name); }
|
|
125
|
+
export function setSkillEnabled(name, on) {
|
|
126
|
+
const s = enabledSet();
|
|
127
|
+
if (on)
|
|
128
|
+
s.add(name);
|
|
129
|
+
else
|
|
130
|
+
s.delete(name);
|
|
131
|
+
try {
|
|
132
|
+
localStorage.setItem(ENABLED_LS, JSON.stringify([...s]));
|
|
133
|
+
}
|
|
134
|
+
catch { /* ignore */ }
|
|
135
|
+
notify();
|
|
136
|
+
}
|
|
137
|
+
const subs = new Set();
|
|
138
|
+
export function subscribeSkills(cb) { subs.add(cb); return () => { subs.delete(cb); }; }
|
|
139
|
+
function notify() { for (const cb of subs) {
|
|
140
|
+
try {
|
|
141
|
+
cb();
|
|
142
|
+
}
|
|
143
|
+
catch { /* ignore */ }
|
|
144
|
+
} }
|
|
145
|
+
/* ---- read / list ---- */
|
|
146
|
+
function flattenFiles(nodes) {
|
|
147
|
+
const out = [];
|
|
148
|
+
for (const n of nodes) {
|
|
149
|
+
if (n.kind === 'file')
|
|
150
|
+
out.push(n.path);
|
|
151
|
+
else if (n.children)
|
|
152
|
+
out.push(...flattenFiles(n.children));
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
/** Every installed skill (each a folder under config `skills/`), with its scripts
|
|
157
|
+
* and enabled state. */
|
|
158
|
+
export async function listSkills() {
|
|
159
|
+
let tree;
|
|
160
|
+
try {
|
|
161
|
+
tree = await configWorkspace().list(ROOT);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
const names = tree.filter((n) => n.kind === 'directory').map((n) => n.name);
|
|
167
|
+
const enabled = enabledSet();
|
|
168
|
+
const out = [];
|
|
169
|
+
for (const name of names) {
|
|
170
|
+
const base = `${ROOT}/${name}/`;
|
|
171
|
+
const paths = flattenFiles(tree.find((n) => n.name === name)?.children || []);
|
|
172
|
+
const rels = paths.map((p) => p.slice(base.length));
|
|
173
|
+
const skillPath = paths.find((p) => p.slice(base.length).toLowerCase() === 'skill.md') || null;
|
|
174
|
+
let description;
|
|
175
|
+
if (skillPath) {
|
|
176
|
+
try {
|
|
177
|
+
const fm = parseFrontmatter(await configWorkspace().read(skillPath));
|
|
178
|
+
if (typeof fm.description === 'string')
|
|
179
|
+
description = fm.description;
|
|
180
|
+
}
|
|
181
|
+
catch { /* ignore */ }
|
|
182
|
+
}
|
|
183
|
+
const scripts = rels.map(classifyScript).filter((s) => !!s);
|
|
184
|
+
out.push({ name, description, instructions: skillPath, scripts, enabled: enabled.has(name) });
|
|
185
|
+
}
|
|
186
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
187
|
+
}
|
|
188
|
+
/** The combined instruction block for ENABLED skills — injected into the system
|
|
189
|
+
* prompt. Includes an explicit note about any gated (non-JS) scripts so Corenel
|
|
190
|
+
* never claims to have run something the browser can't. Empty when none enabled. */
|
|
191
|
+
export async function enabledSkillInstructions() {
|
|
192
|
+
const skills = (await listSkills()).filter((s) => s.enabled && s.instructions);
|
|
193
|
+
if (!skills.length)
|
|
194
|
+
return '';
|
|
195
|
+
const blocks = [];
|
|
196
|
+
for (const s of skills) {
|
|
197
|
+
let body = '';
|
|
198
|
+
try {
|
|
199
|
+
body = stripFrontmatter(await configWorkspace().read(s.instructions));
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (!body)
|
|
205
|
+
continue;
|
|
206
|
+
const gated = [...new Set(s.scripts.filter((x) => !x.runnable).map((x) => x.kind))];
|
|
207
|
+
const note = gated.length
|
|
208
|
+
? `\n\n(This skill bundles ${gated.join('/')} scripts that CANNOT run in the browser sandbox — only its JS/TS scripts run, via the console \`pd exec\`. Do not claim to have run a ${gated.join('/')} script.)`
|
|
209
|
+
: '';
|
|
210
|
+
blocks.push(`### Skill: ${s.name}\n${body}${note}`);
|
|
211
|
+
}
|
|
212
|
+
if (!blocks.length)
|
|
213
|
+
return '';
|
|
214
|
+
return `--- Skills ---\nThe user enabled these skills; follow their instructions when relevant.\n\n${blocks.join('\n\n')}`;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface SystemParts {
|
|
2
|
+
persona: boolean;
|
|
3
|
+
mode: boolean;
|
|
4
|
+
toolGuidance: boolean;
|
|
5
|
+
tools: boolean;
|
|
6
|
+
baseSystem: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function getSystemParts(): SystemParts;
|
|
9
|
+
export declare function setSystemParts(parts: SystemParts): void;
|
|
10
|
+
//# sourceMappingURL=systemParts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemParts.d.ts","sourceRoot":"","sources":["../systemParts.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAS5C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAEvD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const LS = 'prompd.web.systemParts';
|
|
2
|
+
const DEFAULTS = { persona: true, mode: true, toolGuidance: true, tools: true, baseSystem: false };
|
|
3
|
+
export function getSystemParts() {
|
|
4
|
+
try {
|
|
5
|
+
const raw = localStorage.getItem(LS);
|
|
6
|
+
if (!raw)
|
|
7
|
+
return { ...DEFAULTS };
|
|
8
|
+
const p = JSON.parse(raw);
|
|
9
|
+
return { ...DEFAULTS, ...(p && typeof p === 'object' ? p : {}) };
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return { ...DEFAULTS };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function setSystemParts(parts) {
|
|
16
|
+
try {
|
|
17
|
+
localStorage.setItem(LS, JSON.stringify(parts));
|
|
18
|
+
}
|
|
19
|
+
catch { /* ignore */ }
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=systemParts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemParts.js","sourceRoot":"","sources":["../systemParts.ts"],"names":[],"mappings":"AAgBA,MAAM,EAAE,GAAG,wBAAwB,CAAC;AACpC,MAAM,QAAQ,GAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAEhH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAkB;IAC/C,IAAI,CAAC;QAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AACjF,CAAC"}
|