syntaur 0.11.0 → 0.13.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/.claude-plugin/plugin.json +3 -1
- package/README.md +21 -0
- package/dashboard/dist/assets/{_basePickBy-DPIRyskD.js → _basePickBy-qEDLAY_J.js} +1 -1
- package/dashboard/dist/assets/{_baseUniq-CwicZZgc.js → _baseUniq-7tDs18Gn.js} +1 -1
- package/dashboard/dist/assets/{arc-CcHe1anq.js → arc-Brdw0dYW.js} +1 -1
- package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-4lwARCsm.js → architectureDiagram-2XIMDMQ5-BiEdLT9m.js} +1 -1
- package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-SdqET9RP.js → blockDiagram-WCTKOSBZ-HC-j_hPZ.js} +1 -1
- package/dashboard/dist/assets/{c4Diagram-IC4MRINW-BAKj5SV2.js → c4Diagram-IC4MRINW-DA_rWbl7.js} +1 -1
- package/dashboard/dist/assets/channel-D2-caOn6.js +1 -0
- package/dashboard/dist/assets/{chunk-4BX2VUAB-Dn95vjsS.js → chunk-4BX2VUAB-CF3hguyj.js} +1 -1
- package/dashboard/dist/assets/{chunk-55IACEB6-C6L5bDoe.js → chunk-55IACEB6-BTeCeIc_.js} +1 -1
- package/dashboard/dist/assets/{chunk-FMBD7UC4---Go123J.js → chunk-FMBD7UC4-8qVvxmks.js} +1 -1
- package/dashboard/dist/assets/{chunk-JSJVCQXG-C9E63Ryg.js → chunk-JSJVCQXG-DCf8n7EO.js} +1 -1
- package/dashboard/dist/assets/{chunk-KX2RTZJC-Yyi0h479.js → chunk-KX2RTZJC-CcpjTmME.js} +1 -1
- package/dashboard/dist/assets/{chunk-NQ4KR5QH-2Fh1XO45.js → chunk-NQ4KR5QH-BnFPKo4-.js} +1 -1
- package/dashboard/dist/assets/{chunk-QZHKN3VN-B4a3DKz-.js → chunk-QZHKN3VN-IPMVLLv2.js} +1 -1
- package/dashboard/dist/assets/{chunk-WL4C6EOR-XtMf_tFy.js → chunk-WL4C6EOR-D1pQmHqX.js} +1 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-HFOb_XEt.js +1 -0
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-HFOb_XEt.js +1 -0
- package/dashboard/dist/assets/clone-BrYOwgIq.js +1 -0
- package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-8wHbmnAP.js → cose-bilkent-S5V4N54A-tvJjvBQr.js} +1 -1
- package/dashboard/dist/assets/{dagre-KLK3FWXG-uJZOLE_S.js → dagre-KLK3FWXG-qp1vt6LY.js} +1 -1
- package/dashboard/dist/assets/{diagram-E7M64L7V-BZih6Ivf.js → diagram-E7M64L7V-VF5eizNr.js} +1 -1
- package/dashboard/dist/assets/{diagram-IFDJBPK2-CtR6WhET.js → diagram-IFDJBPK2-C3pCbJ1e.js} +1 -1
- package/dashboard/dist/assets/{diagram-P4PSJMXO-DTGhoDSE.js → diagram-P4PSJMXO-D-taXZwH.js} +1 -1
- package/dashboard/dist/assets/{erDiagram-INFDFZHY-Yr93h1x4.js → erDiagram-INFDFZHY-QjY-NHVs.js} +1 -1
- package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-CZ3QY4eZ.js → flowDiagram-PKNHOUZH-FjO8P5Tq.js} +1 -1
- package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-CSf--huI.js → ganttDiagram-A5KZAMGK-Bsn7CyK3.js} +1 -1
- package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-CokKKyLR.js → gitGraphDiagram-K3NZZRJ6-BZ8DjhnF.js} +1 -1
- package/dashboard/dist/assets/{graph-DRs4cE7X.js → graph-AdliIYqX.js} +1 -1
- package/dashboard/dist/assets/index-BoR_oyUZ.css +1 -0
- package/dashboard/dist/assets/index-RCBI4aX2.js +525 -0
- package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-C4CTdWLD.js → infoDiagram-LFFYTUFH-BfZjLA86.js} +1 -1
- package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-DGrfYHHk.js → ishikawaDiagram-PHBUUO56-BSgSGMp5.js} +1 -1
- package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-CEDbuCY2.js → journeyDiagram-4ABVD52K-BlQ7qeMC.js} +1 -1
- package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-BjgAWDsE.js → kanban-definition-K7BYSVSG-CifO0AUu.js} +1 -1
- package/dashboard/dist/assets/{layout-Coi0pRnm.js → layout-B9r-gpD9.js} +1 -1
- package/dashboard/dist/assets/{linear-B4xKytgE.js → linear-CaaIRxVZ.js} +1 -1
- package/dashboard/dist/assets/{mermaid.core-dkpoLY2K.js → mermaid.core-C8wCWYw-.js} +4 -4
- package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-BgUfAXkB.js → mindmap-definition-YRQLILUH-BpX5T7iT.js} +1 -1
- package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-BBuMJroZ.js → pieDiagram-SKSYHLDU-BNGYtWrc.js} +1 -1
- package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-iXygRpen.js → quadrantDiagram-337W2JSQ-CR4GeM9D.js} +1 -1
- package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-DhJGFHd3.js → requirementDiagram-Z7DCOOCP-CXrPkMLl.js} +1 -1
- package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-CLkFLBq1.js → sankeyDiagram-WA2Y5GQK-CIzof7Dm.js} +1 -1
- package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DQh28Zt-.js → sequenceDiagram-2WXFIKYE-BJZLt0O2.js} +1 -1
- package/dashboard/dist/assets/{stateDiagram-RAJIS63D-BZKsD9LJ.js → stateDiagram-RAJIS63D-x9gC6zy6.js} +1 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-CN5Dcv7u.js +1 -0
- package/dashboard/dist/assets/{timeline-definition-YZTLITO2-DCJlSWVw.js → timeline-definition-YZTLITO2-D_ZSQn1K.js} +1 -1
- package/dashboard/dist/assets/{treemap-KZPCXAKY-DEGy-zW9.js → treemap-KZPCXAKY-LPpMEco4.js} +1 -1
- package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CfQAKq7b.js → vennDiagram-LZ73GAT5-CRFZQpr7.js} +1 -1
- package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-CgD-asFJ.js → xychartDiagram-JWTSCODW-Bivutynw.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/dashboard/server.js +355 -81
- package/dist/dashboard/server.js.map +1 -1
- package/dist/db/leases-db.d.ts +178 -0
- package/dist/db/leases-db.js +557 -0
- package/dist/db/leases-db.js.map +1 -0
- package/dist/index.js +1219 -357
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/platforms/claude-code/.claude-plugin/plugin.json +3 -1
- package/platforms/claude-code/skills/claim-resource/SKILL.md +89 -0
- package/platforms/claude-code/skills/release-resource/SKILL.md +65 -0
- package/platforms/claude-code/skills/syntaur-protocol/SKILL.md +1 -0
- package/platforms/codex/skills/claim-resource/SKILL.md +89 -0
- package/platforms/codex/skills/release-resource/SKILL.md +65 -0
- package/platforms/codex/skills/syntaur-protocol/SKILL.md +1 -0
- package/skills/claim-resource/SKILL.md +89 -0
- package/skills/release-resource/SKILL.md +65 -0
- package/skills/syntaur-protocol/SKILL.md +1 -0
- package/dashboard/dist/assets/channel-DKdluNz1.js +0 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-93dPLc4W.js +0 -1
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-93dPLc4W.js +0 -1
- package/dashboard/dist/assets/clone-vnWuXQgZ.js +0 -1
- package/dashboard/dist/assets/index-B9uCPhOL.js +0 -510
- package/dashboard/dist/assets/index-BKoccIZR.css +0 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DU5UnRV-.js +0 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resource leases database module.
|
|
5
|
+
*
|
|
6
|
+
* Shares `~/.syntaur/syntaur.db` with `session-db.ts` and `proof-db.ts`. Each
|
|
7
|
+
* module owns its own schema-version row in the shared `meta` table and creates
|
|
8
|
+
* `meta` with `IF NOT EXISTS` so init order is irrelevant and standalone init
|
|
9
|
+
* (e.g. in a leases-only test DB) is safe.
|
|
10
|
+
*
|
|
11
|
+
* Concurrency model:
|
|
12
|
+
* - `journal_mode = WAL` allows concurrent readers and one writer.
|
|
13
|
+
* - `busy_timeout = 5000` lets SQLite absorb short lock contention internally.
|
|
14
|
+
* - All mutating ops run inside `db.transaction(fn).immediate()` which issues
|
|
15
|
+
* `BEGIN IMMEDIATE` — acquires the reserved lock up-front so two concurrent
|
|
16
|
+
* writers serialize cleanly.
|
|
17
|
+
*
|
|
18
|
+
* Atomic claim uses the tuple-subquery form (the bundled SQLite is built
|
|
19
|
+
* without `SQLITE_ENABLE_UPDATE_DELETE_LIMIT`, so `UPDATE...ORDER BY...LIMIT...
|
|
20
|
+
* RETURNING` is a syntax error — verified empirically).
|
|
21
|
+
*
|
|
22
|
+
* Timestamp invariant: every timestamp written from this module is produced by
|
|
23
|
+
* `nowIso()` which calls `new Date().toISOString()` (canonical UTC, lexicographic-
|
|
24
|
+
* safe). Lexicographic `<=` comparisons in SQL rely on this. The CLI never
|
|
25
|
+
* accepts user-supplied timestamps. A future caller writing a non-canonical
|
|
26
|
+
* timestamp would silently misorder `<=` checks.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
type MemberStatus = 'idle' | 'leased' | 'retired';
|
|
30
|
+
type LeaseState = 'active' | 'released' | 'expired' | 'revoked';
|
|
31
|
+
interface InventoryRow {
|
|
32
|
+
slug: string;
|
|
33
|
+
kind: string;
|
|
34
|
+
display_name: string | null;
|
|
35
|
+
default_ttl_s: number;
|
|
36
|
+
created_at: string;
|
|
37
|
+
}
|
|
38
|
+
interface InventoryMemberRow {
|
|
39
|
+
inventory_slug: string;
|
|
40
|
+
member_id: string;
|
|
41
|
+
status: MemberStatus;
|
|
42
|
+
generation: number;
|
|
43
|
+
metadata_json: string | null;
|
|
44
|
+
last_used_at: string | null;
|
|
45
|
+
retired_at: string | null;
|
|
46
|
+
}
|
|
47
|
+
interface LeaseRow {
|
|
48
|
+
lease_id: string;
|
|
49
|
+
inventory_slug: string;
|
|
50
|
+
member_id: string;
|
|
51
|
+
member_gen: number;
|
|
52
|
+
state: LeaseState;
|
|
53
|
+
granted_at: string;
|
|
54
|
+
expires_at: string;
|
|
55
|
+
released_at: string | null;
|
|
56
|
+
requested_for: string | null;
|
|
57
|
+
}
|
|
58
|
+
interface LeaseEventRow {
|
|
59
|
+
id: number;
|
|
60
|
+
lease_id: string;
|
|
61
|
+
event: string;
|
|
62
|
+
at: string;
|
|
63
|
+
detail_json: string | null;
|
|
64
|
+
}
|
|
65
|
+
interface InventoryDetail {
|
|
66
|
+
inventory: InventoryRow;
|
|
67
|
+
members: InventoryMemberRow[];
|
|
68
|
+
active_leases: LeaseRow[];
|
|
69
|
+
}
|
|
70
|
+
interface CreateInventoryInput {
|
|
71
|
+
slug: string;
|
|
72
|
+
kind: string;
|
|
73
|
+
display_name?: string;
|
|
74
|
+
default_ttl_s: number;
|
|
75
|
+
}
|
|
76
|
+
interface AddMemberInput {
|
|
77
|
+
inventory_slug: string;
|
|
78
|
+
member_id: string;
|
|
79
|
+
metadata?: Record<string, unknown>;
|
|
80
|
+
}
|
|
81
|
+
interface ClaimResult {
|
|
82
|
+
lease_id: string;
|
|
83
|
+
inventory_slug: string;
|
|
84
|
+
member_id: string;
|
|
85
|
+
member_gen: number;
|
|
86
|
+
granted_at: string;
|
|
87
|
+
expires_at: string;
|
|
88
|
+
metadata: Record<string, unknown> | null;
|
|
89
|
+
}
|
|
90
|
+
interface ListLeasesFilter {
|
|
91
|
+
inventory?: string;
|
|
92
|
+
state?: LeaseState;
|
|
93
|
+
}
|
|
94
|
+
declare class NoIdleMemberError extends Error {
|
|
95
|
+
readonly inventorySlug: string;
|
|
96
|
+
constructor(inventorySlug: string);
|
|
97
|
+
}
|
|
98
|
+
declare class StaleLeaseError extends Error {
|
|
99
|
+
readonly leaseId: string;
|
|
100
|
+
constructor(leaseId: string);
|
|
101
|
+
}
|
|
102
|
+
declare class NotFoundError extends Error {
|
|
103
|
+
readonly id: string;
|
|
104
|
+
constructor(id: string);
|
|
105
|
+
}
|
|
106
|
+
declare class LeaseContentionError extends Error {
|
|
107
|
+
readonly inventorySlug: string;
|
|
108
|
+
constructor(inventorySlug: string);
|
|
109
|
+
}
|
|
110
|
+
declare class MemberInUseError extends Error {
|
|
111
|
+
readonly inventorySlug: string;
|
|
112
|
+
readonly memberId: string;
|
|
113
|
+
constructor(inventorySlug: string, memberId: string);
|
|
114
|
+
}
|
|
115
|
+
declare class DuplicateInventoryError extends Error {
|
|
116
|
+
readonly slug: string;
|
|
117
|
+
constructor(slug: string);
|
|
118
|
+
}
|
|
119
|
+
declare class DuplicateMemberError extends Error {
|
|
120
|
+
readonly inventorySlug: string;
|
|
121
|
+
readonly memberId: string;
|
|
122
|
+
constructor(inventorySlug: string, memberId: string);
|
|
123
|
+
}
|
|
124
|
+
/** Canonical UTC ISO 8601 timestamp. Lexicographic-safe for SQL `<=` checks. */
|
|
125
|
+
declare function nowIso(): string;
|
|
126
|
+
/**
|
|
127
|
+
* Initialize the leases database. Idempotent — repeated calls return the same
|
|
128
|
+
* singleton handle. Pass an explicit `dbPath` for tests; defaults to
|
|
129
|
+
* `~/.syntaur/syntaur.db`. Safe to run standalone (creates its own `meta` table).
|
|
130
|
+
*/
|
|
131
|
+
declare function initLeasesDb(dbPath?: string): Database.Database;
|
|
132
|
+
declare function getLeasesDb(): Database.Database;
|
|
133
|
+
declare function closeLeasesDb(): void;
|
|
134
|
+
declare function resetLeasesDb(): void;
|
|
135
|
+
declare function createInventory(input: CreateInventoryInput): InventoryRow;
|
|
136
|
+
declare function listInventories(): InventoryRow[];
|
|
137
|
+
declare function getInventoryDetail(slug: string): InventoryDetail | null;
|
|
138
|
+
declare function addMember(input: AddMemberInput): InventoryMemberRow;
|
|
139
|
+
declare function retireMember(inventorySlug: string, memberId: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* Claim an idle member of `slug`. Atomic — uses `BEGIN IMMEDIATE` so two
|
|
142
|
+
* concurrent claimants serialize. Returns lease metadata or throws
|
|
143
|
+
* `NoIdleMemberError` if the inventory has nothing claimable after sweeping.
|
|
144
|
+
*/
|
|
145
|
+
declare function claimLease(slug: string, ttl_s: number, requested_for?: string): ClaimResult;
|
|
146
|
+
declare function releaseLease(lease_id: string): void;
|
|
147
|
+
/**
|
|
148
|
+
* Extend a lease's TTL from NOW. Refuses if the lease is no longer active,
|
|
149
|
+
* already past its wall-clock expiry, or its bound member generation has
|
|
150
|
+
* advanced.
|
|
151
|
+
*/
|
|
152
|
+
declare function extendLease(lease_id: string, ttl_s: number): {
|
|
153
|
+
new_expires_at: string;
|
|
154
|
+
};
|
|
155
|
+
declare function getLease(lease_id: string): LeaseRow | null;
|
|
156
|
+
declare function listLeases(filter?: ListLeasesFilter): LeaseRow[];
|
|
157
|
+
/**
|
|
158
|
+
* Sweep expired leases across ALL inventories. Idempotent; safe to run
|
|
159
|
+
* concurrently with claims (`BEGIN IMMEDIATE` serializes writers).
|
|
160
|
+
* Returns the number of leases newly transitioned to `expired`.
|
|
161
|
+
*/
|
|
162
|
+
declare function gcExpiredLeases(): number;
|
|
163
|
+
/**
|
|
164
|
+
* Administrative force-release. Bypasses the lease's `state = 'active'` check
|
|
165
|
+
* (humans force-releasing an already-expired-but-not-yet-released lease is
|
|
166
|
+
* fine), but CAS-guards the member free on the lease's bound `member_gen`.
|
|
167
|
+
* This prevents stomping a member that's currently held by a *different*
|
|
168
|
+
* active lease (i.e. the targeted lease is already terminal and the slot has
|
|
169
|
+
* been re-claimed).
|
|
170
|
+
*
|
|
171
|
+
* Returns `member_freed: true` if the member was actually idled by this call,
|
|
172
|
+
* `false` if a newer claim has already taken the slot.
|
|
173
|
+
*/
|
|
174
|
+
declare function forceReleaseLease(lease_id: string): {
|
|
175
|
+
member_freed: boolean;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export { type AddMemberInput, type ClaimResult, type CreateInventoryInput, DuplicateInventoryError, DuplicateMemberError, type InventoryDetail, type InventoryMemberRow, type InventoryRow, LeaseContentionError, type LeaseEventRow, type LeaseRow, type LeaseState, type ListLeasesFilter, MemberInUseError, type MemberStatus, NoIdleMemberError, NotFoundError, StaleLeaseError, addMember, claimLease, closeLeasesDb, createInventory, extendLease, forceReleaseLease, gcExpiredLeases, getInventoryDetail, getLease, getLeasesDb, initLeasesDb, listInventories, listLeases, nowIso, releaseLease, resetLeasesDb, retireMember };
|