@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.
Files changed (150) hide show
  1. package/dist/agentCommands.d.ts +11 -0
  2. package/dist/agentCommands.d.ts.map +1 -0
  3. package/dist/agentCommands.js +267 -0
  4. package/dist/agentCommands.js.map +1 -0
  5. package/dist/agentInbox.d.ts +37 -0
  6. package/dist/agentInbox.d.ts.map +1 -0
  7. package/dist/agentInbox.js +128 -0
  8. package/dist/agentInbox.js.map +1 -0
  9. package/dist/agentPresence.d.ts +36 -0
  10. package/dist/agentPresence.d.ts.map +1 -0
  11. package/dist/agentPresence.js +227 -0
  12. package/dist/agentPresence.js.map +1 -0
  13. package/dist/agenticJobs.d.ts +49 -0
  14. package/dist/agenticJobs.d.ts.map +1 -0
  15. package/dist/agenticJobs.js +190 -0
  16. package/dist/agenticJobs.js.map +1 -0
  17. package/dist/architectAdrs.d.ts +7 -0
  18. package/dist/architectAdrs.d.ts.map +1 -1
  19. package/dist/architectAdrs.js +91 -28
  20. package/dist/architectAdrs.js.map +1 -1
  21. package/dist/daemon.d.ts +6 -0
  22. package/dist/daemon.d.ts.map +1 -1
  23. package/dist/daemon.js +14 -0
  24. package/dist/daemon.js.map +1 -1
  25. package/dist/facades/definitions.d.ts.map +1 -1
  26. package/dist/facades/definitions.js +40 -6
  27. package/dist/facades/definitions.js.map +1 -1
  28. package/dist/hq/defineAgent.d.ts +11 -0
  29. package/dist/hq/defineAgent.d.ts.map +1 -0
  30. package/dist/hq/defineAgent.js +185 -0
  31. package/dist/hq/defineAgent.js.map +1 -0
  32. package/dist/hq/index.d.ts +3 -0
  33. package/dist/hq/index.d.ts.map +1 -0
  34. package/dist/hq/index.js +28 -0
  35. package/dist/hq/index.js.map +1 -0
  36. package/dist/hq/types.d.ts +59 -0
  37. package/dist/hq/types.d.ts.map +1 -0
  38. package/dist/hq/types.js +12 -0
  39. package/dist/hq/types.js.map +1 -0
  40. package/dist/httpServer.d.ts +1 -1
  41. package/dist/httpServer.d.ts.map +1 -1
  42. package/dist/httpServer.js +327 -19
  43. package/dist/httpServer.js.map +1 -1
  44. package/dist/kernel.d.ts +3 -1
  45. package/dist/kernel.d.ts.map +1 -1
  46. package/dist/kernel.js +40 -9
  47. package/dist/kernel.js.map +1 -1
  48. package/dist/projectRegistry.d.ts +27 -0
  49. package/dist/projectRegistry.d.ts.map +1 -1
  50. package/dist/projectRegistry.js +191 -5
  51. package/dist/projectRegistry.js.map +1 -1
  52. package/dist/sentinelIssues.d.ts +5 -0
  53. package/dist/sentinelIssues.d.ts.map +1 -1
  54. package/dist/sentinelIssues.js +1 -1
  55. package/dist/sentinelIssues.js.map +1 -1
  56. package/dist/server.js +12 -0
  57. package/dist/server.js.map +1 -1
  58. package/dist/store/fsStore.d.ts +6 -0
  59. package/dist/store/fsStore.d.ts.map +1 -0
  60. package/dist/store/fsStore.js +77 -0
  61. package/dist/store/fsStore.js.map +1 -0
  62. package/dist/store/index.d.ts +8 -0
  63. package/dist/store/index.d.ts.map +1 -0
  64. package/dist/store/index.js +23 -0
  65. package/dist/store/index.js.map +1 -0
  66. package/dist/store/markdown.d.ts +21 -0
  67. package/dist/store/markdown.d.ts.map +1 -0
  68. package/dist/store/markdown.js +175 -0
  69. package/dist/store/markdown.js.map +1 -0
  70. package/dist/store/supabaseStore.d.ts +6 -0
  71. package/dist/store/supabaseStore.d.ts.map +1 -0
  72. package/dist/store/supabaseStore.js +152 -0
  73. package/dist/store/supabaseStore.js.map +1 -0
  74. package/dist/store/types.d.ts +49 -0
  75. package/dist/store/types.d.ts.map +1 -0
  76. package/dist/store/types.js +11 -0
  77. package/dist/store/types.js.map +1 -0
  78. package/dist/supabaseRetry.d.ts +21 -0
  79. package/dist/supabaseRetry.d.ts.map +1 -0
  80. package/dist/supabaseRetry.js +72 -0
  81. package/dist/supabaseRetry.js.map +1 -0
  82. package/dist/toolConfig.d.ts +49 -0
  83. package/dist/toolConfig.d.ts.map +1 -0
  84. package/dist/toolConfig.js +309 -0
  85. package/dist/toolConfig.js.map +1 -0
  86. package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
  87. package/dist/tools/agentic/agentQueue.js +7 -5
  88. package/dist/tools/agentic/agentQueue.js.map +1 -1
  89. package/dist/tools/agentic/index.d.ts +3 -0
  90. package/dist/tools/agentic/index.d.ts.map +1 -1
  91. package/dist/tools/agentic/index.js +158 -1
  92. package/dist/tools/agentic/index.js.map +1 -1
  93. package/dist/tools/codereview/index.d.ts +4 -0
  94. package/dist/tools/codereview/index.d.ts.map +1 -0
  95. package/dist/tools/codereview/index.js +93 -0
  96. package/dist/tools/codereview/index.js.map +1 -0
  97. package/dist/tools/codereview.d.ts +56 -0
  98. package/dist/tools/codereview.d.ts.map +1 -0
  99. package/dist/tools/codereview.js +304 -0
  100. package/dist/tools/codereview.js.map +1 -0
  101. package/dist/tools/concepts.d.ts +38 -0
  102. package/dist/tools/concepts.d.ts.map +1 -0
  103. package/dist/tools/concepts.js +283 -0
  104. package/dist/tools/concepts.js.map +1 -0
  105. package/dist/tools/corpus/index.d.ts +3 -0
  106. package/dist/tools/corpus/index.d.ts.map +1 -1
  107. package/dist/tools/corpus/index.js +183 -1
  108. package/dist/tools/corpus/index.js.map +1 -1
  109. package/dist/tools/corpus.d.ts +52 -0
  110. package/dist/tools/corpus.d.ts.map +1 -1
  111. package/dist/tools/corpus.js +207 -2
  112. package/dist/tools/corpus.js.map +1 -1
  113. package/dist/tools/dojo.d.ts.map +1 -1
  114. package/dist/tools/dojo.js +11 -1
  115. package/dist/tools/dojo.js.map +1 -1
  116. package/dist/tools/git-sentinel.d.ts.map +1 -1
  117. package/dist/tools/git-sentinel.js +24 -8
  118. package/dist/tools/git-sentinel.js.map +1 -1
  119. package/dist/tools/index.d.ts.map +1 -1
  120. package/dist/tools/index.js +6 -0
  121. package/dist/tools/index.js.map +1 -1
  122. package/dist/tools/oracle.d.ts +2 -0
  123. package/dist/tools/oracle.d.ts.map +1 -1
  124. package/dist/tools/oracle.js +146 -17
  125. package/dist/tools/oracle.js.map +1 -1
  126. package/dist/tools/peers.d.ts +15 -0
  127. package/dist/tools/peers.d.ts.map +1 -0
  128. package/dist/tools/peers.js +70 -0
  129. package/dist/tools/peers.js.map +1 -0
  130. package/dist/tools/registry/index.d.ts +4 -0
  131. package/dist/tools/registry/index.d.ts.map +1 -1
  132. package/dist/tools/registry/index.js +274 -1
  133. package/dist/tools/registry/index.js.map +1 -1
  134. package/dist/tools/roadmap.d.ts +4 -0
  135. package/dist/tools/roadmap.d.ts.map +1 -1
  136. package/dist/tools/roadmap.js.map +1 -1
  137. package/dist/tools/sentinel.d.ts +15 -1
  138. package/dist/tools/sentinel.d.ts.map +1 -1
  139. package/dist/tools/sentinel.js +198 -34
  140. package/dist/tools/sentinel.js.map +1 -1
  141. package/dist/tools/voice/index.d.ts.map +1 -1
  142. package/dist/tools/voice/index.js +2 -3
  143. package/dist/tools/voice/index.js.map +1 -1
  144. package/dist/tools/voice.d.ts +1 -1
  145. package/dist/tools/voice.js +2 -2
  146. package/dist/tools/voice.js.map +1 -1
  147. package/dist/tools/workflow.js +5 -5
  148. package/dist/tools/workflow.js.map +1 -1
  149. package/dist/transports/http.js +1 -1
  150. package/package.json +4 -2
