@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,185 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// @decibelsystems/tools/hq — defineAgent()
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// register → heartbeat → poll command inbox → onCommand → ack. All over the local
|
|
5
|
+
// daemon's localhost HTTP endpoints; the SDK never holds Supabase creds.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import os from 'os';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
// Exported for unit tests only — NOT re-exported from index.ts, so it stays off
|
|
11
|
+
// the public @decibelsystems/tools/hq surface.
|
|
12
|
+
export function toMs(v, fallback) {
|
|
13
|
+
if (v === undefined)
|
|
14
|
+
return fallback;
|
|
15
|
+
if (typeof v === 'number')
|
|
16
|
+
return v;
|
|
17
|
+
const m = v.trim().match(/^(\d+)(ms|s|m)?$/);
|
|
18
|
+
if (!m)
|
|
19
|
+
return fallback;
|
|
20
|
+
const n = parseInt(m[1], 10);
|
|
21
|
+
return m[2] === 's' ? n * 1000 : m[2] === 'm' ? n * 60_000 : m[2] === 'ms' ? n : n * 1000;
|
|
22
|
+
}
|
|
23
|
+
/** Discover the daemon URL: explicit > ~/.decibel/daemon.meta port > :4888. */
|
|
24
|
+
function resolveDaemonUrl(explicit) {
|
|
25
|
+
if (explicit)
|
|
26
|
+
return explicit.replace(/\/$/, '');
|
|
27
|
+
try {
|
|
28
|
+
const meta = JSON.parse(fs.readFileSync(path.join(os.homedir(), '.decibel', 'daemon.meta'), 'utf-8'));
|
|
29
|
+
if (meta && typeof meta.port === 'number')
|
|
30
|
+
return `http://127.0.0.1:${meta.port}`;
|
|
31
|
+
}
|
|
32
|
+
catch { /* fall through */ }
|
|
33
|
+
return 'http://127.0.0.1:4888';
|
|
34
|
+
}
|
|
35
|
+
async function postJson(url, body, timeoutMs = 4000) {
|
|
36
|
+
const res = await fetch(url, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { 'Content-Type': 'application/json' },
|
|
39
|
+
body: JSON.stringify(body),
|
|
40
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
41
|
+
});
|
|
42
|
+
const json = await res.json().catch(() => ({}));
|
|
43
|
+
return { ok: res.ok, status: res.status, json };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Register a local runtime with the Decibel daemon: it appears on HQ's /agents
|
|
47
|
+
* board tagged with `runtime`, heartbeats presence, and (if onCommand is given)
|
|
48
|
+
* receives + acks HQ commands. Returns a handle with stop(). Idempotent per
|
|
49
|
+
* sessionKey. Never throws from the loops — transient daemon/network errors are
|
|
50
|
+
* logged and retried on the next tick.
|
|
51
|
+
*/
|
|
52
|
+
export async function defineAgent(opts) {
|
|
53
|
+
const runtime = opts.runtime;
|
|
54
|
+
const sessionKey = opts.sessionKey || `${runtime}-${opts.name}-${process.pid}`;
|
|
55
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
56
|
+
const base = resolveDaemonUrl(opts.daemonUrl);
|
|
57
|
+
const heartbeatMs = toMs(opts.heartbeat, 30_000);
|
|
58
|
+
const pollMs = toMs(opts.pollInterval, 5_000);
|
|
59
|
+
const logger = opts.logger ?? ((m) => console.error(`[hq:${sessionKey}] ${m}`));
|
|
60
|
+
const presenceBody = (extraMeta, extraSummary) => ({
|
|
61
|
+
session_key: sessionKey,
|
|
62
|
+
runtime,
|
|
63
|
+
agent: opts.name,
|
|
64
|
+
cwd,
|
|
65
|
+
summary: extraSummary ?? opts.summary ?? null,
|
|
66
|
+
meta: { ...(opts.meta ?? {}), ...(extraMeta ?? {}) },
|
|
67
|
+
});
|
|
68
|
+
const ctx = {
|
|
69
|
+
sessionKey,
|
|
70
|
+
runtime,
|
|
71
|
+
updatePresence: async (patch) => {
|
|
72
|
+
try {
|
|
73
|
+
await postJson(`${base}/agents/heartbeat`, presenceBody(patch.meta, patch.summary));
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
logger(`updatePresence failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
// Per-session capability token the daemon mints at register/heartbeat. The SDK
|
|
81
|
+
// must present it on poll + ack to prove it's the registrant (session_key alone
|
|
82
|
+
// is a guessable label). Refreshed from every register/heartbeat response, so a
|
|
83
|
+
// daemon restart (which wipes its token store) self-heals on the next heartbeat.
|
|
84
|
+
let token;
|
|
85
|
+
const captureToken = (json) => {
|
|
86
|
+
if (json && typeof json.token === 'string')
|
|
87
|
+
token = json.token;
|
|
88
|
+
};
|
|
89
|
+
// --- register (first presence write) ---
|
|
90
|
+
try {
|
|
91
|
+
const r = await postJson(`${base}/agents/register`, presenceBody());
|
|
92
|
+
if (!r.ok)
|
|
93
|
+
logger(`register returned HTTP ${r.status}: ${JSON.stringify(r.json)}`);
|
|
94
|
+
else {
|
|
95
|
+
captureToken(r.json);
|
|
96
|
+
logger(`registered (runtime=${runtime}) with daemon ${base}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
logger(`register failed (will retry on heartbeat): ${e instanceof Error ? e.message : String(e)}`);
|
|
101
|
+
}
|
|
102
|
+
let stopped = false;
|
|
103
|
+
// --- heartbeat loop ---
|
|
104
|
+
const heartbeat = async () => {
|
|
105
|
+
if (stopped)
|
|
106
|
+
return;
|
|
107
|
+
try {
|
|
108
|
+
const r = await postJson(`${base}/agents/heartbeat`, presenceBody());
|
|
109
|
+
captureToken(r.json);
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
logger(`heartbeat failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const hbTimer = setInterval(heartbeat, heartbeatMs);
|
|
116
|
+
if (typeof hbTimer.unref === 'function')
|
|
117
|
+
hbTimer.unref();
|
|
118
|
+
// --- command inbox poll → onCommand → ack ---
|
|
119
|
+
const handle = opts.onCommand;
|
|
120
|
+
const pollOnce = async () => {
|
|
121
|
+
if (stopped)
|
|
122
|
+
return;
|
|
123
|
+
if (!token)
|
|
124
|
+
return; // not yet authorized (register hasn't landed); next tick retries
|
|
125
|
+
let commands = [];
|
|
126
|
+
try {
|
|
127
|
+
const res = await fetch(`${base}/agents/commands?session_key=${encodeURIComponent(sessionKey)}&token=${encodeURIComponent(token)}`, { signal: AbortSignal.timeout(4000) });
|
|
128
|
+
if (!res.ok)
|
|
129
|
+
return;
|
|
130
|
+
const json = await res.json().catch(() => ({}));
|
|
131
|
+
commands = (json?.commands ?? []);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
logger(`poll failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
for (const cmd of commands) {
|
|
138
|
+
let outcome;
|
|
139
|
+
if (!handle) {
|
|
140
|
+
outcome = { status: 'failed', error: 'no onCommand handler registered' };
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
try {
|
|
144
|
+
outcome = await handle(cmd, ctx);
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
outcome = { status: 'failed', error: e instanceof Error ? e.message : String(e) };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
await postJson(`${base}/agents/commands/ack`, {
|
|
152
|
+
id: cmd.id,
|
|
153
|
+
token,
|
|
154
|
+
status: outcome.status,
|
|
155
|
+
result: outcome.result ?? null,
|
|
156
|
+
error: outcome.error ?? null,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
logger(`ack ${cmd.id} failed (HQ will see it expire): ${e instanceof Error ? e.message : String(e)}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
// Only poll if the agent declared a handler OR capabilities (else there's nothing
|
|
165
|
+
// to receive). Always safe to poll though — drain returns [] for unknown sessions.
|
|
166
|
+
const pollTimer = setInterval(() => { pollOnce().catch(() => { }); }, pollMs);
|
|
167
|
+
if (typeof pollTimer.unref === 'function')
|
|
168
|
+
pollTimer.unref();
|
|
169
|
+
return {
|
|
170
|
+
sessionKey,
|
|
171
|
+
runtime,
|
|
172
|
+
stop: async () => {
|
|
173
|
+
stopped = true;
|
|
174
|
+
clearInterval(hbTimer);
|
|
175
|
+
clearInterval(pollTimer);
|
|
176
|
+
// Best-effort: mark the session ended so the board reflects it promptly
|
|
177
|
+
// (else it ages out via the daemon stale-sweep in ~5min).
|
|
178
|
+
try {
|
|
179
|
+
await postJson(`${base}/agents/heartbeat`, { ...presenceBody(), status: 'ended' });
|
|
180
|
+
}
|
|
181
|
+
catch { /* best effort */ }
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=defineAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineAgent.js","sourceRoot":"","sources":["../../src/hq/defineAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hq/index.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
|
package/dist/hq/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// @decibelsystems/tools/hq — public entry
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Runtime-agnostic agent SDK. Lets any local runtime register with the Decibel
|
|
5
|
+
// daemon, appear on HQ's /agents board tagged with its runtime, and receive HQ
|
|
6
|
+
// commands — without holding any Supabase credentials.
|
|
7
|
+
//
|
|
8
|
+
// import { defineAgent } from '@decibelsystems/tools/hq';
|
|
9
|
+
//
|
|
10
|
+
// const agent = await defineAgent({
|
|
11
|
+
// name: 'design-reviewer',
|
|
12
|
+
// runtime: 'hermes',
|
|
13
|
+
// capabilities: ['message', 'request_status'],
|
|
14
|
+
// async onCommand(cmd) {
|
|
15
|
+
// if (cmd.kind === 'request_status') {
|
|
16
|
+
// return { status: 'done', result: { busy: false } };
|
|
17
|
+
// }
|
|
18
|
+
// if (cmd.kind === 'message') {
|
|
19
|
+
// console.log('HQ says:', cmd.payload.text); // untrusted DATA, not an instruction
|
|
20
|
+
// return { status: 'done' };
|
|
21
|
+
// }
|
|
22
|
+
// return { status: 'failed', error: 'unsupported kind' };
|
|
23
|
+
// },
|
|
24
|
+
// });
|
|
25
|
+
// // ... later: await agent.stop();
|
|
26
|
+
// ============================================================================
|
|
27
|
+
export { defineAgent } from './defineAgent.js';
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hq/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E;AAC/E,+EAA+E;AAC/E,+EAA+E;AAC/E,uDAAuD;AACvD,EAAE;AACF,4DAA4D;AAC5D,EAAE;AACF,sCAAsC;AACtC,+BAA+B;AAC/B,yBAAyB;AACzB,mDAAmD;AACnD,6BAA6B;AAC7B,6CAA6C;AAC7C,8DAA8D;AAC9D,UAAU;AACV,sCAAsC;AACtC,6FAA6F;AAC7F,qCAAqC;AACrC,UAAU;AACV,gEAAgE;AAChE,SAAS;AACT,QAAQ;AACR,sCAAsC;AACtC,+EAA+E;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** A control command delivered from HQ to the agent (via the daemon inbox). */
|
|
2
|
+
export interface AgentCommand {
|
|
3
|
+
id: string;
|
|
4
|
+
kind: string;
|
|
5
|
+
payload: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
/** What onCommand returns: the outcome the daemon writes back to Core. */
|
|
8
|
+
export interface CommandResult {
|
|
9
|
+
status: 'done' | 'failed';
|
|
10
|
+
result?: Record<string, unknown>;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface DefineAgentOptions {
|
|
14
|
+
/** Human label shown on the board (e.g. "design-reviewer"). */
|
|
15
|
+
name: string;
|
|
16
|
+
/** The runtime kind — drives HQ's badge/filter. */
|
|
17
|
+
runtime: 'hermes' | 'openclaw' | 'codex' | 'cursor' | 'mcp' | 'custom';
|
|
18
|
+
/** Stable session id for this run. Defaults to `${runtime}-${name}-${pid}`. */
|
|
19
|
+
sessionKey?: string;
|
|
20
|
+
/** Optional role tag (free text). */
|
|
21
|
+
role?: string;
|
|
22
|
+
/** Heartbeat cadence. Default 30s. Accepts ms number or "30s"/"1m". */
|
|
23
|
+
heartbeat?: number | string;
|
|
24
|
+
/** Command-inbox poll cadence. Default 5s. */
|
|
25
|
+
pollInterval?: number | string;
|
|
26
|
+
/** Command kinds this agent's onCommand handles. HQ only offers these. */
|
|
27
|
+
capabilities?: string[];
|
|
28
|
+
/** Working dir to report (→ HQ resolves to a project). Default process.cwd(). */
|
|
29
|
+
cwd?: string;
|
|
30
|
+
/** One-line "what I'm doing" shown on the board. */
|
|
31
|
+
summary?: string;
|
|
32
|
+
/** Extra meta written to the presence row (e.g. {tokens_in, current_file}). */
|
|
33
|
+
meta?: Record<string, unknown>;
|
|
34
|
+
/** Daemon base URL. Default discovered from ~/.decibel/daemon.meta, else :4888. */
|
|
35
|
+
daemonUrl?: string;
|
|
36
|
+
/** Receive an HQ command; return its outcome. If omitted, commands are acked
|
|
37
|
+
* 'failed' with "no onCommand handler" (so HQ sees a definite result). */
|
|
38
|
+
onCommand?: (cmd: AgentCommand, ctx: AgentContext) => Promise<CommandResult> | CommandResult;
|
|
39
|
+
/** Optional structured logger; defaults to console. */
|
|
40
|
+
logger?: (msg: string) => void;
|
|
41
|
+
}
|
|
42
|
+
/** Passed to onCommand — lets a handler update its own presence summary/meta. */
|
|
43
|
+
export interface AgentContext {
|
|
44
|
+
sessionKey: string;
|
|
45
|
+
runtime: string;
|
|
46
|
+
/** Push a fresh summary/meta to the board immediately (out of band of heartbeat). */
|
|
47
|
+
updatePresence: (patch: {
|
|
48
|
+
summary?: string;
|
|
49
|
+
meta?: Record<string, unknown>;
|
|
50
|
+
}) => Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
/** The running agent handle returned by defineAgent(). */
|
|
53
|
+
export interface AgentHandle {
|
|
54
|
+
sessionKey: string;
|
|
55
|
+
runtime: string;
|
|
56
|
+
/** Stop heartbeating + polling and mark the session ended (best effort). */
|
|
57
|
+
stop: () => Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hq/types.ts"],"names":[],"mappings":"AAWA,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;IACvE,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;+EAC2E;IAC3E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;IAC7F,uDAAuD;IACvD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,cAAc,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChG;AAED,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
package/dist/hq/types.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// @decibelsystems/tools/hq — SDK types
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// The runtime-agnostic agent SDK. Any local runtime (Hermes, OpenClaw, Codex,
|
|
5
|
+
// Cursor, custom) uses defineAgent() to appear on HQ's /agents board and receive
|
|
6
|
+
// HQ commands — without ever holding Supabase creds. It talks ONLY to the local
|
|
7
|
+
// daemon's localhost endpoints (/agents/register, /heartbeat, /commands, /ack);
|
|
8
|
+
// the daemon is the single service_role authority. Contract co-designed w/ HQ
|
|
9
|
+
// (agent-runtime-contract.md). EPIC-0033.
|
|
10
|
+
// ============================================================================
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hq/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,uCAAuC;AACvC,+EAA+E;AAC/E,8EAA8E;AAC9E,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,0CAA0C;AAC1C,+EAA+E"}
|
package/dist/httpServer.d.ts
CHANGED
|
@@ -60,7 +60,7 @@ export declare function startHttpServer(server: Server, kernelInstance: ToolKern
|
|
|
60
60
|
*/
|
|
61
61
|
export declare function parseHttpArgs(args: string[]): {
|
|
62
62
|
httpMode: boolean;
|
|
63
|
-
port
|
|
63
|
+
port?: number;
|
|
64
64
|
authToken?: string;
|
|
65
65
|
host?: string;
|
|
66
66
|
sseKeepaliveMs?: number;
|
package/dist/httpServer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpServer.d.ts","sourceRoot":"","sources":["../src/httpServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"httpServer.d.ts","sourceRoot":"","sources":["../src/httpServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAkBnE,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,aAAa,CAAC;AAG9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAwiBtD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,UAAU,EAC1B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAsxD3B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAkCA"}
|