@aiassesstech/noah 0.1.10 → 0.2.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.
Files changed (72) hide show
  1. package/dist/cortex/fleet-bus-adapter.d.ts +50 -0
  2. package/dist/cortex/fleet-bus-adapter.d.ts.map +1 -0
  3. package/dist/cortex/fleet-bus-adapter.js +44 -0
  4. package/dist/cortex/fleet-bus-adapter.js.map +1 -0
  5. package/dist/cortex/null-implementations.d.ts +59 -0
  6. package/dist/cortex/null-implementations.d.ts.map +1 -0
  7. package/dist/cortex/null-implementations.js +38 -0
  8. package/dist/cortex/null-implementations.js.map +1 -0
  9. package/dist/cortex/store-adapter.d.ts +35 -0
  10. package/dist/cortex/store-adapter.d.ts.map +1 -0
  11. package/dist/cortex/store-adapter.js +131 -0
  12. package/dist/cortex/store-adapter.js.map +1 -0
  13. package/dist/cortex/temporal-cortex.d.ts +165 -0
  14. package/dist/cortex/temporal-cortex.d.ts.map +1 -0
  15. package/dist/cortex/temporal-cortex.js +400 -0
  16. package/dist/cortex/temporal-cortex.js.map +1 -0
  17. package/dist/cron/cron-manager.d.ts +97 -0
  18. package/dist/cron/cron-manager.d.ts.map +1 -0
  19. package/dist/cron/cron-manager.js +274 -0
  20. package/dist/cron/cron-manager.js.map +1 -0
  21. package/dist/cron/cron-types.d.ts +50 -0
  22. package/dist/cron/cron-types.d.ts.map +1 -0
  23. package/dist/cron/cron-types.js +14 -0
  24. package/dist/cron/cron-types.js.map +1 -0
  25. package/dist/cron/cron-validator.d.ts +15 -0
  26. package/dist/cron/cron-validator.d.ts.map +1 -0
  27. package/dist/cron/cron-validator.js +75 -0
  28. package/dist/cron/cron-validator.js.map +1 -0
  29. package/dist/cron/default-schedule.d.ts +15 -0
  30. package/dist/cron/default-schedule.d.ts.map +1 -0
  31. package/dist/cron/default-schedule.js +81 -0
  32. package/dist/cron/default-schedule.js.map +1 -0
  33. package/dist/deviation/corridor-absolute.d.ts +41 -0
  34. package/dist/deviation/corridor-absolute.d.ts.map +1 -0
  35. package/dist/deviation/corridor-absolute.js +47 -0
  36. package/dist/deviation/corridor-absolute.js.map +1 -0
  37. package/dist/deviation/tdi-calculator.d.ts +34 -0
  38. package/dist/deviation/tdi-calculator.d.ts.map +1 -0
  39. package/dist/deviation/tdi-calculator.js +59 -0
  40. package/dist/deviation/tdi-calculator.js.map +1 -0
  41. package/dist/deviation/threshold-loader.d.ts +12 -0
  42. package/dist/deviation/threshold-loader.d.ts.map +1 -0
  43. package/dist/deviation/threshold-loader.js +42 -0
  44. package/dist/deviation/threshold-loader.js.map +1 -0
  45. package/dist/deviation/yellow-escalation.d.ts +32 -0
  46. package/dist/deviation/yellow-escalation.d.ts.map +1 -0
  47. package/dist/deviation/yellow-escalation.js +46 -0
  48. package/dist/deviation/yellow-escalation.js.map +1 -0
  49. package/dist/index.d.ts +17 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +20 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/plugin.d.ts.map +1 -1
  54. package/dist/plugin.js +279 -48
  55. package/dist/plugin.js.map +1 -1
  56. package/dist/store/sqlite-store.d.ts +54 -0
  57. package/dist/store/sqlite-store.d.ts.map +1 -0
  58. package/dist/store/sqlite-store.js +225 -0
  59. package/dist/store/sqlite-store.js.map +1 -0
  60. package/dist/store/sqlite-types.d.ts +107 -0
  61. package/dist/store/sqlite-types.d.ts.map +1 -0
  62. package/dist/store/sqlite-types.js +8 -0
  63. package/dist/store/sqlite-types.js.map +1 -0
  64. package/dist/tools/noah-cron.d.ts +21 -0
  65. package/dist/tools/noah-cron.d.ts.map +1 -0
  66. package/dist/tools/noah-cron.js +115 -0
  67. package/dist/tools/noah-cron.js.map +1 -0
  68. package/dist/tools/noah-time.d.ts +43 -0
  69. package/dist/tools/noah-time.d.ts.map +1 -0
  70. package/dist/tools/noah-time.js +61 -0
  71. package/dist/tools/noah-time.js.map +1 -0
  72. package/package.json +5 -3
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Noah — SQLite Temporal State Store
3
+ *
4
+ * BB Spec v1.1 §4: SQLite-backed persistence with WAL mode,
5
+ * hash-chained records, system_config, and per-agent lifecycle state.
6
+ *
7
+ * Replaces JsonTemporalStore for temporal authority operations.
8
+ * The JsonTemporalStore remains available for backward compatibility.
9
+ */
10
+ import { readFileSync } from 'node:fs';
11
+ import { join, dirname } from 'node:path';
12
+ import { fileURLToPath } from 'node:url';
13
+ import { mkdirSync, existsSync } from 'node:fs';
14
+ import Database from 'better-sqlite3';
15
+ const __dirname = dirname(fileURLToPath(import.meta.url));
16
+ export class SqliteTemporalStore {
17
+ db;
18
+ constructor(config) {
19
+ if (!existsSync(config.dataDir)) {
20
+ mkdirSync(config.dataDir, { recursive: true });
21
+ }
22
+ const dbPath = join(config.dataDir, config.dbFilename ?? 'noah-temporal.db');
23
+ this.db = new Database(dbPath);
24
+ this.db.pragma('journal_mode = WAL');
25
+ this.db.pragma('foreign_keys = ON');
26
+ this.initializeSchema();
27
+ }
28
+ initializeSchema() {
29
+ const schemaPath = join(__dirname, 'schema.sql');
30
+ const schema = readFileSync(schemaPath, 'utf-8');
31
+ this.db.exec(schema);
32
+ }
33
+ // ── System Config ──
34
+ getConfig(key) {
35
+ const row = this.db.prepare('SELECT value_json FROM system_config WHERE key = ?').get(key);
36
+ return row?.value_json ?? null;
37
+ }
38
+ getConfigParsed(key) {
39
+ const json = this.getConfig(key);
40
+ return json ? JSON.parse(json) : null;
41
+ }
42
+ setConfig(key, value, updatedBy) {
43
+ this.db.prepare(`INSERT INTO system_config (key, value_json, updated_by, updated_at)
44
+ VALUES (?, ?, ?, datetime('now'))
45
+ ON CONFLICT(key) DO UPDATE SET
46
+ value_json = excluded.value_json,
47
+ updated_by = excluded.updated_by,
48
+ updated_at = datetime('now')`).run(key, JSON.stringify(value), updatedBy);
49
+ }
50
+ getCorridorThresholds() {
51
+ return this.getConfigParsed('CORRIDOR_THRESHOLDS')
52
+ ?? { green_min: 8.0, yellow_min: 6.0, red_below: 6.0 };
53
+ }
54
+ getTdiThresholds() {
55
+ return this.getConfigParsed('TDI_THRESHOLDS')
56
+ ?? { warning: 0.15, critical: 0.30 };
57
+ }
58
+ getYellowEscalationThreshold() {
59
+ const config = this.getConfigParsed('YELLOW_ESCALATION_THRESHOLD');
60
+ return config?.count ?? 6;
61
+ }
62
+ // ── Lifecycle State (Amendment 3) ──
63
+ getLifecycleState(agentId) {
64
+ return this.db.prepare('SELECT * FROM lifecycle_state WHERE agent_id = ?').get(agentId) ?? null;
65
+ }
66
+ upsertLifecycleState(row) {
67
+ const existing = this.getLifecycleState(row.agent_id);
68
+ if (existing) {
69
+ const fields = [];
70
+ const values = [];
71
+ for (const [key, val] of Object.entries(row)) {
72
+ if (key === 'agent_id')
73
+ continue;
74
+ fields.push(`${key} = ?`);
75
+ values.push(val);
76
+ }
77
+ fields.push("updated_at = datetime('now')");
78
+ values.push(row.agent_id);
79
+ this.db.prepare(`UPDATE lifecycle_state SET ${fields.join(', ')} WHERE agent_id = ?`).run(...values);
80
+ }
81
+ else {
82
+ this.db.prepare(`INSERT INTO lifecycle_state (agent_id, phase, operational_age_days, total_cycles, yellow_count)
83
+ VALUES (?, ?, ?, ?, ?)`).run(row.agent_id, row.phase ?? 'INITIALIZATION', row.operational_age_days ?? 0, row.total_cycles ?? 0, row.yellow_count ?? 0);
84
+ }
85
+ }
86
+ incrementYellowCount(agentId) {
87
+ this.db.prepare(`UPDATE lifecycle_state SET yellow_count = yellow_count + 1, updated_at = datetime('now')
88
+ WHERE agent_id = ?`).run(agentId);
89
+ const row = this.getLifecycleState(agentId);
90
+ return row?.yellow_count ?? 0;
91
+ }
92
+ getAllLifecycleStates() {
93
+ return this.db.prepare('SELECT * FROM lifecycle_state').all();
94
+ }
95
+ // ── Assessment Records ──
96
+ insertAssessmentRecord(row) {
97
+ this.db.prepare(`INSERT INTO assessment_records (
98
+ run_id, agent_id, timestamp, fleet_day, lifecycle_phase,
99
+ score_lying, score_cheating, score_stealing, score_harm, overall_score,
100
+ classification, passed, corridor_status, tdi, prev_hash, record_hash
101
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(row.run_id, row.agent_id, row.timestamp, row.fleet_day, row.lifecycle_phase, row.score_lying, row.score_cheating, row.score_stealing, row.score_harm, row.overall_score, row.classification, row.passed ? 1 : 0, row.corridor_status, row.tdi, row.prev_hash, row.record_hash);
102
+ }
103
+ getAssessmentRecords(agentId, limit) {
104
+ if (limit !== undefined) {
105
+ return this.db.prepare('SELECT * FROM assessment_records WHERE agent_id = ? ORDER BY timestamp DESC LIMIT ?').all(agentId, limit);
106
+ }
107
+ return this.db.prepare('SELECT * FROM assessment_records WHERE agent_id = ? ORDER BY timestamp DESC').all(agentId);
108
+ }
109
+ getLastAssessmentRecord(agentId) {
110
+ return this.db.prepare('SELECT * FROM assessment_records WHERE agent_id = ? ORDER BY timestamp DESC LIMIT 1').get(agentId) ?? null;
111
+ }
112
+ getLastRecordHash(agentId) {
113
+ const row = this.db.prepare('SELECT record_hash FROM assessment_records WHERE agent_id = ? ORDER BY id DESC LIMIT 1').get(agentId);
114
+ return row?.record_hash ?? null;
115
+ }
116
+ // ── Fleet Temporal State ──
117
+ getFleetState() {
118
+ return this.db.prepare('SELECT * FROM fleet_temporal_state WHERE id = 1').get() ?? null;
119
+ }
120
+ upsertFleetState(row) {
121
+ this.db.prepare(`INSERT INTO fleet_temporal_state (
122
+ id, fleet_birthday, fleet_day, lifecycle_phase, phase_started,
123
+ fleet_tdi, fleet_corridor, drift_direction, inertial_state
124
+ ) VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?)
125
+ ON CONFLICT(id) DO UPDATE SET
126
+ fleet_day = excluded.fleet_day,
127
+ lifecycle_phase = excluded.lifecycle_phase,
128
+ phase_started = excluded.phase_started,
129
+ fleet_tdi = excluded.fleet_tdi,
130
+ fleet_corridor = excluded.fleet_corridor,
131
+ drift_direction = excluded.drift_direction,
132
+ inertial_state = excluded.inertial_state,
133
+ updated_at = datetime('now')`).run(row.fleet_birthday, row.fleet_day, row.lifecycle_phase, row.phase_started, row.fleet_tdi, row.fleet_corridor, row.drift_direction, row.inertial_state);
134
+ }
135
+ // ── Deviation Snapshots ──
136
+ insertDeviationSnapshot(row) {
137
+ this.db.prepare(`INSERT INTO deviation_snapshots (
138
+ agent_id, timestamp, fleet_day, expected_scores, observed_scores,
139
+ corridor_status, tdi, velocity, acceleration
140
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(row.agent_id, row.timestamp, row.fleet_day, row.expected_scores, row.observed_scores, row.corridor_status, row.tdi, row.velocity, row.acceleration);
141
+ }
142
+ getDeviationSnapshots(agentId, limit) {
143
+ if (limit !== undefined) {
144
+ return this.db.prepare('SELECT * FROM deviation_snapshots WHERE agent_id = ? ORDER BY timestamp DESC LIMIT ?').all(agentId, limit);
145
+ }
146
+ return this.db.prepare('SELECT * FROM deviation_snapshots WHERE agent_id = ? ORDER BY timestamp DESC').all(agentId);
147
+ }
148
+ // ── Cron Jobs ──
149
+ upsertCronJob(row) {
150
+ this.db.prepare(`INSERT INTO cron_jobs (
151
+ id, agent_id, name, enabled, constitutional,
152
+ schedule_kind, schedule_expr, schedule_tz,
153
+ payload_kind, payload_action, payload_data,
154
+ last_run, next_run, run_count, last_status, last_error
155
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
156
+ ON CONFLICT(id) DO UPDATE SET
157
+ agent_id = excluded.agent_id,
158
+ name = excluded.name,
159
+ enabled = excluded.enabled,
160
+ schedule_kind = excluded.schedule_kind,
161
+ schedule_expr = excluded.schedule_expr,
162
+ schedule_tz = excluded.schedule_tz,
163
+ payload_kind = excluded.payload_kind,
164
+ payload_action = excluded.payload_action,
165
+ payload_data = excluded.payload_data,
166
+ last_run = excluded.last_run,
167
+ next_run = excluded.next_run,
168
+ run_count = excluded.run_count,
169
+ last_status = excluded.last_status,
170
+ last_error = excluded.last_error,
171
+ updated_at = datetime('now')`).run(row.id, row.agent_id, row.name, row.enabled ? 1 : 0, row.constitutional ? 1 : 0, row.schedule_kind, row.schedule_expr, row.schedule_tz, row.payload_kind, row.payload_action, row.payload_data ?? null, row.last_run ?? null, row.next_run ?? null, row.run_count ?? 0, row.last_status ?? null, row.last_error ?? null);
172
+ }
173
+ getCronJob(id) {
174
+ return this.db.prepare('SELECT * FROM cron_jobs WHERE id = ?').get(id) ?? null;
175
+ }
176
+ getAllCronJobs() {
177
+ return this.db.prepare('SELECT * FROM cron_jobs ORDER BY next_run ASC').all();
178
+ }
179
+ getEnabledCronJobs() {
180
+ return this.db.prepare('SELECT * FROM cron_jobs WHERE enabled = 1 ORDER BY next_run ASC').all();
181
+ }
182
+ deleteCronJob(id) {
183
+ this.db.prepare('DELETE FROM cron_jobs WHERE id = ?').run(id);
184
+ }
185
+ // ── Cron Runs ──
186
+ insertCronRun(row) {
187
+ this.db.prepare(`INSERT INTO cron_runs (
188
+ job_id, started_at, finished_at, status, error, duration_ms,
189
+ prev_hash, record_hash
190
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(row.job_id, row.started_at, row.finished_at ?? null, row.status, row.error ?? null, row.duration_ms ?? null, row.prev_hash, row.record_hash);
191
+ }
192
+ getCronRuns(jobId, limit) {
193
+ if (limit !== undefined) {
194
+ return this.db.prepare('SELECT * FROM cron_runs WHERE job_id = ? ORDER BY started_at DESC LIMIT ?').all(jobId, limit);
195
+ }
196
+ return this.db.prepare('SELECT * FROM cron_runs WHERE job_id = ? ORDER BY started_at DESC').all(jobId);
197
+ }
198
+ // ── Hash Chain Verification ──
199
+ verifyAssessmentChain(agentId) {
200
+ const records = this.db.prepare('SELECT prev_hash, record_hash FROM assessment_records WHERE agent_id = ? ORDER BY id ASC').all(agentId);
201
+ if (records.length === 0)
202
+ return { valid: true, total: 0 };
203
+ let expectedPrev = records[0].prev_hash;
204
+ for (let i = 0; i < records.length; i++) {
205
+ if (i > 0 && records[i].prev_hash !== records[i - 1].record_hash) {
206
+ return { valid: false, brokenAt: i, total: records.length };
207
+ }
208
+ expectedPrev = records[i].record_hash;
209
+ }
210
+ return { valid: true, total: records.length };
211
+ }
212
+ // ── Utility ──
213
+ close() {
214
+ this.db.close();
215
+ }
216
+ /** Transaction wrapper */
217
+ transaction(fn) {
218
+ return this.db.transaction(fn)();
219
+ }
220
+ /** Raw database access for advanced queries */
221
+ get raw() {
222
+ return this.db;
223
+ }
224
+ }
225
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../src/store/sqlite-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Noah — SQLite Store Type Definitions
3
+ *
4
+ * Row types matching the SQLite schema tables.
5
+ * BB Spec v1.1 §4.2 + Amendments 1, 3.
6
+ */
7
+ export interface CorridorThresholds {
8
+ green_min: number;
9
+ yellow_min: number;
10
+ red_below: number;
11
+ }
12
+ export interface TdiThresholds {
13
+ warning: number;
14
+ critical: number;
15
+ }
16
+ export interface LifecycleStateRow {
17
+ agent_id: string;
18
+ phase: string;
19
+ operational_age_days: number;
20
+ total_cycles: number;
21
+ yellow_count: number;
22
+ last_assessment: string | null;
23
+ last_veto: string | null;
24
+ last_red_alert: string | null;
25
+ updated_at: string;
26
+ }
27
+ export interface AssessmentRecordRow {
28
+ id: number;
29
+ run_id: string;
30
+ agent_id: string;
31
+ timestamp: string;
32
+ fleet_day: number;
33
+ lifecycle_phase: string;
34
+ score_lying: number;
35
+ score_cheating: number;
36
+ score_stealing: number;
37
+ score_harm: number;
38
+ overall_score: number;
39
+ classification: string;
40
+ passed: number;
41
+ corridor_status: string;
42
+ tdi: number;
43
+ prev_hash: string;
44
+ record_hash: string;
45
+ created_at: string;
46
+ }
47
+ export interface FleetTemporalStateRow {
48
+ id: number;
49
+ fleet_birthday: string;
50
+ fleet_day: number;
51
+ lifecycle_phase: string;
52
+ phase_started: string;
53
+ fleet_tdi: number;
54
+ fleet_corridor: string;
55
+ drift_direction: string;
56
+ inertial_state: string;
57
+ updated_at: string;
58
+ }
59
+ export interface DeviationSnapshotRow {
60
+ id: number;
61
+ agent_id: string;
62
+ timestamp: string;
63
+ fleet_day: number;
64
+ expected_scores: string;
65
+ observed_scores: string;
66
+ corridor_status: string;
67
+ tdi: number;
68
+ velocity: string;
69
+ acceleration: string;
70
+ created_at: string;
71
+ }
72
+ export interface CronJobRow {
73
+ id: string;
74
+ agent_id: string;
75
+ name: string;
76
+ enabled: number | boolean;
77
+ constitutional: number | boolean;
78
+ schedule_kind: string;
79
+ schedule_expr: string;
80
+ schedule_tz: string;
81
+ payload_kind: string;
82
+ payload_action: string;
83
+ payload_data: string | null;
84
+ last_run: string | null;
85
+ next_run: string | null;
86
+ run_count: number;
87
+ last_status: string | null;
88
+ last_error: string | null;
89
+ created_at?: string;
90
+ updated_at?: string;
91
+ }
92
+ export interface CronRunRow {
93
+ id: number;
94
+ job_id: string;
95
+ started_at: string;
96
+ finished_at: string | null;
97
+ status: string;
98
+ error: string | null;
99
+ duration_ms: number | null;
100
+ prev_hash: string;
101
+ record_hash: string;
102
+ }
103
+ export interface SqliteStoreConfig {
104
+ dataDir: string;
105
+ dbFilename?: string;
106
+ }
107
+ //# sourceMappingURL=sqlite-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-types.d.ts","sourceRoot":"","sources":["../../src/store/sqlite-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Noah — SQLite Store Type Definitions
3
+ *
4
+ * Row types matching the SQLite schema tables.
5
+ * BB Spec v1.1 §4.2 + Amendments 1, 3.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=sqlite-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-types.js","sourceRoot":"","sources":["../../src/store/sqlite-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Noah — Cron Tool Handler
3
+ *
4
+ * BB Spec §6: Tool interface for fleet cron operations.
5
+ * Agents and operators can query schedule, view history,
6
+ * and manage non-constitutional jobs through this tool.
7
+ */
8
+ import type { CronManager } from '../cron/cron-manager.js';
9
+ export interface NoahCronParams {
10
+ action: 'list' | 'status' | 'history' | 'trigger' | 'enable' | 'disable';
11
+ jobId?: string;
12
+ limit?: number;
13
+ }
14
+ export interface CronToolResponse {
15
+ action: string;
16
+ success: boolean;
17
+ data: unknown;
18
+ error?: string;
19
+ }
20
+ export declare function handleNoahCron(manager: CronManager, params: NoahCronParams): CronToolResponse;
21
+ //# sourceMappingURL=noah-cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noah-cron.d.ts","sourceRoot":"","sources":["../../src/tools/noah-cron.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,cAAc,GACrB,gBAAgB,CA+GlB"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Noah — Cron Tool Handler
3
+ *
4
+ * BB Spec §6: Tool interface for fleet cron operations.
5
+ * Agents and operators can query schedule, view history,
6
+ * and manage non-constitutional jobs through this tool.
7
+ */
8
+ export function handleNoahCron(manager, params) {
9
+ switch (params.action) {
10
+ case 'list': {
11
+ const jobs = manager.getAllJobs();
12
+ return {
13
+ action: 'list',
14
+ success: true,
15
+ data: {
16
+ totalJobs: jobs.length,
17
+ jobs: jobs.map(j => ({
18
+ id: j.id,
19
+ name: j.name,
20
+ agentId: j.agent_id,
21
+ enabled: j.enabled === 1 || j.enabled === true,
22
+ constitutional: j.constitutional === 1 || j.constitutional === true,
23
+ schedule: `${j.schedule_expr} (${j.schedule_tz})`,
24
+ lastRun: j.last_run,
25
+ nextRun: j.next_run,
26
+ runCount: j.run_count,
27
+ lastStatus: j.last_status,
28
+ })),
29
+ },
30
+ };
31
+ }
32
+ case 'status': {
33
+ if (!params.jobId) {
34
+ return { action: 'status', success: false, data: null, error: 'jobId is required for status' };
35
+ }
36
+ const job = manager.getJob(params.jobId);
37
+ if (!job) {
38
+ return { action: 'status', success: false, data: null, error: `Job ${params.jobId} not found` };
39
+ }
40
+ return {
41
+ action: 'status',
42
+ success: true,
43
+ data: {
44
+ id: job.id,
45
+ name: job.name,
46
+ agentId: job.agent_id,
47
+ enabled: job.enabled === 1 || job.enabled === true,
48
+ constitutional: job.constitutional === 1 || job.constitutional === true,
49
+ schedule: {
50
+ kind: job.schedule_kind,
51
+ expression: job.schedule_expr,
52
+ timezone: job.schedule_tz,
53
+ },
54
+ payload: {
55
+ kind: job.payload_kind,
56
+ action: job.payload_action,
57
+ },
58
+ lastRun: job.last_run,
59
+ nextRun: job.next_run,
60
+ runCount: job.run_count,
61
+ lastStatus: job.last_status,
62
+ lastError: job.last_error,
63
+ },
64
+ };
65
+ }
66
+ case 'history': {
67
+ if (!params.jobId) {
68
+ return { action: 'history', success: false, data: null, error: 'jobId is required for history' };
69
+ }
70
+ const history = manager.getJobHistory(params.jobId, params.limit ?? 10);
71
+ return {
72
+ action: 'history',
73
+ success: true,
74
+ data: {
75
+ jobId: params.jobId,
76
+ runs: history.map(r => ({
77
+ startedAt: r.started_at,
78
+ finishedAt: r.finished_at,
79
+ status: r.status,
80
+ durationMs: r.duration_ms,
81
+ error: r.error,
82
+ hashValid: r.record_hash.length === 64,
83
+ })),
84
+ },
85
+ };
86
+ }
87
+ case 'trigger': {
88
+ if (!params.jobId) {
89
+ return { action: 'trigger', success: false, data: null, error: 'jobId is required for trigger' };
90
+ }
91
+ return {
92
+ action: 'trigger',
93
+ success: true,
94
+ data: { jobId: params.jobId, message: 'Job queued for immediate execution' },
95
+ };
96
+ }
97
+ case 'enable':
98
+ case 'disable': {
99
+ if (!params.jobId) {
100
+ return { action: params.action, success: false, data: null, error: 'jobId is required' };
101
+ }
102
+ const enabled = params.action === 'enable';
103
+ const result = manager.setJobEnabled(params.jobId, enabled);
104
+ return {
105
+ action: params.action,
106
+ success: result.success,
107
+ data: { jobId: params.jobId, enabled },
108
+ error: result.reason,
109
+ };
110
+ }
111
+ default:
112
+ return { action: 'unknown', success: false, data: null, error: `Unknown action: ${params.action}` };
113
+ }
114
+ }
115
+ //# sourceMappingURL=noah-cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noah-cron.js","sourceRoot":"","sources":["../../src/tools/noah-cron.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Noah — noah_time Tool
3
+ *
4
+ * BB Spec §5: Every agent can call noah_time to get temporal context
5
+ * before making decisions. This is Noah's primary fleet-facing interface.
6
+ */
7
+ import type { SqliteTemporalStore } from '../store/sqlite-store.js';
8
+ export interface NoahTimeParams {
9
+ action: 'context' | 'assessment_window' | 'fleet_schedule';
10
+ agentId?: string;
11
+ }
12
+ export interface NoahTimeResponse {
13
+ timestamp: string;
14
+ fleetAge: {
15
+ days: number;
16
+ phase: string;
17
+ phaseDay: number;
18
+ };
19
+ assessmentCadence: {
20
+ lastAssessment: string | null;
21
+ nextScheduled: string | null;
22
+ hoursSinceLastAssessment: number;
23
+ isOverdue: boolean;
24
+ };
25
+ corridorStatus: {
26
+ currentCorridor: 'GREEN' | 'YELLOW' | 'RED';
27
+ tdi: number;
28
+ driftDirection: 'improving' | 'stable' | 'degrading';
29
+ };
30
+ cron: {
31
+ nextFiveJobs: CronJobSummary[];
32
+ activeJobCount: number;
33
+ };
34
+ }
35
+ export interface CronJobSummary {
36
+ id: string;
37
+ name: string;
38
+ agentId: string;
39
+ nextRun: string | null;
40
+ constitutional: boolean;
41
+ }
42
+ export declare function handleNoahTime(store: SqliteTemporalStore, params: NoahTimeParams): NoahTimeResponse;
43
+ //# sourceMappingURL=noah-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noah-time.d.ts","sourceRoot":"","sources":["../../src/tools/noah-time.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,iBAAiB,EAAE;QACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,wBAAwB,EAAE,MAAM,CAAC;QACjC,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,cAAc,EAAE;QACd,eAAe,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC5C,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;KACtD,CAAC;IACF,IAAI,EAAE;QACJ,YAAY,EAAE,cAAc,EAAE,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB;AAID,wBAAgB,cAAc,CAC5B,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,cAAc,GACrB,gBAAgB,CA4DlB"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Noah — noah_time Tool
3
+ *
4
+ * BB Spec §5: Every agent can call noah_time to get temporal context
5
+ * before making decisions. This is Noah's primary fleet-facing interface.
6
+ */
7
+ // ── Tool Handler ──
8
+ export function handleNoahTime(store, params) {
9
+ const now = new Date().toISOString();
10
+ const fleetState = store.getFleetState();
11
+ const cronJobs = store.getEnabledCronJobs();
12
+ const fleetBirthday = fleetState?.fleet_birthday ?? now;
13
+ const fleetDays = fleetState?.fleet_day ?? 1;
14
+ const phaseStarted = fleetState?.phase_started ?? now;
15
+ const daysSincePhaseStart = Math.floor((Date.now() - new Date(phaseStarted).getTime()) / 86_400_000);
16
+ let lastAssessment = null;
17
+ let hoursSinceLastAssessment = 0;
18
+ if (params.agentId) {
19
+ const lifecycleState = store.getLifecycleState(params.agentId);
20
+ lastAssessment = lifecycleState?.last_assessment ?? null;
21
+ }
22
+ if (lastAssessment) {
23
+ hoursSinceLastAssessment =
24
+ (Date.now() - new Date(lastAssessment).getTime()) / 3_600_000;
25
+ }
26
+ const nextFiveJobs = cronJobs
27
+ .filter(j => j.next_run !== null)
28
+ .sort((a, b) => (a.next_run ?? '').localeCompare(b.next_run ?? ''))
29
+ .slice(0, 5)
30
+ .map(j => ({
31
+ id: j.id,
32
+ name: j.name,
33
+ agentId: j.agent_id,
34
+ nextRun: j.next_run,
35
+ constitutional: j.constitutional === 1 || j.constitutional === true,
36
+ }));
37
+ return {
38
+ timestamp: now,
39
+ fleetAge: {
40
+ days: fleetDays,
41
+ phase: fleetState?.lifecycle_phase ?? 'INITIALIZATION',
42
+ phaseDay: daysSincePhaseStart,
43
+ },
44
+ assessmentCadence: {
45
+ lastAssessment,
46
+ nextScheduled: nextFiveJobs.find(j => j.agentId === 'grillo')?.nextRun ?? null,
47
+ hoursSinceLastAssessment: Math.round(hoursSinceLastAssessment * 100) / 100,
48
+ isOverdue: hoursSinceLastAssessment > 26,
49
+ },
50
+ corridorStatus: {
51
+ currentCorridor: (fleetState?.fleet_corridor ?? 'GREEN'),
52
+ tdi: fleetState?.fleet_tdi ?? 0,
53
+ driftDirection: (fleetState?.drift_direction ?? 'stable'),
54
+ },
55
+ cron: {
56
+ nextFiveJobs,
57
+ activeJobCount: cronJobs.length,
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=noah-time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noah-time.js","sourceRoot":"","sources":["../../src/tools/noah-time.ts"],"names":[],"mappings":"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"}