@decibelsystems/tools 2.1.2 → 2.1.3
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/agentCommands.d.ts +11 -0
- package/dist/agentCommands.d.ts.map +1 -0
- package/dist/agentCommands.js +267 -0
- package/dist/agentCommands.js.map +1 -0
- package/dist/agentInbox.d.ts +37 -0
- package/dist/agentInbox.d.ts.map +1 -0
- package/dist/agentInbox.js +128 -0
- package/dist/agentInbox.js.map +1 -0
- package/dist/agentPresence.d.ts +36 -0
- package/dist/agentPresence.d.ts.map +1 -0
- package/dist/agentPresence.js +227 -0
- package/dist/agentPresence.js.map +1 -0
- package/dist/agenticJobs.d.ts +49 -0
- package/dist/agenticJobs.d.ts.map +1 -0
- package/dist/agenticJobs.js +190 -0
- package/dist/agenticJobs.js.map +1 -0
- package/dist/architectAdrs.d.ts +7 -0
- package/dist/architectAdrs.d.ts.map +1 -1
- package/dist/architectAdrs.js +91 -28
- package/dist/architectAdrs.js.map +1 -1
- package/dist/daemon.d.ts +6 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +14 -0
- package/dist/daemon.js.map +1 -1
- package/dist/facades/definitions.d.ts.map +1 -1
- package/dist/facades/definitions.js +40 -6
- package/dist/facades/definitions.js.map +1 -1
- package/dist/hq/defineAgent.d.ts +11 -0
- package/dist/hq/defineAgent.d.ts.map +1 -0
- package/dist/hq/defineAgent.js +185 -0
- package/dist/hq/defineAgent.js.map +1 -0
- package/dist/hq/index.d.ts +3 -0
- package/dist/hq/index.d.ts.map +1 -0
- package/dist/hq/index.js +28 -0
- package/dist/hq/index.js.map +1 -0
- package/dist/hq/types.d.ts +59 -0
- package/dist/hq/types.d.ts.map +1 -0
- package/dist/hq/types.js +12 -0
- package/dist/hq/types.js.map +1 -0
- package/dist/httpServer.d.ts +1 -1
- package/dist/httpServer.d.ts.map +1 -1
- package/dist/httpServer.js +327 -19
- package/dist/httpServer.js.map +1 -1
- package/dist/kernel.d.ts +3 -1
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +40 -9
- package/dist/kernel.js.map +1 -1
- package/dist/projectRegistry.d.ts +27 -0
- package/dist/projectRegistry.d.ts.map +1 -1
- package/dist/projectRegistry.js +191 -5
- package/dist/projectRegistry.js.map +1 -1
- package/dist/sentinelIssues.d.ts +5 -0
- package/dist/sentinelIssues.d.ts.map +1 -1
- package/dist/sentinelIssues.js +1 -1
- package/dist/sentinelIssues.js.map +1 -1
- package/dist/server.js +12 -0
- package/dist/server.js.map +1 -1
- package/dist/store/fsStore.d.ts +6 -0
- package/dist/store/fsStore.d.ts.map +1 -0
- package/dist/store/fsStore.js +77 -0
- package/dist/store/fsStore.js.map +1 -0
- package/dist/store/index.d.ts +8 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +23 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/markdown.d.ts +21 -0
- package/dist/store/markdown.d.ts.map +1 -0
- package/dist/store/markdown.js +175 -0
- package/dist/store/markdown.js.map +1 -0
- package/dist/store/supabaseStore.d.ts +6 -0
- package/dist/store/supabaseStore.d.ts.map +1 -0
- package/dist/store/supabaseStore.js +152 -0
- package/dist/store/supabaseStore.js.map +1 -0
- package/dist/store/types.d.ts +49 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +11 -0
- package/dist/store/types.js.map +1 -0
- package/dist/supabaseRetry.d.ts +21 -0
- package/dist/supabaseRetry.d.ts.map +1 -0
- package/dist/supabaseRetry.js +72 -0
- package/dist/supabaseRetry.js.map +1 -0
- package/dist/toolConfig.d.ts +49 -0
- package/dist/toolConfig.d.ts.map +1 -0
- package/dist/toolConfig.js +309 -0
- package/dist/toolConfig.js.map +1 -0
- package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
- package/dist/tools/agentic/agentQueue.js +7 -5
- package/dist/tools/agentic/agentQueue.js.map +1 -1
- package/dist/tools/agentic/index.d.ts +3 -0
- package/dist/tools/agentic/index.d.ts.map +1 -1
- package/dist/tools/agentic/index.js +158 -1
- package/dist/tools/agentic/index.js.map +1 -1
- package/dist/tools/codereview/index.d.ts +4 -0
- package/dist/tools/codereview/index.d.ts.map +1 -0
- package/dist/tools/codereview/index.js +93 -0
- package/dist/tools/codereview/index.js.map +1 -0
- package/dist/tools/codereview.d.ts +56 -0
- package/dist/tools/codereview.d.ts.map +1 -0
- package/dist/tools/codereview.js +304 -0
- package/dist/tools/codereview.js.map +1 -0
- package/dist/tools/concepts.d.ts +38 -0
- package/dist/tools/concepts.d.ts.map +1 -0
- package/dist/tools/concepts.js +283 -0
- package/dist/tools/concepts.js.map +1 -0
- package/dist/tools/corpus/index.d.ts +3 -0
- package/dist/tools/corpus/index.d.ts.map +1 -1
- package/dist/tools/corpus/index.js +183 -1
- package/dist/tools/corpus/index.js.map +1 -1
- package/dist/tools/corpus.d.ts +52 -0
- package/dist/tools/corpus.d.ts.map +1 -1
- package/dist/tools/corpus.js +207 -2
- package/dist/tools/corpus.js.map +1 -1
- package/dist/tools/dojo.d.ts.map +1 -1
- package/dist/tools/dojo.js +11 -1
- package/dist/tools/dojo.js.map +1 -1
- package/dist/tools/git-sentinel.d.ts.map +1 -1
- package/dist/tools/git-sentinel.js +24 -8
- package/dist/tools/git-sentinel.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/oracle.d.ts +2 -0
- package/dist/tools/oracle.d.ts.map +1 -1
- package/dist/tools/oracle.js +146 -17
- package/dist/tools/oracle.js.map +1 -1
- package/dist/tools/peers.d.ts +15 -0
- package/dist/tools/peers.d.ts.map +1 -0
- package/dist/tools/peers.js +70 -0
- package/dist/tools/peers.js.map +1 -0
- package/dist/tools/registry/index.d.ts +4 -0
- package/dist/tools/registry/index.d.ts.map +1 -1
- package/dist/tools/registry/index.js +274 -1
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/roadmap.d.ts +4 -0
- package/dist/tools/roadmap.d.ts.map +1 -1
- package/dist/tools/roadmap.js.map +1 -1
- package/dist/tools/sentinel.d.ts +15 -1
- package/dist/tools/sentinel.d.ts.map +1 -1
- package/dist/tools/sentinel.js +198 -34
- package/dist/tools/sentinel.js.map +1 -1
- package/dist/tools/voice/index.d.ts.map +1 -1
- package/dist/tools/voice/index.js +2 -3
- package/dist/tools/voice/index.js.map +1 -1
- package/dist/tools/voice.d.ts +1 -1
- package/dist/tools/voice.js +2 -2
- package/dist/tools/voice.js.map +1 -1
- package/dist/tools/workflow.js +5 -5
- package/dist/tools/workflow.js.map +1 -1
- package/dist/transports/http.js +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Agent-presence writer — heartbeats live claude-peers sessions into Core
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Daemon-side telemetry writer for the Plan D agent-presence domain. On a 30s
|
|
5
|
+
// loop it:
|
|
6
|
+
// 1. reads live peers from the claude-peers broker (POST /list-peers),
|
|
7
|
+
// 2. upserts each into hq.agent_sessions via SERVICE_ROLE (deliberate scoped
|
|
8
|
+
// exception — presence is telemetry, peers carry no user JWT, v1 single-org),
|
|
9
|
+
// 3. stale-sweeps active rows that stopped heartbeating → idle (>90s) / ended (>5min).
|
|
10
|
+
// Never throws into the daemon; no-ops if Supabase isn't configured or the broker
|
|
11
|
+
// is down. Contract co-designed with decibel-hq (migration 20260524000005). EPIC-0033.
|
|
12
|
+
// ============================================================================
|
|
13
|
+
import os from 'os';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { createClient } from '@supabase/supabase-js';
|
|
16
|
+
import { log } from './config.js';
|
|
17
|
+
import { withRetryResult } from './supabaseRetry.js';
|
|
18
|
+
const BROKER_URL = `http://127.0.0.1:${process.env.CLAUDE_PEERS_PORT ?? '7899'}`;
|
|
19
|
+
const ORG_ID = process.env.DECIBEL_ORG_ID || '1cb79e24-e06f-46c9-8a22-5ee025ffb0f4';
|
|
20
|
+
/**
|
|
21
|
+
* The daemon's host identity for presence + command targeting. Defaults to
|
|
22
|
+
* os.hostname() but is overridable via DECIBEL_PRESENCE_HOST — needed where the
|
|
23
|
+
* OS hostname isn't a stable/unique daemon identity (containers with shared
|
|
24
|
+
* hostnames, or two daemons on one machine, e.g. a rolling restart or a test
|
|
25
|
+
* harness). target_host on hq.agent_commands matches this, so it must be the same
|
|
26
|
+
* value the presence writer stamps. Shared by the dispatcher (agentCommands.ts).
|
|
27
|
+
*/
|
|
28
|
+
export function resolveHost() {
|
|
29
|
+
return process.env.DECIBEL_PRESENCE_HOST || os.hostname();
|
|
30
|
+
}
|
|
31
|
+
const HEARTBEAT_MS = 30_000;
|
|
32
|
+
const IDLE_AFTER_MS = 90_000;
|
|
33
|
+
const ENDED_AFTER_MS = 5 * 60_000;
|
|
34
|
+
function serviceClient() {
|
|
35
|
+
const url = process.env.SUPABASE_URL;
|
|
36
|
+
const key = process.env.SUPABASE_SERVICE_KEY;
|
|
37
|
+
if (!url || !key)
|
|
38
|
+
return null;
|
|
39
|
+
return createClient(url, key, {
|
|
40
|
+
auth: { persistSession: false, autoRefreshToken: false },
|
|
41
|
+
db: { schema: 'hq' },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function fetchPeers() {
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetch(`${BROKER_URL}/list-peers`, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: { 'Content-Type': 'application/json' },
|
|
49
|
+
body: JSON.stringify({ requester_id: 'decibel-presence', scope: 'machine' }),
|
|
50
|
+
signal: AbortSignal.timeout(2000),
|
|
51
|
+
});
|
|
52
|
+
if (!res.ok)
|
|
53
|
+
return [];
|
|
54
|
+
return (await res.json());
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// project label (repo dir basename) → hq.projects.id within the org. Cached;
|
|
61
|
+
// refreshed on a miss so newly-onboarded projects resolve.
|
|
62
|
+
let projectMap = null;
|
|
63
|
+
async function loadProjects(client) {
|
|
64
|
+
const { data, error } = await client.from('projects').select('id,key').eq('org_id', ORG_ID);
|
|
65
|
+
const m = new Map();
|
|
66
|
+
if (!error && data)
|
|
67
|
+
for (const r of data)
|
|
68
|
+
m.set(r.key, r.id);
|
|
69
|
+
return m;
|
|
70
|
+
}
|
|
71
|
+
async function resolveProjectId(client, cwd) {
|
|
72
|
+
const key = path.basename(cwd || '');
|
|
73
|
+
if (!key)
|
|
74
|
+
return null;
|
|
75
|
+
if (!projectMap)
|
|
76
|
+
projectMap = await loadProjects(client);
|
|
77
|
+
if (!projectMap.has(key))
|
|
78
|
+
projectMap = await loadProjects(client); // refresh once on miss
|
|
79
|
+
return projectMap.get(key) ?? null;
|
|
80
|
+
}
|
|
81
|
+
async function tick(client) {
|
|
82
|
+
const host = resolveHost();
|
|
83
|
+
const nowMs = Date.now();
|
|
84
|
+
const nowIso = new Date(nowMs).toISOString();
|
|
85
|
+
const peers = await fetchPeers();
|
|
86
|
+
for (const p of peers) {
|
|
87
|
+
if (!p.id)
|
|
88
|
+
continue;
|
|
89
|
+
const project_id = await resolveProjectId(client, p.cwd);
|
|
90
|
+
const row = {
|
|
91
|
+
org_id: ORG_ID,
|
|
92
|
+
host,
|
|
93
|
+
session_key: p.id,
|
|
94
|
+
agent: null,
|
|
95
|
+
// These are Claude Code sessions read from the claude-peers broker; tag the
|
|
96
|
+
// runtime so HQ's /agents board renders the runtime badge + filter (P1/P5).
|
|
97
|
+
runtime: 'claude-code',
|
|
98
|
+
summary: p.summary || null,
|
|
99
|
+
cwd: p.cwd || null,
|
|
100
|
+
project_id,
|
|
101
|
+
status: 'active',
|
|
102
|
+
started_at: p.registered_at || nowIso,
|
|
103
|
+
last_seen_at: nowIso,
|
|
104
|
+
ended_at: null,
|
|
105
|
+
// last_action_at = the broker's per-peer last_seen → HQ's ActivityLine renders
|
|
106
|
+
// a tool-call pulse from it. Richer self-report fields (tokens, current_file)
|
|
107
|
+
// are a follow-on (agent-side self-report; not daemon-observable).
|
|
108
|
+
meta: { last_action_at: p.last_seen || nowIso },
|
|
109
|
+
};
|
|
110
|
+
const { error } = await withRetryResult(() => client.from('agent_sessions').upsert(row, { onConflict: 'org_id,host,session_key' }), `presence.upsert ${p.id}`);
|
|
111
|
+
if (error)
|
|
112
|
+
log(`Presence: upsert ${p.id} failed: ${error.message}`);
|
|
113
|
+
}
|
|
114
|
+
// Stale-sweep: sessions that stopped heartbeating (broker dropped them, or daemon
|
|
115
|
+
// missed beats). idle first, then ended (ended uses status<>'ended' so it also
|
|
116
|
+
// catches idle rows past the longer cutoff).
|
|
117
|
+
const idleCut = new Date(nowMs - IDLE_AFTER_MS).toISOString();
|
|
118
|
+
const endedCut = new Date(nowMs - ENDED_AFTER_MS).toISOString();
|
|
119
|
+
await client.from('agent_sessions').update({ status: 'idle' })
|
|
120
|
+
.eq('org_id', ORG_ID).eq('status', 'active').lt('last_seen_at', idleCut);
|
|
121
|
+
await client.from('agent_sessions').update({ status: 'ended', ended_at: nowIso })
|
|
122
|
+
.eq('org_id', ORG_ID).neq('status', 'ended').lt('last_seen_at', endedCut);
|
|
123
|
+
}
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// Write-time presence-field belt (NON-encoding) — co-designed with decibel-hq.
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// HQ's /agents board already escapes these at render (React JSX text children),
|
|
128
|
+
// so the daemon MUST NOT HTML-encode here — that would double-escape and corrupt
|
|
129
|
+
// legitimate data (a real summary like "fix <Button> when a < b"). The correct
|
|
130
|
+
// write-time defense-in-depth is non-encoding: cap length + strip control chars /
|
|
131
|
+
// null bytes (preserving \t\n\r) so the stored value stays faithful but bounded.
|
|
132
|
+
// Also closes the review's "no validation on meta/result blobs" finding.
|
|
133
|
+
const FIELD_CAPS = { agent: 200, summary: 500, cwd: 1024 };
|
|
134
|
+
const META_VALUE_CAP = 1000;
|
|
135
|
+
const META_MAX_BYTES = 4096;
|
|
136
|
+
// C0 controls (U+0000..U+001F) + DEL (U+007F), EXCEPT tab/newline/carriage-return.
|
|
137
|
+
// eslint-disable-next-line no-control-regex
|
|
138
|
+
const CONTROL_CHARS = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g;
|
|
139
|
+
/** Strip control chars/null bytes and cap length. Empty-after-clean → null. */
|
|
140
|
+
export function sanitizeText(s, maxLen) {
|
|
141
|
+
if (s == null)
|
|
142
|
+
return null;
|
|
143
|
+
const cleaned = String(s).replace(CONTROL_CHARS, '').slice(0, maxLen);
|
|
144
|
+
return cleaned.length ? cleaned : null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Flatten meta to display-safe primitives: strings cleaned + capped, numbers/
|
|
148
|
+
* booleans/null kept, nested objects/arrays dropped (HQ typeof-guards numeric
|
|
149
|
+
* meta and renders strings as text). If the result still exceeds META_MAX_BYTES,
|
|
150
|
+
* drop it entirely — the caller re-adds the trusted last_action_at.
|
|
151
|
+
*/
|
|
152
|
+
export function sanitizeMeta(meta) {
|
|
153
|
+
if (!meta || typeof meta !== 'object')
|
|
154
|
+
return {};
|
|
155
|
+
const out = {};
|
|
156
|
+
for (const [k, v] of Object.entries(meta)) {
|
|
157
|
+
if (typeof v === 'string')
|
|
158
|
+
out[k] = v.replace(CONTROL_CHARS, '').slice(0, META_VALUE_CAP);
|
|
159
|
+
else if (typeof v === 'number' || typeof v === 'boolean' || v === null)
|
|
160
|
+
out[k] = v;
|
|
161
|
+
// nested objects/arrays intentionally dropped
|
|
162
|
+
}
|
|
163
|
+
if (Buffer.byteLength(JSON.stringify(out)) > META_MAX_BYTES)
|
|
164
|
+
return {};
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Upsert a local-runtime session into hq.agent_sessions (register or heartbeat).
|
|
169
|
+
* Returns true on success, false if Supabase is unconfigured or the write failed.
|
|
170
|
+
* Reuses the presence writer's org config + cwd→project resolution.
|
|
171
|
+
*/
|
|
172
|
+
export async function writeLocalAgentSession(reg) {
|
|
173
|
+
const client = serviceClient();
|
|
174
|
+
if (!client)
|
|
175
|
+
return false;
|
|
176
|
+
if (!reg.session_key || !reg.runtime)
|
|
177
|
+
return false;
|
|
178
|
+
const host = resolveHost();
|
|
179
|
+
const nowIso = new Date().toISOString();
|
|
180
|
+
const project_id = await resolveProjectId(client, reg.cwd || '');
|
|
181
|
+
const ended = reg.status === 'ended';
|
|
182
|
+
const row = {
|
|
183
|
+
org_id: ORG_ID,
|
|
184
|
+
host,
|
|
185
|
+
session_key: reg.session_key,
|
|
186
|
+
runtime: reg.runtime,
|
|
187
|
+
// Non-encoding belt on caller-supplied display fields (store-raw / escape-at-
|
|
188
|
+
// render is HQ's job; we only cap length + strip control chars/null bytes).
|
|
189
|
+
agent: sanitizeText(reg.agent, FIELD_CAPS.agent),
|
|
190
|
+
summary: sanitizeText(reg.summary, FIELD_CAPS.summary),
|
|
191
|
+
cwd: sanitizeText(reg.cwd, FIELD_CAPS.cwd),
|
|
192
|
+
project_id,
|
|
193
|
+
status: ended ? 'ended' : 'active',
|
|
194
|
+
started_at: nowIso,
|
|
195
|
+
last_seen_at: nowIso,
|
|
196
|
+
ended_at: ended ? nowIso : null,
|
|
197
|
+
// Default last_action_at to now; a self-reporting SDK may override it via meta
|
|
198
|
+
// (intended richer signal — HQ reads last_seen_at, not this, for liveness).
|
|
199
|
+
meta: { last_action_at: nowIso, ...sanitizeMeta(reg.meta) },
|
|
200
|
+
};
|
|
201
|
+
// started_at only matters on first insert; onConflict updates the rest. We let it
|
|
202
|
+
// re-send started_at — harmless on heartbeat since HQ reads last_seen_at for liveness.
|
|
203
|
+
const { error } = await withRetryResult(() => client.from('agent_sessions').upsert(row, { onConflict: 'org_id,host,session_key' }), `presence.local-register ${reg.session_key}`);
|
|
204
|
+
if (error) {
|
|
205
|
+
log(`Presence: local register ${reg.session_key} (${reg.runtime}) failed: ${error.message}`);
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
/** Start the presence writer loop. Returns a stop function. No-ops if Supabase unconfigured. */
|
|
211
|
+
export function startPresenceWriter() {
|
|
212
|
+
const client = serviceClient();
|
|
213
|
+
if (!client) {
|
|
214
|
+
log('Presence: SUPABASE_URL/SERVICE_KEY not set — agent-presence writer disabled.');
|
|
215
|
+
return () => { };
|
|
216
|
+
}
|
|
217
|
+
log(`Presence: writer started (30s heartbeat → hq.agent_sessions, org ${ORG_ID}).`);
|
|
218
|
+
const run = () => {
|
|
219
|
+
tick(client).catch((e) => log(`Presence: tick error: ${e instanceof Error ? e.message : String(e)}`));
|
|
220
|
+
};
|
|
221
|
+
run();
|
|
222
|
+
const iv = setInterval(run, HEARTBEAT_MS);
|
|
223
|
+
if (typeof iv.unref === 'function')
|
|
224
|
+
iv.unref();
|
|
225
|
+
return () => clearInterval(iv);
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=agentPresence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentPresence.js","sourceRoot":"","sources":["../src/agentPresence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type JobStatus = 'queued' | 'claimed' | 'running' | 'done' | 'cancelled' | 'failed';
|
|
2
|
+
export interface AgenticJob {
|
|
3
|
+
id: string;
|
|
4
|
+
project_id: string;
|
|
5
|
+
prompt: string;
|
|
6
|
+
status: JobStatus;
|
|
7
|
+
claimed_by?: string;
|
|
8
|
+
claimed_at?: string;
|
|
9
|
+
completed_at?: string;
|
|
10
|
+
result?: {
|
|
11
|
+
output?: string;
|
|
12
|
+
files_changed?: string[];
|
|
13
|
+
};
|
|
14
|
+
created_at: string;
|
|
15
|
+
created_by?: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface EnqueueJobInput {
|
|
19
|
+
projectId: string;
|
|
20
|
+
prompt: string;
|
|
21
|
+
createdBy?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface EnqueueJobOutput {
|
|
24
|
+
jobId: string;
|
|
25
|
+
queuePosition: number;
|
|
26
|
+
filePath: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CancelJobInput {
|
|
29
|
+
projectId: string;
|
|
30
|
+
jobId: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* List all jobs for a project. Returns oldest-first (creation order). Reads
|
|
34
|
+
* from both .decibel/ and decibel/ paths, deduplicating by id.
|
|
35
|
+
*/
|
|
36
|
+
export declare function listJobs(projectId: string): Promise<AgenticJob[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Enqueue a new dispatch job. Allocates the next JOB-NNNN id, writes the
|
|
39
|
+
* YAML file, and returns the id + queue position (number of active jobs
|
|
40
|
+
* ahead of this one, inclusive).
|
|
41
|
+
*/
|
|
42
|
+
export declare function enqueueJob(input: EnqueueJobInput): Promise<EnqueueJobOutput>;
|
|
43
|
+
/**
|
|
44
|
+
* Cancel a queued / claimed job. No-op if the job is already terminal
|
|
45
|
+
* (done / cancelled / failed). Marks status: cancelled and stamps
|
|
46
|
+
* completed_at.
|
|
47
|
+
*/
|
|
48
|
+
export declare function cancelJob(input: CancelJobInput): Promise<AgenticJob>;
|
|
49
|
+
//# sourceMappingURL=agenticJobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agenticJobs.d.ts","sourceRoot":"","sources":["../src/agenticJobs.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,SAAS,GACT,MAAM,GACN,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AA2FD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAoBvE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsClF;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA6B1E"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Agentic Dispatch Jobs
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// User-queued prompts that agents (Claude Code, Codex, etc.) read from the
|
|
5
|
+
// project's `.decibel/agentic/jobs/` directory and execute. HQ writes via
|
|
6
|
+
// agentic.enqueue; agents claim and complete via their MCP tool calls.
|
|
7
|
+
//
|
|
8
|
+
// See docs-hq/AGENTIC_DISPATCH.md (in the HQ repo) for the full 3-layer
|
|
9
|
+
// contract this implements.
|
|
10
|
+
// ============================================================================
|
|
11
|
+
import fs from 'fs/promises';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { parse as parseYaml, parseAllDocuments, stringify as stringifyYaml } from 'yaml';
|
|
14
|
+
import { log } from './config.js';
|
|
15
|
+
import { getWritePath, readFilesFromBothPaths } from './decibelPaths.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Constants
|
|
18
|
+
// ============================================================================
|
|
19
|
+
const JOBS_SUBPATH = 'agentic/jobs';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Helpers
|
|
22
|
+
// ============================================================================
|
|
23
|
+
function slugify(text) {
|
|
24
|
+
return text
|
|
25
|
+
.toLowerCase()
|
|
26
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
27
|
+
.replace(/^-|-$/g, '')
|
|
28
|
+
.substring(0, 40);
|
|
29
|
+
}
|
|
30
|
+
function extractJobNumber(id) {
|
|
31
|
+
const match = id.match(/^JOB-(\d+)$/i);
|
|
32
|
+
return match ? parseInt(match[1], 10) : 0;
|
|
33
|
+
}
|
|
34
|
+
function formatJobId(num) {
|
|
35
|
+
return `JOB-${num.toString().padStart(4, '0')}`;
|
|
36
|
+
}
|
|
37
|
+
async function ensureDir(dirPath) {
|
|
38
|
+
try {
|
|
39
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Directory already exists or other error — list/write will surface real issues
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Multi-document YAML parser. Frontmatter format (--- delimited) returns
|
|
47
|
+
* the first doc; plain YAML returns directly. Mirrors sentinelIssues.ts.
|
|
48
|
+
*/
|
|
49
|
+
function safeParseYaml(content) {
|
|
50
|
+
try {
|
|
51
|
+
return parseYaml(content);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
55
|
+
if (!message.includes('multiple documents'))
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
const docs = parseAllDocuments(content);
|
|
59
|
+
if (docs.length === 0)
|
|
60
|
+
throw new Error('No YAML documents found');
|
|
61
|
+
const first = docs[0].toJSON();
|
|
62
|
+
if (typeof first !== 'object' || first === null) {
|
|
63
|
+
throw new Error('First YAML document is not an object');
|
|
64
|
+
}
|
|
65
|
+
return first;
|
|
66
|
+
}
|
|
67
|
+
function parseJobFile(content, fallbackProjectId) {
|
|
68
|
+
let parsed;
|
|
69
|
+
try {
|
|
70
|
+
parsed = safeParseYaml(content);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
log(`agenticJobs: failed to parse job YAML: ${err.message}`);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const id = parsed.id;
|
|
77
|
+
const prompt = parsed.prompt;
|
|
78
|
+
if (!id || !prompt)
|
|
79
|
+
return null;
|
|
80
|
+
return {
|
|
81
|
+
id,
|
|
82
|
+
project_id: parsed.project_id || fallbackProjectId,
|
|
83
|
+
prompt,
|
|
84
|
+
status: parsed.status || 'queued',
|
|
85
|
+
claimed_by: parsed.claimed_by,
|
|
86
|
+
claimed_at: parsed.claimed_at,
|
|
87
|
+
completed_at: parsed.completed_at,
|
|
88
|
+
result: parsed.result,
|
|
89
|
+
created_at: parsed.created_at || new Date().toISOString(),
|
|
90
|
+
created_by: parsed.created_by,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function jobToYaml(job) {
|
|
94
|
+
return stringifyYaml(job);
|
|
95
|
+
}
|
|
96
|
+
// ============================================================================
|
|
97
|
+
// Public API
|
|
98
|
+
// ============================================================================
|
|
99
|
+
/**
|
|
100
|
+
* List all jobs for a project. Returns oldest-first (creation order). Reads
|
|
101
|
+
* from both .decibel/ and decibel/ paths, deduplicating by id.
|
|
102
|
+
*/
|
|
103
|
+
export async function listJobs(projectId) {
|
|
104
|
+
const seen = new Set();
|
|
105
|
+
const jobs = [];
|
|
106
|
+
const files = await readFilesFromBothPaths(projectId, JOBS_SUBPATH);
|
|
107
|
+
for (const { filePath } of files) {
|
|
108
|
+
try {
|
|
109
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
110
|
+
const job = parseJobFile(content, projectId);
|
|
111
|
+
if (!job || seen.has(job.id))
|
|
112
|
+
continue;
|
|
113
|
+
seen.add(job.id);
|
|
114
|
+
jobs.push(job);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
log(`agenticJobs: skipping ${filePath} — ${err.message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Sort oldest-first by creation timestamp
|
|
121
|
+
jobs.sort((a, b) => a.created_at.localeCompare(b.created_at));
|
|
122
|
+
return jobs;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Enqueue a new dispatch job. Allocates the next JOB-NNNN id, writes the
|
|
126
|
+
* YAML file, and returns the id + queue position (number of active jobs
|
|
127
|
+
* ahead of this one, inclusive).
|
|
128
|
+
*/
|
|
129
|
+
export async function enqueueJob(input) {
|
|
130
|
+
const { projectId, prompt, createdBy } = input;
|
|
131
|
+
if (!prompt || !prompt.trim()) {
|
|
132
|
+
throw new Error('prompt is required');
|
|
133
|
+
}
|
|
134
|
+
const dir = await getWritePath(projectId, JOBS_SUBPATH);
|
|
135
|
+
await ensureDir(dir);
|
|
136
|
+
const existing = await listJobs(projectId);
|
|
137
|
+
const maxNum = existing.reduce((max, j) => Math.max(max, extractJobNumber(j.id)), 0);
|
|
138
|
+
const newId = formatJobId(maxNum + 1);
|
|
139
|
+
const slug = slugify(prompt);
|
|
140
|
+
const filename = slug ? `${newId}-${slug}.yml` : `${newId}.yml`;
|
|
141
|
+
const filePath = path.join(dir, filename);
|
|
142
|
+
const now = new Date().toISOString();
|
|
143
|
+
const job = {
|
|
144
|
+
id: newId,
|
|
145
|
+
project_id: projectId,
|
|
146
|
+
prompt: prompt.trim(),
|
|
147
|
+
status: 'queued',
|
|
148
|
+
created_at: now,
|
|
149
|
+
...(createdBy ? { created_by: createdBy } : {}),
|
|
150
|
+
};
|
|
151
|
+
await fs.writeFile(filePath, jobToYaml(job), 'utf-8');
|
|
152
|
+
log(`agenticJobs: enqueued ${newId} for project ${projectId}`);
|
|
153
|
+
// Queue position = count of "active" jobs (not done / cancelled / failed)
|
|
154
|
+
// including this new one. Useful for UX.
|
|
155
|
+
const activeCount = existing.filter((j) => j.status === 'queued' || j.status === 'claimed' || j.status === 'running').length + 1;
|
|
156
|
+
return { jobId: newId, queuePosition: activeCount, filePath };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Cancel a queued / claimed job. No-op if the job is already terminal
|
|
160
|
+
* (done / cancelled / failed). Marks status: cancelled and stamps
|
|
161
|
+
* completed_at.
|
|
162
|
+
*/
|
|
163
|
+
export async function cancelJob(input) {
|
|
164
|
+
const { projectId, jobId } = input;
|
|
165
|
+
if (!jobId.match(/^JOB-\d+$/)) {
|
|
166
|
+
throw new Error(`Invalid job id: ${jobId} (expected JOB-NNNN)`);
|
|
167
|
+
}
|
|
168
|
+
const files = await readFilesFromBothPaths(projectId, JOBS_SUBPATH);
|
|
169
|
+
for (const { filePath } of files) {
|
|
170
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
171
|
+
const job = parseJobFile(content, projectId);
|
|
172
|
+
if (!job || job.id !== jobId)
|
|
173
|
+
continue;
|
|
174
|
+
// Already-terminal jobs are not re-cancelled but still return the
|
|
175
|
+
// current state so callers can refresh UI.
|
|
176
|
+
if (job.status === 'done' || job.status === 'cancelled' || job.status === 'failed') {
|
|
177
|
+
return job;
|
|
178
|
+
}
|
|
179
|
+
const updated = {
|
|
180
|
+
...job,
|
|
181
|
+
status: 'cancelled',
|
|
182
|
+
completed_at: new Date().toISOString(),
|
|
183
|
+
};
|
|
184
|
+
await fs.writeFile(filePath, jobToYaml(updated), 'utf-8');
|
|
185
|
+
log(`agenticJobs: cancelled ${jobId} for project ${projectId}`);
|
|
186
|
+
return updated;
|
|
187
|
+
}
|
|
188
|
+
throw new Error(`Job not found: ${jobId}`);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=agenticJobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agenticJobs.js","sourceRoot":"","sources":["../src/agenticJobs.ts"],"names":[],"mappings":"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"}
|
package/dist/architectAdrs.d.ts
CHANGED
|
@@ -12,6 +12,13 @@ export interface AdrOutput {
|
|
|
12
12
|
id: string;
|
|
13
13
|
path: string;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse an ADR file into a uniform record, handling BOTH the new markdown shape
|
|
17
|
+
* (frontmatter + ## Context/## Decision/## Consequences) AND legacy .yml ADRs.
|
|
18
|
+
* Exported so tests and external readers can assert against the canonical
|
|
19
|
+
* uniform shape rather than having to know which on-disk format produced the file.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseAdrContent(filename: string, content: string): Record<string, unknown>;
|
|
15
22
|
/**
|
|
16
23
|
* Create a new project-level ADR
|
|
17
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architectAdrs.d.ts","sourceRoot":"","sources":["../src/architectAdrs.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"architectAdrs.d.ts","sourceRoot":"","sources":["../src/architectAdrs.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AA4FD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4B1F;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAmE1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC,CAqBF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAazC"}
|