@decibelsystems/tools 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/dist/agentCommands.d.ts +0 -1
- package/dist/agentCommands.d.ts.map +1 -1
- package/dist/agentCommands.js +19 -8
- package/dist/agentCommands.js.map +1 -1
- package/dist/agentPresence.d.ts +5 -3
- package/dist/agentPresence.d.ts.map +1 -1
- package/dist/agentPresence.js +20 -29
- package/dist/agentPresence.js.map +1 -1
- package/dist/architectAdrs.d.ts +13 -1
- package/dist/architectAdrs.d.ts.map +1 -1
- package/dist/architectAdrs.js +83 -1
- package/dist/architectAdrs.js.map +1 -1
- package/dist/artifacts.d.ts +60 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +208 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/asks.d.ts +93 -0
- package/dist/asks.d.ts.map +1 -0
- package/dist/asks.js +383 -0
- package/dist/asks.js.map +1 -0
- package/dist/chat.d.ts +47 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +288 -0
- package/dist/chat.js.map +1 -0
- package/dist/daemon.d.ts +14 -3
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +44 -14
- package/dist/daemon.js.map +1 -1
- package/dist/daemonConfig.d.ts +22 -0
- package/dist/daemonConfig.d.ts.map +1 -1
- package/dist/daemonConfig.js +11 -0
- package/dist/daemonConfig.js.map +1 -1
- package/dist/domain/issue.d.ts +19 -15
- package/dist/domain/issue.d.ts.map +1 -1
- package/dist/domain/issue.js +4 -32
- package/dist/domain/issue.js.map +1 -1
- package/dist/domain/issueCodec.d.ts.map +1 -1
- package/dist/domain/issueCodec.js +10 -0
- package/dist/domain/issueCodec.js.map +1 -1
- package/dist/domain/issueRepository.d.ts +35 -2
- package/dist/domain/issueRepository.d.ts.map +1 -1
- package/dist/domain/issueRepository.js +40 -1
- package/dist/domain/issueRepository.js.map +1 -1
- package/dist/domain/uid.d.ts +16 -0
- package/dist/domain/uid.d.ts.map +1 -0
- package/dist/domain/uid.js +43 -0
- package/dist/domain/uid.js.map +1 -0
- package/dist/facades/definitions.d.ts.map +1 -1
- package/dist/facades/definitions.js +46 -3
- package/dist/facades/definitions.js.map +1 -1
- package/dist/hq/defineAgent.d.ts.map +1 -1
- package/dist/hq/defineAgent.js +7 -11
- package/dist/hq/defineAgent.js.map +1 -1
- package/dist/httpServer.d.ts.map +1 -1
- package/dist/httpServer.js +201 -48
- package/dist/httpServer.js.map +1 -1
- package/dist/identity.d.ts +123 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +312 -0
- package/dist/identity.js.map +1 -0
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +24 -1
- package/dist/kernel.js.map +1 -1
- package/dist/killSwitch.d.ts +117 -0
- package/dist/killSwitch.d.ts.map +1 -0
- package/dist/killSwitch.js +161 -0
- package/dist/killSwitch.js.map +1 -0
- package/dist/lib/atomicWrite.d.ts +23 -0
- package/dist/lib/atomicWrite.d.ts.map +1 -1
- package/dist/lib/atomicWrite.js +84 -0
- package/dist/lib/atomicWrite.js.map +1 -1
- package/dist/lib/recordIdAllocator.d.ts +21 -5
- package/dist/lib/recordIdAllocator.d.ts.map +1 -1
- package/dist/lib/recordIdAllocator.js +25 -7
- package/dist/lib/recordIdAllocator.js.map +1 -1
- package/dist/orgId.d.ts +23 -0
- package/dist/orgId.d.ts.map +1 -0
- package/dist/orgId.js +73 -0
- package/dist/orgId.js.map +1 -0
- package/dist/pairCli.d.ts +2 -0
- package/dist/pairCli.d.ts.map +1 -0
- package/dist/pairCli.js +97 -0
- package/dist/pairCli.js.map +1 -0
- package/dist/peerBroker.d.ts +40 -0
- package/dist/peerBroker.d.ts.map +1 -0
- package/dist/peerBroker.js +70 -0
- package/dist/peerBroker.js.map +1 -0
- package/dist/peerBrokerSupervisor.d.ts +21 -0
- package/dist/peerBrokerSupervisor.d.ts.map +1 -0
- package/dist/peerBrokerSupervisor.js +131 -0
- package/dist/peerBrokerSupervisor.js.map +1 -0
- package/dist/projectPaths.d.ts.map +1 -1
- package/dist/projectPaths.js +1 -19
- package/dist/projectPaths.js.map +1 -1
- package/dist/projectRegistry.d.ts +22 -0
- package/dist/projectRegistry.d.ts.map +1 -1
- package/dist/projectRegistry.js +58 -2
- package/dist/projectRegistry.js.map +1 -1
- package/dist/pty/boundary.d.ts +39 -0
- package/dist/pty/boundary.d.ts.map +1 -0
- package/dist/pty/boundary.js +100 -0
- package/dist/pty/boundary.js.map +1 -0
- package/dist/pty/errors.d.ts +6 -0
- package/dist/pty/errors.d.ts.map +1 -0
- package/dist/pty/errors.js +12 -0
- package/dist/pty/errors.js.map +1 -0
- package/dist/pty/fleet.d.ts +159 -0
- package/dist/pty/fleet.d.ts.map +1 -0
- package/dist/pty/fleet.js +543 -0
- package/dist/pty/fleet.js.map +1 -0
- package/dist/pty/launchProfile.d.ts +45 -0
- package/dist/pty/launchProfile.d.ts.map +1 -0
- package/dist/pty/launchProfile.js +149 -0
- package/dist/pty/launchProfile.js.map +1 -0
- package/dist/pty/openTerminal.d.ts +48 -0
- package/dist/pty/openTerminal.d.ts.map +1 -0
- package/dist/pty/openTerminal.js +185 -0
- package/dist/pty/openTerminal.js.map +1 -0
- package/dist/pty/pairDialog.d.ts +16 -0
- package/dist/pty/pairDialog.d.ts.map +1 -0
- package/dist/pty/pairDialog.js +121 -0
- package/dist/pty/pairDialog.js.map +1 -0
- package/dist/pty/pairing.d.ts +86 -0
- package/dist/pty/pairing.d.ts.map +1 -0
- package/dist/pty/pairing.js +351 -0
- package/dist/pty/pairing.js.map +1 -0
- package/dist/pty/routes.d.ts +49 -0
- package/dist/pty/routes.d.ts.map +1 -0
- package/dist/pty/routes.js +624 -0
- package/dist/pty/routes.js.map +1 -0
- package/dist/pty/sessions.d.ts +167 -0
- package/dist/pty/sessions.d.ts.map +1 -0
- package/dist/pty/sessions.js +513 -0
- package/dist/pty/sessions.js.map +1 -0
- package/dist/pty/tmux.d.ts +109 -0
- package/dist/pty/tmux.d.ts.map +1 -0
- package/dist/pty/tmux.js +271 -0
- package/dist/pty/tmux.js.map +1 -0
- package/dist/roster.d.ts +37 -0
- package/dist/roster.d.ts.map +1 -0
- package/dist/roster.js +126 -0
- package/dist/roster.js.map +1 -0
- package/dist/runtime/daemonMeta.d.ts +53 -0
- package/dist/runtime/daemonMeta.d.ts.map +1 -0
- package/dist/runtime/daemonMeta.js +121 -0
- package/dist/runtime/daemonMeta.js.map +1 -0
- package/dist/runtime/ensureRuntime.d.ts.map +1 -1
- package/dist/runtime/ensureRuntime.js +5 -10
- package/dist/runtime/ensureRuntime.js.map +1 -1
- package/dist/sentinelIssues.d.ts +16 -0
- package/dist/sentinelIssues.d.ts.map +1 -1
- package/dist/sentinelIssues.js +42 -1
- package/dist/sentinelIssues.js.map +1 -1
- package/dist/server.js +66 -5
- package/dist/server.js.map +1 -1
- package/dist/toolConfig.d.ts.map +1 -1
- package/dist/toolConfig.js +12 -0
- package/dist/toolConfig.js.map +1 -1
- package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
- package/dist/tools/agentic/agentQueue.js +4 -0
- package/dist/tools/agentic/agentQueue.js.map +1 -1
- package/dist/tools/architect/index.d.ts +1 -0
- package/dist/tools/architect/index.d.ts.map +1 -1
- package/dist/tools/architect/index.js +45 -1
- package/dist/tools/architect/index.js.map +1 -1
- package/dist/tools/architect.d.ts.map +1 -1
- package/dist/tools/architect.js +59 -8
- package/dist/tools/architect.js.map +1 -1
- package/dist/tools/artifacts.d.ts +5 -0
- package/dist/tools/artifacts.d.ts.map +1 -0
- package/dist/tools/artifacts.js +89 -0
- package/dist/tools/artifacts.js.map +1 -0
- package/dist/tools/asks.d.ts +6 -0
- package/dist/tools/asks.d.ts.map +1 -0
- package/dist/tools/asks.js +104 -0
- package/dist/tools/asks.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +1 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +42 -2
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/data-inspector.d.ts +1 -1
- package/dist/tools/data-inspector.d.ts.map +1 -1
- package/dist/tools/data-inspector.js +1 -1
- package/dist/tools/data-inspector.js.map +1 -1
- package/dist/tools/dojo/index.d.ts.map +1 -1
- package/dist/tools/dojo/index.js +52 -3
- package/dist/tools/dojo/index.js.map +1 -1
- package/dist/tools/dojo.d.ts +62 -1
- package/dist/tools/dojo.d.ts.map +1 -1
- package/dist/tools/dojo.js +84 -1
- package/dist/tools/dojo.js.map +1 -1
- package/dist/tools/guardian.d.ts +7 -0
- package/dist/tools/guardian.d.ts.map +1 -1
- package/dist/tools/guardian.js +146 -9
- package/dist/tools/guardian.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/killswitch/index.d.ts +13 -0
- package/dist/tools/killswitch/index.d.ts.map +1 -0
- package/dist/tools/killswitch/index.js +138 -0
- package/dist/tools/killswitch/index.js.map +1 -0
- package/dist/tools/oracle/index.d.ts.map +1 -1
- package/dist/tools/oracle/index.js +8 -0
- package/dist/tools/oracle/index.js.map +1 -1
- package/dist/tools/oracle.d.ts +7 -0
- package/dist/tools/oracle.d.ts.map +1 -1
- package/dist/tools/oracle.js +22 -6
- package/dist/tools/oracle.js.map +1 -1
- package/dist/tools/provenance.d.ts +11 -2
- package/dist/tools/provenance.d.ts.map +1 -1
- package/dist/tools/provenance.js +26 -24
- package/dist/tools/provenance.js.map +1 -1
- package/dist/tools/registry/index.d.ts.map +1 -1
- package/dist/tools/registry/index.js +24 -0
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/sentinel/index.d.ts.map +1 -1
- package/dist/tools/sentinel/index.js +54 -2
- package/dist/tools/sentinel/index.js.map +1 -1
- package/dist/tools/sentinel.d.ts +50 -0
- package/dist/tools/sentinel.d.ts.map +1 -1
- package/dist/tools/sentinel.js +72 -7
- package/dist/tools/sentinel.js.map +1 -1
- package/dist/tools/shared/runTracker.d.ts +2 -0
- package/dist/tools/shared/runTracker.d.ts.map +1 -1
- package/dist/tools/shared/runTracker.js +38 -0
- package/dist/tools/shared/runTracker.js.map +1 -1
- package/dist/tools/swarm.d.ts +3 -1
- package/dist/tools/swarm.d.ts.map +1 -1
- package/dist/tools/swarm.js +6 -12
- package/dist/tools/swarm.js.map +1 -1
- package/dist/tools/voice/index.d.ts +1 -0
- package/dist/tools/voice/index.d.ts.map +1 -1
- package/dist/tools/voice/index.js +33 -2
- package/dist/tools/voice/index.js.map +1 -1
- package/dist/tools/voice.d.ts +48 -1
- package/dist/tools/voice.d.ts.map +1 -1
- package/dist/tools/voice.js +63 -3
- package/dist/tools/voice.js.map +1 -1
- package/dist/transports/bridge.d.ts.map +1 -1
- package/dist/transports/bridge.js +2 -1
- package/dist/transports/bridge.js.map +1 -1
- package/dist/transports/mcp.d.ts.map +1 -1
- package/dist/transports/mcp.js +2 -1
- package/dist/transports/mcp.js.map +1 -1
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/package.json +13 -2
- package/templates/AGENT.md +3 -0
- package/templates/CLAUDE-decibel.md +11 -0
package/dist/asks.js
ADDED
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Asks: one question to a human, answerable from any channel (ISS-0215)
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// decibel-hq ADR-0015 / tools EPIC-0042, for M-0006. An agent asks Ben, or a
|
|
5
|
+
// guest such as a client, something with a known answer shape. HQ shows it in
|
|
6
|
+
// the Inbox (and on a guest's page), and a human answers there. This module is
|
|
7
|
+
// the daemon half:
|
|
8
|
+
//
|
|
9
|
+
// create writes .decibel/asks/ASK-<ulid>.yml, then upserts hq.asks.
|
|
10
|
+
// pickup a 30 s daemon loop. It pushes asks not yet in HQ, reads answers
|
|
11
|
+
// back into the yaml, and tells a live session in the asking
|
|
12
|
+
// project that its question was answered.
|
|
13
|
+
//
|
|
14
|
+
// The yaml is written FIRST and is the record. Most agent calls arrive over
|
|
15
|
+
// stdio, where there are no Core credentials, so an ask that could not reach
|
|
16
|
+
// HQ is not lost: it sits with synced:false until the daemon's loop sends it.
|
|
17
|
+
// The same goes for a notification nobody was around to receive; notified_at
|
|
18
|
+
// stays empty and the loop tries again.
|
|
19
|
+
//
|
|
20
|
+
// What HQ owns, and this module must not reimplement: who may answer, status
|
|
21
|
+
// transitions, first-answer-wins, approval of drafts, and expiry (computed in
|
|
22
|
+
// hq.asks_v). Humans write only through hq.answer_ask / approve_ask /
|
|
23
|
+
// withdraw_ask. The daemon writes the row with service_role and reads the
|
|
24
|
+
// answer back; it never sets answer columns.
|
|
25
|
+
//
|
|
26
|
+
// Guests: an ask to guest:<grant uuid> is always created as a draft with
|
|
27
|
+
// requires_approval, which is how Ben's "drafts only" rule for client contact
|
|
28
|
+
// is enforced. HQ's CHECK rejects anything else, and guest RLS hides drafts.
|
|
29
|
+
// ============================================================================
|
|
30
|
+
import fs from 'fs';
|
|
31
|
+
import path from 'path';
|
|
32
|
+
import { randomBytes } from 'crypto';
|
|
33
|
+
import YAML from 'yaml';
|
|
34
|
+
import { log } from './config.js';
|
|
35
|
+
import { getOrgId } from './orgId.js';
|
|
36
|
+
import { serviceClient } from './agentPresence.js';
|
|
37
|
+
import { listProjects, resolveProjectPaths } from './projectRegistry.js';
|
|
38
|
+
import { parseIdentity } from './identity.js';
|
|
39
|
+
export const QUESTION_MAX = 4000;
|
|
40
|
+
export const CHOICES_MAX = 10;
|
|
41
|
+
export const CHOICE_MAX = 200;
|
|
42
|
+
export const CONTEXT_REF_MAX = 500;
|
|
43
|
+
const ASK_ID_RE = /^ASK-[0-9A-Za-z]{10,40}$/;
|
|
44
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
45
|
+
export class AskError extends Error {
|
|
46
|
+
}
|
|
47
|
+
// ----------------------------------------------------------------------------
|
|
48
|
+
// Ids
|
|
49
|
+
// ----------------------------------------------------------------------------
|
|
50
|
+
const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
|
51
|
+
/** ASK- plus a ULID: 10 chars of time, 16 of randomness. Sorts by creation. */
|
|
52
|
+
export function mintAskId(now = Date.now()) {
|
|
53
|
+
let t = now;
|
|
54
|
+
let time = '';
|
|
55
|
+
for (let i = 0; i < 10; i++) {
|
|
56
|
+
time = CROCKFORD[t % 32] + time;
|
|
57
|
+
t = Math.floor(t / 32);
|
|
58
|
+
}
|
|
59
|
+
const bytes = randomBytes(16);
|
|
60
|
+
let rand = '';
|
|
61
|
+
for (let i = 0; i < 16; i++)
|
|
62
|
+
rand += CROCKFORD[bytes[i] % 32];
|
|
63
|
+
return `ASK-${time}${rand}`;
|
|
64
|
+
}
|
|
65
|
+
// ----------------------------------------------------------------------------
|
|
66
|
+
// Validation
|
|
67
|
+
// ----------------------------------------------------------------------------
|
|
68
|
+
export function parseShape(raw) {
|
|
69
|
+
const s = (raw ?? { kind: 'text' });
|
|
70
|
+
if (s.kind === 'yes_no' || s.kind === 'text')
|
|
71
|
+
return { kind: s.kind };
|
|
72
|
+
if (s.kind === 'options') {
|
|
73
|
+
const choices = s.choices;
|
|
74
|
+
if (!Array.isArray(choices) || choices.length < 2 || choices.length > CHOICES_MAX ||
|
|
75
|
+
!choices.every((c) => typeof c === 'string' && c.trim() && c.length <= CHOICE_MAX)) {
|
|
76
|
+
throw new AskError(`options needs 2-${CHOICES_MAX} distinct choices, each 1-${CHOICE_MAX} characters`);
|
|
77
|
+
}
|
|
78
|
+
const trimmed = choices.map((c) => c.trim());
|
|
79
|
+
if (new Set(trimmed).size !== trimmed.length)
|
|
80
|
+
throw new AskError('choices must be distinct');
|
|
81
|
+
return { kind: 'options', choices: trimmed };
|
|
82
|
+
}
|
|
83
|
+
throw new AskError('shape.kind must be yes_no, options or text');
|
|
84
|
+
}
|
|
85
|
+
/** A human who can answer: user:<uuid>, human:<name>, or guest:<grant uuid>. */
|
|
86
|
+
export function parseTarget(raw) {
|
|
87
|
+
const p = parseIdentity(typeof raw === 'string' ? raw : null);
|
|
88
|
+
if (!p)
|
|
89
|
+
throw new AskError('target must be user:<uuid>, human:<name> or guest:<grant uuid>');
|
|
90
|
+
if (p.kind === 'guest') {
|
|
91
|
+
if (!UUID_RE.test(p.value))
|
|
92
|
+
throw new AskError('a guest target is guest:<hq.project_grants id>, a uuid');
|
|
93
|
+
return { target: p.raw, guest: true };
|
|
94
|
+
}
|
|
95
|
+
if (p.kind === 'user' || p.kind === 'human')
|
|
96
|
+
return { target: p.raw, guest: false };
|
|
97
|
+
throw new AskError(`an ask goes to a person, not "${p.raw}"`);
|
|
98
|
+
}
|
|
99
|
+
// ----------------------------------------------------------------------------
|
|
100
|
+
// Storage: .decibel/asks/ASK-<ulid>.yml
|
|
101
|
+
// ----------------------------------------------------------------------------
|
|
102
|
+
function asksDir(projectId) {
|
|
103
|
+
return resolveProjectPaths(projectId).subPath('asks');
|
|
104
|
+
}
|
|
105
|
+
function writeAsk(dir, rec) {
|
|
106
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
107
|
+
const file = path.join(dir, `${rec.ask_id}.yml`);
|
|
108
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
109
|
+
fs.writeFileSync(tmp, YAML.stringify(rec), 'utf-8');
|
|
110
|
+
fs.renameSync(tmp, file); // never a half-written record
|
|
111
|
+
}
|
|
112
|
+
export function readAsks(projectId) {
|
|
113
|
+
const dir = asksDir(projectId);
|
|
114
|
+
if (!fs.existsSync(dir))
|
|
115
|
+
return [];
|
|
116
|
+
const out = [];
|
|
117
|
+
for (const f of fs.readdirSync(dir).filter((n) => /^ASK-.*\.yml$/.test(n)).sort()) {
|
|
118
|
+
try {
|
|
119
|
+
out.push(YAML.parse(fs.readFileSync(path.join(dir, f), 'utf-8')));
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
log(`Asks: unreadable ${f} in ${projectId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
export function readAsk(projectId, askId) {
|
|
128
|
+
if (!ASK_ID_RE.test(askId))
|
|
129
|
+
return null;
|
|
130
|
+
const file = path.join(asksDir(projectId), `${askId}.yml`);
|
|
131
|
+
return fs.existsSync(file) ? YAML.parse(fs.readFileSync(file, 'utf-8')) : null;
|
|
132
|
+
}
|
|
133
|
+
// ----------------------------------------------------------------------------
|
|
134
|
+
// HQ: hq.asks
|
|
135
|
+
// ----------------------------------------------------------------------------
|
|
136
|
+
/** The hq.asks row for a record. Never includes answer columns. */
|
|
137
|
+
export function hqRow(rec, orgId) {
|
|
138
|
+
return {
|
|
139
|
+
ask_id: rec.ask_id,
|
|
140
|
+
org_id: orgId,
|
|
141
|
+
project_key: rec.project_key,
|
|
142
|
+
asker: rec.asker,
|
|
143
|
+
target: rec.target,
|
|
144
|
+
question: rec.question,
|
|
145
|
+
shape: rec.shape,
|
|
146
|
+
context_ref: rec.context_ref ?? null,
|
|
147
|
+
requires_approval: rec.requires_approval,
|
|
148
|
+
status: rec.status,
|
|
149
|
+
expires_at: rec.expires_at ?? null,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Insert the row once. ignoreDuplicates: a retry after a lost response must
|
|
154
|
+
* not overwrite a row HQ has since moved on (approved, answered), and the
|
|
155
|
+
* daemon never updates an ask after creating it.
|
|
156
|
+
*/
|
|
157
|
+
async function pushAsk(client, rec, orgId) {
|
|
158
|
+
const { error } = await client.from('asks').upsert(hqRow(rec, orgId), { onConflict: 'ask_id', ignoreDuplicates: true });
|
|
159
|
+
return error ? error.message : null;
|
|
160
|
+
}
|
|
161
|
+
export async function createAsk(input, deps = {}) {
|
|
162
|
+
const resolved = resolveProjectPaths(input.project_id);
|
|
163
|
+
const question = typeof input.question === 'string' ? input.question.trim() : '';
|
|
164
|
+
if (!question || question.length > QUESTION_MAX)
|
|
165
|
+
throw new AskError(`question is required, 1-${QUESTION_MAX} characters`);
|
|
166
|
+
const { target, guest } = parseTarget(input.target);
|
|
167
|
+
const shape = parseShape(input.shape);
|
|
168
|
+
let contextRef;
|
|
169
|
+
if (input.context_ref !== undefined && input.context_ref !== null) {
|
|
170
|
+
if (typeof input.context_ref !== 'string' || input.context_ref.length > CONTEXT_REF_MAX) {
|
|
171
|
+
throw new AskError(`context_ref must be a string of at most ${CONTEXT_REF_MAX} characters`);
|
|
172
|
+
}
|
|
173
|
+
contextRef = input.context_ref;
|
|
174
|
+
}
|
|
175
|
+
const now = (deps.now ?? (() => new Date()))();
|
|
176
|
+
let expiresAt;
|
|
177
|
+
if (input.expires_at !== undefined && input.expires_at !== null) {
|
|
178
|
+
const t = typeof input.expires_at === 'string' ? Date.parse(input.expires_at) : NaN;
|
|
179
|
+
if (!Number.isFinite(t) || t <= now.getTime())
|
|
180
|
+
throw new AskError('expires_at must be an ISO time in the future');
|
|
181
|
+
expiresAt = new Date(t).toISOString();
|
|
182
|
+
}
|
|
183
|
+
// Guests: drafts only, until Ben approves in the Inbox. Not overridable.
|
|
184
|
+
const requiresApproval = guest || input.requires_approval === true;
|
|
185
|
+
const projectKey = path.basename(resolved.projectPath);
|
|
186
|
+
const rec = {
|
|
187
|
+
ask_id: mintAskId(now.getTime()),
|
|
188
|
+
project_id: resolved.id,
|
|
189
|
+
project_key: projectKey,
|
|
190
|
+
asker: input.asker ?? `agent:${projectKey}/claude-code`,
|
|
191
|
+
target,
|
|
192
|
+
question,
|
|
193
|
+
shape,
|
|
194
|
+
...(contextRef ? { context_ref: contextRef } : {}),
|
|
195
|
+
requires_approval: requiresApproval,
|
|
196
|
+
status: requiresApproval ? 'draft' : 'open',
|
|
197
|
+
created_at: now.toISOString(),
|
|
198
|
+
...(expiresAt ? { expires_at: expiresAt } : {}),
|
|
199
|
+
synced: false,
|
|
200
|
+
};
|
|
201
|
+
const dir = resolved.subPath('asks');
|
|
202
|
+
writeAsk(dir, rec);
|
|
203
|
+
// Best effort now; the daemon loop retries whatever did not land.
|
|
204
|
+
const client = deps.client === undefined ? serviceClient() : deps.client;
|
|
205
|
+
let org = null;
|
|
206
|
+
try {
|
|
207
|
+
org = (deps.orgId ?? getOrgId)();
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
rec.sync_error = err instanceof Error ? err.message : String(err);
|
|
211
|
+
}
|
|
212
|
+
if (!client || !org) {
|
|
213
|
+
rec.sync_error ??= 'HQ is not configured in this process; the daemon will send it';
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const err = await pushAsk(client, rec, org);
|
|
217
|
+
if (err)
|
|
218
|
+
rec.sync_error = err;
|
|
219
|
+
else {
|
|
220
|
+
rec.synced = true;
|
|
221
|
+
delete rec.sync_error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
writeAsk(dir, rec);
|
|
225
|
+
return rec;
|
|
226
|
+
}
|
|
227
|
+
// ----------------------------------------------------------------------------
|
|
228
|
+
// The daemon loop: push unsynced, pull answers, notify
|
|
229
|
+
// ----------------------------------------------------------------------------
|
|
230
|
+
/** Terminal in HQ: nothing will change after these. */
|
|
231
|
+
const TERMINAL = ['answered', 'withdrawn', 'expired'];
|
|
232
|
+
export function outcomeText(rec) {
|
|
233
|
+
const head = `[decibel ask ${rec.ask_id}] "${rec.question.slice(0, 200)}"`;
|
|
234
|
+
if (rec.status === 'answered') {
|
|
235
|
+
const who = rec.on_behalf_of ? `${rec.answered_by} for ${rec.on_behalf_of}` : rec.answered_by;
|
|
236
|
+
return `${head} was answered by ${who} via ${rec.answered_via ?? 'HQ'}: ${JSON.stringify(rec.answer)}. The record is .decibel/asks/${rec.ask_id}.yml.`;
|
|
237
|
+
}
|
|
238
|
+
return `${head} is ${rec.status}; no answer is coming. The record is .decibel/asks/${rec.ask_id}.yml.`;
|
|
239
|
+
}
|
|
240
|
+
export async function pickupOnce(deps = {}) {
|
|
241
|
+
const res = { pushed: 0, resolved: 0, notified: 0, errors: [] };
|
|
242
|
+
const client = deps.client === undefined ? serviceClient() : deps.client;
|
|
243
|
+
let org = null;
|
|
244
|
+
try {
|
|
245
|
+
org = (deps.orgId ?? getOrgId)();
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
org = null;
|
|
249
|
+
}
|
|
250
|
+
if (!client || !org)
|
|
251
|
+
return res; // nothing to talk to; the yaml waits
|
|
252
|
+
const projectIds = (deps.projects ?? (() => listProjects().map((p) => p.id)))();
|
|
253
|
+
for (const projectId of projectIds) {
|
|
254
|
+
let asks;
|
|
255
|
+
let dir;
|
|
256
|
+
try {
|
|
257
|
+
dir = asksDir(projectId);
|
|
258
|
+
asks = readAsks(projectId);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
continue; // unregistered or unavailable project
|
|
262
|
+
}
|
|
263
|
+
if (!asks.length)
|
|
264
|
+
continue;
|
|
265
|
+
// 1. Anything HQ has not got yet.
|
|
266
|
+
for (const rec of asks.filter((a) => !a.synced)) {
|
|
267
|
+
const err = await pushAsk(client, rec, org);
|
|
268
|
+
if (err) {
|
|
269
|
+
if (rec.sync_error !== err) {
|
|
270
|
+
rec.sync_error = err;
|
|
271
|
+
writeAsk(dir, rec);
|
|
272
|
+
}
|
|
273
|
+
res.errors.push(`${rec.ask_id}: ${err}`);
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
rec.synced = true;
|
|
277
|
+
delete rec.sync_error;
|
|
278
|
+
writeAsk(dir, rec);
|
|
279
|
+
res.pushed++;
|
|
280
|
+
}
|
|
281
|
+
// 2. Outcomes for synced asks that are still waiting.
|
|
282
|
+
const waiting = asks.filter((a) => a.synced && !TERMINAL.includes(a.status));
|
|
283
|
+
if (waiting.length) {
|
|
284
|
+
const { data, error } = await client
|
|
285
|
+
.from('asks_v')
|
|
286
|
+
.select('ask_id,status,effective_status,answer,answered_by,on_behalf_of,answered_via,answered_at,superseded_answers')
|
|
287
|
+
.in('ask_id', waiting.map((a) => a.ask_id));
|
|
288
|
+
if (error) {
|
|
289
|
+
res.errors.push(`${projectId}: ${error.message}`);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const byId = new Map(data.map((r) => [r.ask_id, r]));
|
|
293
|
+
for (const rec of waiting) {
|
|
294
|
+
const row = byId.get(rec.ask_id);
|
|
295
|
+
if (!row)
|
|
296
|
+
continue;
|
|
297
|
+
const status = row.effective_status ?? row.status;
|
|
298
|
+
if (status === rec.status)
|
|
299
|
+
continue;
|
|
300
|
+
rec.status = status;
|
|
301
|
+
if (status === 'answered') {
|
|
302
|
+
rec.answer = row.answer ?? undefined;
|
|
303
|
+
rec.answered_by = row.answered_by ?? undefined;
|
|
304
|
+
rec.on_behalf_of = row.on_behalf_of ?? undefined;
|
|
305
|
+
rec.answered_via = row.answered_via ?? undefined;
|
|
306
|
+
rec.answered_at = row.answered_at ?? undefined;
|
|
307
|
+
if (row.superseded_answers?.length)
|
|
308
|
+
rec.superseded_answers = row.superseded_answers;
|
|
309
|
+
}
|
|
310
|
+
writeAsk(dir, rec);
|
|
311
|
+
if (TERMINAL.includes(status))
|
|
312
|
+
res.resolved++;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// 3. Tell the project, until someone has been told.
|
|
317
|
+
if (deps.notify) {
|
|
318
|
+
for (const rec of asks.filter((a) => TERMINAL.includes(a.status) && !a.notified_at)) {
|
|
319
|
+
if (await deps.notify(projectId, outcomeText(rec))) {
|
|
320
|
+
rec.notified_at = (deps.now ?? (() => new Date()))().toISOString();
|
|
321
|
+
writeAsk(dir, rec);
|
|
322
|
+
res.notified++;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return res;
|
|
328
|
+
}
|
|
329
|
+
/** Notify live claude-peers sessions whose repo is the project's. */
|
|
330
|
+
export async function notifyProjectSessions(projectId, text) {
|
|
331
|
+
const { fetchPeers } = await import('./peerBroker.js');
|
|
332
|
+
const { sendChat } = await import('./chat.js');
|
|
333
|
+
let root;
|
|
334
|
+
try {
|
|
335
|
+
root = resolveProjectPaths(projectId).projectPath.replace(/\/+$/, '');
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
const peers = (await fetchPeers()).filter((p) => {
|
|
341
|
+
const where = (p.git_root || p.cwd || '').replace(/\/+$/, '');
|
|
342
|
+
return where === root || where.startsWith(root + '/');
|
|
343
|
+
});
|
|
344
|
+
let told = false;
|
|
345
|
+
for (const p of peers) {
|
|
346
|
+
try {
|
|
347
|
+
const r = await sendChat(p.id, text);
|
|
348
|
+
if (r.delivered.length)
|
|
349
|
+
told = true;
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
/* the next sweep tries again */
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return told;
|
|
356
|
+
}
|
|
357
|
+
export const PICKUP_MS = 30_000;
|
|
358
|
+
/** The daemon's 30 s loop (the Friday fallback for realtime; ISS-0213). */
|
|
359
|
+
export function startAskPickup(intervalMs = PICKUP_MS) {
|
|
360
|
+
let running = false;
|
|
361
|
+
const tick = async () => {
|
|
362
|
+
if (running)
|
|
363
|
+
return;
|
|
364
|
+
running = true;
|
|
365
|
+
try {
|
|
366
|
+
const r = await pickupOnce({ notify: notifyProjectSessions });
|
|
367
|
+
if (r.pushed || r.resolved || r.notified) {
|
|
368
|
+
log(`Asks: pushed ${r.pushed}, resolved ${r.resolved}, notified ${r.notified}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
log(`Asks: pickup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
running = false;
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
const timer = setInterval(() => void tick(), intervalMs);
|
|
379
|
+
timer.unref?.();
|
|
380
|
+
void tick();
|
|
381
|
+
return () => clearInterval(timer);
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=asks.js.map
|
package/dist/asks.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asks.js","sourceRoot":"","sources":["../src/asks.ts"],"names":[],"mappings":"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"}
|
package/dist/chat.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const CHAT_TEXT_MAX_BYTES = 4096;
|
|
2
|
+
export declare const HUMAN_SUMMARY = "HQ chat inbox, read by Ben (the human) in HQ. Send status reports and replies here.";
|
|
3
|
+
export interface ChatMessage {
|
|
4
|
+
id: number;
|
|
5
|
+
ts: string;
|
|
6
|
+
dir: 'in' | 'out';
|
|
7
|
+
/** in: the sender. */
|
|
8
|
+
peer_id?: string;
|
|
9
|
+
/** out: a peer id, or "all". */
|
|
10
|
+
to?: string;
|
|
11
|
+
project_id?: string;
|
|
12
|
+
cwd?: string;
|
|
13
|
+
text: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function chatLogPath(): string;
|
|
16
|
+
export declare function readChat(since?: number, limit?: number): {
|
|
17
|
+
messages: ChatMessage[];
|
|
18
|
+
human_peer_id: string | null;
|
|
19
|
+
peer_live: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare class ChatError extends Error {
|
|
22
|
+
readonly status: number;
|
|
23
|
+
readonly code: string;
|
|
24
|
+
constructor(status: number, code: string, message: string);
|
|
25
|
+
}
|
|
26
|
+
export declare function sendChat(to: unknown, text: unknown): Promise<{
|
|
27
|
+
ok: boolean;
|
|
28
|
+
delivered: string[];
|
|
29
|
+
failed: Array<{
|
|
30
|
+
peer_id: string;
|
|
31
|
+
error: string;
|
|
32
|
+
}>;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Every inbound message in the on-disk log, not just the in-memory window.
|
|
36
|
+
* For artifacts.backfill_chat; unreadable lines are skipped as in loadLog.
|
|
37
|
+
*/
|
|
38
|
+
export declare function readAllInbound(): ChatMessage[];
|
|
39
|
+
/** Start the chat peer and its loops (daemon mode). Returns a stop function. */
|
|
40
|
+
export declare function startChat(opts?: {
|
|
41
|
+
pollMs?: number;
|
|
42
|
+
heartbeatMs?: number;
|
|
43
|
+
presenceMs?: number;
|
|
44
|
+
}): () => void;
|
|
45
|
+
/** Test seam: forget in-memory state so a test can point HOME elsewhere. */
|
|
46
|
+
export declare function _resetChat(): void;
|
|
47
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AA2CA,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAOxC,eAAO,MAAM,aAAa,wFAAwF,CAAC;AAEnH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,IAAI,GAAG,KAAK,CAAC;IAClB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AASD,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAkDD,wBAAgB,QAAQ,CAAC,KAAK,SAAI,EAAE,KAAK,SAAM,GAAG;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAS9H;AAyBD,qBAAa,SAAU,SAAQ,KAAK;aAEhB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA6B3J;AA0CD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,EAAE,CAc9C;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,IAAI,CAmC/G;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,IAAI,IAAI,CAKjC"}
|