@husk-ai/core 0.1.1

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 (61) hide show
  1. package/dist/audit.d.ts +65 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +87 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/browse.d.ts +66 -0
  6. package/dist/browse.d.ts.map +1 -0
  7. package/dist/browse.js +217 -0
  8. package/dist/browse.js.map +1 -0
  9. package/dist/config.d.ts +73 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +61 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/errors.d.ts +59 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +40 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/ids.d.ts +7 -0
  18. package/dist/ids.d.ts.map +1 -0
  19. package/dist/ids.js +29 -0
  20. package/dist/ids.js.map +1 -0
  21. package/dist/index.d.ts +23 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +19 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/lifecycle.d.ts +38 -0
  26. package/dist/lifecycle.d.ts.map +1 -0
  27. package/dist/lifecycle.js +52 -0
  28. package/dist/lifecycle.js.map +1 -0
  29. package/dist/logger.d.ts +20 -0
  30. package/dist/logger.d.ts.map +1 -0
  31. package/dist/logger.js +59 -0
  32. package/dist/logger.js.map +1 -0
  33. package/dist/net.d.ts +48 -0
  34. package/dist/net.d.ts.map +1 -0
  35. package/dist/net.js +219 -0
  36. package/dist/net.js.map +1 -0
  37. package/dist/spec.d.ts +832 -0
  38. package/dist/spec.d.ts.map +1 -0
  39. package/dist/spec.js +191 -0
  40. package/dist/spec.js.map +1 -0
  41. package/dist/types/agent.d.ts +168 -0
  42. package/dist/types/agent.d.ts.map +1 -0
  43. package/dist/types/agent.js +2 -0
  44. package/dist/types/agent.js.map +1 -0
  45. package/dist/types/computer.d.ts +205 -0
  46. package/dist/types/computer.d.ts.map +1 -0
  47. package/dist/types/computer.js +9 -0
  48. package/dist/types/computer.js.map +1 -0
  49. package/dist/types/model.d.ts +197 -0
  50. package/dist/types/model.d.ts.map +1 -0
  51. package/dist/types/model.js +16 -0
  52. package/dist/types/model.js.map +1 -0
  53. package/dist/types/transcript.d.ts +64 -0
  54. package/dist/types/transcript.d.ts.map +1 -0
  55. package/dist/types/transcript.js +3 -0
  56. package/dist/types/transcript.js.map +1 -0
  57. package/dist/util.d.ts +69 -0
  58. package/dist/util.d.ts.map +1 -0
  59. package/dist/util.js +236 -0
  60. package/dist/util.js.map +1 -0
  61. package/package.json +26 -0
