@decibelsystems/tools 2.1.4 → 3.0.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 +160 -0
- package/README.md +1 -1
- package/dist/agentPresence.d.ts +80 -0
- package/dist/agentPresence.d.ts.map +1 -1
- package/dist/agentPresence.js +177 -0
- package/dist/agentPresence.js.map +1 -1
- package/dist/agentic/index.d.ts +18 -8
- package/dist/agentic/index.d.ts.map +1 -1
- package/dist/agentic/index.js +18 -144
- package/dist/agentic/index.js.map +1 -1
- package/dist/agentic/types.d.ts +106 -0
- package/dist/agentic/types.d.ts.map +1 -1
- package/dist/agentic/types.js +77 -1
- package/dist/agentic/types.js.map +1 -1
- package/dist/architectAdrs.d.ts +14 -2
- package/dist/architectAdrs.d.ts.map +1 -1
- package/dist/architectAdrs.js +9 -3
- package/dist/architectAdrs.js.map +1 -1
- package/dist/client/transports.d.ts.map +1 -1
- package/dist/client/transports.js +13 -3
- package/dist/client/transports.js.map +1 -1
- package/dist/daemon.d.ts +19 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +181 -38
- package/dist/daemon.js.map +1 -1
- package/dist/daemonConfig.d.ts +30 -0
- package/dist/daemonConfig.d.ts.map +1 -1
- package/dist/daemonConfig.js +56 -9
- package/dist/daemonConfig.js.map +1 -1
- package/dist/decibelPaths.d.ts.map +1 -1
- package/dist/decibelPaths.js +39 -6
- package/dist/decibelPaths.js.map +1 -1
- package/dist/domain/issue.d.ts +77 -0
- package/dist/domain/issue.d.ts.map +1 -0
- package/dist/domain/issue.js +134 -0
- package/dist/domain/issue.js.map +1 -0
- package/dist/domain/issueCodec.d.ts +39 -0
- package/dist/domain/issueCodec.d.ts.map +1 -0
- package/dist/domain/issueCodec.js +298 -0
- package/dist/domain/issueCodec.js.map +1 -0
- package/dist/domain/issueRepository.d.ts +91 -0
- package/dist/domain/issueRepository.d.ts.map +1 -0
- package/dist/domain/issueRepository.js +257 -0
- package/dist/domain/issueRepository.js.map +1 -0
- package/dist/facades/definitions.d.ts +0 -1
- package/dist/facades/definitions.d.ts.map +1 -1
- package/dist/facades/definitions.js +94 -98
- package/dist/facades/definitions.js.map +1 -1
- package/dist/facades/index.d.ts +2 -1
- package/dist/facades/index.d.ts.map +1 -1
- package/dist/facades/index.js +1 -1
- package/dist/facades/index.js.map +1 -1
- package/dist/facades/types.d.ts +17 -0
- package/dist/facades/types.d.ts.map +1 -1
- package/dist/httpArgs.d.ts +11 -0
- package/dist/httpArgs.d.ts.map +1 -0
- package/dist/httpArgs.js +39 -0
- package/dist/httpArgs.js.map +1 -0
- package/dist/httpServer.d.ts +1 -12
- package/dist/httpServer.d.ts.map +1 -1
- package/dist/httpServer.js +173 -98
- package/dist/httpServer.js.map +1 -1
- package/dist/kernel.d.ts +55 -1
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +366 -31
- package/dist/kernel.js.map +1 -1
- package/dist/lib/agent-services/assumptions.d.ts.map +1 -1
- package/dist/lib/agent-services/assumptions.js +8 -2
- package/dist/lib/agent-services/assumptions.js.map +1 -1
- package/dist/lib/atomicWrite.d.ts +26 -0
- package/dist/lib/atomicWrite.d.ts.map +1 -0
- package/dist/lib/atomicWrite.js +73 -0
- package/dist/lib/atomicWrite.js.map +1 -0
- package/dist/lib/envelope.d.ts +31 -0
- package/dist/lib/envelope.d.ts.map +1 -0
- package/dist/lib/envelope.js +80 -0
- package/dist/lib/envelope.js.map +1 -0
- package/dist/lib/fileLock.d.ts +38 -0
- package/dist/lib/fileLock.d.ts.map +1 -0
- package/dist/lib/fileLock.js +124 -0
- package/dist/lib/fileLock.js.map +1 -0
- package/dist/lib/recordIdAllocator.d.ts +86 -0
- package/dist/lib/recordIdAllocator.d.ts.map +1 -0
- package/dist/lib/recordIdAllocator.js +161 -0
- package/dist/lib/recordIdAllocator.js.map +1 -0
- package/dist/license.js +3 -3
- package/dist/license.js.map +1 -1
- package/dist/projectRegistry.d.ts +65 -3
- package/dist/projectRegistry.d.ts.map +1 -1
- package/dist/projectRegistry.js +233 -33
- package/dist/projectRegistry.js.map +1 -1
- package/dist/runtime/circuitBreaker.d.ts +95 -0
- package/dist/runtime/circuitBreaker.d.ts.map +1 -0
- package/dist/runtime/circuitBreaker.js +178 -0
- package/dist/runtime/circuitBreaker.js.map +1 -0
- package/dist/runtime/ensureRuntime.d.ts +103 -0
- package/dist/runtime/ensureRuntime.d.ts.map +1 -0
- package/dist/runtime/ensureRuntime.js +281 -0
- package/dist/runtime/ensureRuntime.js.map +1 -0
- package/dist/runtime/extensions.d.ts +57 -0
- package/dist/runtime/extensions.d.ts.map +1 -0
- package/dist/runtime/extensions.js +216 -0
- package/dist/runtime/extensions.js.map +1 -0
- package/dist/runtime/localHttp.d.ts +24 -0
- package/dist/runtime/localHttp.d.ts.map +1 -0
- package/dist/runtime/localHttp.js +84 -0
- package/dist/runtime/localHttp.js.map +1 -0
- package/dist/runtime/projectResolution.d.ts +29 -0
- package/dist/runtime/projectResolution.d.ts.map +1 -0
- package/dist/runtime/projectResolution.js +67 -0
- package/dist/runtime/projectResolution.js.map +1 -0
- package/dist/runtime/protocol.d.ts +62 -0
- package/dist/runtime/protocol.d.ts.map +1 -0
- package/dist/runtime/protocol.js +74 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/sentinelIssues.d.ts +26 -2
- package/dist/sentinelIssues.d.ts.map +1 -1
- package/dist/sentinelIssues.js +163 -76
- package/dist/sentinelIssues.js.map +1 -1
- package/dist/server.js +65 -12
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +83 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +445 -0
- package/dist/setup.js.map +1 -0
- package/dist/store/markdown.d.ts +14 -1
- package/dist/store/markdown.d.ts.map +1 -1
- package/dist/store/markdown.js +36 -3
- package/dist/store/markdown.js.map +1 -1
- package/dist/tools/agentic/index.d.ts.map +1 -1
- package/dist/tools/agentic/index.js +28 -2
- package/dist/tools/agentic/index.js.map +1 -1
- package/dist/tools/architect/index.d.ts.map +1 -1
- package/dist/tools/architect/index.js +7 -2
- package/dist/tools/architect/index.js.map +1 -1
- package/dist/tools/conductor/index.d.ts +9 -0
- package/dist/tools/conductor/index.d.ts.map +1 -0
- package/dist/tools/conductor/index.js +242 -0
- package/dist/tools/conductor/index.js.map +1 -0
- package/dist/tools/context.d.ts +10 -5
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +45 -18
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/coordinator/coordinator.d.ts.map +1 -1
- package/dist/tools/coordinator/coordinator.js +48 -19
- package/dist/tools/coordinator/coordinator.js.map +1 -1
- package/dist/tools/crit.d.ts +2 -1
- package/dist/tools/crit.d.ts.map +1 -1
- package/dist/tools/crit.js +19 -4
- package/dist/tools/crit.js.map +1 -1
- package/dist/tools/designer/index.d.ts.map +1 -1
- package/dist/tools/designer/index.js +4 -3
- package/dist/tools/designer/index.js.map +1 -1
- package/dist/tools/designer/lateral-tools.d.ts.map +1 -1
- package/dist/tools/designer/lateral-tools.js +4 -2
- package/dist/tools/designer/lateral-tools.js.map +1 -1
- package/dist/tools/designer.d.ts +2 -1
- package/dist/tools/designer.d.ts.map +1 -1
- package/dist/tools/designer.js +24 -12
- package/dist/tools/designer.js.map +1 -1
- package/dist/tools/dojo.d.ts +3 -2
- package/dist/tools/dojo.d.ts.map +1 -1
- package/dist/tools/dojo.js +64 -22
- package/dist/tools/dojo.js.map +1 -1
- package/dist/tools/dojoPolicy.js +1 -1
- package/dist/tools/dojoPolicy.js.map +1 -1
- package/dist/tools/friction.d.ts.map +1 -1
- package/dist/tools/friction.js +16 -6
- package/dist/tools/friction.js.map +1 -1
- package/dist/tools/guardian.d.ts +29 -7
- package/dist/tools/guardian.d.ts.map +1 -1
- package/dist/tools/guardian.js +90 -75
- package/dist/tools/guardian.js.map +1 -1
- package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -1
- package/dist/tools/hygiene/oracle-hygiene.js +8 -2
- package/dist/tools/hygiene/oracle-hygiene.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +29 -18
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/learnings.d.ts +2 -1
- package/dist/tools/learnings.d.ts.map +1 -1
- package/dist/tools/learnings.js +31 -15
- package/dist/tools/learnings.js.map +1 -1
- package/dist/tools/oracle.d.ts.map +1 -1
- package/dist/tools/oracle.js +19 -6
- package/dist/tools/oracle.js.map +1 -1
- package/dist/tools/policy.d.ts +2 -1
- package/dist/tools/policy.d.ts.map +1 -1
- package/dist/tools/policy.js +28 -9
- package/dist/tools/policy.js.map +1 -1
- package/dist/tools/postoffice/index.d.ts +10 -0
- package/dist/tools/postoffice/index.d.ts.map +1 -0
- package/dist/tools/postoffice/index.js +218 -0
- package/dist/tools/postoffice/index.js.map +1 -0
- package/dist/tools/postoffice.d.ts +78 -0
- package/dist/tools/postoffice.d.ts.map +1 -0
- package/dist/tools/postoffice.js +199 -0
- package/dist/tools/postoffice.js.map +1 -0
- package/dist/tools/provenance.d.ts +7 -0
- package/dist/tools/provenance.d.ts.map +1 -1
- package/dist/tools/provenance.js +42 -16
- package/dist/tools/provenance.js.map +1 -1
- package/dist/tools/registry/index.d.ts.map +1 -1
- package/dist/tools/registry/index.js +41 -12
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/sentinel/index.d.ts +1 -0
- package/dist/tools/sentinel/index.d.ts.map +1 -1
- package/dist/tools/sentinel/index.js +88 -4
- package/dist/tools/sentinel/index.js.map +1 -1
- package/dist/tools/sentinel.d.ts +117 -1
- package/dist/tools/sentinel.d.ts.map +1 -1
- package/dist/tools/sentinel.js +761 -339
- package/dist/tools/sentinel.js.map +1 -1
- package/dist/tools/shared/index.d.ts +2 -1
- package/dist/tools/shared/index.d.ts.map +1 -1
- package/dist/tools/shared/index.js +2 -1
- package/dist/tools/shared/index.js.map +1 -1
- package/dist/tools/shared/response.d.ts +24 -0
- package/dist/tools/shared/response.d.ts.map +1 -1
- package/dist/tools/shared/response.js +61 -7
- package/dist/tools/shared/response.js.map +1 -1
- package/dist/tools/shared/storeRead.d.ts +153 -0
- package/dist/tools/shared/storeRead.d.ts.map +1 -0
- package/dist/tools/shared/storeRead.js +242 -0
- package/dist/tools/shared/storeRead.js.map +1 -0
- package/dist/tools/testSpec.d.ts +3 -2
- package/dist/tools/testSpec.d.ts.map +1 -1
- package/dist/tools/testSpec.js +51 -14
- package/dist/tools/testSpec.js.map +1 -1
- package/dist/tools/vector.d.ts +33 -1
- package/dist/tools/vector.d.ts.map +1 -1
- package/dist/tools/vector.js +31 -5
- package/dist/tools/vector.js.map +1 -1
- package/dist/tools/zoom/index.d.ts +15 -0
- package/dist/tools/zoom/index.d.ts.map +1 -0
- package/dist/tools/zoom/index.js +174 -0
- package/dist/tools/zoom/index.js.map +1 -0
- package/dist/tools/zoom.d.ts +234 -0
- package/dist/tools/zoom.d.ts.map +1 -0
- package/dist/tools/zoom.js +627 -0
- package/dist/tools/zoom.js.map +1 -0
- package/dist/transports/bridge.d.ts +1 -1
- package/dist/transports/bridge.d.ts.map +1 -1
- package/dist/transports/bridge.js +2 -0
- package/dist/transports/bridge.js.map +1 -1
- package/dist/transports/http.d.ts +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +3 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/index.d.ts +1 -0
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports/index.js +1 -0
- package/dist/transports/index.js.map +1 -1
- package/dist/transports/mcp.d.ts +1 -1
- package/dist/transports/mcp.d.ts.map +1 -1
- package/dist/transports/mcp.js +7 -3
- package/dist/transports/mcp.js.map +1 -1
- package/dist/transports/stdio.d.ts +1 -1
- package/dist/transports/stdio.d.ts.map +1 -1
- package/dist/transports/stdio.js +2 -0
- package/dist/transports/stdio.js.map +1 -1
- package/dist/transports/thinStdio.d.ts +22 -0
- package/dist/transports/thinStdio.d.ts.map +1 -0
- package/dist/transports/thinStdio.js +218 -0
- package/dist/transports/thinStdio.js.map +1 -0
- package/dist/transports/types.d.ts +8 -1
- package/dist/transports/types.d.ts.map +1 -1
- package/dist/types/agent-services.d.ts +7 -0
- package/dist/types/agent-services.d.ts.map +1 -1
- package/package.json +9 -4
- package/templates/com.decibel.daemon.plist +6 -1
- package/dist/tools/deck.d.ts +0 -11
- package/dist/tools/deck.d.ts.map +0 -1
- package/dist/tools/deck.js +0 -1656
- package/dist/tools/deck.js.map +0 -1
- package/dist/tools/mother.d.ts +0 -11
- package/dist/tools/mother.d.ts.map +0 -1
- package/dist/tools/mother.js +0 -503
- package/dist/tools/mother.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -3
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -189
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/senken.d.ts +0 -11
- package/dist/tools/senken.d.ts.map +0 -1
- package/dist/tools/senken.js +0 -482
- package/dist/tools/senken.js.map +0 -1
- package/dist/tools/terminal.d.ts +0 -17
- package/dist/tools/terminal.d.ts.map +0 -1
- package/dist/tools/terminal.js +0 -968
- package/dist/tools/terminal.js.map +0 -1
- package/dist/tools/toolsIndex.d.ts +0 -5
- package/dist/tools/toolsIndex.d.ts.map +0 -1
- package/dist/tools/toolsIndex.js +0 -37
- package/dist/tools/toolsIndex.js.map +0 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialized ISS-NNNN and EPIC-NNNN allocation.
|
|
3
|
+
*
|
|
4
|
+
* The defect this closes: `create_issue` picked the next id by scanning the
|
|
5
|
+
* issues directory for the current maximum, then wrote the file many awaits
|
|
6
|
+
* later. Two processes could read the same maximum and both write ISS-0141.
|
|
7
|
+
* Four duplicate-id groups exist on disk from exactly this (ISS-0015, ISS-0028,
|
|
8
|
+
* ISS-0054, ISS-0112), reported independently by the `machina` peer and
|
|
9
|
+
* reproduced locally.
|
|
10
|
+
*
|
|
11
|
+
* Two independent defences, because a lock only protects callers that take it:
|
|
12
|
+
*
|
|
13
|
+
* 1. The lock spans **allocation through successful write**, not just the id
|
|
14
|
+
* calculation. Serializing only the scan leaves the same race — both
|
|
15
|
+
* processes still compute 141 before either file lands.
|
|
16
|
+
*
|
|
17
|
+
* 2. The write itself is O_EXCL. If a caller bypasses the lock entirely — an
|
|
18
|
+
* old client, a migration script, a future mistake — a colliding write
|
|
19
|
+
* fails loudly with EEXIST instead of silently overwriting a real issue.
|
|
20
|
+
*
|
|
21
|
+
* Both `createIssue` implementations (src/tools/sentinel.ts and
|
|
22
|
+
* src/sentinelIssues.ts) allocate from a single numbering space and write
|
|
23
|
+
* different formats into the same directory, so they must share this path or
|
|
24
|
+
* they race against each other.
|
|
25
|
+
*/
|
|
26
|
+
import { promises as fs } from 'fs';
|
|
27
|
+
import path from 'path';
|
|
28
|
+
import { withFileLock } from './fileLock.js';
|
|
29
|
+
/**
|
|
30
|
+
* Lock file guarding id allocation, scoped per record directory.
|
|
31
|
+
*
|
|
32
|
+
* Issues and epics number independently and live in different directories, so
|
|
33
|
+
* one lock file name per directory is exactly one lock per numbering space.
|
|
34
|
+
*/
|
|
35
|
+
const LOCK_FILENAME = '.record-id.lock';
|
|
36
|
+
/** Records the allocator considers when scanning for the current maximum. */
|
|
37
|
+
function isRecordFile(filename) {
|
|
38
|
+
return /\.(md|yml|yaml)$/i.test(filename);
|
|
39
|
+
}
|
|
40
|
+
function frontmatterRegion(content) {
|
|
41
|
+
const delimited = /^---\n([\s\S]*?)\n---/.exec(content);
|
|
42
|
+
if (delimited)
|
|
43
|
+
return delimited[1];
|
|
44
|
+
// Bare-YAML records have no delimiters; the whole head is the region.
|
|
45
|
+
if (/^---/.test(content.trimStart()))
|
|
46
|
+
return null;
|
|
47
|
+
const headingIdx = content.split('\n').findIndex((l) => /^#{1,6}\s/.test(l));
|
|
48
|
+
return headingIdx > 0 ? content.split('\n').slice(0, headingIdx).join('\n') : content;
|
|
49
|
+
}
|
|
50
|
+
export function formatRecordId(prefix, num) {
|
|
51
|
+
return `${prefix}-${num.toString().padStart(4, '0')}`;
|
|
52
|
+
}
|
|
53
|
+
export function formatIssueId(num) {
|
|
54
|
+
return formatRecordId('ISS', num);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Highest PREFIX-NNNN currently present, by filename prefix or frontmatter id.
|
|
58
|
+
*
|
|
59
|
+
* Both sources are checked because the two record formats disagree: PREFIX-NNNN
|
|
60
|
+
* files carry the id in the name, while timestamp-slug records carry it only in
|
|
61
|
+
* frontmatter. Scanning one source alone under-counts and hands out an id that
|
|
62
|
+
* is already taken.
|
|
63
|
+
*/
|
|
64
|
+
export async function scanMaxRecordNumber(dir, prefix) {
|
|
65
|
+
let max = 0;
|
|
66
|
+
let files;
|
|
67
|
+
try {
|
|
68
|
+
files = await fs.readdir(dir);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return 0; // Directory does not exist yet.
|
|
72
|
+
}
|
|
73
|
+
const fromName = new RegExp(`^${prefix}-(\\d+)`, 'i');
|
|
74
|
+
const fromId = new RegExp(`^${prefix}-(\\d+)$`, 'i');
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
const prefixMatch = file.match(fromName);
|
|
77
|
+
if (prefixMatch) {
|
|
78
|
+
max = Math.max(max, parseInt(prefixMatch[1], 10));
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (!isRecordFile(file))
|
|
82
|
+
continue;
|
|
83
|
+
try {
|
|
84
|
+
const content = await fs.readFile(path.join(dir, file), 'utf-8');
|
|
85
|
+
const region = frontmatterRegion(content);
|
|
86
|
+
if (!region)
|
|
87
|
+
continue;
|
|
88
|
+
const idLine = region.split('\n').find((l) => l.trim().toLowerCase().startsWith('id:'));
|
|
89
|
+
if (!idLine)
|
|
90
|
+
continue;
|
|
91
|
+
const idVal = idLine.slice(idLine.indexOf(':') + 1).trim();
|
|
92
|
+
const idMatch = idVal.match(fromId);
|
|
93
|
+
if (idMatch)
|
|
94
|
+
max = Math.max(max, parseInt(idMatch[1], 10));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Unreadable record — skip rather than abort the whole allocation.
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return max;
|
|
101
|
+
}
|
|
102
|
+
export async function scanMaxIssueNumber(issuesDir) {
|
|
103
|
+
return scanMaxRecordNumber(issuesDir, 'ISS');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Allocate the next PREFIX-NNNN and write the record, with both held under one
|
|
107
|
+
* lock so no other process can allocate the same id in between.
|
|
108
|
+
*
|
|
109
|
+
* `buildContent` receives the allocated id because the id appears inside the
|
|
110
|
+
* record body (frontmatter `id:`), so content cannot be built before allocation.
|
|
111
|
+
*
|
|
112
|
+
* On the rare EEXIST — a bypassing writer took the id between our scan and our
|
|
113
|
+
* write — the allocation is retried rather than failed, up to `maxAttempts`.
|
|
114
|
+
* Retrying is correct here: the id is genuinely taken, and the next one up is a
|
|
115
|
+
* valid answer to the caller's request.
|
|
116
|
+
*/
|
|
117
|
+
export async function allocateAndWriteRecord(dir, prefix, extension, slug, buildContent, options = {}) {
|
|
118
|
+
const maxAttempts = options.maxAttempts ?? 5;
|
|
119
|
+
const lockPath = path.join(dir, LOCK_FILENAME);
|
|
120
|
+
return withFileLock(lockPath, async () => {
|
|
121
|
+
let next = (await scanMaxRecordNumber(dir, prefix)) + 1;
|
|
122
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
123
|
+
const id = formatRecordId(prefix, next);
|
|
124
|
+
const filename = `${id}-${slug}.${extension}`;
|
|
125
|
+
const filePath = path.join(dir, filename);
|
|
126
|
+
options.validate?.(filePath);
|
|
127
|
+
try {
|
|
128
|
+
// 'wx' is O_EXCL: fails rather than clobbering an existing record.
|
|
129
|
+
await fs.writeFile(filePath, buildContent(id), { encoding: 'utf-8', flag: 'wx' });
|
|
130
|
+
return { id, filename, filePath };
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (err.code !== 'EEXIST')
|
|
134
|
+
throw err;
|
|
135
|
+
next++; // Taken by a writer that did not hold the lock. Try the next.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
throw new Error(`Could not allocate an unused ${prefix} id in ${dir} after ${maxAttempts} attempts ` +
|
|
139
|
+
`(last tried ${formatRecordId(prefix, next - 1)}). The directory may contain records ` +
|
|
140
|
+
`written by a process that bypasses id locking.`);
|
|
141
|
+
}, { timeoutMs: options.timeoutMs });
|
|
142
|
+
}
|
|
143
|
+
/** ISS-NNNN allocation. See {@link allocateAndWriteRecord}. */
|
|
144
|
+
export async function allocateAndWriteIssue(issuesDir, extension, slug, buildContent, options = {}) {
|
|
145
|
+
return allocateAndWriteRecord(issuesDir, 'ISS', extension, slug, buildContent, options);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* EPIC-NNNN allocation.
|
|
149
|
+
*
|
|
150
|
+
* Added because `logEpic` had the pre-lock defect verbatim: it read the
|
|
151
|
+
* directory for the current maximum, then wrote the file ~20 awaits later.
|
|
152
|
+
* Epics are the worse half of that race. An issue collision at least left two
|
|
153
|
+
* files and a visible duplicate id; the epic path wrote through
|
|
154
|
+
* `writeFileAtomic`, whose rename CLOBBERS, so the loser was not duplicated —
|
|
155
|
+
* it was gone, and its caller had already been told it was created. Found by
|
|
156
|
+
* the S5 concurrency sweep.
|
|
157
|
+
*/
|
|
158
|
+
export async function allocateAndWriteEpic(epicsDir, slug, buildContent, options = {}) {
|
|
159
|
+
return allocateAndWriteRecord(epicsDir, 'EPIC', 'md', slug, buildContent, options);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=recordIdAllocator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordIdAllocator.js","sourceRoot":"","sources":["../../src/lib/recordIdAllocator.ts"],"names":[],"mappings":"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"}
|
package/dist/license.js
CHANGED
|
@@ -12,9 +12,9 @@ import { log } from './config.js';
|
|
|
12
12
|
const KEY_PATTERN = /^DCBL-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$/;
|
|
13
13
|
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
14
14
|
const OFFLINE_GRACE_MS = 72 * 60 * 60 * 1000; // 72 hours
|
|
15
|
-
// Supabase project for license verification (
|
|
16
|
-
const SUPABASE_URL = 'https://
|
|
17
|
-
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
|
|
15
|
+
// Supabase project for license verification (Core)
|
|
16
|
+
const SUPABASE_URL = 'https://dqftcixhsvcjtyxsxoao.supabase.co';
|
|
17
|
+
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRxZnRjaXhoc3ZjanR5eHN4b2FvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjcyMTgzMTYsImV4cCI6MjA4Mjc5NDMxNn0.erZq0zJMF-tATX7b0mofGsajFUvcqlZE5PQ4qcggmGc';
|
|
18
18
|
// ============================================================================
|
|
19
19
|
// License Validator
|
|
20
20
|
// ============================================================================
|
package/dist/license.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,uDAAuD;AACvD,+EAA+E;AAC/E,+DAA+D;AAC/D,6DAA6D;AAC7D,+EAA+E;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,WAAW,GAAG,4CAA4C,CAAC;AACjE,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AACrD,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAEzD,
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,47 @@ export interface ProjectEntry {
|
|
|
9
9
|
aliases?: string[];
|
|
10
10
|
/** If true, this is the default project when none specified */
|
|
11
11
|
default?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Per-device path overrides, keyed by device ID (see getDeviceId).
|
|
14
|
+
* The same registry file can serve multiple machines: `path` stays the
|
|
15
|
+
* canonical location (external drives mount at the same /Volumes/... path on
|
|
16
|
+
* any Mac, so they live here), while machine-local checkouts go in
|
|
17
|
+
* devicePaths. Resolution prefers this device's override, then the canonical
|
|
18
|
+
* path, then any other device's copy that happens to exist here.
|
|
19
|
+
*/
|
|
20
|
+
devicePaths?: Record<string, string>;
|
|
21
|
+
/** Display-only (set on entries returned by listProjects): the canonical registered path. */
|
|
22
|
+
canonicalPath?: string;
|
|
23
|
+
/** Display-only: whether the effective path exists with a .decibel folder on this device. */
|
|
24
|
+
available?: boolean;
|
|
25
|
+
/** Display-only: which candidate won — 'device' | 'canonical' | 'other_device'. */
|
|
26
|
+
pathSource?: EffectivePathSource;
|
|
27
|
+
}
|
|
28
|
+
export type EffectivePathSource = 'device' | 'canonical' | 'other_device';
|
|
29
|
+
export interface EffectivePath {
|
|
30
|
+
path: string;
|
|
31
|
+
source: EffectivePathSource;
|
|
32
|
+
available: boolean;
|
|
12
33
|
}
|
|
13
34
|
export interface ProjectRegistry {
|
|
14
35
|
version: 1;
|
|
15
36
|
projects: ProjectEntry[];
|
|
16
37
|
}
|
|
38
|
+
export declare function getDeviceId(): string;
|
|
39
|
+
/**
|
|
40
|
+
* All paths an entry might live at, most-specific first:
|
|
41
|
+
* this device's override → canonical path → other devices' copies.
|
|
42
|
+
*/
|
|
43
|
+
export declare function listCandidatePaths(entry: ProjectEntry): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Pick the path this entry actually lives at ON THIS DEVICE: the first
|
|
46
|
+
* candidate whose .decibel/ folder exists. External drives resolve via the
|
|
47
|
+
* canonical path whenever mounted; machine-local checkouts via devicePaths.
|
|
48
|
+
* If nothing exists (drive unplugged, no local copy), returns the
|
|
49
|
+
* most-specific candidate with available=false so error messages can point
|
|
50
|
+
* at the right location.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getEffectivePath(entry: ProjectEntry): EffectivePath;
|
|
17
53
|
/**
|
|
18
54
|
* Resolve a project ID or alias to its filesystem path.
|
|
19
55
|
*
|
|
@@ -30,13 +66,39 @@ export interface ProjectRegistry {
|
|
|
30
66
|
*/
|
|
31
67
|
export declare function resolveProject(projectId: string): ProjectEntry;
|
|
32
68
|
/**
|
|
33
|
-
* List all registered projects
|
|
69
|
+
* List all registered projects. Entries carry the device-effective `path`
|
|
70
|
+
* (so every consumer reads the right location for this machine), plus
|
|
71
|
+
* display fields: canonicalPath, available, pathSource.
|
|
34
72
|
*/
|
|
35
73
|
export declare function listProjects(): ProjectEntry[];
|
|
74
|
+
export interface RegisterResult {
|
|
75
|
+
action: 'added' | 'updated_canonical' | 'device_linked' | 'kept_existing_device_link';
|
|
76
|
+
id: string;
|
|
77
|
+
/** The path now effective for this device. */
|
|
78
|
+
path: string;
|
|
79
|
+
/** For kept_existing_device_link: the path that was NOT recorded. */
|
|
80
|
+
skippedPath?: string;
|
|
81
|
+
}
|
|
36
82
|
/**
|
|
37
|
-
* Register a new project or update an existing one
|
|
83
|
+
* Register a new project or update an existing one — device-aware.
|
|
84
|
+
*
|
|
85
|
+
* New IDs register their path as canonical. For an existing ID with a
|
|
86
|
+
* DIFFERENT path, the new path is recorded as this device's override
|
|
87
|
+
* (devicePaths[deviceId]) so machines don't clobber each other's locations —
|
|
88
|
+
* the scenario that broke the laptop when the registry held desktop-only
|
|
89
|
+
* /Volumes/Ashitaka paths. Pass opts.canonical=true to deliberately rewrite
|
|
90
|
+
* the canonical path (e.g. the project genuinely moved).
|
|
91
|
+
*
|
|
92
|
+
* If this device is ALREADY linked to a valid copy, a differing path is NOT
|
|
93
|
+
* recorded unless opts.repoint=true — otherwise a second copy of the same
|
|
94
|
+
* project (e.g. a backup on an external drive) discovered later in a scan
|
|
95
|
+
* would silently steal the link from the working copy. registry_add passes
|
|
96
|
+
* repoint (explicit user intent); registry_scan apply does not.
|
|
38
97
|
*/
|
|
39
|
-
export declare function registerProject(entry: ProjectEntry
|
|
98
|
+
export declare function registerProject(entry: ProjectEntry, opts?: {
|
|
99
|
+
canonical?: boolean;
|
|
100
|
+
repoint?: boolean;
|
|
101
|
+
}): RegisterResult;
|
|
40
102
|
/**
|
|
41
103
|
* Remove a project from the registry
|
|
42
104
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectRegistry.d.ts","sourceRoot":"","sources":["../src/projectRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projectRegistry.d.ts","sourceRoot":"","sources":["../src/projectRegistry.ts"],"names":[],"mappings":"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"}
|