@@ -0,0 +1,175 @@
1
+ // ============================================================================
2
+ // Sentinel issue .md <-> IssueRecord (frontmatter + markdown body)
3
+ // ============================================================================
4
+ // Canonical format written by sentinel.ts createIssue:
5
+ // ---
6
+ // projectId: <label>
7
+ // severity: <sev>
8
+ // status: <status>
9
+ // created_at: <iso>
10
+ // [epic_id: <epic>]
11
+ // ---
12
+ // # <title>
13
+ // **Severity:** ...
14
+ // ## Details
15
+ // <body>
16
+ // Reused by FsStore and the migration importer.
17
+ // ============================================================================
18
+ import { parse as parseYaml } from 'yaml';
19
+ const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n?/;
20
+ const SEVERITIES = ['low', 'med', 'high', 'critical'];
21
+ const STATUSES = ['open', 'in_progress', 'done', 'blocked', 'closed', 'wontfix'];
22
+ const PRIORITIES = ['low', 'medium', 'high'];
23
+ function asString(v) {
24
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
25
+ }
26
+ function oneOf(v, allowed) {
27
+ return typeof v === 'string' && allowed.includes(v) ? v : undefined;
28
+ }
29
+ /** Parse a sentinel issue .md into an IssueRecord. source_key = filename stem (no .md). */
30
+ export function parseIssueMarkdown(filename, content) {
31
+ const source_key = filename.replace(/\.md$/i, '');
32
+ let fm = {};
33
+ let body = content;
34
+ const m = content.match(FRONTMATTER_RE);
35
+ if (m) {
36
+ try {
37
+ fm = parseYaml(m[1]) ?? {};
38
+ }
39
+ catch {
40
+ fm = {};
41
+ }
42
+ body = content.slice(m[0].length);
43
+ }
44
+ const heading = body.match(/^#\s+(.+)$/m);
45
+ const title = asString(fm.title) ?? (heading ? heading[1].trim() : source_key);
46
+ const tags = Array.isArray(fm.tags)
47
+ ? fm.tags.filter((t) => typeof t === 'string')
48
+ : undefined;
49
+ return {
50
+ source_key,
51
+ title,
52
+ details: body.trim() || undefined,
53
+ severity: oneOf(fm.severity, SEVERITIES),
54
+ status: oneOf(fm.status, STATUSES) ?? 'open',
55
+ priority: oneOf(fm.priority, PRIORITIES),
56
+ epic_key: asString(fm.epic_id) ?? asString(fm.epic_key),
57
+ tags,
58
+ resolution: asString(fm.resolution),
59
+ closed_at: asString(fm.closed_at),
60
+ created_at: asString(fm.created_at),
61
+ updated_at: asString(fm.updated_at),
62
+ };
63
+ }
64
+ /** Serialize an IssueRecord to sentinel .md (frontmatter + body), markdown-safe (no YAML round-trip of the body). */
65
+ export function serializeIssueMarkdown(projectKey, issue) {
66
+ const fm = ['---', `projectId: ${projectKey}`];
67
+ if (issue.severity)
68
+ fm.push(`severity: ${issue.severity}`);
69
+ fm.push(`status: ${issue.status}`);
70
+ if (issue.priority)
71
+ fm.push(`priority: ${issue.priority}`);
72
+ if (issue.epic_key)
73
+ fm.push(`epic_id: ${issue.epic_key}`);
74
+ if (issue.tags && issue.tags.length > 0)
75
+ fm.push(`tags: [${issue.tags.join(', ')}]`);
76
+ if (issue.created_at)
77
+ fm.push(`created_at: ${issue.created_at}`);
78
+ if (issue.updated_at)
79
+ fm.push(`updated_at: ${issue.updated_at}`);
80
+ if (issue.closed_at)
81
+ fm.push(`closed_at: ${issue.closed_at}`);
82
+ if (issue.resolution)
83
+ fm.push(`resolution: ${JSON.stringify(issue.resolution)}`);
84
+ fm.push('---');
85
+ let body;
86
+ if (issue.details && /^#\s+/m.test(issue.details)) {
87
+ // Already a full markdown body — preserve verbatim.
88
+ body = issue.details.trim();
89
+ }
90
+ else {
91
+ const lines = [`# ${issue.title}`, ''];
92
+ if (issue.severity)
93
+ lines.push(`**Severity:** ${issue.severity}`);
94
+ lines.push(`**Status:** ${issue.status}`, '', '## Details', '', issue.details ?? '');
95
+ body = lines.join('\n');
96
+ }
97
+ return `${fm.join('\n')}\n\n${body}\n`;
98
+ }
99
+ /** Normalize a related_* value: native array, JSON-encoded string, or single string → string[]. */
100
+ function toStringArray(v) {
101
+ if (Array.isArray(v))
102
+ return v.filter((x) => typeof x === 'string');
103
+ if (typeof v === 'string' && v.trim()) {
104
+ try {
105
+ const p = JSON.parse(v);
106
+ if (Array.isArray(p))
107
+ return p.filter((x) => typeof x === 'string');
108
+ }
109
+ catch {
110
+ /* not JSON */
111
+ }
112
+ return [v];
113
+ }
114
+ return [];
115
+ }
116
+ /** Split a markdown body into its `## Section` → text map (lowercased keys). */
117
+ function sectionMap(body) {
118
+ const out = {};
119
+ const parts = body.split(/^##\s+/m);
120
+ for (let i = 1; i < parts.length; i++) {
121
+ const seg = parts[i];
122
+ const nl = seg.indexOf('\n');
123
+ const name = (nl === -1 ? seg : seg.slice(0, nl)).trim().toLowerCase();
124
+ out[name] = (nl === -1 ? '' : seg.slice(nl + 1)).trim();
125
+ }
126
+ return out;
127
+ }
128
+ /** Parse an ADR file → fields, handling new .md (frontmatter + ## sections) AND legacy .yml. */
129
+ export function parseAdrMarkdown(filename, content) {
130
+ const source_key = filename.replace(/\.(md|ya?ml)$/i, '');
131
+ if (/\.ya?ml$/i.test(filename)) {
132
+ const y = parseYaml(content) ?? {};
133
+ return {
134
+ source_key,
135
+ title: asString(y.title) ?? source_key,
136
+ status: asString(y.status),
137
+ context: asString(y.context),
138
+ decision: asString(y.decision),
139
+ consequences: asString(y.consequences),
140
+ related_issues: toStringArray(y.related_issues),
141
+ related_epics: toStringArray(y.related_epics),
142
+ tags: Array.isArray(y.tags) ? y.tags.filter((t) => typeof t === 'string') : undefined,
143
+ created_at: asString(y.created_at),
144
+ updated_at: asString(y.updated_at),
145
+ };
146
+ }
147
+ let fm = {};
148
+ let body = content;
149
+ const m = content.match(/^---\n([\s\S]*?)\n---\n?/);
150
+ if (m) {
151
+ try {
152
+ fm = parseYaml(m[1]) ?? {};
153
+ }
154
+ catch {
155
+ fm = {};
156
+ }
157
+ body = content.slice(m[0].length);
158
+ }
159
+ const heading = body.match(/^#\s+(.+)$/m);
160
+ const sections = sectionMap(body);
161
+ return {
162
+ source_key,
163
+ title: asString(fm.title) ?? (heading ? heading[1].trim() : source_key),
164
+ status: asString(fm.status),
165
+ context: sections['context'] || undefined,
166
+ decision: sections['decision'] || undefined,
167
+ consequences: sections['consequences'] || undefined,
168
+ related_issues: toStringArray(fm.related_issues),
169
+ related_epics: toStringArray(fm.related_epics),
170
+ tags: Array.isArray(fm.tags) ? fm.tags.filter((t) => typeof t === 'string') : undefined,
171
+ created_at: asString(fm.created_at),
172
+ updated_at: asString(fm.updated_at),
173
+ };
174
+ }
175
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/store/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IssueStore, Store } from './types.js';
2
+ export declare class SupabaseStore implements Store {
3
+ readonly kind: "supabase";
4
+ issues: IssueStore;
5
+ }
6
+ //# sourceMappingURL=supabaseStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabaseStore.d.ts","sourceRoot":"","sources":["../../src/store/supabaseStore.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,UAAU,EACV,KAAK,EAEN,MAAM,YAAY,CAAC;AAiKpB,qBAAa,aAAc,YAAW,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,MAAM,EAAE,UAAU,CAA4B;CAC/C"}
@@ -0,0 +1,152 @@
1
+ // ============================================================================
2
+ // SupabaseStore — org-scoped project intelligence in Core Supabase under RLS
3
+ // ============================================================================
4
+ // Write/agent surface for the hosted SaaS. Every call runs as the CALLER:
5
+ // a per-request supabase-js client is built with the user's JWT (X-User-Key) as
6
+ // Authorization: Bearer, so PostgREST sees role=authenticated and membership RLS
7
+ // (hq.is_org_member) scopes reads + writes. NO service_role for tenant ops.
8
+ // Tenant routing: (orgId from X-Org-Key, projectKey label) → hq.projects.id.
9
+ // Contract co-designed with decibel-hq (multi-tenant-store.md). See ADR-0007.
10
+ // ============================================================================
11
+ import { createClient } from '@supabase/supabase-js';
12
+ const SCHEMA = 'hq';
13
+ function requireEnv() {
14
+ const url = process.env.SUPABASE_URL;
15
+ const anonKey = process.env.SUPABASE_ANON_KEY;
16
+ if (!url || !anonKey) {
17
+ throw new Error('SupabaseStore: SUPABASE_URL and SUPABASE_ANON_KEY must be set.');
18
+ }
19
+ return { url, anonKey };
20
+ }
21
+ /** Per-request client bound to the caller's JWT so RLS applies as that user. Never cached. */
22
+ function clientForUser(userJwt) {
23
+ const { url, anonKey } = requireEnv();
24
+ return createClient(url, anonKey, {
25
+ auth: { persistSession: false, autoRefreshToken: false },
26
+ db: { schema: SCHEMA },
27
+ global: { headers: { Authorization: `Bearer ${userJwt}` } },
28
+ });
29
+ }
30
+ /** Decode the `sub` (user id) claim from a JWT for created_by. Supabase verifies the token server-side. */
31
+ function jwtSub(jwt) {
32
+ try {
33
+ const payload = jwt.split('.')[1];
34
+ if (!payload)
35
+ return undefined;
36
+ const json = Buffer.from(payload.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf-8');
37
+ const claims = JSON.parse(json);
38
+ return claims.sub;
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ }
44
+ function requireCtx(ctx) {
45
+ if (!ctx.orgId)
46
+ throw new Error('SupabaseStore: orgId (X-Org-Key) is required for tenant routing.');
47
+ if (!ctx.userJwt)
48
+ throw new Error('SupabaseStore: userJwt (X-User-Key) is required.');
49
+ return { orgId: ctx.orgId, userJwt: ctx.userJwt };
50
+ }
51
+ /** Resolve a project label → hq.projects.id within the org (RLS: caller must be a member). */
52
+ async function resolveProjectId(client, orgId, projectKey) {
53
+ const { data, error } = await client
54
+ .from('projects')
55
+ .select('id')
56
+ .eq('org_id', orgId)
57
+ .eq('key', projectKey)
58
+ .maybeSingle();
59
+ if (error)
60
+ throw new Error(`SupabaseStore: project lookup failed: ${error.message}`);
61
+ if (!data) {
62
+ throw new Error(`SupabaseStore: project '${projectKey}' not found in org ${orgId} (or caller is not a member).`);
63
+ }
64
+ return data.id;
65
+ }
66
+ function rowToIssue(r) {
67
+ return {
68
+ source_key: r.source_key,
69
+ title: r.title,
70
+ details: r.details ?? undefined,
71
+ severity: r.severity ?? undefined,
72
+ status: r.status,
73
+ priority: r.priority ?? undefined,
74
+ epic_key: r.epic_key ?? undefined,
75
+ tags: r.tags ?? undefined,
76
+ resolution: r.resolution ?? undefined,
77
+ closed_at: r.closed_at ?? undefined,
78
+ created_at: r.created_at ?? undefined,
79
+ updated_at: r.updated_at ?? undefined,
80
+ };
81
+ }
82
+ class SupabaseIssueStore {
83
+ async list(ctx, filter) {
84
+ const { orgId, userJwt } = requireCtx(ctx);
85
+ const client = clientForUser(userJwt);
86
+ const projectId = await resolveProjectId(client, orgId, ctx.projectKey);
87
+ let q = client
88
+ .from('sentinel_issues')
89
+ .select('*')
90
+ .eq('org_id', orgId)
91
+ .eq('project_id', projectId);
92
+ if (filter?.status)
93
+ q = q.eq('status', filter.status);
94
+ const { data, error } = await q;
95
+ if (error)
96
+ throw new Error(`SupabaseStore: list failed: ${error.message}`);
97
+ return (data ?? []).map(rowToIssue);
98
+ }
99
+ async get(ctx, sourceKey) {
100
+ const { orgId, userJwt } = requireCtx(ctx);
101
+ const client = clientForUser(userJwt);
102
+ const projectId = await resolveProjectId(client, orgId, ctx.projectKey);
103
+ const { data, error } = await client
104
+ .from('sentinel_issues')
105
+ .select('*')
106
+ .eq('org_id', orgId)
107
+ .eq('project_id', projectId)
108
+ .eq('source_key', sourceKey)
109
+ .maybeSingle();
110
+ if (error)
111
+ throw new Error(`SupabaseStore: get failed: ${error.message}`);
112
+ return data ? rowToIssue(data) : null;
113
+ }
114
+ async upsert(ctx, issue) {
115
+ const { orgId, userJwt } = requireCtx(ctx);
116
+ const client = clientForUser(userJwt);
117
+ const projectId = await resolveProjectId(client, orgId, ctx.projectKey);
118
+ const createdBy = jwtSub(userJwt);
119
+ const row = {
120
+ org_id: orgId,
121
+ project_id: projectId,
122
+ source_key: issue.source_key,
123
+ title: issue.title,
124
+ details: issue.details ?? null,
125
+ severity: issue.severity ?? null,
126
+ status: issue.status,
127
+ priority: issue.priority ?? null,
128
+ epic_key: issue.epic_key ?? null,
129
+ tags: issue.tags ?? [],
130
+ resolution: issue.resolution ?? null,
131
+ closed_at: issue.closed_at ?? null,
132
+ updated_at: new Date().toISOString(),
133
+ };
134
+ if (issue.created_at)
135
+ row.created_at = issue.created_at;
136
+ if (createdBy)
137
+ row.created_by = createdBy;
138
+ const { data, error } = await client
139
+ .from('sentinel_issues')
140
+ .upsert(row, { onConflict: 'org_id,project_id,source_key' })
141
+ .select('*')
142
+ .single();
143
+ if (error)
144
+ throw new Error(`SupabaseStore: upsert failed: ${error.message}`);
145
+ return rowToIssue(data);
146
+ }
147
+ }
148
+ export class SupabaseStore {
149
+ kind = 'supabase';
150
+ issues = new SupabaseIssueStore();
151
+ }
152
+ //# sourceMappingURL=supabaseStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabaseStore.js","sourceRoot":"","sources":["../../src/store/supabaseStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export type IssueSeverity = 'low' | 'med' | 'high' | 'critical';
2
+ export type IssueStatus = 'open' | 'in_progress' | 'done' | 'blocked' | 'closed' | 'wontfix';
3
+ export type IssuePriority = 'low' | 'medium' | 'high';
4
+ /**
5
+ * Per-request context carried from DispatchContext into the store.
6
+ * - orgId : tenant org (hq.orgs.id) from the X-Org-Key header (required by SupabaseStore)
7
+ * - projectKey: project label, e.g. "decibel-hq" → maps to hq.projects.key
8
+ * - userJwt : caller's Supabase access token from X-User-Key → sets RLS identity on writes
9
+ */
10
+ export interface StoreContext {
11
+ orgId?: string;
12
+ projectKey: string;
13
+ userJwt?: string;
14
+ }
15
+ /**
16
+ * One sentinel issue. Mirrors hq.sentinel_issues domain columns 1:1;
17
+ * id / org_id / project_id / created_by are resolved/assigned by the store, not here.
18
+ */
19
+ export interface IssueRecord {
20
+ /** Stable id: issue filename stem (no .md) or ISS-NNNN. Upsert key with org+project. */
21
+ source_key: string;
22
+ title: string;
23
+ /** Full markdown body sans frontmatter. */
24
+ details?: string;
25
+ severity?: IssueSeverity;
26
+ status: IssueStatus;
27
+ priority?: IssuePriority;
28
+ /** Linked epic's source_key (from frontmatter epic_id). */
29
+ epic_key?: string;
30
+ tags?: string[];
31
+ resolution?: string;
32
+ closed_at?: string;
33
+ created_at?: string;
34
+ updated_at?: string;
35
+ }
36
+ export interface IssueListFilter {
37
+ status?: IssueStatus;
38
+ }
39
+ export interface IssueStore {
40
+ list(ctx: StoreContext, filter?: IssueListFilter): Promise<IssueRecord[]>;
41
+ get(ctx: StoreContext, sourceKey: string): Promise<IssueRecord | null>;
42
+ /** Insert or update, keyed by (org_id, project_id, source_key). */
43
+ upsert(ctx: StoreContext, issue: IssueRecord): Promise<IssueRecord>;
44
+ }
45
+ export interface Store {
46
+ readonly kind: 'fs' | 'supabase';
47
+ issues: IssueStore;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC7F,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACvE,mEAAmE;IACnE,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAAC;IACjC,MAAM,EAAE,UAAU,CAAC;CAEpB"}
@@ -0,0 +1,11 @@
1
+ // ============================================================================
2
+ // Project-Intelligence Store — interface + types
3
+ // ============================================================================
4
+ // Abstracts read/write of project-intel domains (sentinel/architect/friction/
5
+ // oracle) behind a Store interface with two impls:
6
+ // - FsStore : box-local .decibel/*.md files (dev/self-host, git-tracked)
7
+ // - SupabaseStore : org-scoped Core Supabase tables under RLS (hosted SaaS)
8
+ // Selected by config (DECIBEL_STORE). See ADR-0007 / EPIC-0033.
9
+ // ============================================================================
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iDAAiD;AACjD,+EAA+E;AAC/E,8EAA8E;AAC9E,mDAAmD;AACnD,iFAAiF;AACjF,8EAA8E;AAC9E,gEAAgE;AAChE,+EAA+E"}
@@ -0,0 +1,21 @@
1
+ /** Heuristic: is this error a transient network/connection blip worth one retry? */
2
+ export declare function isTransientNetworkError(err: unknown): boolean;
3
+ /**
4
+ * Run `fn`; on a transient network error, wait `delayMs` and try once more.
5
+ * `label` is used only for debug logging. Non-transient errors throw immediately.
6
+ */
7
+ export declare function withRetry<T>(fn: () => Promise<T>, label?: string, delayMs?: number): Promise<T>;
8
+ /**
9
+ * Variant for Supabase query builders that RESOLVE with `{ data, error }` rather
10
+ * than throwing. Retries once when the resolved `error` looks transient OR the
11
+ * call itself throws transiently. Returns the final `{ data, error }`.
12
+ */
13
+ type Resulted<T> = {
14
+ data: T;
15
+ error: {
16
+ message: string;
17
+ } | null;
18
+ };
19
+ export declare function withRetryResult<T>(fn: () => PromiseLike<Resulted<T>>, label?: string, delayMs?: number): Promise<Resulted<T>>;
20
+ export {};
21
+ //# sourceMappingURL=supabaseRetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabaseRetry.d.ts","sourceRoot":"","sources":["../src/supabaseRetry.ts"],"names":[],"mappings":"AAgBA,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAY7D;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,SAAa,EAAE,OAAO,SAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAStG;AAED;;;;GAIG;AACH,KAAK,QAAQ,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,CAAC;AAElE,wBAAsB,eAAe,CAAC,CAAC,EAGrC,EAAE,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAClC,KAAK,SAAa,EAClB,OAAO,SAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAmBtB"}
@@ -0,0 +1,72 @@
1
+ // ============================================================================
2
+ // Transient-retry wrapper for Supabase calls (presence / dispatcher / inbox)
3
+ // ============================================================================
4
+ // The daemon's Supabase calls intermittently fail with a transient
5
+ // "TypeError: fetch failed" — a one-off connection/DNS blip from the host, not a
6
+ // real outage (the next attempt succeeds). These cluster into whole-tick failures
7
+ // and add log noise + a brief board-staleness window. (Issue 2026-06-13.)
8
+ //
9
+ // withRetry runs an async fn and retries ONCE on a transient network error after a
10
+ // short delay, before giving up. Deliberately minimal: one retry keeps the 30s/5s
11
+ // loop cadence intact while smoothing single blips. A genuine outage still fails
12
+ // fast (one retry, then the caller's normal error path).
13
+ // ============================================================================
14
+ import { log } from './config.js';
15
+ /** Heuristic: is this error a transient network/connection blip worth one retry? */
16
+ export function isTransientNetworkError(err) {
17
+ if (!err)
18
+ return false;
19
+ const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
20
+ return (msg.includes('fetch failed') ||
21
+ msg.includes('econnreset') ||
22
+ msg.includes('econnrefused') ||
23
+ msg.includes('etimedout') ||
24
+ msg.includes('socket hang up') ||
25
+ msg.includes('network') ||
26
+ msg.includes('and retry') // PostgREST-fronted transient
27
+ );
28
+ }
29
+ /**
30
+ * Run `fn`; on a transient network error, wait `delayMs` and try once more.
31
+ * `label` is used only for debug logging. Non-transient errors throw immediately.
32
+ */
33
+ export async function withRetry(fn, label = 'supabase', delayMs = 500) {
34
+ try {
35
+ return await fn();
36
+ }
37
+ catch (err) {
38
+ if (!isTransientNetworkError(err))
39
+ throw err;
40
+ log(`Retry: ${label} transient error (${err instanceof Error ? err.message : String(err)}); retrying once in ${delayMs}ms`);
41
+ await new Promise((r) => setTimeout(r, delayMs));
42
+ return await fn();
43
+ }
44
+ }
45
+ export async function withRetryResult(
46
+ // Accepts a thenable (Supabase's PostgrestFilterBuilder is await-able but not a
47
+ // real Promise), so callers can pass the query builder directly.
48
+ fn, label = 'supabase', delayMs = 500) {
49
+ let res;
50
+ try {
51
+ res = await fn();
52
+ }
53
+ catch (err) {
54
+ if (!isTransientNetworkError(err))
55
+ throw err;
56
+ res = { data: undefined, error: { message: err instanceof Error ? err.message : String(err) } };
57
+ }
58
+ if (res.error && isTransientNetworkError(res.error.message)) {
59
+ log(`Retry: ${label} transient (${res.error.message}); retrying once in ${delayMs}ms`);
60
+ await new Promise((r) => setTimeout(r, delayMs));
61
+ try {
62
+ return await fn();
63
+ }
64
+ catch (err) {
65
+ if (!isTransientNetworkError(err))
66
+ throw err;
67
+ return { data: undefined, error: { message: err instanceof Error ? err.message : String(err) } };
68
+ }
69
+ }
70
+ return res;
71
+ }
72
+ //# sourceMappingURL=supabaseRetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabaseRetry.js","sourceRoot":"","sources":["../src/supabaseRetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export interface ConfigKeyDef {
2
+ key: string;
3
+ type: 'string' | 'number' | 'boolean' | 'string[]';
4
+ default: unknown;
5
+ description: string;
6
+ env?: string;
7
+ }
8
+ /**
9
+ * Registry of all configurable keys, grouped by facade.
10
+ * Add new keys here when a facade gains configurable behavior.
11
+ */
12
+ export declare const CONFIG_SCHEMA: Record<string, ConfigKeyDef[]>;
13
+ export interface Profile {
14
+ name: string;
15
+ description: string;
16
+ overrides: Record<string, Record<string, unknown>>;
17
+ }
18
+ export declare const BUILT_IN_PROFILES: Record<string, Profile>;
19
+ /**
20
+ * Get merged config for a specific facade.
21
+ * Merge order: defaults → profile → project config → global config → env vars
22
+ */
23
+ export declare function getToolConfig<T extends Record<string, unknown> = Record<string, unknown>>(projectId: string | undefined, facade: string): T;
24
+ /**
25
+ * Get the full merged config for all facades.
26
+ */
27
+ export declare function getAllToolConfig(projectId?: string): Record<string, Record<string, unknown>>;
28
+ /**
29
+ * Get the enabled facades list (from DECIBEL_FACADES env or config files).
30
+ * Returns undefined if no restriction is set (all facades allowed).
31
+ */
32
+ export declare function getEnabledFacades(projectId?: string): string[] | undefined;
33
+ /**
34
+ * Set a config value in a project's .decibel/config.yaml.
35
+ */
36
+ export declare function setToolConfigValue(projectId: string, facade: string, key: string, value: unknown): {
37
+ success: boolean;
38
+ path: string;
39
+ message: string;
40
+ };
41
+ /**
42
+ * Set the active profile in a project's .decibel/config.yaml.
43
+ */
44
+ export declare function setProfile(projectId: string, profileName: string): {
45
+ success: boolean;
46
+ path: string;
47
+ message: string;
48
+ };
49
+ //# sourceMappingURL=toolConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolConfig.d.ts","sourceRoot":"","sources":["../src/toolConfig.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAmCxD,CAAC;AAMF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CA0CrD,CAAC;AAkEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvF,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,GACb,CAAC,CAyCH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAM5F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAqB1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA4CrD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAkCrD"}