package/dist/spec.d.ts ADDED
@@ -0,0 +1,832 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * husk.yaml -- the whole agent in one file.
4
+ *
5
+ * This is the artifact a chat becomes. It is portable, diffable, reviewable,
6
+ * and it is the only thing the runtime needs in order to bring a bot up.
7
+ */
8
+ export declare const NetworkPolicySchema: z.ZodObject<{
9
+ mode: z.ZodDefault<z.ZodEnum<["none", "egress", "full"]>>;
10
+ allow: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
+ deny: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ mode: "none" | "egress" | "full";
14
+ deny?: string[] | undefined;
15
+ allow?: string[] | undefined;
16
+ }, {
17
+ deny?: string[] | undefined;
18
+ mode?: "none" | "egress" | "full" | undefined;
19
+ allow?: string[] | undefined;
20
+ }>;
21
+ export declare const ComputerConfigSchema: z.ZodObject<{
22
+ /** false disables the machine entirely; true accepts every default. */
23
+ enabled: z.ZodDefault<z.ZodBoolean>;
24
+ provider: z.ZodOptional<z.ZodString>;
25
+ flavor: z.ZodDefault<z.ZodEnum<["base", "python", "node", "full"]>>;
26
+ image: z.ZodOptional<z.ZodString>;
27
+ cpus: z.ZodOptional<z.ZodNumber>;
28
+ memoryMb: z.ZodOptional<z.ZodNumber>;
29
+ diskMb: z.ZodOptional<z.ZodNumber>;
30
+ idleTimeoutSec: z.ZodDefault<z.ZodNumber>;
31
+ maxLifetimeSec: z.ZodDefault<z.ZodNumber>;
32
+ network: z.ZodDefault<z.ZodObject<{
33
+ mode: z.ZodDefault<z.ZodEnum<["none", "egress", "full"]>>;
34
+ allow: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
35
+ deny: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
36
+ }, "strip", z.ZodTypeAny, {
37
+ mode: "none" | "egress" | "full";
38
+ deny?: string[] | undefined;
39
+ allow?: string[] | undefined;
40
+ }, {
41
+ deny?: string[] | undefined;
42
+ mode?: "none" | "egress" | "full" | undefined;
43
+ allow?: string[] | undefined;
44
+ }>>;
45
+ packages: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
46
+ setup: z.ZodOptional<z.ZodString>;
47
+ env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
48
+ workdir: z.ZodDefault<z.ZodString>;
49
+ persist: z.ZodDefault<z.ZodBoolean>;
50
+ mounts: z.ZodDefault<z.ZodArray<z.ZodObject<{
51
+ source: z.ZodString;
52
+ target: z.ZodString;
53
+ readonly: z.ZodDefault<z.ZodBoolean>;
54
+ }, "strip", z.ZodTypeAny, {
55
+ source: string;
56
+ target: string;
57
+ readonly: boolean;
58
+ }, {
59
+ source: string;
60
+ target: string;
61
+ readonly?: boolean | undefined;
62
+ }>, "many">>;
63
+ /**
64
+ * Unprivileged user inside the machine. Omitted means "whatever the provider
65
+ * defaults to" (`husk` on the container images), which is why there is no
66
+ * default here: writing one in would override a provider that knows better.
67
+ */
68
+ user: z.ZodOptional<z.ZodString>;
69
+ /**
70
+ * Provider-specific configuration, carried through to `ComputerSpec.labels`.
71
+ *
72
+ * This is how a single husk.yaml points itself at a particular box or Fly app
73
+ * without an environment variable: `husk.ssh`, `husk.ssh.key`, `husk.fly.app`,
74
+ * `husk.fly.region`, `husk.fly.ports`. The ssh and fly providers read these
75
+ * first and fall back to the environment.
76
+ *
77
+ * Optional rather than `.default({})` so a spec that never mentions labels
78
+ * serialises exactly as it did before.
79
+ */
80
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
81
+ }, "strip", z.ZodTypeAny, {
82
+ enabled: boolean;
83
+ flavor: "full" | "base" | "python" | "node";
84
+ idleTimeoutSec: number;
85
+ maxLifetimeSec: number;
86
+ network: {
87
+ mode: "none" | "egress" | "full";
88
+ deny?: string[] | undefined;
89
+ allow?: string[] | undefined;
90
+ };
91
+ packages: string[];
92
+ env: Record<string, string>;
93
+ workdir: string;
94
+ persist: boolean;
95
+ mounts: {
96
+ source: string;
97
+ target: string;
98
+ readonly: boolean;
99
+ }[];
100
+ provider?: string | undefined;
101
+ image?: string | undefined;
102
+ cpus?: number | undefined;
103
+ memoryMb?: number | undefined;
104
+ diskMb?: number | undefined;
105
+ setup?: string | undefined;
106
+ user?: string | undefined;
107
+ labels?: Record<string, string> | undefined;
108
+ }, {
109
+ enabled?: boolean | undefined;
110
+ provider?: string | undefined;
111
+ flavor?: "full" | "base" | "python" | "node" | undefined;
112
+ image?: string | undefined;
113
+ cpus?: number | undefined;
114
+ memoryMb?: number | undefined;
115
+ diskMb?: number | undefined;
116
+ idleTimeoutSec?: number | undefined;
117
+ maxLifetimeSec?: number | undefined;
118
+ network?: {
119
+ deny?: string[] | undefined;
120
+ mode?: "none" | "egress" | "full" | undefined;
121
+ allow?: string[] | undefined;
122
+ } | undefined;
123
+ packages?: string[] | undefined;
124
+ setup?: string | undefined;
125
+ env?: Record<string, string> | undefined;
126
+ workdir?: string | undefined;
127
+ persist?: boolean | undefined;
128
+ mounts?: {
129
+ source: string;
130
+ target: string;
131
+ readonly?: boolean | undefined;
132
+ }[] | undefined;
133
+ user?: string | undefined;
134
+ labels?: Record<string, string> | undefined;
135
+ }>;
136
+ export declare const LimitsSchema: z.ZodObject<{
137
+ maxSteps: z.ZodDefault<z.ZodNumber>;
138
+ maxCostUsd: z.ZodDefault<z.ZodNumber>;
139
+ maxTokens: z.ZodDefault<z.ZodNumber>;
140
+ timeoutSec: z.ZodDefault<z.ZodNumber>;
141
+ /** Per-exec ceiling inside the machine. */
142
+ execTimeoutSec: z.ZodDefault<z.ZodNumber>;
143
+ maxOutputBytes: z.ZodDefault<z.ZodNumber>;
144
+ }, "strip", z.ZodTypeAny, {
145
+ maxSteps: number;
146
+ maxCostUsd: number;
147
+ maxTokens: number;
148
+ timeoutSec: number;
149
+ execTimeoutSec: number;
150
+ maxOutputBytes: number;
151
+ }, {
152
+ maxSteps?: number | undefined;
153
+ maxCostUsd?: number | undefined;
154
+ maxTokens?: number | undefined;
155
+ timeoutSec?: number | undefined;
156
+ execTimeoutSec?: number | undefined;
157
+ maxOutputBytes?: number | undefined;
158
+ }>;
159
+ export declare const GuardrailsSchema: z.ZodObject<{
160
+ approvalMode: z.ZodDefault<z.ZodEnum<["auto", "ask", "readonly"]>>;
161
+ /** Regexes matched against a shell command before it runs. */
162
+ denyCommands: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
163
+ allowCommands: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
164
+ /** Refuse and explain, rather than answering. */
165
+ refuse: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
166
+ /** Strip credential-shaped strings from tool output before the model sees them. */
167
+ redactSecrets: z.ZodDefault<z.ZodBoolean>;
168
+ }, "strip", z.ZodTypeAny, {
169
+ approvalMode: "auto" | "readonly" | "ask";
170
+ denyCommands: string[];
171
+ allowCommands: string[];
172
+ refuse: string[];
173
+ redactSecrets: boolean;
174
+ }, {
175
+ approvalMode?: "auto" | "readonly" | "ask" | undefined;
176
+ denyCommands?: string[] | undefined;
177
+ allowCommands?: string[] | undefined;
178
+ refuse?: string[] | undefined;
179
+ redactSecrets?: boolean | undefined;
180
+ }>;
181
+ export declare const TriggerSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
182
+ type: z.ZodLiteral<"http">;
183
+ path: z.ZodDefault<z.ZodString>;
184
+ auth: z.ZodDefault<z.ZodEnum<["none", "token"]>>;
185
+ }, "strip", z.ZodTypeAny, {
186
+ path: string;
187
+ type: "http";
188
+ auth: "none" | "token";
189
+ }, {
190
+ type: "http";
191
+ path?: string | undefined;
192
+ auth?: "none" | "token" | undefined;
193
+ }>, z.ZodObject<{
194
+ type: z.ZodLiteral<"cron">;
195
+ schedule: z.ZodString;
196
+ prompt: z.ZodString;
197
+ }, "strip", z.ZodTypeAny, {
198
+ type: "cron";
199
+ schedule: string;
200
+ prompt: string;
201
+ }, {
202
+ type: "cron";
203
+ schedule: string;
204
+ prompt: string;
205
+ }>, z.ZodObject<{
206
+ type: z.ZodLiteral<"discord">;
207
+ channels: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
208
+ mentionOnly: z.ZodDefault<z.ZodBoolean>;
209
+ }, "strip", z.ZodTypeAny, {
210
+ type: "discord";
211
+ channels: string[];
212
+ mentionOnly: boolean;
213
+ }, {
214
+ type: "discord";
215
+ channels?: string[] | undefined;
216
+ mentionOnly?: boolean | undefined;
217
+ }>, z.ZodObject<{
218
+ type: z.ZodLiteral<"slack">;
219
+ channels: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
220
+ mentionOnly: z.ZodDefault<z.ZodBoolean>;
221
+ }, "strip", z.ZodTypeAny, {
222
+ type: "slack";
223
+ channels: string[];
224
+ mentionOnly: boolean;
225
+ }, {
226
+ type: "slack";
227
+ channels?: string[] | undefined;
228
+ mentionOnly?: boolean | undefined;
229
+ }>, z.ZodObject<{
230
+ type: z.ZodLiteral<"telegram">;
231
+ allowlist: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
232
+ }, "strip", z.ZodTypeAny, {
233
+ type: "telegram";
234
+ allowlist: string[];
235
+ }, {
236
+ type: "telegram";
237
+ allowlist?: string[] | undefined;
238
+ }>, z.ZodObject<{
239
+ type: z.ZodLiteral<"webhook">;
240
+ path: z.ZodString;
241
+ secret: z.ZodOptional<z.ZodString>;
242
+ }, "strip", z.ZodTypeAny, {
243
+ path: string;
244
+ type: "webhook";
245
+ secret?: string | undefined;
246
+ }, {
247
+ path: string;
248
+ type: "webhook";
249
+ secret?: string | undefined;
250
+ }>, z.ZodObject<{
251
+ type: z.ZodLiteral<"cli">;
252
+ }, "strip", z.ZodTypeAny, {
253
+ type: "cli";
254
+ }, {
255
+ type: "cli";
256
+ }>]>;
257
+ export declare const MemorySchema: z.ZodObject<{
258
+ enabled: z.ZodDefault<z.ZodBoolean>;
259
+ backend: z.ZodDefault<z.ZodEnum<["sqlite", "memory", "file"]>>;
260
+ /** Turns of raw history kept verbatim before older turns get summarised. */
261
+ windowTurns: z.ZodDefault<z.ZodNumber>;
262
+ summarise: z.ZodDefault<z.ZodBoolean>;
263
+ }, "strip", z.ZodTypeAny, {
264
+ enabled: boolean;
265
+ backend: "file" | "sqlite" | "memory";
266
+ windowTurns: number;
267
+ summarise: boolean;
268
+ }, {
269
+ enabled?: boolean | undefined;
270
+ backend?: "file" | "sqlite" | "memory" | undefined;
271
+ windowTurns?: number | undefined;
272
+ summarise?: boolean | undefined;
273
+ }>;
274
+ export declare const KnowledgeItemSchema: z.ZodObject<{
275
+ title: z.ZodString;
276
+ content: z.ZodString;
277
+ source: z.ZodOptional<z.ZodString>;
278
+ }, "strip", z.ZodTypeAny, {
279
+ title: string;
280
+ content: string;
281
+ source?: string | undefined;
282
+ }, {
283
+ title: string;
284
+ content: string;
285
+ source?: string | undefined;
286
+ }>;
287
+ export declare const ExampleSchema: z.ZodObject<{
288
+ user: z.ZodString;
289
+ assistant: z.ZodString;
290
+ }, "strip", z.ZodTypeAny, {
291
+ user: string;
292
+ assistant: string;
293
+ }, {
294
+ user: string;
295
+ assistant: string;
296
+ }>;
297
+ export declare const HuskSpecSchema: z.ZodObject<{
298
+ /** Schema version. Bumped only on breaking changes. */
299
+ apiVersion: z.ZodDefault<z.ZodLiteral<"husk/v1">>;
300
+ name: z.ZodString;
301
+ displayName: z.ZodOptional<z.ZodString>;
302
+ version: z.ZodDefault<z.ZodString>;
303
+ description: z.ZodDefault<z.ZodString>;
304
+ /** Primary model, by alias or fully-qualified id. */
305
+ model: z.ZodDefault<z.ZodString>;
306
+ /** Tried in order when the primary is unavailable, rate limited, or over budget. */
307
+ fallbackModels: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
308
+ temperature: z.ZodOptional<z.ZodNumber>;
309
+ /** The system prompt. Supports {{var}} interpolation from RunOptions.vars. */
310
+ persona: z.ZodDefault<z.ZodString>;
311
+ knowledge: z.ZodDefault<z.ZodArray<z.ZodObject<{
312
+ title: z.ZodString;
313
+ content: z.ZodString;
314
+ source: z.ZodOptional<z.ZodString>;
315
+ }, "strip", z.ZodTypeAny, {
316
+ title: string;
317
+ content: string;
318
+ source?: string | undefined;
319
+ }, {
320
+ title: string;
321
+ content: string;
322
+ source?: string | undefined;
323
+ }>, "many">>;
324
+ examples: z.ZodDefault<z.ZodArray<z.ZodObject<{
325
+ user: z.ZodString;
326
+ assistant: z.ZodString;
327
+ }, "strip", z.ZodTypeAny, {
328
+ user: string;
329
+ assistant: string;
330
+ }, {
331
+ user: string;
332
+ assistant: string;
333
+ }>, "many">>;
334
+ /** Tool names, or the computer / files / web / http bundles. */
335
+ tools: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
336
+ computer: z.ZodDefault<z.ZodObject<{
337
+ /** false disables the machine entirely; true accepts every default. */
338
+ enabled: z.ZodDefault<z.ZodBoolean>;
339
+ provider: z.ZodOptional<z.ZodString>;
340
+ flavor: z.ZodDefault<z.ZodEnum<["base", "python", "node", "full"]>>;
341
+ image: z.ZodOptional<z.ZodString>;
342
+ cpus: z.ZodOptional<z.ZodNumber>;
343
+ memoryMb: z.ZodOptional<z.ZodNumber>;
344
+ diskMb: z.ZodOptional<z.ZodNumber>;
345
+ idleTimeoutSec: z.ZodDefault<z.ZodNumber>;
346
+ maxLifetimeSec: z.ZodDefault<z.ZodNumber>;
347
+ network: z.ZodDefault<z.ZodObject<{
348
+ mode: z.ZodDefault<z.ZodEnum<["none", "egress", "full"]>>;
349
+ allow: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
350
+ deny: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
351
+ }, "strip", z.ZodTypeAny, {
352
+ mode: "none" | "egress" | "full";
353
+ deny?: string[] | undefined;
354
+ allow?: string[] | undefined;
355
+ }, {
356
+ deny?: string[] | undefined;
357
+ mode?: "none" | "egress" | "full" | undefined;
358
+ allow?: string[] | undefined;
359
+ }>>;
360
+ packages: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
361
+ setup: z.ZodOptional<z.ZodString>;
362
+ env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
363
+ workdir: z.ZodDefault<z.ZodString>;
364
+ persist: z.ZodDefault<z.ZodBoolean>;
365
+ mounts: z.ZodDefault<z.ZodArray<z.ZodObject<{
366
+ source: z.ZodString;
367
+ target: z.ZodString;
368
+ readonly: z.ZodDefault<z.ZodBoolean>;
369
+ }, "strip", z.ZodTypeAny, {
370
+ source: string;
371
+ target: string;
372
+ readonly: boolean;
373
+ }, {
374
+ source: string;
375
+ target: string;
376
+ readonly?: boolean | undefined;
377
+ }>, "many">>;
378
+ /**
379
+ * Unprivileged user inside the machine. Omitted means "whatever the provider
380
+ * defaults to" (`husk` on the container images), which is why there is no
381
+ * default here: writing one in would override a provider that knows better.
382
+ */
383
+ user: z.ZodOptional<z.ZodString>;
384
+ /**
385
+ * Provider-specific configuration, carried through to `ComputerSpec.labels`.
386
+ *
387
+ * This is how a single husk.yaml points itself at a particular box or Fly app
388
+ * without an environment variable: `husk.ssh`, `husk.ssh.key`, `husk.fly.app`,
389
+ * `husk.fly.region`, `husk.fly.ports`. The ssh and fly providers read these
390
+ * first and fall back to the environment.
391
+ *
392
+ * Optional rather than `.default({})` so a spec that never mentions labels
393
+ * serialises exactly as it did before.
394
+ */
395
+ labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
396
+ }, "strip", z.ZodTypeAny, {
397
+ enabled: boolean;
398
+ flavor: "full" | "base" | "python" | "node";
399
+ idleTimeoutSec: number;
400
+ maxLifetimeSec: number;
401
+ network: {
402
+ mode: "none" | "egress" | "full";
403
+ deny?: string[] | undefined;
404
+ allow?: string[] | undefined;
405
+ };
406
+ packages: string[];
407
+ env: Record<string, string>;
408
+ workdir: string;
409
+ persist: boolean;
410
+ mounts: {
411
+ source: string;
412
+ target: string;
413
+ readonly: boolean;
414
+ }[];
415
+ provider?: string | undefined;
416
+ image?: string | undefined;
417
+ cpus?: number | undefined;
418
+ memoryMb?: number | undefined;
419
+ diskMb?: number | undefined;
420
+ setup?: string | undefined;
421
+ user?: string | undefined;
422
+ labels?: Record<string, string> | undefined;
423
+ }, {
424
+ enabled?: boolean | undefined;
425
+ provider?: string | undefined;
426
+ flavor?: "full" | "base" | "python" | "node" | undefined;
427
+ image?: string | undefined;
428
+ cpus?: number | undefined;
429
+ memoryMb?: number | undefined;
430
+ diskMb?: number | undefined;
431
+ idleTimeoutSec?: number | undefined;
432
+ maxLifetimeSec?: number | undefined;
433
+ network?: {
434
+ deny?: string[] | undefined;
435
+ mode?: "none" | "egress" | "full" | undefined;
436
+ allow?: string[] | undefined;
437
+ } | undefined;
438
+ packages?: string[] | undefined;
439
+ setup?: string | undefined;
440
+ env?: Record<string, string> | undefined;
441
+ workdir?: string | undefined;
442
+ persist?: boolean | undefined;
443
+ mounts?: {
444
+ source: string;
445
+ target: string;
446
+ readonly?: boolean | undefined;
447
+ }[] | undefined;
448
+ user?: string | undefined;
449
+ labels?: Record<string, string> | undefined;
450
+ }>>;
451
+ limits: z.ZodDefault<z.ZodObject<{
452
+ maxSteps: z.ZodDefault<z.ZodNumber>;
453
+ maxCostUsd: z.ZodDefault<z.ZodNumber>;
454
+ maxTokens: z.ZodDefault<z.ZodNumber>;
455
+ timeoutSec: z.ZodDefault<z.ZodNumber>;
456
+ /** Per-exec ceiling inside the machine. */
457
+ execTimeoutSec: z.ZodDefault<z.ZodNumber>;
458
+ maxOutputBytes: z.ZodDefault<z.ZodNumber>;
459
+ }, "strip", z.ZodTypeAny, {
460
+ maxSteps: number;
461
+ maxCostUsd: number;
462
+ maxTokens: number;
463
+ timeoutSec: number;
464
+ execTimeoutSec: number;
465
+ maxOutputBytes: number;
466
+ }, {
467
+ maxSteps?: number | undefined;
468
+ maxCostUsd?: number | undefined;
469
+ maxTokens?: number | undefined;
470
+ timeoutSec?: number | undefined;
471
+ execTimeoutSec?: number | undefined;
472
+ maxOutputBytes?: number | undefined;
473
+ }>>;
474
+ guardrails: z.ZodDefault<z.ZodObject<{
475
+ approvalMode: z.ZodDefault<z.ZodEnum<["auto", "ask", "readonly"]>>;
476
+ /** Regexes matched against a shell command before it runs. */
477
+ denyCommands: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
478
+ allowCommands: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
479
+ /** Refuse and explain, rather than answering. */
480
+ refuse: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
481
+ /** Strip credential-shaped strings from tool output before the model sees them. */
482
+ redactSecrets: z.ZodDefault<z.ZodBoolean>;
483
+ }, "strip", z.ZodTypeAny, {
484
+ approvalMode: "auto" | "readonly" | "ask";
485
+ denyCommands: string[];
486
+ allowCommands: string[];
487
+ refuse: string[];
488
+ redactSecrets: boolean;
489
+ }, {
490
+ approvalMode?: "auto" | "readonly" | "ask" | undefined;
491
+ denyCommands?: string[] | undefined;
492
+ allowCommands?: string[] | undefined;
493
+ refuse?: string[] | undefined;
494
+ redactSecrets?: boolean | undefined;
495
+ }>>;
496
+ memory: z.ZodDefault<z.ZodObject<{
497
+ enabled: z.ZodDefault<z.ZodBoolean>;
498
+ backend: z.ZodDefault<z.ZodEnum<["sqlite", "memory", "file"]>>;
499
+ /** Turns of raw history kept verbatim before older turns get summarised. */
500
+ windowTurns: z.ZodDefault<z.ZodNumber>;
501
+ summarise: z.ZodDefault<z.ZodBoolean>;
502
+ }, "strip", z.ZodTypeAny, {
503
+ enabled: boolean;
504
+ backend: "file" | "sqlite" | "memory";
505
+ windowTurns: number;
506
+ summarise: boolean;
507
+ }, {
508
+ enabled?: boolean | undefined;
509
+ backend?: "file" | "sqlite" | "memory" | undefined;
510
+ windowTurns?: number | undefined;
511
+ summarise?: boolean | undefined;
512
+ }>>;
513
+ triggers: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
514
+ type: z.ZodLiteral<"http">;
515
+ path: z.ZodDefault<z.ZodString>;
516
+ auth: z.ZodDefault<z.ZodEnum<["none", "token"]>>;
517
+ }, "strip", z.ZodTypeAny, {
518
+ path: string;
519
+ type: "http";
520
+ auth: "none" | "token";
521
+ }, {
522
+ type: "http";
523
+ path?: string | undefined;
524
+ auth?: "none" | "token" | undefined;
525
+ }>, z.ZodObject<{
526
+ type: z.ZodLiteral<"cron">;
527
+ schedule: z.ZodString;
528
+ prompt: z.ZodString;
529
+ }, "strip", z.ZodTypeAny, {
530
+ type: "cron";
531
+ schedule: string;
532
+ prompt: string;
533
+ }, {
534
+ type: "cron";
535
+ schedule: string;
536
+ prompt: string;
537
+ }>, z.ZodObject<{
538
+ type: z.ZodLiteral<"discord">;
539
+ channels: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
540
+ mentionOnly: z.ZodDefault<z.ZodBoolean>;
541
+ }, "strip", z.ZodTypeAny, {
542
+ type: "discord";
543
+ channels: string[];
544
+ mentionOnly: boolean;
545
+ }, {
546
+ type: "discord";
547
+ channels?: string[] | undefined;
548
+ mentionOnly?: boolean | undefined;
549
+ }>, z.ZodObject<{
550
+ type: z.ZodLiteral<"slack">;
551
+ channels: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
552
+ mentionOnly: z.ZodDefault<z.ZodBoolean>;
553
+ }, "strip", z.ZodTypeAny, {
554
+ type: "slack";
555
+ channels: string[];
556
+ mentionOnly: boolean;
557
+ }, {
558
+ type: "slack";
559
+ channels?: string[] | undefined;
560
+ mentionOnly?: boolean | undefined;
561
+ }>, z.ZodObject<{
562
+ type: z.ZodLiteral<"telegram">;
563
+ allowlist: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
564
+ }, "strip", z.ZodTypeAny, {
565
+ type: "telegram";
566
+ allowlist: string[];
567
+ }, {
568
+ type: "telegram";
569
+ allowlist?: string[] | undefined;
570
+ }>, z.ZodObject<{
571
+ type: z.ZodLiteral<"webhook">;
572
+ path: z.ZodString;
573
+ secret: z.ZodOptional<z.ZodString>;
574
+ }, "strip", z.ZodTypeAny, {
575
+ path: string;
576
+ type: "webhook";
577
+ secret?: string | undefined;
578
+ }, {
579
+ path: string;
580
+ type: "webhook";
581
+ secret?: string | undefined;
582
+ }>, z.ZodObject<{
583
+ type: z.ZodLiteral<"cli">;
584
+ }, "strip", z.ZodTypeAny, {
585
+ type: "cli";
586
+ }, {
587
+ type: "cli";
588
+ }>]>, "many">>;
589
+ /** Free-form, carried through untouched. */
590
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
591
+ /** Provenance: which transcript this husk was distilled from. */
592
+ origin: z.ZodOptional<z.ZodObject<{
593
+ source: z.ZodString;
594
+ transcriptId: z.ZodOptional<z.ZodString>;
595
+ importedAt: z.ZodOptional<z.ZodString>;
596
+ messageCount: z.ZodOptional<z.ZodNumber>;
597
+ }, "strip", z.ZodTypeAny, {
598
+ source: string;
599
+ transcriptId?: string | undefined;
600
+ importedAt?: string | undefined;
601
+ messageCount?: number | undefined;
602
+ }, {
603
+ source: string;
604
+ transcriptId?: string | undefined;
605
+ importedAt?: string | undefined;
606
+ messageCount?: number | undefined;
607
+ }>>;
608
+ }, "strip", z.ZodTypeAny, {
609
+ guardrails: {
610
+ approvalMode: "auto" | "readonly" | "ask";
611
+ denyCommands: string[];
612
+ allowCommands: string[];
613
+ refuse: string[];
614
+ redactSecrets: boolean;
615
+ };
616
+ memory: {
617
+ enabled: boolean;
618
+ backend: "file" | "sqlite" | "memory";
619
+ windowTurns: number;
620
+ summarise: boolean;
621
+ };
622
+ apiVersion: "husk/v1";
623
+ name: string;
624
+ version: string;
625
+ description: string;
626
+ model: string;
627
+ fallbackModels: string[];
628
+ persona: string;
629
+ knowledge: {
630
+ title: string;
631
+ content: string;
632
+ source?: string | undefined;
633
+ }[];
634
+ examples: {
635
+ user: string;
636
+ assistant: string;
637
+ }[];
638
+ computer: {
639
+ enabled: boolean;
640
+ flavor: "full" | "base" | "python" | "node";
641
+ idleTimeoutSec: number;
642
+ maxLifetimeSec: number;
643
+ network: {
644
+ mode: "none" | "egress" | "full";
645
+ deny?: string[] | undefined;
646
+ allow?: string[] | undefined;
647
+ };
648
+ packages: string[];
649
+ env: Record<string, string>;
650
+ workdir: string;
651
+ persist: boolean;
652
+ mounts: {
653
+ source: string;
654
+ target: string;
655
+ readonly: boolean;
656
+ }[];
657
+ provider?: string | undefined;
658
+ image?: string | undefined;
659
+ cpus?: number | undefined;
660
+ memoryMb?: number | undefined;
661
+ diskMb?: number | undefined;
662
+ setup?: string | undefined;
663
+ user?: string | undefined;
664
+ labels?: Record<string, string> | undefined;
665
+ };
666
+ tools: string[];
667
+ limits: {
668
+ maxSteps: number;
669
+ maxCostUsd: number;
670
+ maxTokens: number;
671
+ timeoutSec: number;
672
+ execTimeoutSec: number;
673
+ maxOutputBytes: number;
674
+ };
675
+ triggers: ({
676
+ path: string;
677
+ type: "http";
678
+ auth: "none" | "token";
679
+ } | {
680
+ type: "cron";
681
+ schedule: string;
682
+ prompt: string;
683
+ } | {
684
+ type: "discord";
685
+ channels: string[];
686
+ mentionOnly: boolean;
687
+ } | {
688
+ type: "slack";
689
+ channels: string[];
690
+ mentionOnly: boolean;
691
+ } | {
692
+ type: "telegram";
693
+ allowlist: string[];
694
+ } | {
695
+ path: string;
696
+ type: "webhook";
697
+ secret?: string | undefined;
698
+ } | {
699
+ type: "cli";
700
+ })[];
701
+ metadata: Record<string, unknown>;
702
+ displayName?: string | undefined;
703
+ temperature?: number | undefined;
704
+ origin?: {
705
+ source: string;
706
+ transcriptId?: string | undefined;
707
+ importedAt?: string | undefined;
708
+ messageCount?: number | undefined;
709
+ } | undefined;
710
+ }, {
711
+ name: string;
712
+ guardrails?: {
713
+ approvalMode?: "auto" | "readonly" | "ask" | undefined;
714
+ denyCommands?: string[] | undefined;
715
+ allowCommands?: string[] | undefined;
716
+ refuse?: string[] | undefined;
717
+ redactSecrets?: boolean | undefined;
718
+ } | undefined;
719
+ memory?: {
720
+ enabled?: boolean | undefined;
721
+ backend?: "file" | "sqlite" | "memory" | undefined;
722
+ windowTurns?: number | undefined;
723
+ summarise?: boolean | undefined;
724
+ } | undefined;
725
+ apiVersion?: "husk/v1" | undefined;
726
+ displayName?: string | undefined;
727
+ version?: string | undefined;
728
+ description?: string | undefined;
729
+ model?: string | undefined;
730
+ fallbackModels?: string[] | undefined;
731
+ temperature?: number | undefined;
732
+ persona?: string | undefined;
733
+ knowledge?: {
734
+ title: string;
735
+ content: string;
736
+ source?: string | undefined;
737
+ }[] | undefined;
738
+ examples?: {
739
+ user: string;
740
+ assistant: string;
741
+ }[] | undefined;
742
+ computer?: {
743
+ enabled?: boolean | undefined;
744
+ provider?: string | undefined;
745
+ flavor?: "full" | "base" | "python" | "node" | undefined;
746
+ image?: string | undefined;
747
+ cpus?: number | undefined;
748
+ memoryMb?: number | undefined;
749
+ diskMb?: number | undefined;
750
+ idleTimeoutSec?: number | undefined;
751
+ maxLifetimeSec?: number | undefined;
752
+ network?: {
753
+ deny?: string[] | undefined;
754
+ mode?: "none" | "egress" | "full" | undefined;
755
+ allow?: string[] | undefined;
756
+ } | undefined;
757
+ packages?: string[] | undefined;
758
+ setup?: string | undefined;
759
+ env?: Record<string, string> | undefined;
760
+ workdir?: string | undefined;
761
+ persist?: boolean | undefined;
762
+ mounts?: {
763
+ source: string;
764
+ target: string;
765
+ readonly?: boolean | undefined;
766
+ }[] | undefined;
767
+ user?: string | undefined;
768
+ labels?: Record<string, string> | undefined;
769
+ } | undefined;
770
+ tools?: string[] | undefined;
771
+ limits?: {
772
+ maxSteps?: number | undefined;
773
+ maxCostUsd?: number | undefined;
774
+ maxTokens?: number | undefined;
775
+ timeoutSec?: number | undefined;
776
+ execTimeoutSec?: number | undefined;
777
+ maxOutputBytes?: number | undefined;
778
+ } | undefined;
779
+ triggers?: ({
780
+ type: "http";
781
+ path?: string | undefined;
782
+ auth?: "none" | "token" | undefined;
783
+ } | {
784
+ type: "cron";
785
+ schedule: string;
786
+ prompt: string;
787
+ } | {
788
+ type: "discord";
789
+ channels?: string[] | undefined;
790
+ mentionOnly?: boolean | undefined;
791
+ } | {
792
+ type: "slack";
793
+ channels?: string[] | undefined;
794
+ mentionOnly?: boolean | undefined;
795
+ } | {
796
+ type: "telegram";
797
+ allowlist?: string[] | undefined;
798
+ } | {
799
+ path: string;
800
+ type: "webhook";
801
+ secret?: string | undefined;
802
+ } | {
803
+ type: "cli";
804
+ })[] | undefined;
805
+ metadata?: Record<string, unknown> | undefined;
806
+ origin?: {
807
+ source: string;
808
+ transcriptId?: string | undefined;
809
+ importedAt?: string | undefined;
810
+ messageCount?: number | undefined;
811
+ } | undefined;
812
+ }>;
813
+ export type HuskSpec = z.infer<typeof HuskSpecSchema>;
814
+ export type HuskSpecInput = z.input<typeof HuskSpecSchema>;
815
+ export type ComputerConfig = z.infer<typeof ComputerConfigSchema>;
816
+ export type Limits = z.infer<typeof LimitsSchema>;
817
+ export type Guardrails = z.infer<typeof GuardrailsSchema>;
818
+ export type Trigger = z.infer<typeof TriggerSchema>;
819
+ /** Parse and normalise. Throws a HuskError carrying every field-level problem. */
820
+ export declare function parseSpec(input: unknown): HuskSpec;
821
+ export declare function safeParseSpec(input: unknown): {
822
+ ok: true;
823
+ spec: HuskSpec;
824
+ } | {
825
+ ok: false;
826
+ issues: string[];
827
+ };
828
+ /** A minimal, valid husk. Used by `husk init` and by tests. */
829
+ export declare function defaultSpec(name: string): HuskSpec;
830
+ /** Interpolate {{var}} placeholders in the persona. Unknown vars are left intact. */
831
+ export declare function renderPersona(spec: HuskSpec, vars?: Record<string, string>): string;
832
+ //# sourceMappingURL=spec.d.ts.map