@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.
- package/dist/audit.d.ts +65 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +87 -0
- package/dist/audit.js.map +1 -0
- package/dist/browse.d.ts +66 -0
- package/dist/browse.d.ts.map +1 -0
- package/dist/browse.js +217 -0
- package/dist/browse.js.map +1 -0
- package/dist/config.d.ts +73 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +59 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/ids.d.ts +7 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +29 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +38 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +52 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/logger.d.ts +20 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +59 -0
- package/dist/logger.js.map +1 -0
- package/dist/net.d.ts +48 -0
- package/dist/net.d.ts.map +1 -0
- package/dist/net.js +219 -0
- package/dist/net.js.map +1 -0
- package/dist/spec.d.ts +832 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +191 -0
- package/dist/spec.js.map +1 -0
- package/dist/types/agent.d.ts +168 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +2 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/computer.d.ts +205 -0
- package/dist/types/computer.d.ts.map +1 -0
- package/dist/types/computer.js +9 -0
- package/dist/types/computer.js.map +1 -0
- package/dist/types/model.d.ts +197 -0
- package/dist/types/model.d.ts.map +1 -0
- package/dist/types/model.js +16 -0
- package/dist/types/model.js.map +1 -0
- package/dist/types/transcript.d.ts +64 -0
- package/dist/types/transcript.d.ts.map +1 -0
- package/dist/types/transcript.js +3 -0
- package/dist/types/transcript.js.map +1 -0
- package/dist/util.d.ts +69 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +236 -0
- package/dist/util.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
|
package/dist/spec.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { HuskError } from './errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* husk.yaml -- the whole agent in one file.
|
|
5
|
+
*
|
|
6
|
+
* This is the artifact a chat becomes. It is portable, diffable, reviewable,
|
|
7
|
+
* and it is the only thing the runtime needs in order to bring a bot up.
|
|
8
|
+
*/
|
|
9
|
+
export const NetworkPolicySchema = z.object({
|
|
10
|
+
mode: z.enum(['none', 'egress', 'full']).default('egress'),
|
|
11
|
+
allow: z.array(z.string()).optional(),
|
|
12
|
+
deny: z.array(z.string()).optional(),
|
|
13
|
+
});
|
|
14
|
+
export const ComputerConfigSchema = z.object({
|
|
15
|
+
/** false disables the machine entirely; true accepts every default. */
|
|
16
|
+
enabled: z.boolean().default(true),
|
|
17
|
+
provider: z.string().optional(),
|
|
18
|
+
flavor: z.enum(['base', 'python', 'node', 'full']).default('base'),
|
|
19
|
+
image: z.string().optional(),
|
|
20
|
+
cpus: z.number().positive().max(64).optional(),
|
|
21
|
+
memoryMb: z.number().int().positive().max(131072).optional(),
|
|
22
|
+
diskMb: z.number().int().positive().optional(),
|
|
23
|
+
idleTimeoutSec: z.number().int().min(0).default(900),
|
|
24
|
+
maxLifetimeSec: z.number().int().min(0).default(0),
|
|
25
|
+
network: NetworkPolicySchema.default({ mode: 'egress' }),
|
|
26
|
+
packages: z.array(z.string()).default([]),
|
|
27
|
+
setup: z.string().optional(),
|
|
28
|
+
env: z.record(z.string()).default({}),
|
|
29
|
+
workdir: z.string().default('/work'),
|
|
30
|
+
persist: z.boolean().default(false),
|
|
31
|
+
mounts: z
|
|
32
|
+
.array(z.object({ source: z.string(), target: z.string(), readonly: z.boolean().default(true) }))
|
|
33
|
+
.default([]),
|
|
34
|
+
/**
|
|
35
|
+
* Unprivileged user inside the machine. Omitted means "whatever the provider
|
|
36
|
+
* defaults to" (`husk` on the container images), which is why there is no
|
|
37
|
+
* default here: writing one in would override a provider that knows better.
|
|
38
|
+
*/
|
|
39
|
+
user: z.string().optional(),
|
|
40
|
+
/**
|
|
41
|
+
* Provider-specific configuration, carried through to `ComputerSpec.labels`.
|
|
42
|
+
*
|
|
43
|
+
* This is how a single husk.yaml points itself at a particular box or Fly app
|
|
44
|
+
* without an environment variable: `husk.ssh`, `husk.ssh.key`, `husk.fly.app`,
|
|
45
|
+
* `husk.fly.region`, `husk.fly.ports`. The ssh and fly providers read these
|
|
46
|
+
* first and fall back to the environment.
|
|
47
|
+
*
|
|
48
|
+
* Optional rather than `.default({})` so a spec that never mentions labels
|
|
49
|
+
* serialises exactly as it did before.
|
|
50
|
+
*/
|
|
51
|
+
labels: z.record(z.string()).optional(),
|
|
52
|
+
});
|
|
53
|
+
export const LimitsSchema = z.object({
|
|
54
|
+
maxSteps: z.number().int().positive().max(500).default(24),
|
|
55
|
+
maxCostUsd: z.number().min(0).default(0.5),
|
|
56
|
+
maxTokens: z.number().int().positive().default(200_000),
|
|
57
|
+
timeoutSec: z.number().int().positive().default(300),
|
|
58
|
+
/** Per-exec ceiling inside the machine. */
|
|
59
|
+
execTimeoutSec: z.number().int().positive().default(120),
|
|
60
|
+
maxOutputBytes: z.number().int().positive().default(262_144),
|
|
61
|
+
});
|
|
62
|
+
export const GuardrailsSchema = z.object({
|
|
63
|
+
approvalMode: z.enum(['auto', 'ask', 'readonly']).default('auto'),
|
|
64
|
+
/** Regexes matched against a shell command before it runs. */
|
|
65
|
+
denyCommands: z.array(z.string()).default([]),
|
|
66
|
+
allowCommands: z.array(z.string()).default([]),
|
|
67
|
+
/** Refuse and explain, rather than answering. */
|
|
68
|
+
refuse: z.array(z.string()).default([]),
|
|
69
|
+
/** Strip credential-shaped strings from tool output before the model sees them. */
|
|
70
|
+
redactSecrets: z.boolean().default(true),
|
|
71
|
+
});
|
|
72
|
+
export const TriggerSchema = z.discriminatedUnion('type', [
|
|
73
|
+
z.object({
|
|
74
|
+
type: z.literal('http'),
|
|
75
|
+
path: z.string().default('/'),
|
|
76
|
+
auth: z.enum(['none', 'token']).default('token'),
|
|
77
|
+
}),
|
|
78
|
+
z.object({ type: z.literal('cron'), schedule: z.string(), prompt: z.string() }),
|
|
79
|
+
z.object({
|
|
80
|
+
type: z.literal('discord'),
|
|
81
|
+
channels: z.array(z.string()).default([]),
|
|
82
|
+
mentionOnly: z.boolean().default(true),
|
|
83
|
+
}),
|
|
84
|
+
z.object({
|
|
85
|
+
type: z.literal('slack'),
|
|
86
|
+
channels: z.array(z.string()).default([]),
|
|
87
|
+
mentionOnly: z.boolean().default(true),
|
|
88
|
+
}),
|
|
89
|
+
z.object({ type: z.literal('telegram'), allowlist: z.array(z.string()).default([]) }),
|
|
90
|
+
z.object({ type: z.literal('webhook'), path: z.string(), secret: z.string().optional() }),
|
|
91
|
+
z.object({ type: z.literal('cli') }),
|
|
92
|
+
]);
|
|
93
|
+
export const MemorySchema = z.object({
|
|
94
|
+
enabled: z.boolean().default(false),
|
|
95
|
+
backend: z.enum(['sqlite', 'memory', 'file']).default('sqlite'),
|
|
96
|
+
/** Turns of raw history kept verbatim before older turns get summarised. */
|
|
97
|
+
windowTurns: z.number().int().positive().default(20),
|
|
98
|
+
summarise: z.boolean().default(true),
|
|
99
|
+
});
|
|
100
|
+
export const KnowledgeItemSchema = z.object({
|
|
101
|
+
title: z.string(),
|
|
102
|
+
content: z.string(),
|
|
103
|
+
source: z.string().optional(),
|
|
104
|
+
});
|
|
105
|
+
export const ExampleSchema = z.object({
|
|
106
|
+
user: z.string(),
|
|
107
|
+
assistant: z.string(),
|
|
108
|
+
});
|
|
109
|
+
export const HuskSpecSchema = z.object({
|
|
110
|
+
/** Schema version. Bumped only on breaking changes. */
|
|
111
|
+
apiVersion: z.literal('husk/v1').default('husk/v1'),
|
|
112
|
+
name: z
|
|
113
|
+
.string()
|
|
114
|
+
.min(1)
|
|
115
|
+
.max(64)
|
|
116
|
+
.regex(/^[a-z0-9][a-z0-9-]*$/, 'name must be lowercase alphanumeric with dashes'),
|
|
117
|
+
displayName: z.string().max(96).optional(),
|
|
118
|
+
version: z.string().default('0.1.0'),
|
|
119
|
+
description: z.string().max(280).default(''),
|
|
120
|
+
/** Primary model, by alias or fully-qualified id. */
|
|
121
|
+
model: z.string().default('auto'),
|
|
122
|
+
/** Tried in order when the primary is unavailable, rate limited, or over budget. */
|
|
123
|
+
fallbackModels: z.array(z.string()).default([]),
|
|
124
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
125
|
+
/** The system prompt. Supports {{var}} interpolation from RunOptions.vars. */
|
|
126
|
+
persona: z.string().default(''),
|
|
127
|
+
knowledge: z.array(KnowledgeItemSchema).default([]),
|
|
128
|
+
examples: z.array(ExampleSchema).default([]),
|
|
129
|
+
/** Tool names, or the computer / files / web / http bundles. */
|
|
130
|
+
tools: z.array(z.string()).default(['computer']),
|
|
131
|
+
computer: ComputerConfigSchema.default({}),
|
|
132
|
+
limits: LimitsSchema.default({}),
|
|
133
|
+
guardrails: GuardrailsSchema.default({}),
|
|
134
|
+
memory: MemorySchema.default({}),
|
|
135
|
+
triggers: z.array(TriggerSchema).default([{ type: 'cli' }]),
|
|
136
|
+
/** Free-form, carried through untouched. */
|
|
137
|
+
metadata: z.record(z.unknown()).default({}),
|
|
138
|
+
/** Provenance: which transcript this husk was distilled from. */
|
|
139
|
+
origin: z
|
|
140
|
+
.object({
|
|
141
|
+
source: z.string(),
|
|
142
|
+
transcriptId: z.string().optional(),
|
|
143
|
+
importedAt: z.string().optional(),
|
|
144
|
+
messageCount: z.number().optional(),
|
|
145
|
+
})
|
|
146
|
+
.optional(),
|
|
147
|
+
});
|
|
148
|
+
/** Parse and normalise. Throws a HuskError carrying every field-level problem. */
|
|
149
|
+
export function parseSpec(input) {
|
|
150
|
+
const result = HuskSpecSchema.safeParse(input);
|
|
151
|
+
if (!result.success) {
|
|
152
|
+
const issues = result.error.issues.map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`);
|
|
153
|
+
throw new HuskError('E_SPEC_INVALID', `husk.yaml is not valid:\n ${issues.join('\n ')}`, {
|
|
154
|
+
hint: 'Run `husk validate` to see the expected shape, or `husk init` to regenerate.',
|
|
155
|
+
details: { issues },
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return result.data;
|
|
159
|
+
}
|
|
160
|
+
export function safeParseSpec(input) {
|
|
161
|
+
const result = HuskSpecSchema.safeParse(input);
|
|
162
|
+
if (result.success)
|
|
163
|
+
return { ok: true, spec: result.data };
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
issues: result.error.issues.map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/** A minimal, valid husk. Used by `husk init` and by tests. */
|
|
170
|
+
export function defaultSpec(name) {
|
|
171
|
+
return HuskSpecSchema.parse({
|
|
172
|
+
name,
|
|
173
|
+
displayName: name.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()),
|
|
174
|
+
description: 'A husk.',
|
|
175
|
+
persona: 'You are a careful, concise assistant with access to a Linux computer.',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/** Interpolate {{var}} placeholders in the persona. Unknown vars are left intact. */
|
|
179
|
+
export function renderPersona(spec, vars = {}) {
|
|
180
|
+
const base = spec.persona.replace(/\{\{\s*(\w+)\s*\}\}/g, (m, k) => vars[k] ?? m);
|
|
181
|
+
const parts = [base];
|
|
182
|
+
if (spec.knowledge.length) {
|
|
183
|
+
parts.push('\n## Reference\n' + spec.knowledge.map((k) => `### ${k.title}\n${k.content}`).join('\n\n'));
|
|
184
|
+
}
|
|
185
|
+
if (spec.guardrails.refuse.length) {
|
|
186
|
+
parts.push('\n## Out of scope\nDecline these, briefly, and say what you can do instead:\n' +
|
|
187
|
+
spec.guardrails.refuse.map((r) => `- ${r}`).join('\n'));
|
|
188
|
+
}
|
|
189
|
+
return parts.join('\n').trim();
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=spec.js.map
|
package/dist/spec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { Computer } from './computer.js';
|
|
2
|
+
import type { ChatResponse, JSONSchema, ModelMessage, ToolCallPart, Usage } from './model.js';
|
|
3
|
+
import type { Logger } from '../logger.js';
|
|
4
|
+
export interface ToolContext {
|
|
5
|
+
/** The machine this agent is driving, when it has one. */
|
|
6
|
+
computer?: Computer;
|
|
7
|
+
log: Logger;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
huskId: string;
|
|
10
|
+
runId: string;
|
|
11
|
+
/** Scratch space shared across tool calls within one run. */
|
|
12
|
+
state: Map<string, unknown>;
|
|
13
|
+
emit(event: RunEvent): void;
|
|
14
|
+
/** Ask the operator to approve a dangerous call. Resolves false when no approver is wired. */
|
|
15
|
+
confirm(prompt: string, details?: Record<string, unknown>): Promise<boolean>;
|
|
16
|
+
}
|
|
17
|
+
export interface Tool<I = Record<string, unknown>, O = unknown> {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
parameters: JSONSchema;
|
|
21
|
+
/** Requires approval when the run is in ask mode. */
|
|
22
|
+
dangerous?: boolean;
|
|
23
|
+
/** Withheld from the model unless the husk explicitly enables it. */
|
|
24
|
+
optIn?: boolean;
|
|
25
|
+
handler(input: I, ctx: ToolContext): Promise<O>;
|
|
26
|
+
/** Render the result for the model. Defaults to JSON.stringify. */
|
|
27
|
+
render?(output: O): string;
|
|
28
|
+
}
|
|
29
|
+
export type ApprovalMode = 'auto' | 'ask' | 'readonly';
|
|
30
|
+
/**
|
|
31
|
+
* What a human is being asked to approve.
|
|
32
|
+
*
|
|
33
|
+
* Covers both a `dangerous` tool call and a free-form `ctx.confirm`, so an
|
|
34
|
+
* approver written once handles every pause the runtime can raise.
|
|
35
|
+
*/
|
|
36
|
+
export interface ApprovalRequest {
|
|
37
|
+
runId: string;
|
|
38
|
+
huskId: string;
|
|
39
|
+
/** The tool being called, or undefined for a free-form `ctx.confirm`. */
|
|
40
|
+
tool?: string;
|
|
41
|
+
/** The originating tool call, when there is one. Lets a client correlate. */
|
|
42
|
+
callId?: string;
|
|
43
|
+
args?: Record<string, unknown>;
|
|
44
|
+
/** Human-readable question. Always populated. */
|
|
45
|
+
prompt: string;
|
|
46
|
+
details?: Record<string, unknown>;
|
|
47
|
+
dangerous: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Decide whether a paused call may proceed.
|
|
51
|
+
*
|
|
52
|
+
* Returning false, throwing, and not being supplied at all must all deny.
|
|
53
|
+
* Approval is a security boundary: absent means no.
|
|
54
|
+
*/
|
|
55
|
+
export type Approver = (req: ApprovalRequest) => Promise<boolean>;
|
|
56
|
+
export interface RunOptions {
|
|
57
|
+
input: string | ModelMessage[];
|
|
58
|
+
/** Prior turns to continue from. */
|
|
59
|
+
history?: ModelMessage[];
|
|
60
|
+
model?: string;
|
|
61
|
+
maxSteps?: number;
|
|
62
|
+
maxCostUsd?: number;
|
|
63
|
+
maxTokens?: number;
|
|
64
|
+
timeoutSec?: number;
|
|
65
|
+
approvalMode?: ApprovalMode;
|
|
66
|
+
signal?: AbortSignal;
|
|
67
|
+
onEvent?: (event: RunEvent) => void;
|
|
68
|
+
/**
|
|
69
|
+
* Called before a `dangerous` tool runs in `ask` mode.
|
|
70
|
+
*
|
|
71
|
+
* Absent means deny. A headless process running an `ask`-mode husk must fail
|
|
72
|
+
* closed, not quietly behave as though it were in `auto`.
|
|
73
|
+
*/
|
|
74
|
+
onApproval?: Approver;
|
|
75
|
+
/** Named values interpolated into the persona template. */
|
|
76
|
+
vars?: Record<string, string>;
|
|
77
|
+
}
|
|
78
|
+
export type RunEvent = {
|
|
79
|
+
type: 'run_start';
|
|
80
|
+
runId: string;
|
|
81
|
+
husk: string;
|
|
82
|
+
model: string;
|
|
83
|
+
} | {
|
|
84
|
+
type: 'step_start';
|
|
85
|
+
step: number;
|
|
86
|
+
} | {
|
|
87
|
+
type: 'thinking_delta';
|
|
88
|
+
text: string;
|
|
89
|
+
} | {
|
|
90
|
+
type: 'text_delta';
|
|
91
|
+
text: string;
|
|
92
|
+
} | {
|
|
93
|
+
type: 'message';
|
|
94
|
+
message: ModelMessage;
|
|
95
|
+
} | {
|
|
96
|
+
type: 'tool_start';
|
|
97
|
+
call: ToolCallPart;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Output from a running tool, as it arrives.
|
|
101
|
+
*
|
|
102
|
+
* Deliberately not `text_delta`: that is the model's token stream, and a
|
|
103
|
+
* consumer rendering it must not find a build log spliced into the middle.
|
|
104
|
+
*/
|
|
105
|
+
| {
|
|
106
|
+
type: 'tool_delta';
|
|
107
|
+
callId: string;
|
|
108
|
+
tool: string;
|
|
109
|
+
stream: 'stdout' | 'stderr';
|
|
110
|
+
text: string;
|
|
111
|
+
} | {
|
|
112
|
+
type: 'tool_end';
|
|
113
|
+
call: ToolCallPart;
|
|
114
|
+
output: string;
|
|
115
|
+
isError: boolean;
|
|
116
|
+
durationMs: number;
|
|
117
|
+
} | {
|
|
118
|
+
type: 'tool_denied';
|
|
119
|
+
call: ToolCallPart;
|
|
120
|
+
reason: string;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The run is blocked on a human. Answer by resolving the `Approver`, or over
|
|
124
|
+
* HTTP by POSTing to /v1/approvals/:approvalId. An unanswered request is
|
|
125
|
+
* denied when it times out.
|
|
126
|
+
*/
|
|
127
|
+
| {
|
|
128
|
+
type: 'approval_required';
|
|
129
|
+
approvalId: string;
|
|
130
|
+
request: ApprovalRequest;
|
|
131
|
+
} | {
|
|
132
|
+
type: 'computer_ready';
|
|
133
|
+
computerId: string;
|
|
134
|
+
provider: string;
|
|
135
|
+
} | {
|
|
136
|
+
type: 'usage';
|
|
137
|
+
usage: Usage;
|
|
138
|
+
cumulative: Usage;
|
|
139
|
+
} | {
|
|
140
|
+
type: 'warning';
|
|
141
|
+
message: string;
|
|
142
|
+
} | {
|
|
143
|
+
type: 'run_end';
|
|
144
|
+
result: RunResult;
|
|
145
|
+
} | {
|
|
146
|
+
type: 'error';
|
|
147
|
+
error: {
|
|
148
|
+
message: string;
|
|
149
|
+
code?: string;
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
export interface RunResult {
|
|
153
|
+
runId: string;
|
|
154
|
+
text: string;
|
|
155
|
+
messages: ModelMessage[];
|
|
156
|
+
steps: number;
|
|
157
|
+
usage: Usage;
|
|
158
|
+
durationMs: number;
|
|
159
|
+
/** `loop` means the run was cut short because the agent kept repeating itself. */
|
|
160
|
+
stopReason: 'complete' | 'step_limit' | 'budget' | 'timeout' | 'aborted' | 'loop' | 'error';
|
|
161
|
+
error?: {
|
|
162
|
+
message: string;
|
|
163
|
+
code?: string;
|
|
164
|
+
};
|
|
165
|
+
/** Every model call made during the run, for replay and debugging. */
|
|
166
|
+
trace?: ChatResponse[];
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The computer contract.
|
|
3
|
+
*
|
|
4
|
+
* A Husk "computer" is a small, disposable Linux machine an agent can drive.
|
|
5
|
+
* Every provider -- Docker, Podman, a plain guarded directory, SSH, Fly --
|
|
6
|
+
* implements this same surface, so an agent never learns where it is running.
|
|
7
|
+
*/
|
|
8
|
+
export type ProviderName = 'docker' | 'podman' | 'local' | 'ssh' | 'fly' | (string & {});
|
|
9
|
+
export type ComputerState = 'creating' | 'running' | 'paused' | 'stopped' | 'destroyed' | 'error';
|
|
10
|
+
/** How much the machine is allowed to talk to the outside world. */
|
|
11
|
+
export interface NetworkPolicy {
|
|
12
|
+
/** none: no egress at all. egress: allowlist only. full: unrestricted. */
|
|
13
|
+
mode: 'none' | 'egress' | 'full';
|
|
14
|
+
/** Hostnames or CIDRs permitted when mode === 'egress'. Supports leading '*.' wildcards. */
|
|
15
|
+
allow?: string[];
|
|
16
|
+
/** Always-denied hosts, applied even in 'full' mode. */
|
|
17
|
+
deny?: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface MountSpec {
|
|
20
|
+
/** Absolute path on the host. */
|
|
21
|
+
source: string;
|
|
22
|
+
/** Absolute path inside the computer. */
|
|
23
|
+
target: string;
|
|
24
|
+
readonly?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Prebuilt environments. A provider maps these onto concrete images. */
|
|
27
|
+
export type Flavor = 'base' | 'python' | 'node' | 'full';
|
|
28
|
+
export interface ComputerSpec {
|
|
29
|
+
/** Human label. Also used for the container name when it is unique. */
|
|
30
|
+
name?: string;
|
|
31
|
+
provider?: ProviderName;
|
|
32
|
+
/** Explicit image reference. Overrides `flavor`. */
|
|
33
|
+
image?: string;
|
|
34
|
+
flavor?: Flavor;
|
|
35
|
+
cpus?: number;
|
|
36
|
+
memoryMb?: number;
|
|
37
|
+
diskMb?: number;
|
|
38
|
+
/** Destroy the computer after this many seconds of no exec activity. 0 disables. */
|
|
39
|
+
idleTimeoutSec?: number;
|
|
40
|
+
/** Hard ceiling on total lifetime regardless of activity. 0 disables. */
|
|
41
|
+
maxLifetimeSec?: number;
|
|
42
|
+
network?: NetworkPolicy;
|
|
43
|
+
env?: Record<string, string>;
|
|
44
|
+
mounts?: MountSpec[];
|
|
45
|
+
/** Default working directory. Defaults to /work. */
|
|
46
|
+
workdir?: string;
|
|
47
|
+
/** Unprivileged user inside the machine. Defaults to `husk`. */
|
|
48
|
+
user?: string;
|
|
49
|
+
/** Keep the filesystem across restarts (named volume / retained directory). */
|
|
50
|
+
persist?: boolean;
|
|
51
|
+
/** Extra packages to install on first boot, resolved by the flavor's package manager. */
|
|
52
|
+
packages?: string[];
|
|
53
|
+
/** Shell snippet run once after creation. */
|
|
54
|
+
setup?: string;
|
|
55
|
+
labels?: Record<string, string>;
|
|
56
|
+
}
|
|
57
|
+
export interface ComputerInfo {
|
|
58
|
+
id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
provider: ProviderName;
|
|
61
|
+
state: ComputerState;
|
|
62
|
+
image: string;
|
|
63
|
+
workdir: string;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
lastUsedAt: string;
|
|
66
|
+
spec: ComputerSpec;
|
|
67
|
+
/** Provider-native handle (container id, machine id, pid namespace, ...). */
|
|
68
|
+
nativeId?: string;
|
|
69
|
+
/** Ports published to the host, keyed by the in-computer port. */
|
|
70
|
+
ports?: Record<number, PortBinding>;
|
|
71
|
+
/**
|
|
72
|
+
* Set when `image` is not the image the spec asked for.
|
|
73
|
+
*
|
|
74
|
+
* husk prefers its own images and falls back to a stock public one when the
|
|
75
|
+
* registry has nothing -- which is every install until the images are
|
|
76
|
+
* published. The fallback is a bare `debian:bookworm-slim`: no python3, no
|
|
77
|
+
* curl, no `huskinfo`, and no `husk` user. That is a perfectly usable Linux
|
|
78
|
+
* box and a surprising one if you were told you had the other, so the
|
|
79
|
+
* substitution is recorded rather than performed quietly.
|
|
80
|
+
*/
|
|
81
|
+
imageFallback?: {
|
|
82
|
+
wanted: string;
|
|
83
|
+
reason: string;
|
|
84
|
+
};
|
|
85
|
+
error?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface PortBinding {
|
|
88
|
+
hostPort: number;
|
|
89
|
+
url: string;
|
|
90
|
+
/** Set when the provider can offer a public tunnel. */
|
|
91
|
+
publicUrl?: string;
|
|
92
|
+
/**
|
|
93
|
+
* Whether anything actually answered on `url` when the binding was made.
|
|
94
|
+
*
|
|
95
|
+
* `false` is not necessarily an error -- an agent that exposes a port before
|
|
96
|
+
* its server finishes starting is the ordinary case -- but a URL nobody has
|
|
97
|
+
* ever connected to should not be handed back as though it were known good.
|
|
98
|
+
* Undefined means the provider did not check.
|
|
99
|
+
*/
|
|
100
|
+
reachable?: boolean;
|
|
101
|
+
}
|
|
102
|
+
export interface ExecRequest {
|
|
103
|
+
/** A shell string, or an argv array to execute without a shell. */
|
|
104
|
+
cmd: string | string[];
|
|
105
|
+
cwd?: string;
|
|
106
|
+
env?: Record<string, string>;
|
|
107
|
+
timeoutSec?: number;
|
|
108
|
+
stdin?: string;
|
|
109
|
+
user?: string;
|
|
110
|
+
/** Allocate a pty. Required for interactive tools and for programs that check isatty. */
|
|
111
|
+
tty?: boolean;
|
|
112
|
+
/** Output is clamped to this many bytes per stream. Defaults to 256 KiB. */
|
|
113
|
+
maxOutputBytes?: number;
|
|
114
|
+
onStdout?: (chunk: string) => void;
|
|
115
|
+
onStderr?: (chunk: string) => void;
|
|
116
|
+
signal?: AbortSignal;
|
|
117
|
+
}
|
|
118
|
+
export interface ExecResult {
|
|
119
|
+
exitCode: number;
|
|
120
|
+
stdout: string;
|
|
121
|
+
stderr: string;
|
|
122
|
+
durationMs: number;
|
|
123
|
+
truncated: boolean;
|
|
124
|
+
timedOut: boolean;
|
|
125
|
+
}
|
|
126
|
+
export interface DirEntry {
|
|
127
|
+
name: string;
|
|
128
|
+
path: string;
|
|
129
|
+
type: 'file' | 'dir' | 'symlink' | 'other';
|
|
130
|
+
size: number;
|
|
131
|
+
modifiedAt?: string;
|
|
132
|
+
mode?: string;
|
|
133
|
+
}
|
|
134
|
+
export interface WriteFileOptions {
|
|
135
|
+
/** Octal string, e.g. '0755'. */
|
|
136
|
+
mode?: string;
|
|
137
|
+
/** Create parent directories. Defaults to true. */
|
|
138
|
+
mkdirp?: boolean;
|
|
139
|
+
append?: boolean;
|
|
140
|
+
}
|
|
141
|
+
/** A live computer. All paths are absolute inside the machine unless noted. */
|
|
142
|
+
export interface Computer {
|
|
143
|
+
readonly id: string;
|
|
144
|
+
readonly info: ComputerInfo;
|
|
145
|
+
refresh(): Promise<ComputerInfo>;
|
|
146
|
+
exec(req: ExecRequest): Promise<ExecResult>;
|
|
147
|
+
writeFile(path: string, content: string | Uint8Array, opts?: WriteFileOptions): Promise<void>;
|
|
148
|
+
readFile(path: string): Promise<Uint8Array>;
|
|
149
|
+
readTextFile(path: string, maxBytes?: number): Promise<string>;
|
|
150
|
+
listDir(path: string): Promise<DirEntry[]>;
|
|
151
|
+
stat(path: string): Promise<DirEntry | null>;
|
|
152
|
+
remove(path: string, opts?: {
|
|
153
|
+
recursive?: boolean;
|
|
154
|
+
}): Promise<void>;
|
|
155
|
+
/** Copy a host path into the machine. Directories are copied recursively. */
|
|
156
|
+
upload(hostPath: string, targetPath: string): Promise<void>;
|
|
157
|
+
/** Copy a machine path back out to the host. */
|
|
158
|
+
download(path: string, hostPath: string): Promise<void>;
|
|
159
|
+
/** Publish an in-computer port to the host. Idempotent. */
|
|
160
|
+
exposePort(port: number): Promise<PortBinding>;
|
|
161
|
+
stop(): Promise<void>;
|
|
162
|
+
start(): Promise<void>;
|
|
163
|
+
destroy(): Promise<void>;
|
|
164
|
+
/** Optional capabilities -- callers must feature-detect. */
|
|
165
|
+
snapshot?(name?: string): Promise<{
|
|
166
|
+
id: string;
|
|
167
|
+
sizeBytes?: number;
|
|
168
|
+
}>;
|
|
169
|
+
restore?(snapshotId: string): Promise<void>;
|
|
170
|
+
}
|
|
171
|
+
export interface Availability {
|
|
172
|
+
available: boolean;
|
|
173
|
+
/** Why it is not available, in one line. */
|
|
174
|
+
reason?: string;
|
|
175
|
+
/** What the user should do about it, in one line. */
|
|
176
|
+
hint?: string;
|
|
177
|
+
version?: string;
|
|
178
|
+
/** True when the boundary is real. See `isolationKind` for what kind of real. */
|
|
179
|
+
isolated?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* What the boundary actually is.
|
|
182
|
+
*
|
|
183
|
+
* - `kernel` — namespaces and cgroups on this machine (docker, podman, fly).
|
|
184
|
+
* - `machine` — a different computer entirely (ssh). Isolated from *your* laptop,
|
|
185
|
+
* but the agent still holds your user's shell on the far end, so it is not
|
|
186
|
+
* isolated from that box. Rendering this as a plain green "isolated" badge
|
|
187
|
+
* overclaims, which is the whole reason this field exists.
|
|
188
|
+
* - `guardrails` — process-level checks only (local). Stops accidents, not attackers.
|
|
189
|
+
*/
|
|
190
|
+
isolationKind?: 'kernel' | 'machine' | 'guardrails';
|
|
191
|
+
}
|
|
192
|
+
export interface ComputerProvider {
|
|
193
|
+
readonly name: ProviderName;
|
|
194
|
+
/** One-line description shown in `husk doctor`. */
|
|
195
|
+
readonly description: string;
|
|
196
|
+
/** Higher wins when auto-selecting a provider. */
|
|
197
|
+
readonly priority: number;
|
|
198
|
+
isAvailable(): Promise<Availability>;
|
|
199
|
+
create(spec: ComputerSpec): Promise<Computer>;
|
|
200
|
+
get(id: string): Promise<Computer | null>;
|
|
201
|
+
list(): Promise<ComputerInfo[]>;
|
|
202
|
+
/** Remove computers that have outlived their idle or lifetime budget. */
|
|
203
|
+
reap?(): Promise<string[]>;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=computer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer.d.ts","sourceRoot":"","sources":["../../src/types/computer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The computer contract.
|
|
3
|
+
*
|
|
4
|
+
* A Husk "computer" is a small, disposable Linux machine an agent can drive.
|
|
5
|
+
* Every provider -- Docker, Podman, a plain guarded directory, SSH, Fly --
|
|
6
|
+
* implements this same surface, so an agent never learns where it is running.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=computer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer.js","sourceRoot":"","sources":["../../src/types/computer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|