@kaleidorg/mind 0.5.1 → 0.6.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/autonomy/index.d.ts +21 -0
- package/dist/autonomy/index.d.ts.map +1 -0
- package/dist/autonomy/index.js +16 -0
- package/dist/autonomy/index.js.map +1 -0
- package/dist/autonomy/prompt.d.ts +21 -0
- package/dist/autonomy/prompt.d.ts.map +1 -0
- package/dist/autonomy/prompt.js +37 -0
- package/dist/autonomy/prompt.js.map +1 -0
- package/dist/autonomy/risk.d.ts +53 -0
- package/dist/autonomy/risk.d.ts.map +1 -0
- package/dist/autonomy/risk.js +74 -0
- package/dist/autonomy/risk.js.map +1 -0
- package/dist/autonomy/run-state.d.ts +39 -0
- package/dist/autonomy/run-state.d.ts.map +1 -0
- package/dist/autonomy/run-state.js +118 -0
- package/dist/autonomy/run-state.js.map +1 -0
- package/dist/autonomy/scheduler.d.ts +18 -0
- package/dist/autonomy/scheduler.d.ts.map +1 -0
- package/dist/autonomy/scheduler.js +113 -0
- package/dist/autonomy/scheduler.js.map +1 -0
- package/dist/autonomy/task-store.d.ts +44 -0
- package/dist/autonomy/task-store.d.ts.map +1 -0
- package/dist/autonomy/task-store.js +139 -0
- package/dist/autonomy/task-store.js.map +1 -0
- package/dist/autonomy/types.d.ts +164 -0
- package/dist/autonomy/types.d.ts.map +1 -0
- package/dist/autonomy/types.js +20 -0
- package/dist/autonomy/types.js.map +1 -0
- package/dist/bitrefill/contract.d.ts +60 -0
- package/dist/bitrefill/contract.d.ts.map +1 -0
- package/dist/bitrefill/contract.js +119 -0
- package/dist/bitrefill/contract.js.map +1 -0
- package/dist/context/compress.d.ts +65 -0
- package/dist/context/compress.d.ts.map +1 -0
- package/dist/context/compress.js +181 -0
- package/dist/context/compress.js.map +1 -0
- package/dist/engine.d.ts +20 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +23 -4
- package/dist/engine.js.map +1 -1
- package/dist/evidence.d.ts +62 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +47 -0
- package/dist/evidence.js.map +1 -0
- package/dist/flashnet/contract.d.ts +56 -0
- package/dist/flashnet/contract.d.ts.map +1 -0
- package/dist/flashnet/contract.js +100 -0
- package/dist/flashnet/contract.js.map +1 -0
- package/dist/funnel.d.ts +11 -0
- package/dist/funnel.d.ts.map +1 -1
- package/dist/funnel.js +62 -7
- package/dist/funnel.js.map +1 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/kaleidoswap/contract.js +1 -1
- package/dist/kaleidoswap/contract.js.map +1 -1
- package/dist/knowledge/bitcoin-copilot.d.ts.map +1 -1
- package/dist/knowledge/bitcoin-copilot.js +85 -2
- package/dist/knowledge/bitcoin-copilot.js.map +1 -1
- package/dist/providers/types.d.ts +17 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/qvac/index.d.ts +1 -1
- package/dist/qvac/index.d.ts.map +1 -1
- package/dist/qvac/index.js.map +1 -1
- package/dist/qvac/parse.d.ts +18 -0
- package/dist/qvac/parse.d.ts.map +1 -1
- package/dist/qvac/parse.js +1 -0
- package/dist/qvac/parse.js.map +1 -1
- package/dist/qvac/provider.d.ts +16 -0
- package/dist/qvac/provider.d.ts.map +1 -1
- package/dist/qvac/provider.js +40 -1
- package/dist/qvac/provider.js.map +1 -1
- package/dist/qvac/stream.d.ts +22 -0
- package/dist/qvac/stream.d.ts.map +1 -1
- package/dist/qvac/stream.js +33 -1
- package/dist/qvac/stream.js.map +1 -1
- package/dist/recipe/buy-asset-channel.d.ts +1 -1
- package/dist/recipe/buy-asset-channel.d.ts.map +1 -1
- package/dist/recipe/buy-asset-channel.js +4 -3
- package/dist/recipe/buy-asset-channel.js.map +1 -1
- package/dist/recipe/flashnet-swap.d.ts +35 -0
- package/dist/recipe/flashnet-swap.d.ts.map +1 -0
- package/dist/recipe/flashnet-swap.js +239 -0
- package/dist/recipe/flashnet-swap.js.map +1 -0
- package/dist/recipe/kaleidoswap-atomic.d.ts +1 -1
- package/dist/recipe/kaleidoswap-atomic.d.ts.map +1 -1
- package/dist/recipe/kaleidoswap-atomic.js +42 -20
- package/dist/recipe/kaleidoswap-atomic.js.map +1 -1
- package/dist/recipe/kaleidoswap-channel-order.d.ts.map +1 -1
- package/dist/recipe/kaleidoswap-channel-order.js +31 -10
- package/dist/recipe/kaleidoswap-channel-order.js.map +1 -1
- package/dist/recipe/kaleidoswap-price.d.ts.map +1 -1
- package/dist/recipe/kaleidoswap-price.js +7 -1
- package/dist/recipe/kaleidoswap-price.js.map +1 -1
- package/dist/recipe/runner.d.ts.map +1 -1
- package/dist/recipe/runner.js +43 -3
- package/dist/recipe/runner.js.map +1 -1
- package/dist/recipe/swap.d.ts.map +1 -1
- package/dist/recipe/swap.js +14 -1
- package/dist/recipe/swap.js.map +1 -1
- package/dist/tools/mcp.d.ts +19 -0
- package/dist/tools/mcp.d.ts.map +1 -1
- package/dist/tools/mcp.js +51 -9
- package/dist/tools/mcp.js.map +1 -1
- package/dist/wallet/confirm.d.ts.map +1 -1
- package/dist/wallet/confirm.js +1 -0
- package/dist/wallet/confirm.js.map +1 -1
- package/dist/wallet/contract.d.ts.map +1 -1
- package/dist/wallet/contract.js +20 -4
- package/dist/wallet/contract.js.map +1 -1
- package/package.json +5 -4
- package/skills/bitrefill/SKILL.md +152 -52
- package/skills/channel-manager/SKILL.md +59 -0
- package/skills/dca/SKILL.md +48 -0
- package/skills/flashnet-swaps/SKILL.md +158 -0
- package/skills/kaleido-lsps/SKILL.md +34 -17
- package/skills/kaleido-trading/SKILL.md +37 -13
- package/skills/liquidity-optimizer/SKILL.md +91 -0
- package/skills/merchant-finder/SKILL.md +2 -2
- package/skills/portfolio-manager/SKILL.md +67 -0
- package/skills/rgb-lightning-node/SKILL.md +38 -11
- package/skills/spark-wallet/SKILL.md +235 -0
- package/skills/wallet-assistant/SKILL.md +2 -2
- package/src/autonomy/autonomy.test.ts +348 -0
- package/src/autonomy/index.ts +50 -0
- package/src/autonomy/prompt.ts +48 -0
- package/src/autonomy/risk.ts +139 -0
- package/src/autonomy/run-state.ts +144 -0
- package/src/autonomy/scheduler.ts +120 -0
- package/src/autonomy/task-store.ts +167 -0
- package/src/autonomy/types.ts +186 -0
- package/src/bitrefill/contract.test.ts +89 -0
- package/src/bitrefill/contract.ts +190 -0
- package/src/context/compress.test.ts +120 -0
- package/src/context/compress.ts +230 -0
- package/src/engine.test.ts +34 -0
- package/src/engine.ts +35 -4
- package/src/evidence.test.ts +80 -0
- package/src/evidence.ts +114 -0
- package/src/flashnet/contract.test.ts +101 -0
- package/src/flashnet/contract.ts +164 -0
- package/src/funnel.mind.test.ts +390 -0
- package/src/funnel.ts +73 -8
- package/src/index.ts +92 -1
- package/src/kaleidoswap/contract.ts +1 -1
- package/src/knowledge/bitcoin-copilot.ts +96 -2
- package/src/providers/types.ts +18 -0
- package/src/qvac/index.ts +1 -0
- package/src/qvac/parse.ts +20 -0
- package/src/qvac/provider.test.ts +17 -0
- package/src/qvac/provider.ts +62 -2
- package/src/qvac/stream.test.ts +36 -0
- package/src/qvac/stream.ts +54 -1
- package/src/recipe/buy-asset-channel.test.ts +5 -0
- package/src/recipe/buy-asset-channel.ts +6 -3
- package/src/recipe/flashnet-swap.test.ts +114 -0
- package/src/recipe/flashnet-swap.ts +266 -0
- package/src/recipe/kaleidoswap-atomic.test.ts +24 -3
- package/src/recipe/kaleidoswap-atomic.ts +39 -20
- package/src/recipe/kaleidoswap-channel-order.test.ts +38 -0
- package/src/recipe/kaleidoswap-channel-order.ts +27 -9
- package/src/recipe/kaleidoswap-price.ts +7 -1
- package/src/recipe/recipe.test.ts +21 -0
- package/src/recipe/runner.ts +46 -3
- package/src/recipe/swap.ts +16 -1
- package/src/tools/mcp.live.test.ts +116 -0
- package/src/tools/mcp.parse.test.ts +37 -0
- package/src/tools/mcp.ts +55 -9
- package/src/wallet/confirm.test.ts +8 -0
- package/src/wallet/confirm.ts +1 -0
- package/src/wallet/contract.test.ts +10 -0
- package/src/wallet/contract.ts +26 -4
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomy — the agent's task brain: a registry of scheduled tasks (TaskStore),
|
|
3
|
+
* the record of what they did (TaskRunLog), an interval engine that fires them
|
|
4
|
+
* (createTaskScheduler), and enforced spend guardrails (evaluateSpend).
|
|
5
|
+
*
|
|
6
|
+
* This is the half of the agent's memory the MemoryStore (soul + facts) doesn't
|
|
7
|
+
* cover — the operational state nanobot kept in tasks.json + cron + run history.
|
|
8
|
+
* Storage and timers are injected; the logic is pure TS.
|
|
9
|
+
*/
|
|
10
|
+
export type { TaskAllocation, AgentTask, NewTask, TaskSeed, TaskStore, TaskStoreIO, TaskRunCost, TaskStats, TaskRunRecord, RunLogSnapshot, RunLogIO, TaskRunOutcome, RunTask, TimerHandle, SchedulerOptions, TaskScheduler, } from './types.js';
|
|
11
|
+
export { ZERO_ALLOCATION } from './types.js';
|
|
12
|
+
export { InMemoryTaskStore, defaultTaskSeeds } from './task-store.js';
|
|
13
|
+
export type { TaskStoreOptions } from './task-store.js';
|
|
14
|
+
export { TaskRunLog } from './run-state.js';
|
|
15
|
+
export type { RunLogOptions } from './run-state.js';
|
|
16
|
+
export { createTaskScheduler } from './scheduler.js';
|
|
17
|
+
export { evaluateSpend, DEFAULT_RISK_LIMITS } from './risk.js';
|
|
18
|
+
export type { SpendKind, RiskLimits, SpendAction, RiskContext, RiskOutcome, RiskVerdict, } from './risk.js';
|
|
19
|
+
export { buildTaskPrompt } from './prompt.js';
|
|
20
|
+
export type { TaskPromptOptions } from './prompt.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/autonomy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,cAAc,EACd,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAW,EACX,SAAS,EACT,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACd,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC/D,YAAY,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomy — the agent's task brain: a registry of scheduled tasks (TaskStore),
|
|
3
|
+
* the record of what they did (TaskRunLog), an interval engine that fires them
|
|
4
|
+
* (createTaskScheduler), and enforced spend guardrails (evaluateSpend).
|
|
5
|
+
*
|
|
6
|
+
* This is the half of the agent's memory the MemoryStore (soul + facts) doesn't
|
|
7
|
+
* cover — the operational state nanobot kept in tasks.json + cron + run history.
|
|
8
|
+
* Storage and timers are injected; the logic is pure TS.
|
|
9
|
+
*/
|
|
10
|
+
export { ZERO_ALLOCATION } from './types.js';
|
|
11
|
+
export { InMemoryTaskStore, defaultTaskSeeds } from './task-store.js';
|
|
12
|
+
export { TaskRunLog } from './run-state.js';
|
|
13
|
+
export { createTaskScheduler } from './scheduler.js';
|
|
14
|
+
export { evaluateSpend, DEFAULT_RISK_LIMITS } from './risk.js';
|
|
15
|
+
export { buildTaskPrompt } from './prompt.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/autonomy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAU/D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildTaskPrompt — turns an AgentTask into the instruction the agent runs on
|
|
3
|
+
* each scheduled fire. Port of kaleidoagent's nanobot-cron-sync.buildCronPrompt,
|
|
4
|
+
* de-nanobot'd: it targets the Funnel's skill-scoped agentic tier directly, so a
|
|
5
|
+
* host typically does `funnel.runTurn(buildTaskPrompt(task, opts), { ... })`.
|
|
6
|
+
*
|
|
7
|
+
* The strict-JSON return contract is preserved so the host can parse a run's
|
|
8
|
+
* action/portfolio summary back out (the RunLog stores the raw text; a host that
|
|
9
|
+
* wants structured snapshots parses the JSON).
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentTask } from './types.js';
|
|
12
|
+
export interface TaskPromptOptions {
|
|
13
|
+
/** Clock — injectable for deterministic tests. Default: Date.now via new Date. */
|
|
14
|
+
nowIso?: string;
|
|
15
|
+
/** True forbids any live wallet action (passed through to the model + enforced by risk). */
|
|
16
|
+
dryRun: boolean;
|
|
17
|
+
/** Portfolio targets / risk params / allocations surfaced to the model. */
|
|
18
|
+
params?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export declare function buildTaskPrompt(task: AgentTask, opts: TaskPromptOptions): string;
|
|
21
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/autonomy/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,MAAM,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAyBhF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildTaskPrompt — turns an AgentTask into the instruction the agent runs on
|
|
3
|
+
* each scheduled fire. Port of kaleidoagent's nanobot-cron-sync.buildCronPrompt,
|
|
4
|
+
* de-nanobot'd: it targets the Funnel's skill-scoped agentic tier directly, so a
|
|
5
|
+
* host typically does `funnel.runTurn(buildTaskPrompt(task, opts), { ... })`.
|
|
6
|
+
*
|
|
7
|
+
* The strict-JSON return contract is preserved so the host can parse a run's
|
|
8
|
+
* action/portfolio summary back out (the RunLog stores the raw text; a host that
|
|
9
|
+
* wants structured snapshots parses the JSON).
|
|
10
|
+
*/
|
|
11
|
+
export function buildTaskPrompt(task, opts) {
|
|
12
|
+
const nowIso = opts.nowIso ?? new Date().toISOString();
|
|
13
|
+
const params = {
|
|
14
|
+
allocation: task.allocation,
|
|
15
|
+
...opts.params,
|
|
16
|
+
};
|
|
17
|
+
return [
|
|
18
|
+
'You are operating as the KaleidoSwap autonomous background runtime.',
|
|
19
|
+
`Current time: ${nowIso}`,
|
|
20
|
+
`Task id: ${task.id}`,
|
|
21
|
+
`Task: ${task.name} — ${task.description}`,
|
|
22
|
+
`Primary skill: ${task.skill}`,
|
|
23
|
+
`dry_run: ${opts.dryRun}`,
|
|
24
|
+
`Parameters: ${JSON.stringify(params)}`,
|
|
25
|
+
'',
|
|
26
|
+
`Use the "${task.skill}" skill to complete this task with the available tools.`,
|
|
27
|
+
'Fetch every value (balances, quotes, asset ids) live from tools — never invent one.',
|
|
28
|
+
opts.dryRun
|
|
29
|
+
? 'dry_run is ON: describe what you WOULD do. Do NOT pay, send, swap, or open channels.'
|
|
30
|
+
: 'Respect the fund-safety limits: never breach the BTC reserve or stop-loss floor.',
|
|
31
|
+
'Return STRICT JSON only, no prose, with these fields:',
|
|
32
|
+
'{"task":"' + task.id + '","timestamp":"ISO8601","action":"...","dry_run":' +
|
|
33
|
+
String(opts.dryRun) +
|
|
34
|
+
',"reason":"...","details":{}}',
|
|
35
|
+
].join('\n');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/autonomy/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,MAAM,UAAU,eAAe,CAAC,IAAe,EAAE,IAAuB;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG;QACb,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,IAAI,CAAC,MAAM;KACf,CAAC;IACF,OAAO;QACL,qEAAqE;QACrE,iBAAiB,MAAM,EAAE;QACzB,YAAY,IAAI,CAAC,EAAE,EAAE;QACrB,SAAS,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,WAAW,EAAE;QAC1C,kBAAkB,IAAI,CAAC,KAAK,EAAE;QAC9B,YAAY,IAAI,CAAC,MAAM,EAAE;QACzB,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;QACvC,EAAE;QACF,YAAY,IAAI,CAAC,KAAK,yDAAyD;QAC/E,qFAAqF;QACrF,IAAI,CAAC,MAAM;YACT,CAAC,CAAC,sFAAsF;YACxF,CAAC,CAAC,kFAAkF;QACtF,uDAAuD;QACvD,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,mDAAmD;YACzE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACnB,+BAA+B;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk guardrails — the spend safety from kaleidoagent's SOUL.md ("respect fund
|
|
3
|
+
* safety above all", "dry_run means dry_run", "enforce min_btc_reserve before any
|
|
4
|
+
* outbound") turned into an ENFORCED function instead of prompt text a small model
|
|
5
|
+
* might ignore.
|
|
6
|
+
*
|
|
7
|
+
* The host calls `evaluateSpend` before any autonomous spend (and inside the
|
|
8
|
+
* Funnel's `onConfirm`) to decide: allow silently, require user confirmation, or
|
|
9
|
+
* block outright. Pure function — trivially testable, no I/O.
|
|
10
|
+
*
|
|
11
|
+
* Order of checks is intentional: hard blocks (dry-run, stop-loss, reserve, size,
|
|
12
|
+
* order cap) come first; only a spend that clears all of them is sized against the
|
|
13
|
+
* auto-approve threshold.
|
|
14
|
+
*/
|
|
15
|
+
export type SpendKind = 'pay' | 'send' | 'swap' | 'channel';
|
|
16
|
+
export interface RiskLimits {
|
|
17
|
+
/** When true, NO spend executes — the agent describes what it WOULD do. */
|
|
18
|
+
dryRun: boolean;
|
|
19
|
+
/** Sats that must remain in BTC balance after any outbound. */
|
|
20
|
+
minBtcReserveSat: number;
|
|
21
|
+
/** Hard floor: if BTC balance is at/below this, block all spends. */
|
|
22
|
+
stopLossBtcSat: number;
|
|
23
|
+
/** Max USD value of a single autonomous spend. */
|
|
24
|
+
maxSpendUsd: number;
|
|
25
|
+
/** Spends at/under this USD value auto-approve; above need confirmation. */
|
|
26
|
+
autoApproveUnderUsd: number;
|
|
27
|
+
/** Block new swaps/channels once this many orders are already open. */
|
|
28
|
+
maxOpenOrders?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface SpendAction {
|
|
31
|
+
kind: SpendKind;
|
|
32
|
+
/** Sats leaving the BTC balance (omit for pure asset sends). */
|
|
33
|
+
amountSat?: number;
|
|
34
|
+
/** USD value of the spend — used for the size + auto-approve gates. */
|
|
35
|
+
amountUsd?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface RiskContext {
|
|
38
|
+
/** Spendable BTC right now (sats). */
|
|
39
|
+
btcBalanceSat?: number;
|
|
40
|
+
/** Currently open orders (for the order-cap gate). */
|
|
41
|
+
openOrders?: number;
|
|
42
|
+
}
|
|
43
|
+
export type RiskOutcome = 'allow' | 'confirm' | 'block';
|
|
44
|
+
export interface RiskVerdict {
|
|
45
|
+
outcome: RiskOutcome;
|
|
46
|
+
/** True when the host MUST gate on user confirmation before executing. */
|
|
47
|
+
requiresConfirmation: boolean;
|
|
48
|
+
reason: string;
|
|
49
|
+
}
|
|
50
|
+
/** Sensible defaults — conservative. Hosts override per user settings. */
|
|
51
|
+
export declare const DEFAULT_RISK_LIMITS: RiskLimits;
|
|
52
|
+
export declare function evaluateSpend(action: SpendAction, limits: RiskLimits, ctx?: RiskContext): RiskVerdict;
|
|
53
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/autonomy/risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,0EAA0E;IAC1E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,EAAE,UAOjC,CAAC;AAEF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAClB,GAAG,GAAE,WAAgB,GACpB,WAAW,CAoEb"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk guardrails — the spend safety from kaleidoagent's SOUL.md ("respect fund
|
|
3
|
+
* safety above all", "dry_run means dry_run", "enforce min_btc_reserve before any
|
|
4
|
+
* outbound") turned into an ENFORCED function instead of prompt text a small model
|
|
5
|
+
* might ignore.
|
|
6
|
+
*
|
|
7
|
+
* The host calls `evaluateSpend` before any autonomous spend (and inside the
|
|
8
|
+
* Funnel's `onConfirm`) to decide: allow silently, require user confirmation, or
|
|
9
|
+
* block outright. Pure function — trivially testable, no I/O.
|
|
10
|
+
*
|
|
11
|
+
* Order of checks is intentional: hard blocks (dry-run, stop-loss, reserve, size,
|
|
12
|
+
* order cap) come first; only a spend that clears all of them is sized against the
|
|
13
|
+
* auto-approve threshold.
|
|
14
|
+
*/
|
|
15
|
+
/** Sensible defaults — conservative. Hosts override per user settings. */
|
|
16
|
+
export const DEFAULT_RISK_LIMITS = {
|
|
17
|
+
dryRun: true,
|
|
18
|
+
minBtcReserveSat: 50_000,
|
|
19
|
+
stopLossBtcSat: 50_000,
|
|
20
|
+
maxSpendUsd: 50,
|
|
21
|
+
autoApproveUnderUsd: 0, // 0 = always confirm unless the host raises it
|
|
22
|
+
maxOpenOrders: 3,
|
|
23
|
+
};
|
|
24
|
+
export function evaluateSpend(action, limits, ctx = {}) {
|
|
25
|
+
const block = (reason) => ({
|
|
26
|
+
outcome: 'block',
|
|
27
|
+
requiresConfirmation: false,
|
|
28
|
+
reason,
|
|
29
|
+
});
|
|
30
|
+
// 1. Dry-run: nothing moves, full stop.
|
|
31
|
+
if (limits.dryRun) {
|
|
32
|
+
return block(`dry-run is on — would ${action.kind}, but no funds move`);
|
|
33
|
+
}
|
|
34
|
+
const balance = ctx.btcBalanceSat;
|
|
35
|
+
// 2. Stop-loss: balance already at/below the floor.
|
|
36
|
+
if (balance !== undefined && balance <= limits.stopLossBtcSat) {
|
|
37
|
+
return block(`BTC balance ${balance} sat is at/below the stop-loss floor ${limits.stopLossBtcSat} sat`);
|
|
38
|
+
}
|
|
39
|
+
// 3. Reserve: this spend would dip below the reserve.
|
|
40
|
+
if (action.amountSat !== undefined && balance !== undefined) {
|
|
41
|
+
const after = balance - action.amountSat;
|
|
42
|
+
if (after < limits.minBtcReserveSat) {
|
|
43
|
+
return block(`would leave ${after} sat, below the ${limits.minBtcReserveSat} sat reserve`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// 4. Size cap.
|
|
47
|
+
if (action.amountUsd !== undefined && action.amountUsd > limits.maxSpendUsd) {
|
|
48
|
+
return block(`$${action.amountUsd} exceeds the max single spend $${limits.maxSpendUsd}`);
|
|
49
|
+
}
|
|
50
|
+
// 5. Open-order cap (swaps/channels only).
|
|
51
|
+
if ((action.kind === 'swap' || action.kind === 'channel') &&
|
|
52
|
+
limits.maxOpenOrders !== undefined &&
|
|
53
|
+
ctx.openOrders !== undefined &&
|
|
54
|
+
ctx.openOrders >= limits.maxOpenOrders) {
|
|
55
|
+
return block(`${ctx.openOrders} open orders ≥ cap ${limits.maxOpenOrders} — not opening another`);
|
|
56
|
+
}
|
|
57
|
+
// 6. Cleared all hard gates → size against the auto-approve threshold.
|
|
58
|
+
// An unknown USD value defaults to confirm (safe): never auto-spend blind.
|
|
59
|
+
if (action.amountUsd !== undefined && action.amountUsd <= limits.autoApproveUnderUsd) {
|
|
60
|
+
return {
|
|
61
|
+
outcome: 'allow',
|
|
62
|
+
requiresConfirmation: false,
|
|
63
|
+
reason: `$${action.amountUsd} ≤ auto-approve $${limits.autoApproveUnderUsd}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
outcome: 'confirm',
|
|
68
|
+
requiresConfirmation: true,
|
|
69
|
+
reason: action.amountUsd !== undefined
|
|
70
|
+
? `$${action.amountUsd} above auto-approve $${limits.autoApproveUnderUsd} — needs confirmation`
|
|
71
|
+
: `unknown spend value — needs confirmation`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/autonomy/risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA2CH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,MAAM,EAAE,IAAI;IACZ,gBAAgB,EAAE,MAAM;IACxB,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,EAAE;IACf,mBAAmB,EAAE,CAAC,EAAE,+CAA+C;IACvE,aAAa,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,UAAU,aAAa,CAC3B,MAAmB,EACnB,MAAkB,EAClB,MAAmB,EAAE;IAErB,MAAM,KAAK,GAAG,CAAC,MAAc,EAAe,EAAE,CAAC,CAAC;QAC9C,OAAO,EAAE,OAAO;QAChB,oBAAoB,EAAE,KAAK;QAC3B,MAAM;KACP,CAAC,CAAC;IAEH,wCAAwC;IACxC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC,yBAAyB,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC;IAElC,oDAAoD;IACpD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9D,OAAO,KAAK,CACV,eAAe,OAAO,wCAAwC,MAAM,CAAC,cAAc,MAAM,CAC1F,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;QACzC,IAAI,KAAK,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACpC,OAAO,KAAK,CACV,eAAe,KAAK,mBAAmB,MAAM,CAAC,gBAAgB,cAAc,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5E,OAAO,KAAK,CACV,IAAI,MAAM,CAAC,SAAS,kCAAkC,MAAM,CAAC,WAAW,EAAE,CAC3E,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IACE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;QACrD,MAAM,CAAC,aAAa,KAAK,SAAS;QAClC,GAAG,CAAC,UAAU,KAAK,SAAS;QAC5B,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,aAAa,EACtC,CAAC;QACD,OAAO,KAAK,CACV,GAAG,GAAG,CAAC,UAAU,sBAAsB,MAAM,CAAC,aAAa,wBAAwB,CACpF,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,2EAA2E;IAC3E,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACrF,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,oBAAoB,EAAE,KAAK;YAC3B,MAAM,EAAE,IAAI,MAAM,CAAC,SAAS,oBAAoB,MAAM,CAAC,mBAAmB,EAAE;SAC7E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,oBAAoB,EAAE,IAAI;QAC1B,MAAM,EACJ,MAAM,CAAC,SAAS,KAAK,SAAS;YAC5B,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,wBAAwB,MAAM,CAAC,mBAAmB,uBAAuB;YAC/F,CAAC,CAAC,0CAA0C;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskRunLog — what each task did, when, and what it cost. Port of kaleidoagent's
|
|
3
|
+
* agent-state.ts (LoopStats + recent-runs + cumulative cost), generalized and
|
|
4
|
+
* decoupled from the HTTP status server. This is the "memory of the tasks": the
|
|
5
|
+
* record the UI reads to show "rebalance last ran 2h ago, cost $0.003".
|
|
6
|
+
*
|
|
7
|
+
* In-memory with optional injected persistence. Pure TS, zero deps.
|
|
8
|
+
*/
|
|
9
|
+
import type { RunLogIO, RunLogSnapshot, TaskRunCost, TaskRunRecord, TaskStats } from './types.js';
|
|
10
|
+
export interface RunLogOptions {
|
|
11
|
+
/** Persistence (load on first use, save on writes). Omit for ephemeral logs. */
|
|
12
|
+
io?: RunLogIO;
|
|
13
|
+
/** How many recent runs to retain. Default 20. */
|
|
14
|
+
maxRecent?: number;
|
|
15
|
+
/** Clock — injectable for deterministic tests. */
|
|
16
|
+
now?: () => number;
|
|
17
|
+
}
|
|
18
|
+
export declare class TaskRunLog {
|
|
19
|
+
private stats;
|
|
20
|
+
private recentRuns;
|
|
21
|
+
private cumulative;
|
|
22
|
+
private hydrated;
|
|
23
|
+
private readonly io?;
|
|
24
|
+
private readonly maxRecent;
|
|
25
|
+
private readonly now;
|
|
26
|
+
constructor(opts?: RunLogOptions);
|
|
27
|
+
private hydrate;
|
|
28
|
+
private persist;
|
|
29
|
+
private ensure;
|
|
30
|
+
/** Record a completed run (success or failure). */
|
|
31
|
+
record(record: TaskRunRecord): Promise<void>;
|
|
32
|
+
statsFor(taskId: string): Promise<TaskStats | null>;
|
|
33
|
+
allStats(): Promise<Record<string, TaskStats>>;
|
|
34
|
+
recent(limit?: number): Promise<TaskRunRecord[]>;
|
|
35
|
+
totalCost(): Promise<TaskRunCost>;
|
|
36
|
+
snapshot(): Promise<RunLogSnapshot>;
|
|
37
|
+
private snapshotSync;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=run-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../../src/autonomy/run-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,SAAS,EACV,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,GAAE,aAAkB;YAMtB,OAAO;YAiBP,OAAO;IAIrB,OAAO,CAAC,MAAM;IAgBd,mDAAmD;IAC7C,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B5C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAKnD,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAK9C,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAKhD,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAKjC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAKzC,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskRunLog — what each task did, when, and what it cost. Port of kaleidoagent's
|
|
3
|
+
* agent-state.ts (LoopStats + recent-runs + cumulative cost), generalized and
|
|
4
|
+
* decoupled from the HTTP status server. This is the "memory of the tasks": the
|
|
5
|
+
* record the UI reads to show "rebalance last ran 2h ago, cost $0.003".
|
|
6
|
+
*
|
|
7
|
+
* In-memory with optional injected persistence. Pure TS, zero deps.
|
|
8
|
+
*/
|
|
9
|
+
const ZERO_COST = { usd: 0, inputTokens: 0, outputTokens: 0 };
|
|
10
|
+
const DEFAULT_MAX_RECENT = 20;
|
|
11
|
+
const TEXT_CAP = 800;
|
|
12
|
+
export class TaskRunLog {
|
|
13
|
+
stats = {};
|
|
14
|
+
recentRuns = [];
|
|
15
|
+
cumulative = { ...ZERO_COST };
|
|
16
|
+
hydrated = false;
|
|
17
|
+
io;
|
|
18
|
+
maxRecent;
|
|
19
|
+
now;
|
|
20
|
+
constructor(opts = {}) {
|
|
21
|
+
this.io = opts.io;
|
|
22
|
+
this.maxRecent = opts.maxRecent ?? DEFAULT_MAX_RECENT;
|
|
23
|
+
this.now = opts.now ?? (() => Date.now());
|
|
24
|
+
}
|
|
25
|
+
async hydrate() {
|
|
26
|
+
if (this.hydrated)
|
|
27
|
+
return;
|
|
28
|
+
this.hydrated = true;
|
|
29
|
+
if (this.io) {
|
|
30
|
+
try {
|
|
31
|
+
const snap = await this.io.load();
|
|
32
|
+
if (snap) {
|
|
33
|
+
this.stats = snap.stats ?? {};
|
|
34
|
+
this.recentRuns = snap.recent ?? [];
|
|
35
|
+
this.cumulative = snap.cumulative ?? { ...ZERO_COST };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
/* start fresh on a corrupt/absent snapshot */
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async persist() {
|
|
44
|
+
if (this.io)
|
|
45
|
+
await this.io.save(this.snapshotSync());
|
|
46
|
+
}
|
|
47
|
+
ensure(taskId) {
|
|
48
|
+
const existing = this.stats[taskId];
|
|
49
|
+
if (existing)
|
|
50
|
+
return existing;
|
|
51
|
+
const fresh = {
|
|
52
|
+
runs: 0,
|
|
53
|
+
errors: 0,
|
|
54
|
+
lastRunAt: null,
|
|
55
|
+
lastDurationMs: null,
|
|
56
|
+
lastToolCalls: null,
|
|
57
|
+
lastError: null,
|
|
58
|
+
lastText: null,
|
|
59
|
+
};
|
|
60
|
+
this.stats[taskId] = fresh;
|
|
61
|
+
return fresh;
|
|
62
|
+
}
|
|
63
|
+
/** Record a completed run (success or failure). */
|
|
64
|
+
async record(record) {
|
|
65
|
+
await this.hydrate();
|
|
66
|
+
const s = this.ensure(record.taskId);
|
|
67
|
+
s.runs += 1;
|
|
68
|
+
s.lastRunAt = record.startedAt;
|
|
69
|
+
s.lastDurationMs = record.durationMs;
|
|
70
|
+
s.lastToolCalls = record.toolCalls;
|
|
71
|
+
if (record.ok) {
|
|
72
|
+
s.lastError = null;
|
|
73
|
+
s.lastText = record.text.slice(0, TEXT_CAP);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
s.errors += 1;
|
|
77
|
+
s.lastError = record.error;
|
|
78
|
+
}
|
|
79
|
+
this.cumulative = {
|
|
80
|
+
usd: this.cumulative.usd + record.cost.usd,
|
|
81
|
+
inputTokens: this.cumulative.inputTokens + record.cost.inputTokens,
|
|
82
|
+
outputTokens: this.cumulative.outputTokens + record.cost.outputTokens,
|
|
83
|
+
};
|
|
84
|
+
this.recentRuns.unshift({ ...record, text: record.text.slice(0, TEXT_CAP) });
|
|
85
|
+
if (this.recentRuns.length > this.maxRecent) {
|
|
86
|
+
this.recentRuns.length = this.maxRecent;
|
|
87
|
+
}
|
|
88
|
+
await this.persist();
|
|
89
|
+
}
|
|
90
|
+
async statsFor(taskId) {
|
|
91
|
+
await this.hydrate();
|
|
92
|
+
return this.stats[taskId] ?? null;
|
|
93
|
+
}
|
|
94
|
+
async allStats() {
|
|
95
|
+
await this.hydrate();
|
|
96
|
+
return { ...this.stats };
|
|
97
|
+
}
|
|
98
|
+
async recent(limit) {
|
|
99
|
+
await this.hydrate();
|
|
100
|
+
return this.recentRuns.slice(0, limit ?? this.recentRuns.length);
|
|
101
|
+
}
|
|
102
|
+
async totalCost() {
|
|
103
|
+
await this.hydrate();
|
|
104
|
+
return { ...this.cumulative };
|
|
105
|
+
}
|
|
106
|
+
async snapshot() {
|
|
107
|
+
await this.hydrate();
|
|
108
|
+
return this.snapshotSync();
|
|
109
|
+
}
|
|
110
|
+
snapshotSync() {
|
|
111
|
+
return {
|
|
112
|
+
stats: { ...this.stats },
|
|
113
|
+
recent: [...this.recentRuns],
|
|
114
|
+
cumulative: { ...this.cumulative },
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=run-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-state.js","sourceRoot":"","sources":["../../src/autonomy/run-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduler — fires due tasks on their interval. Replaces the nanobot cron
|
|
3
|
+
* engine kaleidoagent relied on; here it's pure TS with injectable clock +
|
|
4
|
+
* timers so it's deterministically testable and runs anywhere (no cron daemon).
|
|
5
|
+
*
|
|
6
|
+
* Semantics:
|
|
7
|
+
* - A task is "due" when enabled, scheduleSec > 0, and at least scheduleSec
|
|
8
|
+
* has elapsed since its last run (or its creation, if never run). A fresh
|
|
9
|
+
* task therefore waits one full interval before its first auto-run — unless
|
|
10
|
+
* runOnStartup is set, in which case start() runs it immediately.
|
|
11
|
+
* - Runs are serial by default (concurrency 1) — safest for a wallet. A task
|
|
12
|
+
* never runs concurrently with itself.
|
|
13
|
+
* - lastRunAt is stamped at the START of a run, so a slow run doesn't shorten
|
|
14
|
+
* the next interval, and a failing run still advances (no hot-loop).
|
|
15
|
+
*/
|
|
16
|
+
import type { SchedulerOptions, TaskScheduler } from './types.js';
|
|
17
|
+
export declare function createTaskScheduler(opts: SchedulerOptions): TaskScheduler;
|
|
18
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/autonomy/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAEV,gBAAgB,EAEhB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,aAAa,CA+FzE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduler — fires due tasks on their interval. Replaces the nanobot cron
|
|
3
|
+
* engine kaleidoagent relied on; here it's pure TS with injectable clock +
|
|
4
|
+
* timers so it's deterministically testable and runs anywhere (no cron daemon).
|
|
5
|
+
*
|
|
6
|
+
* Semantics:
|
|
7
|
+
* - A task is "due" when enabled, scheduleSec > 0, and at least scheduleSec
|
|
8
|
+
* has elapsed since its last run (or its creation, if never run). A fresh
|
|
9
|
+
* task therefore waits one full interval before its first auto-run — unless
|
|
10
|
+
* runOnStartup is set, in which case start() runs it immediately.
|
|
11
|
+
* - Runs are serial by default (concurrency 1) — safest for a wallet. A task
|
|
12
|
+
* never runs concurrently with itself.
|
|
13
|
+
* - lastRunAt is stamped at the START of a run, so a slow run doesn't shorten
|
|
14
|
+
* the next interval, and a failing run still advances (no hot-loop).
|
|
15
|
+
*/
|
|
16
|
+
export function createTaskScheduler(opts) {
|
|
17
|
+
const { store, run } = opts;
|
|
18
|
+
const now = opts.now ?? (() => Date.now());
|
|
19
|
+
const log = opts.log ?? (() => { });
|
|
20
|
+
const tickMs = opts.tickMs ?? 30_000;
|
|
21
|
+
const concurrency = Math.max(1, opts.concurrency ?? 1);
|
|
22
|
+
const setTimer = opts.setTimer ?? ((fn, ms) => setInterval(fn, ms));
|
|
23
|
+
const clearTimer = opts.clearTimer ?? ((h) => clearInterval(h));
|
|
24
|
+
const active = new Set();
|
|
25
|
+
let running = false;
|
|
26
|
+
let timer;
|
|
27
|
+
function isDue(task, ref) {
|
|
28
|
+
if (!task.enabled || task.scheduleSec <= 0)
|
|
29
|
+
return false;
|
|
30
|
+
const since = ref - (task.lastRunAt ?? task.createdAt);
|
|
31
|
+
return since >= task.scheduleSec * 1000;
|
|
32
|
+
}
|
|
33
|
+
/** Run one task, stamping lastRunAt and reporting the outcome. */
|
|
34
|
+
async function runOne(task) {
|
|
35
|
+
active.add(task.id);
|
|
36
|
+
const started = now();
|
|
37
|
+
// Stamp the start time first so a crash mid-run still advances the interval.
|
|
38
|
+
await store.update(task.id, { lastRunAt: started });
|
|
39
|
+
let outcome;
|
|
40
|
+
try {
|
|
41
|
+
outcome = await run(task);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
outcome = { ok: false, error: e?.message ?? String(e) };
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
active.delete(task.id);
|
|
48
|
+
}
|
|
49
|
+
const durationMs = now() - started;
|
|
50
|
+
log(`ran ${task.id} ok=${outcome.ok} ${durationMs}ms`);
|
|
51
|
+
opts.onOutcome?.(task, outcome, durationMs);
|
|
52
|
+
return outcome;
|
|
53
|
+
}
|
|
54
|
+
async function tick() {
|
|
55
|
+
const tasks = await store.list();
|
|
56
|
+
const ref = now();
|
|
57
|
+
const launched = [];
|
|
58
|
+
for (const task of tasks) {
|
|
59
|
+
if (active.size >= concurrency)
|
|
60
|
+
break;
|
|
61
|
+
if (active.has(task.id) || !isDue(task, ref))
|
|
62
|
+
continue;
|
|
63
|
+
// active.add (inside runOne) runs synchronously, so the size guard stays
|
|
64
|
+
// accurate as we launch up to `concurrency` runs that overlap each other;
|
|
65
|
+
// we await them so `tick()` resolves only once this batch is done.
|
|
66
|
+
launched.push(runOne(task));
|
|
67
|
+
}
|
|
68
|
+
await Promise.all(launched);
|
|
69
|
+
}
|
|
70
|
+
async function startupPass() {
|
|
71
|
+
const tasks = await store.list();
|
|
72
|
+
for (const task of tasks) {
|
|
73
|
+
if (task.enabled && task.runOnStartup && !active.has(task.id)) {
|
|
74
|
+
// Serial on startup — predictable ordering, no thundering herd.
|
|
75
|
+
await runOne(task);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
start() {
|
|
81
|
+
if (running)
|
|
82
|
+
return;
|
|
83
|
+
running = true;
|
|
84
|
+
timer = setTimer(() => {
|
|
85
|
+
void tick();
|
|
86
|
+
}, tickMs);
|
|
87
|
+
log(`scheduler started (tick=${tickMs}ms, concurrency=${concurrency})`);
|
|
88
|
+
void startupPass();
|
|
89
|
+
},
|
|
90
|
+
stop() {
|
|
91
|
+
running = false;
|
|
92
|
+
if (timer !== undefined) {
|
|
93
|
+
clearTimer(timer);
|
|
94
|
+
timer = undefined;
|
|
95
|
+
}
|
|
96
|
+
log('scheduler stopped');
|
|
97
|
+
},
|
|
98
|
+
tick,
|
|
99
|
+
async runNow(id) {
|
|
100
|
+
const task = await store.get(id);
|
|
101
|
+
if (!task || active.has(id))
|
|
102
|
+
return null;
|
|
103
|
+
return runOne(task);
|
|
104
|
+
},
|
|
105
|
+
active() {
|
|
106
|
+
return [...active];
|
|
107
|
+
},
|
|
108
|
+
isRunning() {
|
|
109
|
+
return running;
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/autonomy/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskStore implementation — in-memory, with optional injected persistence.
|
|
3
|
+
* Pure TS, zero deps. Port of kaleidoagent's tasks-store.ts, but storage-agnostic
|
|
4
|
+
* (host injects IO: fs on a Node sidecar, SQLite on the desktop, AsyncStorage on RN).
|
|
5
|
+
*
|
|
6
|
+
* const store = new InMemoryTaskStore(); // ephemeral
|
|
7
|
+
* const store = new InMemoryTaskStore({ io }); // persisted
|
|
8
|
+
*/
|
|
9
|
+
import { type AgentTask, type NewTask, type TaskSeed, type TaskStore, type TaskStoreIO } from './types.js';
|
|
10
|
+
export interface TaskStoreOptions {
|
|
11
|
+
/** Persistence (load on first use, save on writes). Omit for ephemeral tasks. */
|
|
12
|
+
io?: TaskStoreIO;
|
|
13
|
+
/** Clock — injectable for deterministic tests. */
|
|
14
|
+
now?: () => number;
|
|
15
|
+
}
|
|
16
|
+
export declare class InMemoryTaskStore implements TaskStore {
|
|
17
|
+
private tasks;
|
|
18
|
+
private hydrated;
|
|
19
|
+
private counter;
|
|
20
|
+
private readonly io?;
|
|
21
|
+
private readonly now;
|
|
22
|
+
constructor(opts?: TaskStoreOptions);
|
|
23
|
+
private hydrate;
|
|
24
|
+
private persist;
|
|
25
|
+
list(): Promise<AgentTask[]>;
|
|
26
|
+
get(id: string): Promise<AgentTask | null>;
|
|
27
|
+
create(input: NewTask): Promise<AgentTask>;
|
|
28
|
+
update(id: string, patch: Partial<Omit<AgentTask, 'id' | 'createdAt'>>): Promise<AgentTask | null>;
|
|
29
|
+
remove(id: string): Promise<boolean>;
|
|
30
|
+
seedDefaults(seeds: TaskSeed[]): Promise<AgentTask[]>;
|
|
31
|
+
/** Fill defaults + assign id/createdAt for a new or seed task. */
|
|
32
|
+
private materialize;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The three default loops nanobot seeded — ready to pass to `seedDefaults`.
|
|
36
|
+
* Disabled by default: a wallet agent must be turned on deliberately, never
|
|
37
|
+
* auto-arm itself on first launch.
|
|
38
|
+
*/
|
|
39
|
+
export declare function defaultTaskSeeds(opts?: {
|
|
40
|
+
heartbeatSec?: number;
|
|
41
|
+
rebalanceSec?: number;
|
|
42
|
+
dailySummarySec?: number;
|
|
43
|
+
}): TaskSeed[];
|
|
44
|
+
//# sourceMappingURL=task-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../../src/autonomy/task-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,GAAE,gBAAqB;YAKzB,OAAO;YAaP,OAAO;IAIf,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAK5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK1C,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ1C,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAClD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAYtB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASpC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAc3D,kEAAkE;IAClE,OAAO,CAAC,WAAW;CAcpB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,QAAQ,EAAE,CA8BlB"}
|