@telora/daemon 0.15.18 → 0.15.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/build-info.json +2 -2
  2. package/dist/directive-executor.d.ts.map +1 -1
  3. package/dist/directive-executor.js +23 -1
  4. package/dist/directive-executor.js.map +1 -1
  5. package/dist/focus-completion.d.ts.map +1 -1
  6. package/dist/focus-completion.js +31 -3
  7. package/dist/focus-completion.js.map +1 -1
  8. package/dist/focus-engine.d.ts +1 -0
  9. package/dist/focus-engine.d.ts.map +1 -1
  10. package/dist/focus-engine.js +57 -0
  11. package/dist/focus-engine.js.map +1 -1
  12. package/dist/focus-executor.d.ts.map +1 -1
  13. package/dist/focus-executor.js +2 -0
  14. package/dist/focus-executor.js.map +1 -1
  15. package/dist/focus-loop.d.ts +59 -0
  16. package/dist/focus-loop.d.ts.map +1 -0
  17. package/dist/focus-loop.js +231 -0
  18. package/dist/focus-loop.js.map +1 -0
  19. package/dist/listener.d.ts.map +1 -1
  20. package/dist/listener.js +16 -18
  21. package/dist/listener.js.map +1 -1
  22. package/dist/queries/focus-cycle-evaluations.d.ts +32 -0
  23. package/dist/queries/focus-cycle-evaluations.d.ts.map +1 -0
  24. package/dist/queries/focus-cycle-evaluations.js +25 -0
  25. package/dist/queries/focus-cycle-evaluations.js.map +1 -0
  26. package/dist/queries/shared.d.ts.map +1 -1
  27. package/dist/queries/shared.js +7 -0
  28. package/dist/queries/shared.js.map +1 -1
  29. package/dist/queries/verification.d.ts +25 -0
  30. package/dist/queries/verification.d.ts.map +1 -0
  31. package/dist/queries/verification.js +20 -0
  32. package/dist/queries/verification.js.map +1 -0
  33. package/dist/state-cascade.d.ts +11 -30
  34. package/dist/state-cascade.d.ts.map +1 -1
  35. package/dist/state-cascade.js +13 -105
  36. package/dist/state-cascade.js.map +1 -1
  37. package/dist/team-prompt-base.d.ts +11 -0
  38. package/dist/team-prompt-base.d.ts.map +1 -1
  39. package/dist/team-prompt-base.js +63 -0
  40. package/dist/team-prompt-base.js.map +1 -1
  41. package/dist/team-spawner.d.ts.map +1 -1
  42. package/dist/team-spawner.js +2 -0
  43. package/dist/team-spawner.js.map +1 -1
  44. package/dist/types/focus.d.ts +13 -0
  45. package/dist/types/focus.d.ts.map +1 -1
  46. package/dist/verification-engine.d.ts +61 -0
  47. package/dist/verification-engine.d.ts.map +1 -0
  48. package/dist/verification-engine.js +167 -0
  49. package/dist/verification-engine.js.map +1 -0
  50. package/package.json +1 -1
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Pluggable verification engine -- Differential Focus Spec.
3
+ *
4
+ * Each delivery is the materialization of an injection. When the delivery
5
+ * reaches the 'verify' execution status, this engine selects a strategy
6
+ * based on the delivery's verification_method and runs it. On a 'passed'
7
+ * outcome the injection is retired (its FRT statement promotes to CRT)
8
+ * via the existing reality_tree_verify_injection compound op.
9
+ *
10
+ * Methods:
11
+ * deterministic -- run a shell command (tests, lint, types). Pass = exit 0.
12
+ * behavioral -- runtime telemetry observation (scaffold; needs drift
13
+ * detection from delivery 82bdf164 to provide signal).
14
+ * ai_inspection -- AI reads code/state and decides (scaffold; needs the
15
+ * reality-tree-dialog skill driving it).
16
+ * human -- pure no-op: human flips verification_outcome via UI.
17
+ *
18
+ * @module verification-engine
19
+ */
20
+ import { spawn } from 'node:child_process';
21
+ import { getPendingVerifications, recordDeliveryVerificationOutcome, verifyInjectionOnPass, } from './queries/verification.js';
22
+ import { configForProduct } from './config.js';
23
+ const DEFAULT_VERIFICATION_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
24
+ /**
25
+ * Run a configured shell command in the focus's worktree (or the product
26
+ * repo path as fallback). Pass = exit 0.
27
+ */
28
+ export async function runDeterministicStrategy(config, cwd) {
29
+ const command = config?.command;
30
+ if (typeof command !== 'string' || command.length === 0 || !config) {
31
+ return {
32
+ outcome: 'escalated',
33
+ rationale: 'deterministic strategy missing config.command',
34
+ };
35
+ }
36
+ const timeoutMs = typeof config.timeoutMs === 'number' && config.timeoutMs > 0
37
+ ? config.timeoutMs
38
+ : DEFAULT_VERIFICATION_TIMEOUT_MS;
39
+ return new Promise((resolve) => {
40
+ const child = spawn('sh', ['-c', command], {
41
+ cwd,
42
+ stdio: ['ignore', 'pipe', 'pipe'],
43
+ });
44
+ let stdout = '';
45
+ let stderr = '';
46
+ const tail = (buf, max = 4000) => buf.length <= max ? buf : buf.slice(buf.length - max);
47
+ child.stdout?.on('data', (chunk) => {
48
+ stdout += chunk.toString('utf8');
49
+ stdout = tail(stdout);
50
+ });
51
+ child.stderr?.on('data', (chunk) => {
52
+ stderr += chunk.toString('utf8');
53
+ stderr = tail(stderr);
54
+ });
55
+ const timer = setTimeout(() => {
56
+ try {
57
+ child.kill('SIGKILL');
58
+ }
59
+ catch { /* ignore */ }
60
+ }, timeoutMs);
61
+ child.on('error', (err) => {
62
+ clearTimeout(timer);
63
+ resolve({
64
+ outcome: 'failed',
65
+ rationale: `deterministic spawn error: ${err.message}`,
66
+ stdoutTail: stdout,
67
+ stderrTail: stderr,
68
+ });
69
+ });
70
+ child.on('close', (code) => {
71
+ clearTimeout(timer);
72
+ const passed = code === 0;
73
+ resolve({
74
+ outcome: passed ? 'passed' : 'failed',
75
+ rationale: passed
76
+ ? 'deterministic check passed (exit 0)'
77
+ : `deterministic check failed (exit ${code})`,
78
+ exitCode: code,
79
+ stdoutTail: stdout,
80
+ stderrTail: stderr,
81
+ });
82
+ });
83
+ });
84
+ }
85
+ export async function runHumanStrategy() {
86
+ return {
87
+ outcome: 'pending',
88
+ rationale: 'human strategy -- awaiting "done done" sign-off via UI',
89
+ };
90
+ }
91
+ export async function runBehavioralStrategy() {
92
+ return {
93
+ outcome: 'pending',
94
+ rationale: 'behavioral strategy scaffold -- runtime telemetry source not yet wired (see drift detection 82bdf164)',
95
+ };
96
+ }
97
+ export async function runAiInspectionStrategy() {
98
+ return {
99
+ outcome: 'pending',
100
+ rationale: 'ai_inspection strategy scaffold -- needs Claude process driven by reality-tree-dialog skill',
101
+ };
102
+ }
103
+ const defaultDeps = (config) => ({
104
+ getPendingVerifications,
105
+ recordOutcome: recordDeliveryVerificationOutcome,
106
+ verifyInjection: verifyInjectionOnPass,
107
+ runDeterministic: runDeterministicStrategy,
108
+ resolveCwd: (productId) => {
109
+ if (!productId)
110
+ return config.repoPath;
111
+ const product = config.products.find(p => p.id === productId);
112
+ if (!product)
113
+ return config.repoPath;
114
+ return configForProduct(config, product).repoPath;
115
+ },
116
+ });
117
+ const STRATEGIES = {
118
+ deterministic: (deps, v) => deps.runDeterministic(v.verificationConfig, deps.resolveCwd(v.productId)),
119
+ behavioral: () => runBehavioralStrategy(),
120
+ ai_inspection: () => runAiInspectionStrategy(),
121
+ human: () => runHumanStrategy(),
122
+ };
123
+ /**
124
+ * Run verification for a single delivery. Records the outcome and, on
125
+ * 'passed', retires the injection.
126
+ */
127
+ export async function runVerificationForDelivery(v, deps) {
128
+ const strategy = STRATEGIES[v.verificationMethod];
129
+ const result = await strategy(deps, v);
130
+ // Record outcome regardless of method (including pending for human/scaffolds).
131
+ await deps.recordOutcome(v.deliveryId, result.outcome);
132
+ // On pass: retire the injection, promote FRT overlay to CRT.
133
+ if (result.outcome === 'passed' && v.injectionNodeId) {
134
+ await deps.verifyInjection(v.injectionNodeId);
135
+ }
136
+ return result;
137
+ }
138
+ /**
139
+ * One tick: fetch pending verifications across products, dispatch each.
140
+ * Returns counts for telemetry.
141
+ */
142
+ export async function runVerificationTick(config, deps) {
143
+ const merged = { ...defaultDeps(config), ...deps };
144
+ const counts = { checked: 0, passed: 0, failed: 0, pending: 0, escalated: 0 };
145
+ for (const product of config.products) {
146
+ let pending;
147
+ try {
148
+ pending = await merged.getPendingVerifications(product.id);
149
+ }
150
+ catch (err) {
151
+ console.warn(`[verification] fetch failed for product ${product.id}:`, err.message);
152
+ continue;
153
+ }
154
+ for (const v of pending) {
155
+ counts.checked += 1;
156
+ try {
157
+ const r = await runVerificationForDelivery(v, merged);
158
+ counts[r.outcome] = (counts[r.outcome] ?? 0) + 1;
159
+ }
160
+ catch (err) {
161
+ console.warn(`[verification] tick failed for delivery ${v.deliveryId}:`, err.message);
162
+ }
163
+ }
164
+ }
165
+ return counts;
166
+ }
167
+ //# sourceMappingURL=verification-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-engine.js","sourceRoot":"","sources":["../src/verification-engine.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telora/daemon",
3
- "version": "0.15.18",
3
+ "version": "0.15.23",
4
4
  "description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
5
5
  "type": "module",
6
6
  "bin": {