@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.
Files changed (149) hide show
  1. package/dist/compression.d.ts +11 -0
  2. package/dist/compression.d.ts.map +1 -0
  3. package/dist/compression.js +27 -0
  4. package/dist/compression.js.map +1 -0
  5. package/dist/conversation.d.ts +29 -0
  6. package/dist/conversation.d.ts.map +1 -0
  7. package/dist/conversation.js +25 -0
  8. package/dist/conversation.js.map +1 -0
  9. package/dist/core/loop.d.ts +31 -0
  10. package/dist/core/loop.d.ts.map +1 -0
  11. package/dist/core/loop.js +237 -0
  12. package/dist/core/loop.js.map +1 -0
  13. package/dist/dag/executeNode.d.ts +41 -0
  14. package/dist/dag/executeNode.d.ts.map +1 -0
  15. package/dist/dag/executeNode.js +81 -0
  16. package/dist/dag/executeNode.js.map +1 -0
  17. package/dist/fileSchema.d.ts +7 -0
  18. package/dist/fileSchema.d.ts.map +1 -0
  19. package/dist/fileSchema.js +40 -0
  20. package/dist/fileSchema.js.map +1 -0
  21. package/dist/guardrail/builtins.d.ts +9 -0
  22. package/dist/guardrail/builtins.d.ts.map +1 -0
  23. package/dist/guardrail/builtins.js +61 -0
  24. package/dist/guardrail/builtins.js.map +1 -0
  25. package/dist/guardrail/glob.d.ts +3 -0
  26. package/dist/guardrail/glob.d.ts.map +1 -0
  27. package/dist/guardrail/glob.js +33 -0
  28. package/dist/guardrail/glob.js.map +1 -0
  29. package/dist/guardrail/guardrail.d.ts +25 -0
  30. package/dist/guardrail/guardrail.d.ts.map +1 -0
  31. package/dist/guardrail/guardrail.js +67 -0
  32. package/dist/guardrail/guardrail.js.map +1 -0
  33. package/dist/guardrail/index.d.ts +9 -0
  34. package/dist/guardrail/index.d.ts.map +1 -0
  35. package/dist/guardrail/index.js +11 -0
  36. package/dist/guardrail/index.js.map +1 -0
  37. package/dist/guardrail/permission-service.d.ts +53 -0
  38. package/dist/guardrail/permission-service.d.ts.map +1 -0
  39. package/dist/guardrail/permission-service.js +147 -0
  40. package/dist/guardrail/permission-service.js.map +1 -0
  41. package/dist/guardrail/serialize.d.ts +9 -0
  42. package/dist/guardrail/serialize.d.ts.map +1 -0
  43. package/dist/guardrail/serialize.js +53 -0
  44. package/dist/guardrail/serialize.js.map +1 -0
  45. package/dist/guardrail/store.d.ts +26 -0
  46. package/dist/guardrail/store.d.ts.map +1 -0
  47. package/dist/guardrail/store.js +109 -0
  48. package/dist/guardrail/store.js.map +1 -0
  49. package/dist/guardrail/validate.d.ts +8 -0
  50. package/dist/guardrail/validate.d.ts.map +1 -0
  51. package/dist/guardrail/validate.js +105 -0
  52. package/dist/guardrail/validate.js.map +1 -0
  53. package/dist/guards.d.ts +37 -0
  54. package/dist/guards.d.ts.map +1 -0
  55. package/dist/guards.js +45 -0
  56. package/dist/guards.js.map +1 -0
  57. package/dist/log.d.ts +4 -0
  58. package/dist/log.d.ts.map +1 -0
  59. package/dist/log.js +22 -0
  60. package/dist/log.js.map +1 -0
  61. package/dist/promptCompiler.d.ts +18 -0
  62. package/dist/promptCompiler.d.ts.map +1 -0
  63. package/dist/promptCompiler.js +11 -0
  64. package/dist/promptCompiler.js.map +1 -0
  65. package/dist/prompts/config.d.ts +63 -0
  66. package/dist/prompts/config.d.ts.map +1 -0
  67. package/dist/prompts/config.js +268 -0
  68. package/dist/prompts/config.js.map +1 -0
  69. package/dist/prompts/host.d.ts +30 -0
  70. package/dist/prompts/host.d.ts.map +1 -0
  71. package/dist/prompts/host.js +11 -0
  72. package/dist/prompts/host.js.map +1 -0
  73. package/dist/prompts/index.d.ts +50 -0
  74. package/dist/prompts/index.d.ts.map +1 -0
  75. package/dist/prompts/index.js +105 -0
  76. package/dist/prompts/index.js.map +1 -0
  77. package/dist/prompts/library/defaults.generated.d.ts +2 -0
  78. package/dist/prompts/library/defaults.generated.d.ts.map +1 -0
  79. package/dist/prompts/library/defaults.generated.js +31 -0
  80. package/dist/prompts/library/defaults.generated.js.map +1 -0
  81. package/dist/prompts/library/index.d.ts +8 -0
  82. package/dist/prompts/library/index.d.ts.map +1 -0
  83. package/dist/prompts/library/index.js +28 -0
  84. package/dist/prompts/library/index.js.map +1 -0
  85. package/dist/providers/gateway.d.ts +58 -0
  86. package/dist/providers/gateway.d.ts.map +1 -0
  87. package/dist/providers/gateway.js +145 -0
  88. package/dist/providers/gateway.js.map +1 -0
  89. package/dist/services.d.ts +29 -0
  90. package/dist/services.d.ts.map +1 -0
  91. package/dist/services.js +22 -0
  92. package/dist/services.js.map +1 -0
  93. package/dist/sidecar/host.d.ts +69 -0
  94. package/dist/sidecar/host.d.ts.map +1 -0
  95. package/dist/sidecar/host.js +228 -0
  96. package/dist/sidecar/host.js.map +1 -0
  97. package/dist/sidecar/server.d.ts +42 -0
  98. package/dist/sidecar/server.d.ts.map +1 -0
  99. package/dist/sidecar/server.js +267 -0
  100. package/dist/sidecar/server.js.map +1 -0
  101. package/dist/skills.d.ts +39 -0
  102. package/dist/skills.d.ts.map +1 -0
  103. package/dist/skills.js +216 -0
  104. package/dist/skills.js.map +1 -0
  105. package/dist/systemParts.d.ts +10 -0
  106. package/dist/systemParts.d.ts.map +1 -0
  107. package/dist/systemParts.js +21 -0
  108. package/dist/systemParts.js.map +1 -0
  109. package/dist/todos.d.ts +34 -0
  110. package/dist/todos.d.ts.map +1 -0
  111. package/dist/todos.js +112 -0
  112. package/dist/todos.js.map +1 -0
  113. package/dist/tools/builtins.d.ts +20 -0
  114. package/dist/tools/builtins.d.ts.map +1 -0
  115. package/dist/tools/builtins.js +335 -0
  116. package/dist/tools/builtins.js.map +1 -0
  117. package/dist/tools/files.d.ts +11 -0
  118. package/dist/tools/files.d.ts.map +1 -0
  119. package/dist/tools/files.js +161 -0
  120. package/dist/tools/files.js.map +1 -0
  121. package/dist/tools/http.d.ts +3 -0
  122. package/dist/tools/http.d.ts.map +1 -0
  123. package/dist/tools/http.js +71 -0
  124. package/dist/tools/http.js.map +1 -0
  125. package/dist/tools/namespaces.d.ts +27 -0
  126. package/dist/tools/namespaces.d.ts.map +1 -0
  127. package/dist/tools/namespaces.js +83 -0
  128. package/dist/tools/namespaces.js.map +1 -0
  129. package/dist/tools/registry.d.ts +8 -0
  130. package/dist/tools/registry.d.ts.map +1 -0
  131. package/dist/tools/registry.js +14 -0
  132. package/dist/tools/registry.js.map +1 -0
  133. package/dist/tools/sessions.d.ts +3 -0
  134. package/dist/tools/sessions.d.ts.map +1 -0
  135. package/dist/tools/sessions.js +149 -0
  136. package/dist/tools/sessions.js.map +1 -0
  137. package/dist/tools/todo.d.ts +3 -0
  138. package/dist/tools/todo.d.ts.map +1 -0
  139. package/dist/tools/todo.js +38 -0
  140. package/dist/tools/todo.js.map +1 -0
  141. package/dist/tools/urlGuard.d.ts +9 -0
  142. package/dist/tools/urlGuard.d.ts.map +1 -0
  143. package/dist/tools/urlGuard.js +80 -0
  144. package/dist/tools/urlGuard.js.map +1 -0
  145. package/dist/tools/web.d.ts +3 -0
  146. package/dist/tools/web.d.ts.map +1 -0
  147. package/dist/tools/web.js +35 -0
  148. package/dist/tools/web.js.map +1 -0
  149. 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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"}
@@ -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"}