@aisy/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/dist/agent-loop/index.d.ts +4 -0
- package/dist/agent-loop/index.d.ts.map +1 -0
- package/dist/agent-loop/index.js +352 -0
- package/dist/agent-loop/index.js.map +1 -0
- package/dist/agent-loop/types.d.ts +183 -0
- package/dist/agent-loop/types.d.ts.map +1 -0
- package/dist/agent-loop/types.js +3 -0
- package/dist/agent-loop/types.js.map +1 -0
- package/dist/bin/aisy.d.ts +3 -0
- package/dist/bin/aisy.d.ts.map +1 -0
- package/dist/bin/aisy.js +14 -0
- package/dist/bin/aisy.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +114 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context-engine/index.d.ts +4 -0
- package/dist/context-engine/index.d.ts.map +1 -0
- package/dist/context-engine/index.js +126 -0
- package/dist/context-engine/index.js.map +1 -0
- package/dist/context-engine/types.d.ts +54 -0
- package/dist/context-engine/types.d.ts.map +1 -0
- package/dist/context-engine/types.js +4 -0
- package/dist/context-engine/types.js.map +1 -0
- package/dist/eval/index.d.ts +20 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +128 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/types.d.ts +62 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +17 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/gateway/index.d.ts +5 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +288 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/types.d.ts +194 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +94 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/goals/index.d.ts +11 -0
- package/dist/goals/index.d.ts.map +1 -0
- package/dist/goals/index.js +21 -0
- package/dist/goals/index.js.map +1 -0
- package/dist/goals/types.d.ts +47 -0
- package/dist/goals/types.d.ts.map +1 -0
- package/dist/goals/types.js +5 -0
- package/dist/goals/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +215 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +148 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +4 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +419 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +131 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +33 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/nightly/index.d.ts +4 -0
- package/dist/nightly/index.d.ts.map +1 -0
- package/dist/nightly/index.js +470 -0
- package/dist/nightly/index.js.map +1 -0
- package/dist/nightly/types.d.ts +326 -0
- package/dist/nightly/types.d.ts.map +1 -0
- package/dist/nightly/types.js +3 -0
- package/dist/nightly/types.js.map +1 -0
- package/dist/observability/index.d.ts +11 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +396 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/types.d.ts +139 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +4 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/onboarding/index.d.ts +16 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +787 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/interactive.d.ts +23 -0
- package/dist/onboarding/interactive.d.ts.map +1 -0
- package/dist/onboarding/interactive.js +45 -0
- package/dist/onboarding/interactive.js.map +1 -0
- package/dist/onboarding/types.d.ts +388 -0
- package/dist/onboarding/types.d.ts.map +1 -0
- package/dist/onboarding/types.js +35 -0
- package/dist/onboarding/types.js.map +1 -0
- package/dist/orchestration/index.d.ts +8 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +706 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/types.d.ts +391 -0
- package/dist/orchestration/types.d.ts.map +1 -0
- package/dist/orchestration/types.js +30 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/personality/index.d.ts +65 -0
- package/dist/personality/index.d.ts.map +1 -0
- package/dist/personality/index.js +339 -0
- package/dist/personality/index.js.map +1 -0
- package/dist/personality/types.d.ts +103 -0
- package/dist/personality/types.d.ts.map +1 -0
- package/dist/personality/types.js +15 -0
- package/dist/personality/types.js.map +1 -0
- package/dist/provider/index.d.ts +4 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +236 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/types.d.ts +180 -0
- package/dist/provider/types.d.ts.map +1 -0
- package/dist/provider/types.js +4 -0
- package/dist/provider/types.js.map +1 -0
- package/dist/runtime/agent-cards.d.ts +14 -0
- package/dist/runtime/agent-cards.d.ts.map +1 -0
- package/dist/runtime/agent-cards.js +90 -0
- package/dist/runtime/agent-cards.js.map +1 -0
- package/dist/runtime/agent-runner.d.ts +30 -0
- package/dist/runtime/agent-runner.d.ts.map +1 -0
- package/dist/runtime/agent-runner.js +37 -0
- package/dist/runtime/agent-runner.js.map +1 -0
- package/dist/runtime/budget.d.ts +15 -0
- package/dist/runtime/budget.d.ts.map +1 -0
- package/dist/runtime/budget.js +24 -0
- package/dist/runtime/budget.js.map +1 -0
- package/dist/runtime/delegation-driver.d.ts +11 -0
- package/dist/runtime/delegation-driver.d.ts.map +1 -0
- package/dist/runtime/delegation-driver.js +132 -0
- package/dist/runtime/delegation-driver.js.map +1 -0
- package/dist/runtime/exact-cache.d.ts +10 -0
- package/dist/runtime/exact-cache.d.ts.map +1 -0
- package/dist/runtime/exact-cache.js +30 -0
- package/dist/runtime/exact-cache.js.map +1 -0
- package/dist/runtime/execute-tool.d.ts +29 -0
- package/dist/runtime/execute-tool.d.ts.map +1 -0
- package/dist/runtime/execute-tool.js +80 -0
- package/dist/runtime/execute-tool.js.map +1 -0
- package/dist/runtime/guardian.d.ts +9 -0
- package/dist/runtime/guardian.d.ts.map +1 -0
- package/dist/runtime/guardian.js +41 -0
- package/dist/runtime/guardian.js.map +1 -0
- package/dist/runtime/hook-gate.d.ts +17 -0
- package/dist/runtime/hook-gate.d.ts.map +1 -0
- package/dist/runtime/hook-gate.js +56 -0
- package/dist/runtime/hook-gate.js.map +1 -0
- package/dist/runtime/memory-adapter.d.ts +6 -0
- package/dist/runtime/memory-adapter.d.ts.map +1 -0
- package/dist/runtime/memory-adapter.js +38 -0
- package/dist/runtime/memory-adapter.js.map +1 -0
- package/dist/runtime/nightly-adapters.d.ts +48 -0
- package/dist/runtime/nightly-adapters.d.ts.map +1 -0
- package/dist/runtime/nightly-adapters.js +139 -0
- package/dist/runtime/nightly-adapters.js.map +1 -0
- package/dist/runtime/nightly-generator.d.ts +10 -0
- package/dist/runtime/nightly-generator.d.ts.map +1 -0
- package/dist/runtime/nightly-generator.js +335 -0
- package/dist/runtime/nightly-generator.js.map +1 -0
- package/dist/runtime/onboarding-node.d.ts +6 -0
- package/dist/runtime/onboarding-node.d.ts.map +1 -0
- package/dist/runtime/onboarding-node.js +356 -0
- package/dist/runtime/onboarding-node.js.map +1 -0
- package/dist/runtime/provider-anthropic.d.ts +43 -0
- package/dist/runtime/provider-anthropic.d.ts.map +1 -0
- package/dist/runtime/provider-anthropic.js +148 -0
- package/dist/runtime/provider-anthropic.js.map +1 -0
- package/dist/runtime/provider-cli.d.ts +18 -0
- package/dist/runtime/provider-cli.d.ts.map +1 -0
- package/dist/runtime/provider-cli.js +73 -0
- package/dist/runtime/provider-cli.js.map +1 -0
- package/dist/runtime/provider-openai.d.ts +30 -0
- package/dist/runtime/provider-openai.d.ts.map +1 -0
- package/dist/runtime/provider-openai.js +114 -0
- package/dist/runtime/provider-openai.js.map +1 -0
- package/dist/runtime/providers.d.ts +43 -0
- package/dist/runtime/providers.d.ts.map +1 -0
- package/dist/runtime/providers.js +72 -0
- package/dist/runtime/providers.js.map +1 -0
- package/dist/runtime/sandbox-bash.d.ts +21 -0
- package/dist/runtime/sandbox-bash.d.ts.map +1 -0
- package/dist/runtime/sandbox-bash.js +51 -0
- package/dist/runtime/sandbox-bash.js.map +1 -0
- package/dist/runtime/scoped-tool-executor.d.ts +10 -0
- package/dist/runtime/scoped-tool-executor.d.ts.map +1 -0
- package/dist/runtime/scoped-tool-executor.js +30 -0
- package/dist/runtime/scoped-tool-executor.js.map +1 -0
- package/dist/runtime/session-log.d.ts +6 -0
- package/dist/runtime/session-log.d.ts.map +1 -0
- package/dist/runtime/session-log.js +54 -0
- package/dist/runtime/session-log.js.map +1 -0
- package/dist/runtime/settings.d.ts +24 -0
- package/dist/runtime/settings.d.ts.map +1 -0
- package/dist/runtime/settings.js +29 -0
- package/dist/runtime/settings.js.map +1 -0
- package/dist/runtime/spawn-plan.d.ts +13 -0
- package/dist/runtime/spawn-plan.d.ts.map +1 -0
- package/dist/runtime/spawn-plan.js +107 -0
- package/dist/runtime/spawn-plan.js.map +1 -0
- package/dist/runtime/spend.d.ts +41 -0
- package/dist/runtime/spend.d.ts.map +1 -0
- package/dist/runtime/spend.js +0 -0
- package/dist/runtime/spend.js.map +1 -0
- package/dist/runtime/sub-agent-runner.d.ts +19 -0
- package/dist/runtime/sub-agent-runner.d.ts.map +1 -0
- package/dist/runtime/sub-agent-runner.js +47 -0
- package/dist/runtime/sub-agent-runner.js.map +1 -0
- package/dist/safety/grants.d.ts +7 -0
- package/dist/safety/grants.d.ts.map +1 -0
- package/dist/safety/grants.js +53 -0
- package/dist/safety/grants.js.map +1 -0
- package/dist/safety/index.d.ts +72 -0
- package/dist/safety/index.d.ts.map +1 -0
- package/dist/safety/index.js +464 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/types.d.ts +254 -0
- package/dist/safety/types.d.ts.map +1 -0
- package/dist/safety/types.js +3 -0
- package/dist/safety/types.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +463 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/types.d.ts +177 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +3 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/testing/clock.d.ts +8 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +13 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/effect-verifier.d.ts +15 -0
- package/dist/testing/effect-verifier.d.ts.map +1 -0
- package/dist/testing/effect-verifier.js +27 -0
- package/dist/testing/effect-verifier.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider-fake.d.ts +14 -0
- package/dist/testing/provider-fake.d.ts.map +1 -0
- package/dist/testing/provider-fake.js +18 -0
- package/dist/testing/provider-fake.js.map +1 -0
- package/dist/testing/sandbox-stub.d.ts +15 -0
- package/dist/testing/sandbox-stub.d.ts.map +1 -0
- package/dist/testing/sandbox-stub.js +15 -0
- package/dist/testing/sandbox-stub.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +0 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +138 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +4 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/triggers/index.d.ts +4 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +187 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/types.d.ts +74 -0
- package/dist/triggers/types.d.ts.map +1 -0
- package/dist/triggers/types.js +5 -0
- package/dist/triggers/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
export { makeGrantStore } from './grants.js';
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Normalization + HARD_DENY rule set (ADR-0009)
|
|
5
|
+
// Tested against the normalized tool name + serialized args — obfuscated
|
|
6
|
+
// variants (alias paths, URL-encoding, path traversal) are normalized first.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function normalizeHaystack(call) {
|
|
9
|
+
let s = `${call.tool} ${JSON.stringify(call.args)}`.toLowerCase();
|
|
10
|
+
try {
|
|
11
|
+
s = decodeURIComponent(s);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
/* malformed escapes stay as-is — patterns still match the raw form */
|
|
15
|
+
}
|
|
16
|
+
return s;
|
|
17
|
+
}
|
|
18
|
+
const HARD_DENY = [
|
|
19
|
+
{ id: 'FS_DESTRUCTION_RM_RF', pattern: /\brm\s+-[a-z]*(?:rf|fr)\b/ },
|
|
20
|
+
{ id: 'INFRA_DESTRUCTION_TF', pattern: /terraform\s+destroy/ },
|
|
21
|
+
{ id: 'HISTORY_REWRITE_FORCE_PUSH', pattern: /git\s+push(?:\s+\S+)*\s+(?:--force|-f)\b/ },
|
|
22
|
+
{ id: 'DB_DROP_TABLE', pattern: /\bdrop\s+table\b/ },
|
|
23
|
+
{ id: 'DB_TRUNCATE', pattern: /\btruncate\s+table\b/ },
|
|
24
|
+
{ id: 'MONEY_OP', pattern: /stripe\.|createcharge|\btransfer\s+funds\b|\bpayout\b/ },
|
|
25
|
+
{ id: 'SECRET_FILE_READ', pattern: /etc\/shadow|etc\/passwd|id_rsa\b|\.aws\/credentials/ },
|
|
26
|
+
];
|
|
27
|
+
/** DELETE without WHERE — checked on every string arg (any key), fail-closed. */
|
|
28
|
+
function isUnboundedDelete(call) {
|
|
29
|
+
for (const v of Object.values(call.args)) {
|
|
30
|
+
if (typeof v !== 'string')
|
|
31
|
+
continue;
|
|
32
|
+
const s = v.toLowerCase();
|
|
33
|
+
if (/\bdelete\s+from\b/.test(s) && !/\bwhere\b/.test(s))
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
/** Outbound / side-effecting drop set disabled under narrowing (ADR-0027). */
|
|
39
|
+
function isOutboundOrSideEffecting(call) {
|
|
40
|
+
if (/^(telegram\.|http\.|mcp:write)/.test(call.tool))
|
|
41
|
+
return true;
|
|
42
|
+
if (call.tool === 'bash') {
|
|
43
|
+
const cmd = String(call.args['cmd'] ?? '');
|
|
44
|
+
return /git\s+push|curl|wget|\bssh\b|\bscp\b|\bnc\b/.test(cmd);
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
/** High-risk in degraded (no-gVisor) mode: network-capable shell commands. */
|
|
49
|
+
function isHighRiskShell(call) {
|
|
50
|
+
if (call.tool !== 'bash')
|
|
51
|
+
return false;
|
|
52
|
+
return /curl|wget|\bssh\b|\bnc\b/.test(String(call.args['cmd'] ?? ''));
|
|
53
|
+
}
|
|
54
|
+
function tierOf(call) {
|
|
55
|
+
if (/drop-database|drop_database|delete-repo/.test(call.tool))
|
|
56
|
+
return 3;
|
|
57
|
+
if (/^git\.|^db\.|^telegram\.|^http\./.test(call.tool) || call.tool === 'bash' || /write|send/.test(call.tool))
|
|
58
|
+
return 2;
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
function makeCard(call, tier) {
|
|
62
|
+
return {
|
|
63
|
+
tier,
|
|
64
|
+
actionSummary: `${call.tool}(${Object.keys(call.args).join(', ')})`,
|
|
65
|
+
actionHash: createHash('sha256').update(JSON.stringify({ tool: call.tool, args: call.args })).digest('hex'),
|
|
66
|
+
nonce: randomUUID(),
|
|
67
|
+
issuedAt: Date.now(),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function makeSafetyPolicy(deps = {}) {
|
|
71
|
+
const ready = deps.ready ?? true;
|
|
72
|
+
const sandboxLevel = deps.sandboxSecurityLevel ?? 'full';
|
|
73
|
+
const isNarrowed = (ctx) =>
|
|
74
|
+
// Absent or unparsable provenance is treated as untrusted (AC-05-7).
|
|
75
|
+
ctx.some(span => span.provenance !== 'operator');
|
|
76
|
+
return {
|
|
77
|
+
get ready() {
|
|
78
|
+
return ready;
|
|
79
|
+
},
|
|
80
|
+
isNarrowed,
|
|
81
|
+
evaluate(call, ctx) {
|
|
82
|
+
// Cold start: nothing executes before the rule set is loaded.
|
|
83
|
+
if (!ready) {
|
|
84
|
+
return { decision: 'deny', rule: 'COLD_START', reason: 'safety policy not loaded — fail-closed' };
|
|
85
|
+
}
|
|
86
|
+
// Hook infrastructure failure → deny, never allow-on-error (AC-05-27).
|
|
87
|
+
if (call.args['hookError'] === true) {
|
|
88
|
+
return { decision: 'deny', rule: 'HOOK_ERROR', reason: 'PreToolUse hook error/timeout — fail-closed' };
|
|
89
|
+
}
|
|
90
|
+
// HARD_DENY — normalized matching, no model involvement (ADR-0009).
|
|
91
|
+
const haystack = normalizeHaystack(call);
|
|
92
|
+
for (const rule of HARD_DENY) {
|
|
93
|
+
if (rule.pattern.test(haystack)) {
|
|
94
|
+
return { decision: 'deny', rule: rule.id, reason: `matched HARD_DENY ${rule.id}` };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (isUnboundedDelete(call)) {
|
|
98
|
+
return { decision: 'deny', rule: 'DB_DELETE_NO_WHERE', reason: 'DELETE without WHERE' };
|
|
99
|
+
}
|
|
100
|
+
// Motivated-call block: untrusted-derived args never execute (ADR-0027).
|
|
101
|
+
if (call.argsTainted === true) {
|
|
102
|
+
return { decision: 'deny', rule: 'TAINTED_ARGS', reason: 'args derived from untrusted span' };
|
|
103
|
+
}
|
|
104
|
+
// Capability narrowing: outbound / side-effecting drop set is disabled
|
|
105
|
+
// while any untrusted span is in context (ADR-0027).
|
|
106
|
+
if (isNarrowed(ctx) && isOutboundOrSideEffecting(call)) {
|
|
107
|
+
return { decision: 'deny', rule: 'NARROWED_OUTBOUND', reason: 'untrusted span in context — outbound locked' };
|
|
108
|
+
}
|
|
109
|
+
// Degraded sandbox (no gVisor): high-risk tools are denied (ADR-0012).
|
|
110
|
+
if (sandboxLevel === 'degraded-no-gvisor' && isHighRiskShell(call)) {
|
|
111
|
+
return { decision: 'deny', rule: 'DEGRADED_SANDBOX', reason: 'gVisor unavailable — high-risk tool denied' };
|
|
112
|
+
}
|
|
113
|
+
// Autonomy gradient (ADR-0011): Tier-3 always asks via the red card and
|
|
114
|
+
// is NEVER suppressible by a grant (step-up every time, ADR-0047).
|
|
115
|
+
// Tier-2 asks, unless a per-tool scoped grant remembers the approval —
|
|
116
|
+
// checked HERE, after every deny above, so a grant can never override a
|
|
117
|
+
// deny. Tier-0/1 auto-allow.
|
|
118
|
+
const tier = tierOf(call);
|
|
119
|
+
if (tier === 3) {
|
|
120
|
+
return { decision: 'ask', tier, card: makeCard(call, tier) };
|
|
121
|
+
}
|
|
122
|
+
if (tier === 2) {
|
|
123
|
+
if (deps.grants?.has(call.tool) === true) {
|
|
124
|
+
return { decision: 'allow' };
|
|
125
|
+
}
|
|
126
|
+
return { decision: 'ask', tier, card: makeCard(call, tier) };
|
|
127
|
+
}
|
|
128
|
+
return { decision: 'allow' };
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// SafetyClassifier — async convenience wrapper over the policy
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
export function makeSafetyClassifier(deps = {}) {
|
|
136
|
+
const policy = makeSafetyPolicy(deps);
|
|
137
|
+
return {
|
|
138
|
+
classify: async (input) => policy.evaluate(input.call, input.ctx),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// InputGuard — unconditional defang + advisory classifier (ADR-0028)
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
const INJECTION_PATTERNS = [
|
|
145
|
+
/ignore\s+(?:all\s+)?previous\s+instructions/i,
|
|
146
|
+
/new\s+system\s*(?:prompt|:)/i,
|
|
147
|
+
/exfiltrate/i,
|
|
148
|
+
];
|
|
149
|
+
export function makeInputGuard(deps = {}) {
|
|
150
|
+
return {
|
|
151
|
+
// Deterministic transforms — run 100% of the time, independent of the
|
|
152
|
+
// classifier: strip auto-loading resources, neutralize URLs, defang
|
|
153
|
+
// known injection phrasings. Provenance is never modified.
|
|
154
|
+
defang(span) {
|
|
155
|
+
let text = span.text;
|
|
156
|
+
// Markdown images auto-load — stripped entirely.
|
|
157
|
+
text = text.replace(/!\[[^\]]*\]\([^)]*\)/g, '[image removed]');
|
|
158
|
+
// Foreign URLs neutralized to a non-loadable scheme.
|
|
159
|
+
text = text.replace(/https:\/\//gi, 'hxxps://').replace(/http:\/\//gi, 'hxxp://');
|
|
160
|
+
// Known injection phrasing is visibly marked, never silently passed —
|
|
161
|
+
// a global-flagged copy ensures every occurrence is defanged, not just
|
|
162
|
+
// the first (mirrors the Vault redactor below).
|
|
163
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
164
|
+
const gPattern = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');
|
|
165
|
+
text = text.replace(gPattern, (m) => `[defanged] ${m}`);
|
|
166
|
+
}
|
|
167
|
+
return { ...span, text };
|
|
168
|
+
},
|
|
169
|
+
// Advisory only: can escalate, can never grant trust (provenance is
|
|
170
|
+
// owned by Core/Gateway and never rewritten here).
|
|
171
|
+
async classify(span) {
|
|
172
|
+
if (deps.classify) {
|
|
173
|
+
try {
|
|
174
|
+
return await deps.classify(span);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Classifier unavailable → caller defaults to quarantine; report
|
|
178
|
+
// 'suspicious' so nothing is admitted as clean on a dead classifier.
|
|
179
|
+
return 'suspicious';
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (INJECTION_PATTERNS.some(p => p.test(span.text)))
|
|
183
|
+
return 'injection';
|
|
184
|
+
if (/password|secret|send\s+all\s+data/i.test(span.text))
|
|
185
|
+
return 'suspicious';
|
|
186
|
+
return 'clean';
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function shannonEntropy(s) {
|
|
191
|
+
if (s.length === 0)
|
|
192
|
+
return 0;
|
|
193
|
+
const freq = new Map();
|
|
194
|
+
for (const ch of s)
|
|
195
|
+
freq.set(ch, (freq.get(ch) ?? 0) + 1);
|
|
196
|
+
let h = 0;
|
|
197
|
+
for (const n of freq.values()) {
|
|
198
|
+
const p = n / s.length;
|
|
199
|
+
h -= p * Math.log2(p);
|
|
200
|
+
}
|
|
201
|
+
return h;
|
|
202
|
+
}
|
|
203
|
+
/** Three-part JWT shape, prefix-free — shared by EgressGuard and the Vault. */
|
|
204
|
+
const JWT_SHAPE = /eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/;
|
|
205
|
+
const SECRET_SHAPES = [
|
|
206
|
+
/sk_live_[a-z0-9]+/i,
|
|
207
|
+
/\bAKIA[A-Z0-9_]+/,
|
|
208
|
+
JWT_SHAPE,
|
|
209
|
+
];
|
|
210
|
+
export function makeEgressGuard(deps = {}) {
|
|
211
|
+
const proxyAvailable = deps.proxyAvailable ?? true;
|
|
212
|
+
const maxBody = deps.maxBodyBytes ?? 1_000_000;
|
|
213
|
+
return {
|
|
214
|
+
inspectBody(req, ctx) {
|
|
215
|
+
// Proxy down or allowlist not loaded → nothing leaves (fail-closed).
|
|
216
|
+
if (!proxyAvailable)
|
|
217
|
+
return { decision: 'deny', reason: 'egress proxy unavailable' };
|
|
218
|
+
const entry = deps.allowlist?.find(e => e.host === req.host);
|
|
219
|
+
if (!entry)
|
|
220
|
+
return { decision: 'deny', reason: 'host not on egress allowlist' };
|
|
221
|
+
// Method allowlist: only the methods the host entry declares may pass.
|
|
222
|
+
const method = req.method.toUpperCase();
|
|
223
|
+
if (!entry.methods.some(m => m.toUpperCase() === method)) {
|
|
224
|
+
return { decision: 'deny', reason: 'method not on host egress allowlist' };
|
|
225
|
+
}
|
|
226
|
+
// Read-only destination: any write method or body is a deny.
|
|
227
|
+
const isRead = ['GET', 'HEAD'].includes(method);
|
|
228
|
+
if (entry.mode === 'read-only' && (!isRead || req.body !== undefined)) {
|
|
229
|
+
return { decision: 'deny', reason: 'write to read-only destination' };
|
|
230
|
+
}
|
|
231
|
+
const body = typeof req.body === 'string' ? req.body : req.body ? Buffer.from(req.body).toString('utf8') : '';
|
|
232
|
+
if (body.length > maxBody)
|
|
233
|
+
return { decision: 'deny', reason: 'body exceeds size cap' };
|
|
234
|
+
if (body.length > 256 && shannonEntropy(body) > 5.5) {
|
|
235
|
+
return { decision: 'deny', reason: 'high-entropy body (possible encrypted exfil)' };
|
|
236
|
+
}
|
|
237
|
+
if (SECRET_SHAPES.some(p => p.test(body))) {
|
|
238
|
+
return { decision: 'deny', reason: 'secret-shaped pattern in outbound body' };
|
|
239
|
+
}
|
|
240
|
+
// While narrowed, free-text query strings are a covert channel.
|
|
241
|
+
const narrowed = ctx.some(span => span.provenance !== 'operator');
|
|
242
|
+
if (narrowed && req.queryString && req.queryString.length > 0) {
|
|
243
|
+
return { decision: 'deny', reason: 'free-text query string while narrowed' };
|
|
244
|
+
}
|
|
245
|
+
return { decision: 'allow' };
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const TRUST_FIELDS = ['is_human_confirmed', 'permanence', 'trusted', 'human_confirmed'];
|
|
250
|
+
/** Recursively drop every trust-marker field from objects and array elements. */
|
|
251
|
+
function stripTrustDeep(value) {
|
|
252
|
+
if (Array.isArray(value))
|
|
253
|
+
return value.map(stripTrustDeep);
|
|
254
|
+
if (value !== null && typeof value === 'object') {
|
|
255
|
+
const stripped = {};
|
|
256
|
+
for (const [key, v] of Object.entries(value)) {
|
|
257
|
+
if (TRUST_FIELDS.includes(key))
|
|
258
|
+
continue;
|
|
259
|
+
stripped[key] = stripTrustDeep(v);
|
|
260
|
+
}
|
|
261
|
+
return stripped;
|
|
262
|
+
}
|
|
263
|
+
return value;
|
|
264
|
+
}
|
|
265
|
+
export function makeApprovalHandler(deps = {}) {
|
|
266
|
+
const pending = new Map((deps.pending ?? []).map(p => [p.nonce, p]));
|
|
267
|
+
const consumed = new Set();
|
|
268
|
+
const now = deps.now ?? (() => Date.now());
|
|
269
|
+
const verifyFactor = deps.verifySecondFactor ?? ((f) => f.length > 0);
|
|
270
|
+
return {
|
|
271
|
+
confirm(nonce, actionHash, secondFactor) {
|
|
272
|
+
// Replay: a consumed nonce never confirms again.
|
|
273
|
+
if (consumed.has(nonce))
|
|
274
|
+
return { status: 'rejected-replay' };
|
|
275
|
+
const entry = pending.get(nonce);
|
|
276
|
+
if (!entry)
|
|
277
|
+
return { status: 'rejected-stale' };
|
|
278
|
+
if (now() > entry.expiresAt)
|
|
279
|
+
return { status: 'rejected-stale' };
|
|
280
|
+
// The tap must echo the exact pending action's hash.
|
|
281
|
+
if (actionHash !== entry.actionHash)
|
|
282
|
+
return { status: 'rejected-hash-mismatch' };
|
|
283
|
+
// TOCTOU: the staged artifact must be byte-identical at promote time.
|
|
284
|
+
const stagedNow = deps.currentStagedHash ? deps.currentStagedHash() : entry.stagedHashAtAccept;
|
|
285
|
+
if (stagedNow !== entry.stagedHashAtAccept)
|
|
286
|
+
return { status: 'rejected-toctou' };
|
|
287
|
+
// Step-up second factor for Tier-3 / money / permanence. The record only
|
|
288
|
+
// asserts a 2FA check when one was actually required AND validated; when
|
|
289
|
+
// not required, no factor was supplied or verified → false (the approval
|
|
290
|
+
// is still valid, the field must not claim a check that never happened).
|
|
291
|
+
const secondFactorOk = entry.requiresSecondFactor && secondFactor !== undefined && verifyFactor(secondFactor);
|
|
292
|
+
if (entry.requiresSecondFactor && !secondFactorOk)
|
|
293
|
+
return { status: 'rejected-second-factor' };
|
|
294
|
+
consumed.add(nonce);
|
|
295
|
+
return {
|
|
296
|
+
status: 'approved',
|
|
297
|
+
record: {
|
|
298
|
+
nonce,
|
|
299
|
+
actionHash,
|
|
300
|
+
op: 'confirm',
|
|
301
|
+
tapTimestamp: now(),
|
|
302
|
+
secondFactorOk,
|
|
303
|
+
stagedHashAtAccept: entry.stagedHashAtAccept,
|
|
304
|
+
stagedHashAtPromote: stagedNow,
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
},
|
|
308
|
+
// Model output can never carry trust: every trust/permanence field is
|
|
309
|
+
// stripped before staging (AC-05-11; the handler is the only setter).
|
|
310
|
+
// Recurses into nested objects and arrays so a trust field buried at any
|
|
311
|
+
// depth is also stripped.
|
|
312
|
+
stripTrustFields(output) {
|
|
313
|
+
return stripTrustDeep(output);
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
const BUILTIN_SECRET_PATTERNS = [
|
|
318
|
+
/sk_live_[A-Za-z0-9]+/g,
|
|
319
|
+
/AKIA[A-Z0-9_]+/g,
|
|
320
|
+
new RegExp(JWT_SHAPE.source, 'g'), // shared JWT shape (see JWT_SHAPE)
|
|
321
|
+
];
|
|
322
|
+
export function makeVault(deps = {}) {
|
|
323
|
+
const secrets = new Map(Object.entries(deps.secrets ?? {}));
|
|
324
|
+
const patterns = [...BUILTIN_SECRET_PATTERNS];
|
|
325
|
+
const redactor = {
|
|
326
|
+
redact(text) {
|
|
327
|
+
let out = text;
|
|
328
|
+
// Known secret VALUES are stripped wherever they appear. An empty value
|
|
329
|
+
// would splice the placeholder between every character — skip it.
|
|
330
|
+
for (const value of secrets.values()) {
|
|
331
|
+
if (!value)
|
|
332
|
+
continue;
|
|
333
|
+
out = out.split(value).join('«redacted»');
|
|
334
|
+
}
|
|
335
|
+
// Built-in + registered secret SHAPES.
|
|
336
|
+
for (const pattern of patterns) {
|
|
337
|
+
out = out.replace(new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g'), '«redacted»');
|
|
338
|
+
}
|
|
339
|
+
return out;
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
return {
|
|
343
|
+
async getSecret(name) {
|
|
344
|
+
const value = secrets.get(name);
|
|
345
|
+
if (value === undefined)
|
|
346
|
+
throw new Error(`vault: secret '${name}' not found`);
|
|
347
|
+
return value;
|
|
348
|
+
},
|
|
349
|
+
async listSecrets() {
|
|
350
|
+
return [...secrets.keys()];
|
|
351
|
+
},
|
|
352
|
+
addRedactionPattern(pattern) {
|
|
353
|
+
patterns.push(pattern);
|
|
354
|
+
},
|
|
355
|
+
get redactor() {
|
|
356
|
+
return redactor;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
export function makeSandboxRunner(deps = {}) {
|
|
361
|
+
const allowedRoots = deps.allowedMountRoots ?? ['/work', '/tmp/aisy'];
|
|
362
|
+
const gVisorAvailable = deps.gVisorProbe ? deps.gVisorProbe() : true;
|
|
363
|
+
const seccompProfile = deps.seccompProfile ?? '/etc/aisy/seccomp-default.json';
|
|
364
|
+
const usernsRemap = deps.usernsRemap ?? 'default';
|
|
365
|
+
const running = new Map(); // containerId -> taskId
|
|
366
|
+
let counter = 0;
|
|
367
|
+
const validateMounts = (mounts) => {
|
|
368
|
+
for (const m of mounts) {
|
|
369
|
+
// The docker socket is host-root-equivalent — never mountable.
|
|
370
|
+
if (m.hostPath.includes('docker.sock')) {
|
|
371
|
+
return `mount of ${m.hostPath} refused: docker.sock is never mountable`;
|
|
372
|
+
}
|
|
373
|
+
if (!allowedRoots.some(root => m.hostPath === root || m.hostPath.startsWith(`${root}/`))) {
|
|
374
|
+
return `mount of ${m.hostPath} refused: outside the worktree allowlist`;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return null;
|
|
378
|
+
};
|
|
379
|
+
return {
|
|
380
|
+
get securityLevel() {
|
|
381
|
+
return gVisorAvailable ? 'full' : 'degraded-no-gvisor';
|
|
382
|
+
},
|
|
383
|
+
validateMounts,
|
|
384
|
+
async start(config) {
|
|
385
|
+
const mountError = validateMounts(config.mounts);
|
|
386
|
+
if (mountError)
|
|
387
|
+
throw new Error(mountError);
|
|
388
|
+
// ADR-0012 container invariants — fixed flags, not configurable.
|
|
389
|
+
const flags = [
|
|
390
|
+
'--cap-drop=ALL',
|
|
391
|
+
'--security-opt=no-new-privileges',
|
|
392
|
+
`--security-opt=seccomp=${seccompProfile}`,
|
|
393
|
+
`--userns-remap=${usernsRemap}`,
|
|
394
|
+
'--read-only',
|
|
395
|
+
config.egressBridge ? `--network=${config.egressBridge}` : '--network=none',
|
|
396
|
+
'--pids-limit=256',
|
|
397
|
+
...(config.gVisorAvailable ? ['--runtime=runsc'] : []),
|
|
398
|
+
];
|
|
399
|
+
const id = deps.launch ? deps.launch(config, flags) : `sbx-${++counter}`;
|
|
400
|
+
running.set(id, config.taskId);
|
|
401
|
+
return id;
|
|
402
|
+
},
|
|
403
|
+
async exec(containerId, cmd, args) {
|
|
404
|
+
if (!running.has(containerId))
|
|
405
|
+
throw new Error(`exec: unknown container ${containerId}`);
|
|
406
|
+
return deps.execImpl
|
|
407
|
+
? deps.execImpl(containerId, cmd, args)
|
|
408
|
+
: { stdout: '', stderr: '', exitCode: 0 };
|
|
409
|
+
},
|
|
410
|
+
async teardown(containerId, _taskId) {
|
|
411
|
+
// Teardown must be CONFIRMED; an unknown container cannot be confirmed
|
|
412
|
+
// torn down — the task is marked failed (throw).
|
|
413
|
+
if (!running.delete(containerId)) {
|
|
414
|
+
throw new Error(`teardown of unknown container ${containerId} cannot be confirmed`);
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
/** Known params per op kind; anything else (incl. any force flag) is refused. */
|
|
420
|
+
const CARVEOUT_KINDS = new Set([
|
|
421
|
+
'vacuum', 'fts5-optimize', 'wal-checkpoint', 'log-rotation',
|
|
422
|
+
'docker-prune', 'worktree-prune', 'git-push-ff',
|
|
423
|
+
]);
|
|
424
|
+
export function makeNightlyCarveout(deps = {}) {
|
|
425
|
+
const isPermitted = (op) => {
|
|
426
|
+
if (!CARVEOUT_KINDS.has(op.kind))
|
|
427
|
+
return false;
|
|
428
|
+
// Precondition: no force flags, no unknown escalation params.
|
|
429
|
+
if (op.params['force'] === true)
|
|
430
|
+
return false;
|
|
431
|
+
if (Object.keys(op.params).some(k => k === 'unknown'))
|
|
432
|
+
return false;
|
|
433
|
+
return true;
|
|
434
|
+
};
|
|
435
|
+
return {
|
|
436
|
+
isPermitted,
|
|
437
|
+
async run(op) {
|
|
438
|
+
if (!isPermitted(op)) {
|
|
439
|
+
return { ran: false, reason: `op ${op.kind} not permitted by the carve-out allowlist` };
|
|
440
|
+
}
|
|
441
|
+
// Reversibility: pre-op DB snapshot commits BEFORE the op runs.
|
|
442
|
+
deps.snapshot?.();
|
|
443
|
+
deps.execOp?.(op);
|
|
444
|
+
return { ran: true };
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
// ---------------------------------------------------------------------------
|
|
449
|
+
// LethalTrifectaDetector (ADR-0010) — at least one leg must stay severed
|
|
450
|
+
// ---------------------------------------------------------------------------
|
|
451
|
+
export function makeLethalTrifectaDetector() {
|
|
452
|
+
return {
|
|
453
|
+
evaluate(call, ctx) {
|
|
454
|
+
const hasUntrustedContent = ctx.some(span => span.provenance !== 'operator');
|
|
455
|
+
const hasPrivateData = ctx.some(
|
|
456
|
+
// A newline separator stops a match from spanning the text/source join.
|
|
457
|
+
span => SECRET_SHAPES.some(p => p.test(span.text)) || /api[-_]?key|\.env\b/i.test(`${span.text}\n${span.source}`));
|
|
458
|
+
const hasOutboundChannel = isOutboundOrSideEffecting(call);
|
|
459
|
+
const state = { hasUntrustedContent, hasPrivateData, hasOutboundChannel };
|
|
460
|
+
return { triggered: hasUntrustedContent && hasPrivateData && hasOutboundChannel, state };
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/safety/index.ts"],"names":[],"mappings":"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"}
|