@cavelang/cli 0.27.3 → 0.29.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/Authors.md +5 -0
- package/License.md +6 -0
- package/README.md +122 -24
- package/dist/internal/act/action.d.ts +69 -0
- package/dist/internal/act/action.d.ts.map +1 -0
- package/dist/internal/act/action.js +201 -0
- package/dist/internal/act/action.js.map +1 -0
- package/dist/internal/act/declare.d.ts +102 -0
- package/dist/internal/act/declare.d.ts.map +1 -0
- package/dist/internal/act/declare.js +270 -0
- package/dist/internal/act/declare.js.map +1 -0
- package/dist/internal/act/engine.d.ts +103 -0
- package/dist/internal/act/engine.d.ts.map +1 -0
- package/dist/internal/act/engine.js +298 -0
- package/dist/internal/act/engine.js.map +1 -0
- package/dist/internal/act/index.d.ts +27 -0
- package/dist/internal/act/index.d.ts.map +1 -0
- package/dist/internal/act/index.js +25 -0
- package/dist/internal/act/index.js.map +1 -0
- package/dist/internal/automate/automation.d.ts +78 -0
- package/dist/internal/automate/automation.d.ts.map +1 -0
- package/dist/internal/automate/automation.js +135 -0
- package/dist/internal/automate/automation.js.map +1 -0
- package/dist/internal/automate/declare.d.ts +84 -0
- package/dist/internal/automate/declare.d.ts.map +1 -0
- package/dist/internal/automate/declare.js +233 -0
- package/dist/internal/automate/declare.js.map +1 -0
- package/dist/internal/automate/engine.d.ts +125 -0
- package/dist/internal/automate/engine.d.ts.map +1 -0
- package/dist/internal/automate/engine.js +388 -0
- package/dist/internal/automate/engine.js.map +1 -0
- package/dist/internal/automate/index.d.ts +28 -0
- package/dist/internal/automate/index.d.ts.map +1 -0
- package/dist/internal/automate/index.js +26 -0
- package/dist/internal/automate/index.js.map +1 -0
- package/dist/internal/automate/main.d.ts +26 -0
- package/dist/internal/automate/main.d.ts.map +1 -0
- package/dist/internal/automate/main.js +298 -0
- package/dist/internal/automate/main.js.map +1 -0
- package/dist/internal/connect/index.d.ts +26 -0
- package/dist/internal/connect/index.d.ts.map +1 -0
- package/dist/internal/connect/index.js +24 -0
- package/dist/internal/connect/index.js.map +1 -0
- package/dist/internal/connect/main.d.ts +23 -0
- package/dist/internal/connect/main.d.ts.map +1 -0
- package/dist/internal/connect/main.js +330 -0
- package/dist/internal/connect/main.js.map +1 -0
- package/dist/internal/connect/run.d.ts +85 -0
- package/dist/internal/connect/run.d.ts.map +1 -0
- package/dist/internal/connect/run.js +242 -0
- package/dist/internal/connect/run.js.map +1 -0
- package/dist/internal/connect/source.d.ts +44 -0
- package/dist/internal/connect/source.d.ts.map +1 -0
- package/dist/internal/connect/source.js +215 -0
- package/dist/internal/connect/source.js.map +1 -0
- package/dist/internal/connect/template.d.ts +69 -0
- package/dist/internal/connect/template.d.ts.map +1 -0
- package/dist/internal/connect/template.js +221 -0
- package/dist/internal/connect/template.js.map +1 -0
- package/dist/internal/eval/index.d.ts +28 -0
- package/dist/internal/eval/index.d.ts.map +1 -0
- package/dist/internal/eval/index.js +27 -0
- package/dist/internal/eval/index.js.map +1 -0
- package/dist/internal/eval/judge.d.ts +30 -0
- package/dist/internal/eval/judge.d.ts.map +1 -0
- package/dist/internal/eval/judge.js +101 -0
- package/dist/internal/eval/judge.js.map +1 -0
- package/dist/internal/eval/loop.d.ts +64 -0
- package/dist/internal/eval/loop.d.ts.map +1 -0
- package/dist/internal/eval/loop.js +123 -0
- package/dist/internal/eval/loop.js.map +1 -0
- package/dist/internal/eval/main.d.ts +17 -0
- package/dist/internal/eval/main.d.ts.map +1 -0
- package/dist/internal/eval/main.js +236 -0
- package/dist/internal/eval/main.js.map +1 -0
- package/dist/internal/eval/queries.d.ts +74 -0
- package/dist/internal/eval/queries.d.ts.map +1 -0
- package/dist/internal/eval/queries.js +161 -0
- package/dist/internal/eval/queries.js.map +1 -0
- package/dist/internal/eval/run.d.ts +143 -0
- package/dist/internal/eval/run.d.ts.map +1 -0
- package/dist/internal/eval/run.js +376 -0
- package/dist/internal/eval/run.js.map +1 -0
- package/dist/internal/eval/score.d.ts +81 -0
- package/dist/internal/eval/score.d.ts.map +1 -0
- package/dist/internal/eval/score.js +126 -0
- package/dist/internal/eval/score.js.map +1 -0
- package/dist/internal/eval/suite.d.ts +66 -0
- package/dist/internal/eval/suite.d.ts.map +1 -0
- package/dist/internal/eval/suite.js +130 -0
- package/dist/internal/eval/suite.js.map +1 -0
- package/dist/internal/ingest/context.d.ts +20 -0
- package/dist/internal/ingest/context.d.ts.map +1 -0
- package/dist/internal/ingest/context.js +59 -0
- package/dist/internal/ingest/context.js.map +1 -0
- package/dist/internal/ingest/files.d.ts +46 -0
- package/dist/internal/ingest/files.d.ts.map +1 -0
- package/dist/internal/ingest/files.js +115 -0
- package/dist/internal/ingest/files.js.map +1 -0
- package/dist/internal/ingest/index.d.ts +31 -0
- package/dist/internal/ingest/index.d.ts.map +1 -0
- package/dist/internal/ingest/index.js +29 -0
- package/dist/internal/ingest/index.js.map +1 -0
- package/dist/internal/ingest/main.d.ts +12 -0
- package/dist/internal/ingest/main.d.ts.map +1 -0
- package/dist/internal/ingest/main.js +180 -0
- package/dist/internal/ingest/main.js.map +1 -0
- package/dist/internal/ingest/prompt.d.ts +32 -0
- package/dist/internal/ingest/prompt.d.ts.map +1 -0
- package/dist/internal/ingest/prompt.js +75 -0
- package/dist/internal/ingest/prompt.js.map +1 -0
- package/dist/internal/ingest/run.d.ts +142 -0
- package/dist/internal/ingest/run.d.ts.map +1 -0
- package/dist/internal/ingest/run.js +350 -0
- package/dist/internal/ingest/run.js.map +1 -0
- package/dist/internal/ingest/web.d.ts +48 -0
- package/dist/internal/ingest/web.d.ts.map +1 -0
- package/dist/internal/ingest/web.js +140 -0
- package/dist/internal/ingest/web.js.map +1 -0
- package/dist/internal/loop/demo.d.ts +22 -0
- package/dist/internal/loop/demo.d.ts.map +1 -0
- package/dist/internal/loop/demo.js +67 -0
- package/dist/internal/loop/demo.js.map +1 -0
- package/dist/internal/loop/index.d.ts +20 -0
- package/dist/internal/loop/index.d.ts.map +1 -0
- package/dist/internal/loop/index.js +17 -0
- package/dist/internal/loop/index.js.map +1 -0
- package/dist/internal/loop/llm.d.ts +99 -0
- package/dist/internal/loop/llm.d.ts.map +1 -0
- package/dist/internal/loop/llm.js +231 -0
- package/dist/internal/loop/llm.js.map +1 -0
- package/dist/internal/loop/reconstruct.d.ts +87 -0
- package/dist/internal/loop/reconstruct.d.ts.map +1 -0
- package/dist/internal/loop/reconstruct.js +157 -0
- package/dist/internal/loop/reconstruct.js.map +1 -0
- package/dist/internal/loop/sqlite.d.ts +13 -0
- package/dist/internal/loop/sqlite.d.ts.map +1 -0
- package/dist/internal/loop/sqlite.js +33 -0
- package/dist/internal/loop/sqlite.js.map +1 -0
- package/dist/internal/loop/store.d.ts +50 -0
- package/dist/internal/loop/store.d.ts.map +1 -0
- package/dist/internal/loop/store.js +100 -0
- package/dist/internal/loop/store.js.map +1 -0
- package/dist/internal/mcp/bin.d.ts +7 -0
- package/dist/internal/mcp/bin.d.ts.map +1 -0
- package/dist/internal/mcp/bin.js +8 -0
- package/dist/internal/mcp/bin.js.map +1 -0
- package/dist/internal/mcp/index.d.ts +25 -0
- package/dist/internal/mcp/index.d.ts.map +1 -0
- package/dist/internal/mcp/index.js +23 -0
- package/dist/internal/mcp/index.js.map +1 -0
- package/dist/internal/mcp/main.d.ts +23 -0
- package/dist/internal/mcp/main.d.ts.map +1 -0
- package/dist/internal/mcp/main.js +156 -0
- package/dist/internal/mcp/main.js.map +1 -0
- package/dist/internal/mcp/server.d.ts +92 -0
- package/dist/internal/mcp/server.d.ts.map +1 -0
- package/dist/internal/mcp/server.js +251 -0
- package/dist/internal/mcp/server.js.map +1 -0
- package/dist/internal/mcp/tools.d.ts +91 -0
- package/dist/internal/mcp/tools.d.ts.map +1 -0
- package/dist/internal/mcp/tools.js +584 -0
- package/dist/internal/mcp/tools.js.map +1 -0
- package/dist/internal/rules/declare.d.ts +58 -0
- package/dist/internal/rules/declare.d.ts.map +1 -0
- package/dist/internal/rules/declare.js +152 -0
- package/dist/internal/rules/declare.js.map +1 -0
- package/dist/internal/rules/engine.d.ts +125 -0
- package/dist/internal/rules/engine.d.ts.map +1 -0
- package/dist/internal/rules/engine.js +575 -0
- package/dist/internal/rules/engine.js.map +1 -0
- package/dist/internal/rules/index.d.ts +23 -0
- package/dist/internal/rules/index.d.ts.map +1 -0
- package/dist/internal/rules/index.js +21 -0
- package/dist/internal/rules/index.js.map +1 -0
- package/dist/internal/rules/rule.d.ts +88 -0
- package/dist/internal/rules/rule.d.ts.map +1 -0
- package/dist/internal/rules/rule.js +221 -0
- package/dist/internal/rules/rule.js.map +1 -0
- package/dist/internal/shape/check.d.ts +118 -0
- package/dist/internal/shape/check.d.ts.map +1 -0
- package/dist/internal/shape/check.js +331 -0
- package/dist/internal/shape/check.js.map +1 -0
- package/dist/internal/shape/client.d.ts +31 -0
- package/dist/internal/shape/client.d.ts.map +1 -0
- package/dist/internal/shape/client.js +170 -0
- package/dist/internal/shape/client.js.map +1 -0
- package/dist/internal/shape/gate.d.ts +33 -0
- package/dist/internal/shape/gate.d.ts.map +1 -0
- package/dist/internal/shape/gate.js +0 -0
- package/dist/internal/shape/gate.js.map +1 -0
- package/dist/internal/shape/index.d.ts +27 -0
- package/dist/internal/shape/index.d.ts.map +1 -0
- package/dist/internal/shape/index.js +23 -0
- package/dist/internal/shape/index.js.map +1 -0
- package/dist/internal/shape/suggest.d.ts +82 -0
- package/dist/internal/shape/suggest.d.ts.map +1 -0
- package/dist/internal/shape/suggest.js +374 -0
- package/dist/internal/shape/suggest.js.map +1 -0
- package/dist/internal/sync/index.d.ts +22 -0
- package/dist/internal/sync/index.d.ts.map +1 -0
- package/dist/internal/sync/index.js +21 -0
- package/dist/internal/sync/index.js.map +1 -0
- package/dist/internal/sync/sync.d.ts +95 -0
- package/dist/internal/sync/sync.d.ts.map +1 -0
- package/dist/internal/sync/sync.js +342 -0
- package/dist/internal/sync/sync.js.map +1 -0
- package/dist/internal/view/api.d.ts +196 -0
- package/dist/internal/view/api.d.ts.map +1 -0
- package/dist/internal/view/api.js +189 -0
- package/dist/internal/view/api.js.map +1 -0
- package/dist/internal/view/index.d.ts +33 -0
- package/dist/internal/view/index.d.ts.map +1 -0
- package/dist/internal/view/index.js +30 -0
- package/dist/internal/view/index.js.map +1 -0
- package/dist/internal/view/main.d.ts +11 -0
- package/dist/internal/view/main.d.ts.map +1 -0
- package/dist/internal/view/main.js +98 -0
- package/dist/internal/view/main.js.map +1 -0
- package/dist/internal/view/page.d.ts +14 -0
- package/dist/internal/view/page.d.ts.map +1 -0
- package/dist/internal/view/page.js +370 -0
- package/dist/internal/view/page.js.map +1 -0
- package/dist/internal/view/report.d.ts +52 -0
- package/dist/internal/view/report.d.ts.map +1 -0
- package/dist/internal/view/report.js +367 -0
- package/dist/internal/view/report.js.map +1 -0
- package/dist/internal/view/scope.d.ts +11 -0
- package/dist/internal/view/scope.d.ts.map +1 -0
- package/dist/internal/view/scope.js +41 -0
- package/dist/internal/view/scope.js.map +1 -0
- package/dist/internal/view/server.d.ts +35 -0
- package/dist/internal/view/server.d.ts.map +1 -0
- package/dist/internal/view/server.js +141 -0
- package/dist/internal/view/server.js.map +1 -0
- package/dist/src/act.d.ts +3 -0
- package/dist/src/act.d.ts.map +1 -0
- package/dist/src/act.js +3 -0
- package/dist/src/act.js.map +1 -0
- package/dist/src/automate.d.ts +3 -0
- package/dist/src/automate.d.ts.map +1 -0
- package/dist/src/automate.js +3 -0
- package/dist/src/automate.js.map +1 -0
- package/dist/src/cli.d.ts +24 -17
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +416 -109
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands.d.ts +104 -0
- package/dist/src/commands.d.ts.map +1 -0
- package/dist/src/commands.js +33 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/connect.d.ts +3 -0
- package/dist/src/connect.d.ts.map +1 -0
- package/dist/src/connect.js +3 -0
- package/dist/src/connect.js.map +1 -0
- package/dist/src/dispatch.d.ts +14 -0
- package/dist/src/dispatch.d.ts.map +1 -0
- package/dist/src/dispatch.js +116 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +45 -0
- package/dist/src/doctor.d.ts.map +1 -0
- package/dist/src/doctor.js +284 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/eval.d.ts +3 -0
- package/dist/src/eval.d.ts.map +1 -0
- package/dist/src/eval.js +3 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/ingest.d.ts +3 -0
- package/dist/src/ingest.d.ts.map +1 -0
- package/dist/src/ingest.js +3 -0
- package/dist/src/ingest.js.map +1 -0
- package/dist/src/loop.d.ts +3 -0
- package/dist/src/loop.d.ts.map +1 -0
- package/dist/src/loop.js +3 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/main.d.ts +1 -1
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +3 -75
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp.d.ts +3 -0
- package/dist/src/mcp.d.ts.map +1 -0
- package/dist/src/mcp.js +3 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/rules.d.ts +3 -0
- package/dist/src/rules.d.ts.map +1 -0
- package/dist/src/rules.js +3 -0
- package/dist/src/rules.js.map +1 -0
- package/dist/src/shape.d.ts +3 -0
- package/dist/src/shape.d.ts.map +1 -0
- package/dist/src/shape.js +3 -0
- package/dist/src/shape.js.map +1 -0
- package/dist/src/sync.d.ts +3 -0
- package/dist/src/sync.d.ts.map +1 -0
- package/dist/src/sync.js +3 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/view.d.ts +3 -0
- package/dist/src/view.d.ts.map +1 -0
- package/dist/src/view.js +3 -0
- package/dist/src/view.js.map +1 -0
- package/package.json +81 -21
- package/src/act.ts +2 -0
- package/src/automate.ts +2 -0
- package/src/cli.ts +423 -104
- package/src/commands.ts +48 -0
- package/src/connect.ts +2 -0
- package/src/dispatch.ts +141 -0
- package/src/doctor.ts +370 -0
- package/src/eval.ts +2 -0
- package/src/index.ts +9 -2
- package/src/ingest.ts +2 -0
- package/src/loop.ts +2 -0
- package/src/main.ts +3 -66
- package/src/mcp.ts +2 -0
- package/src/rules.ts +2 -0
- package/src/shape.ts +2 -0
- package/src/sync.ts +2 -0
- package/src/view.ts +2 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cave automate` entry (spec §29.5) — argument parsing, the declare /
|
|
3
|
+
* list / retract lifecycle, one settle cycle under `--once`, and the
|
|
4
|
+
* long-running loop: a cheap `MAX(tx)` poll, a cycle whenever it moves.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { parseArgs } from 'node:util';
|
|
8
|
+
import { Registry } from '@cavelang/canonical';
|
|
9
|
+
import { shellComplete } from '@cavelang/cli/loop';
|
|
10
|
+
import { defaultDbPath, open } from '@cavelang/store';
|
|
11
|
+
import { declareAutomations, listAutomations, retractAutomation } from "./declare.js";
|
|
12
|
+
import { defaultAgentTimeoutSeconds, defaultMaxPasses, settle, settled } from "./engine.js";
|
|
13
|
+
const usage = `cave automate — the event-driven loop (spec §29)
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
cave automate [--db <path>] [options] watch the store; settle on change
|
|
17
|
+
cave automate [--db <path>] --once [--json] one settle cycle, then exit
|
|
18
|
+
cave automate [--db <path>] --declare [file...]
|
|
19
|
+
cave automate [--db <path>] --list [--json]
|
|
20
|
+
cave automate [--db <path>] --retract <name>
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
--db <path> database file (default: $CAVE_DB, or cave.db)
|
|
24
|
+
--once run one settle cycle and exit — cron replaces the
|
|
25
|
+
daemon; the exit code carries step failures
|
|
26
|
+
--interval <s> poll interval in seconds (default 2)
|
|
27
|
+
--declare declare the automations of CAVE documents (stdin
|
|
28
|
+
when no file); other lines are prelude
|
|
29
|
+
--list print the store's current automations and exit
|
|
30
|
+
--retract <n> retract an automation's declaration and exit
|
|
31
|
+
--hooks <file> JSON file of out-of-band hook command templates,
|
|
32
|
+
name → shell template (spec §25.4), shared with
|
|
33
|
+
action steps; default: $CAVE_HOOKS
|
|
34
|
+
--agent <template> shell agent for prompt steps — the cave ingest/eval
|
|
35
|
+
contract: prompt on stdin and {prompt-file}
|
|
36
|
+
(substituted shell-quoted), CAVE reply on stdout
|
|
37
|
+
(appended, spec §29.3)
|
|
38
|
+
--timeout <seconds> per-prompt agent timeout (default ${defaultAgentTimeoutSeconds})
|
|
39
|
+
--aliases triggers match through the alias closure (spec §13.6)
|
|
40
|
+
--no-derive do not fire the store's rules each pass (spec §29.4)
|
|
41
|
+
--no-check skip the shape gate on action steps (spec §25.3)
|
|
42
|
+
--max-passes <n> settle guard per cycle (default ${defaultMaxPasses})
|
|
43
|
+
--json with --once/--list: emit the report as JSON
|
|
44
|
+
--no-prelude open the store without the standard verb registry
|
|
45
|
+
|
|
46
|
+
An automation pairs a trigger with steps, declared in-band (spec §29.1):
|
|
47
|
+
|
|
48
|
+
automation/page-on-spike HAS automation: \`?svc IS service,
|
|
49
|
+
?svc HAS error-rate: ?r, ?r > 0.05 =>
|
|
50
|
+
action/open-incident, hook/page, "investigate the spike on ?svc"\`
|
|
51
|
+
|
|
52
|
+
New claims matching the trigger fire the steps — a §25 action (parameters
|
|
53
|
+
bound from same-named trigger variables), an out-of-band hook (trigger
|
|
54
|
+
claims on stdin), or an agent prompt whose CAVE reply is recorded. Rules
|
|
55
|
+
(spec §24) fire incrementally each pass. An automation is armed at its
|
|
56
|
+
declaration and never wakes itself; chains across automations converge
|
|
57
|
+
because every write path is idempotent.
|
|
58
|
+
|
|
59
|
+
Examples:
|
|
60
|
+
cave automate --db k.db --declare automations.cave
|
|
61
|
+
cave automate --db k.db --once
|
|
62
|
+
cave automate --db k.db --hooks hooks.json --agent 'claude -p'
|
|
63
|
+
cave automate --db k.db --once --json | jq '.automations'`;
|
|
64
|
+
const waitForAbort = (signal) => signal?.aborted === true ? Promise.resolve() : new Promise(resolve => signal?.addEventListener('abort', () => resolve(), { once: true }));
|
|
65
|
+
/** Loads a §25.4 hooks configuration file: name → shell command template. */
|
|
66
|
+
const readHooks = (path) => {
|
|
67
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
68
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed) ||
|
|
69
|
+
Object.values(parsed).some(value => typeof value !== 'string')) {
|
|
70
|
+
throw new Error(`${path}: hooks must be a JSON object of name → shell template strings`);
|
|
71
|
+
}
|
|
72
|
+
return parsed;
|
|
73
|
+
};
|
|
74
|
+
const readInput = async (files, input) => {
|
|
75
|
+
if (files.length > 0 && !(files.length === 1 && files[0] === '-')) {
|
|
76
|
+
return files.map(file => readFileSync(file, 'utf8')).join('\n');
|
|
77
|
+
}
|
|
78
|
+
let text = '';
|
|
79
|
+
for await (const chunk of input) {
|
|
80
|
+
text += String(chunk);
|
|
81
|
+
}
|
|
82
|
+
return text;
|
|
83
|
+
};
|
|
84
|
+
/** Text rendering of one cycle — only what fired, plus problems and notes. */
|
|
85
|
+
const renderReport = (report) => {
|
|
86
|
+
const lines = [];
|
|
87
|
+
for (const problem of report.problems) {
|
|
88
|
+
lines.push(`${problem.subject}: ${problem.problems.join('; ')}`);
|
|
89
|
+
}
|
|
90
|
+
for (const automation of report.automations) {
|
|
91
|
+
if (automation.fired === 0) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
lines.push(`${automation.subject}: fired ${automation.fired} solution(s)` +
|
|
95
|
+
(automation.description === undefined ? '' : ` ; ${automation.description}`));
|
|
96
|
+
for (const firing of automation.firings) {
|
|
97
|
+
const bindings = Object.entries(firing.bindings)
|
|
98
|
+
.map(([name, value]) => `?${name} = ${value}`)
|
|
99
|
+
.join(' ');
|
|
100
|
+
if (bindings !== '') {
|
|
101
|
+
lines.push(` ${bindings}`);
|
|
102
|
+
}
|
|
103
|
+
for (const step of firing.steps) {
|
|
104
|
+
lines.push(` ${step.step}: ${step.outcome}${step.detail === undefined ? '' : ` (${step.detail})`}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
lines.push(...report.notes.map(note => `note: ${note}`));
|
|
109
|
+
const fired = report.automations.reduce((sum, automation) => sum + automation.fired, 0);
|
|
110
|
+
const derived = report.derive === undefined ?
|
|
111
|
+
'' :
|
|
112
|
+
`; derived +${report.derive.appended} appended, ${report.derive.updated} updated, ${report.derive.retracted} retracted`;
|
|
113
|
+
lines.push(`settled: ${fired} firing(s) over ${report.passes} pass(es)${derived}`);
|
|
114
|
+
return lines;
|
|
115
|
+
};
|
|
116
|
+
const settleOptions = (values) => {
|
|
117
|
+
const hooksPath = values.hooks ?? process.env['CAVE_HOOKS'];
|
|
118
|
+
const timeoutSeconds = values.timeout === undefined ? defaultAgentTimeoutSeconds : Number(values.timeout);
|
|
119
|
+
return {
|
|
120
|
+
aliases: values.aliases === true,
|
|
121
|
+
derive: values['no-derive'] !== true,
|
|
122
|
+
check: values['no-check'] !== true,
|
|
123
|
+
...values['max-passes'] === undefined ? {} : { maxPasses: Number(values['max-passes']) },
|
|
124
|
+
...hooksPath === undefined ? {} : { hooks: readHooks(hooksPath) },
|
|
125
|
+
...values.agent === undefined ? {} : { complete: shellComplete(values.agent, { timeoutSeconds }) }
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
const maxTxOf = (store) => store.db.prepare('SELECT MAX(tx) AS t FROM cave_claim').get().t;
|
|
129
|
+
/**
|
|
130
|
+
* One watch cycle (spec §29.5): settle, report, and return the tx
|
|
131
|
+
* boundary the poll may treat as seen. The boundary is captured *before*
|
|
132
|
+
* each settle, and the cycle re-settles until `MAX(tx)` is unchanged
|
|
133
|
+
* across one — a write landing while a settle runs (or while its report
|
|
134
|
+
* renders) re-enters the loop instead of being marked seen unprocessed
|
|
135
|
+
* (BUGS.md watch-watermark-race). Settle's own appends move `MAX(tx)`
|
|
136
|
+
* too, so a cycle that fired ends with one confirming settle; quiescent
|
|
137
|
+
* write paths (§29.4) are what make the loop terminate.
|
|
138
|
+
*/
|
|
139
|
+
export const watchCycle = async (store, options, onReport) => {
|
|
140
|
+
for (;;) {
|
|
141
|
+
const boundary = maxTxOf(store);
|
|
142
|
+
onReport(await settle(store, options));
|
|
143
|
+
if (maxTxOf(store) === boundary) {
|
|
144
|
+
return boundary;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
/** The daemon (spec §29.5): settle at startup, then settle when MAX(tx) moves. */
|
|
149
|
+
const runWatch = async (store, options, intervalSeconds, io) => {
|
|
150
|
+
let seen = null;
|
|
151
|
+
let running = false;
|
|
152
|
+
const onReport = (report) => {
|
|
153
|
+
const fired = report.automations.some(automation => automation.fired > 0);
|
|
154
|
+
if (fired || report.problems.length > 0 || report.notes.length > 0) {
|
|
155
|
+
io.stdout.write(`${renderReport(report).join('\n')}\n`);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const cycle = async () => {
|
|
159
|
+
running = true;
|
|
160
|
+
try {
|
|
161
|
+
seen = await watchCycle(store, options, onReport);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
io.stderr.write(`cave automate: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
165
|
+
// `seen` stays put: the next tick retries the pending events —
|
|
166
|
+
// settling is idempotent (§29.3) — instead of stalling them
|
|
167
|
+
// behind an unrelated later append.
|
|
168
|
+
}
|
|
169
|
+
running = false;
|
|
170
|
+
};
|
|
171
|
+
let active = cycle();
|
|
172
|
+
await active;
|
|
173
|
+
io.stdout.write(`watching (poll every ${intervalSeconds}s, ctrl-c to stop)\n`);
|
|
174
|
+
const timer = setInterval(() => {
|
|
175
|
+
if (!running && maxTxOf(store) !== seen) {
|
|
176
|
+
active = cycle();
|
|
177
|
+
void active;
|
|
178
|
+
}
|
|
179
|
+
}, intervalSeconds * 1000);
|
|
180
|
+
await waitForAbort(io.signal);
|
|
181
|
+
clearInterval(timer);
|
|
182
|
+
await active;
|
|
183
|
+
return 0;
|
|
184
|
+
};
|
|
185
|
+
export const runAutomate = async (argv, context = {}) => {
|
|
186
|
+
const io = {
|
|
187
|
+
stdin: context.stdin ?? process.stdin,
|
|
188
|
+
stdout: context.stdout ?? process.stdout,
|
|
189
|
+
stderr: context.stderr ?? process.stderr,
|
|
190
|
+
...context.signal === undefined ? {} : { signal: context.signal }
|
|
191
|
+
};
|
|
192
|
+
const { values, positionals } = parseArgs({
|
|
193
|
+
args: [...argv],
|
|
194
|
+
options: {
|
|
195
|
+
db: { type: 'string' },
|
|
196
|
+
once: { type: 'boolean' },
|
|
197
|
+
interval: { type: 'string' },
|
|
198
|
+
declare: { type: 'boolean' },
|
|
199
|
+
list: { type: 'boolean' },
|
|
200
|
+
retract: { type: 'string' },
|
|
201
|
+
hooks: { type: 'string' },
|
|
202
|
+
agent: { type: 'string' },
|
|
203
|
+
timeout: { type: 'string' },
|
|
204
|
+
aliases: { type: 'boolean' },
|
|
205
|
+
'no-derive': { type: 'boolean' },
|
|
206
|
+
'no-check': { type: 'boolean' },
|
|
207
|
+
'max-passes': { type: 'string' },
|
|
208
|
+
json: { type: 'boolean' },
|
|
209
|
+
'no-prelude': { type: 'boolean' },
|
|
210
|
+
help: { type: 'boolean', short: 'h' }
|
|
211
|
+
},
|
|
212
|
+
allowPositionals: true
|
|
213
|
+
});
|
|
214
|
+
if (values.help === true) {
|
|
215
|
+
io.stdout.write(`${usage}\n`);
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
218
|
+
const intervalSeconds = values.interval === undefined ? 2 : Number(values.interval);
|
|
219
|
+
if (!Number.isFinite(intervalSeconds) || intervalSeconds <= 0) {
|
|
220
|
+
io.stderr.write(`cave automate: --interval must be a positive number of seconds, got '${values.interval}'\n`);
|
|
221
|
+
return 1;
|
|
222
|
+
}
|
|
223
|
+
const maxPasses = values['max-passes'] === undefined ? undefined : Number(values['max-passes']);
|
|
224
|
+
if (maxPasses !== undefined && (!Number.isInteger(maxPasses) || maxPasses < 1)) {
|
|
225
|
+
io.stderr.write(`cave automate: --max-passes expects a positive integer, got '${values['max-passes']}'\n`);
|
|
226
|
+
return 1;
|
|
227
|
+
}
|
|
228
|
+
const timeoutSeconds = values.timeout === undefined ? undefined : Number(values.timeout);
|
|
229
|
+
if (timeoutSeconds !== undefined && (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0)) {
|
|
230
|
+
io.stderr.write(`cave automate: --timeout must be a positive number of seconds, got '${values.timeout}'\n`);
|
|
231
|
+
return 1;
|
|
232
|
+
}
|
|
233
|
+
const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
|
|
234
|
+
try {
|
|
235
|
+
if (values.declare === true) {
|
|
236
|
+
const declaration = declareAutomations(store, await readInput(positionals, io.stdin));
|
|
237
|
+
for (const problem of declaration.problems) {
|
|
238
|
+
io.stderr.write(`line ${problem.line}: ${problem.message}\n`);
|
|
239
|
+
}
|
|
240
|
+
io.stdout.write(`declared ${declaration.declared} automation(s)` +
|
|
241
|
+
(declaration.unchanged > 0 ? `, ${declaration.unchanged} unchanged` : '') +
|
|
242
|
+
(declaration.prelude > 0 ? `, +${declaration.prelude} prelude claim(s)` : '') + '\n');
|
|
243
|
+
return declaration.problems.length > 0 ? 1 : 0;
|
|
244
|
+
}
|
|
245
|
+
if (values.list === true) {
|
|
246
|
+
const automations = listAutomations(store);
|
|
247
|
+
if (values.json === true) {
|
|
248
|
+
io.stdout.write(`${JSON.stringify(automations, undefined, 2)}\n`);
|
|
249
|
+
return 0;
|
|
250
|
+
}
|
|
251
|
+
if (automations.length === 0) {
|
|
252
|
+
io.stdout.write('no automations\n');
|
|
253
|
+
return 0;
|
|
254
|
+
}
|
|
255
|
+
for (const automation of automations) {
|
|
256
|
+
io.stdout.write(`${automation.subject} \`${automation.text}\`` +
|
|
257
|
+
`${automation.description === undefined ? '' : ` ; ${automation.description}`}\n`);
|
|
258
|
+
if (!automation.ok) {
|
|
259
|
+
io.stdout.write(` problems: ${automation.problems.join('; ')}\n`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
if (values.retract !== undefined) {
|
|
265
|
+
const outcome = retractAutomation(store, values.retract);
|
|
266
|
+
if (!outcome.ok) {
|
|
267
|
+
io.stderr.write(`cave automate: ${outcome.error}\n`);
|
|
268
|
+
return 1;
|
|
269
|
+
}
|
|
270
|
+
io.stdout.write(`retracted ${outcome.subject} — what past firings recorded stays recorded (spec §29.1)\n`);
|
|
271
|
+
return 0;
|
|
272
|
+
}
|
|
273
|
+
if (positionals.length > 0) {
|
|
274
|
+
io.stderr.write(`cave automate: unexpected argument ${JSON.stringify(positionals[0])} — files go with --declare\n`);
|
|
275
|
+
return 1;
|
|
276
|
+
}
|
|
277
|
+
const options = settleOptions(values);
|
|
278
|
+
if (values.once === true) {
|
|
279
|
+
const report = await settle(store, options);
|
|
280
|
+
if (values.json === true) {
|
|
281
|
+
io.stdout.write(`${JSON.stringify(report, undefined, 2)}\n`);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
io.stdout.write(`${renderReport(report).join('\n')}\n`);
|
|
285
|
+
}
|
|
286
|
+
return settled(report) ? 0 : 1;
|
|
287
|
+
}
|
|
288
|
+
return await runWatch(store, options, intervalSeconds, io);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
io.stderr.write(`cave automate: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
292
|
+
return 1;
|
|
293
|
+
}
|
|
294
|
+
finally {
|
|
295
|
+
store.close();
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@cavelang/cli/connect` — deterministic structured ingestion (spec §23).
|
|
3
|
+
*
|
|
4
|
+
* ```sh
|
|
5
|
+
* cave connect people.csv --map people.map.cave --db k.db --key id
|
|
6
|
+
* ```
|
|
7
|
+
*
|
|
8
|
+
* Library API:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Source, Template, connect } from '@cavelang/cli/connect'
|
|
12
|
+
* import { open } from '@cavelang/store'
|
|
13
|
+
*
|
|
14
|
+
* const store = open('k.db')
|
|
15
|
+
* const { mapping } = Template.parse(mappingText)
|
|
16
|
+
* const { records } = await Source.load('people.csv')
|
|
17
|
+
* const report = connect(store, mapping!, records, { name: 'people', key: 'id' })
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export * as Source from './source.ts';
|
|
21
|
+
export * as Template from './template.ts';
|
|
22
|
+
export { connect, digestAttribute, digestOf, federatedQuery, isConnected, provenanceContext } from './run.ts';
|
|
23
|
+
export type { ConnectOptions, Failure, FederatedOutcome, Report } from './run.ts';
|
|
24
|
+
export { runConnect } from './main.ts';
|
|
25
|
+
export type { RunContext as ConnectRunContext, ScheduleLike, WatchLike } from './main.ts';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC7G,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,YAAY,EAAE,UAAU,IAAI,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@cavelang/cli/connect` — deterministic structured ingestion (spec §23).
|
|
3
|
+
*
|
|
4
|
+
* ```sh
|
|
5
|
+
* cave connect people.csv --map people.map.cave --db k.db --key id
|
|
6
|
+
* ```
|
|
7
|
+
*
|
|
8
|
+
* Library API:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Source, Template, connect } from '@cavelang/cli/connect'
|
|
12
|
+
* import { open } from '@cavelang/store'
|
|
13
|
+
*
|
|
14
|
+
* const store = open('k.db')
|
|
15
|
+
* const { mapping } = Template.parse(mappingText)
|
|
16
|
+
* const { records } = await Source.load('people.csv')
|
|
17
|
+
* const report = connect(store, mapping!, records, { name: 'people', key: 'id' })
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export * as Source from "./source.js";
|
|
21
|
+
export * as Template from "./template.js";
|
|
22
|
+
export { connect, digestAttribute, digestOf, federatedQuery, isConnected, provenanceContext } from "./run.js";
|
|
23
|
+
export { runConnect } from "./main.js";
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE7G,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cave connect` entry — argument parsing, pass orchestration (single,
|
|
3
|
+
* `--watch`, `--query`), and report rendering around `run.ts`.
|
|
4
|
+
*/
|
|
5
|
+
import * as Source from './source.ts';
|
|
6
|
+
export type RunContext = {
|
|
7
|
+
readonly stdout?: NodeJS.WritableStream;
|
|
8
|
+
readonly stderr?: NodeJS.WritableStream;
|
|
9
|
+
readonly signal?: AbortSignal;
|
|
10
|
+
/** URL transport injection for deterministic integrations. */
|
|
11
|
+
readonly fetchImpl?: Source.FetchLike;
|
|
12
|
+
/** Directory-watcher injection; production uses `node:fs.watch`. */
|
|
13
|
+
readonly watch?: WatchLike;
|
|
14
|
+
/** Debounce scheduler injection; production waits 200ms. */
|
|
15
|
+
readonly schedule?: ScheduleLike;
|
|
16
|
+
readonly cancelScheduled?: (handle: unknown) => void;
|
|
17
|
+
};
|
|
18
|
+
export type WatchLike = (path: string, listener: (event: string, filename: string | Buffer | null) => void) => {
|
|
19
|
+
close(): void;
|
|
20
|
+
};
|
|
21
|
+
export type ScheduleLike = (callback: () => Promise<void>, delayMs: number) => unknown;
|
|
22
|
+
export declare const runConnect: (argv: readonly string[], context?: RunContext) => Promise<number>;
|
|
23
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAuErC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,SAAS,CAAA;IACrC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;CACrD,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,KAChE;IAAE,KAAK,IAAI,IAAI,CAAA;CAAE,CAAA;AAEtB,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;AAyOtF,eAAO,MAAM,UAAU,GAAU,MAAM,SAAS,MAAM,EAAE,EAAE,UAAS,UAAe,KAAG,OAAO,CAAC,MAAM,CA6ElG,CAAA"}
|