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.
Files changed (77) hide show
  1. package/.claude-plugin/plugin.json +3 -1
  2. package/README.md +21 -0
  3. package/dashboard/dist/assets/{_basePickBy-DPIRyskD.js → _basePickBy-qEDLAY_J.js} +1 -1
  4. package/dashboard/dist/assets/{_baseUniq-CwicZZgc.js → _baseUniq-7tDs18Gn.js} +1 -1
  5. package/dashboard/dist/assets/{arc-CcHe1anq.js → arc-Brdw0dYW.js} +1 -1
  6. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-4lwARCsm.js → architectureDiagram-2XIMDMQ5-BiEdLT9m.js} +1 -1
  7. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-SdqET9RP.js → blockDiagram-WCTKOSBZ-HC-j_hPZ.js} +1 -1
  8. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-BAKj5SV2.js → c4Diagram-IC4MRINW-DA_rWbl7.js} +1 -1
  9. package/dashboard/dist/assets/channel-D2-caOn6.js +1 -0
  10. package/dashboard/dist/assets/{chunk-4BX2VUAB-Dn95vjsS.js → chunk-4BX2VUAB-CF3hguyj.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-55IACEB6-C6L5bDoe.js → chunk-55IACEB6-BTeCeIc_.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-FMBD7UC4---Go123J.js → chunk-FMBD7UC4-8qVvxmks.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-JSJVCQXG-C9E63Ryg.js → chunk-JSJVCQXG-DCf8n7EO.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-KX2RTZJC-Yyi0h479.js → chunk-KX2RTZJC-CcpjTmME.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-NQ4KR5QH-2Fh1XO45.js → chunk-NQ4KR5QH-BnFPKo4-.js} +1 -1
  16. package/dashboard/dist/assets/{chunk-QZHKN3VN-B4a3DKz-.js → chunk-QZHKN3VN-IPMVLLv2.js} +1 -1
  17. package/dashboard/dist/assets/{chunk-WL4C6EOR-XtMf_tFy.js → chunk-WL4C6EOR-D1pQmHqX.js} +1 -1
  18. package/dashboard/dist/assets/classDiagram-VBA2DB6C-HFOb_XEt.js +1 -0
  19. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-HFOb_XEt.js +1 -0
  20. package/dashboard/dist/assets/clone-BrYOwgIq.js +1 -0
  21. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-8wHbmnAP.js → cose-bilkent-S5V4N54A-tvJjvBQr.js} +1 -1
  22. package/dashboard/dist/assets/{dagre-KLK3FWXG-uJZOLE_S.js → dagre-KLK3FWXG-qp1vt6LY.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-E7M64L7V-BZih6Ivf.js → diagram-E7M64L7V-VF5eizNr.js} +1 -1
  24. package/dashboard/dist/assets/{diagram-IFDJBPK2-CtR6WhET.js → diagram-IFDJBPK2-C3pCbJ1e.js} +1 -1
  25. package/dashboard/dist/assets/{diagram-P4PSJMXO-DTGhoDSE.js → diagram-P4PSJMXO-D-taXZwH.js} +1 -1
  26. package/dashboard/dist/assets/{erDiagram-INFDFZHY-Yr93h1x4.js → erDiagram-INFDFZHY-QjY-NHVs.js} +1 -1
  27. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-CZ3QY4eZ.js → flowDiagram-PKNHOUZH-FjO8P5Tq.js} +1 -1
  28. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-CSf--huI.js → ganttDiagram-A5KZAMGK-Bsn7CyK3.js} +1 -1
  29. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-CokKKyLR.js → gitGraphDiagram-K3NZZRJ6-BZ8DjhnF.js} +1 -1
  30. package/dashboard/dist/assets/{graph-DRs4cE7X.js → graph-AdliIYqX.js} +1 -1
  31. package/dashboard/dist/assets/index-BoR_oyUZ.css +1 -0
  32. package/dashboard/dist/assets/index-RCBI4aX2.js +525 -0
  33. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-C4CTdWLD.js → infoDiagram-LFFYTUFH-BfZjLA86.js} +1 -1
  34. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-DGrfYHHk.js → ishikawaDiagram-PHBUUO56-BSgSGMp5.js} +1 -1
  35. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-CEDbuCY2.js → journeyDiagram-4ABVD52K-BlQ7qeMC.js} +1 -1
  36. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-BjgAWDsE.js → kanban-definition-K7BYSVSG-CifO0AUu.js} +1 -1
  37. package/dashboard/dist/assets/{layout-Coi0pRnm.js → layout-B9r-gpD9.js} +1 -1
  38. package/dashboard/dist/assets/{linear-B4xKytgE.js → linear-CaaIRxVZ.js} +1 -1
  39. package/dashboard/dist/assets/{mermaid.core-dkpoLY2K.js → mermaid.core-C8wCWYw-.js} +4 -4
  40. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-BgUfAXkB.js → mindmap-definition-YRQLILUH-BpX5T7iT.js} +1 -1
  41. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-BBuMJroZ.js → pieDiagram-SKSYHLDU-BNGYtWrc.js} +1 -1
  42. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-iXygRpen.js → quadrantDiagram-337W2JSQ-CR4GeM9D.js} +1 -1
  43. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-DhJGFHd3.js → requirementDiagram-Z7DCOOCP-CXrPkMLl.js} +1 -1
  44. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-CLkFLBq1.js → sankeyDiagram-WA2Y5GQK-CIzof7Dm.js} +1 -1
  45. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DQh28Zt-.js → sequenceDiagram-2WXFIKYE-BJZLt0O2.js} +1 -1
  46. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-BZKsD9LJ.js → stateDiagram-RAJIS63D-x9gC6zy6.js} +1 -1
  47. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-CN5Dcv7u.js +1 -0
  48. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-DCJlSWVw.js → timeline-definition-YZTLITO2-D_ZSQn1K.js} +1 -1
  49. package/dashboard/dist/assets/{treemap-KZPCXAKY-DEGy-zW9.js → treemap-KZPCXAKY-LPpMEco4.js} +1 -1
  50. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CfQAKq7b.js → vennDiagram-LZ73GAT5-CRFZQpr7.js} +1 -1
  51. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-CgD-asFJ.js → xychartDiagram-JWTSCODW-Bivutynw.js} +1 -1
  52. package/dashboard/dist/index.html +2 -2
  53. package/dist/dashboard/server.js +355 -81
  54. package/dist/dashboard/server.js.map +1 -1
  55. package/dist/db/leases-db.d.ts +178 -0
  56. package/dist/db/leases-db.js +557 -0
  57. package/dist/db/leases-db.js.map +1 -0
  58. package/dist/index.js +1219 -357
  59. package/dist/index.js.map +1 -1
  60. package/package.json +1 -1
  61. package/platforms/claude-code/.claude-plugin/plugin.json +3 -1
  62. package/platforms/claude-code/skills/claim-resource/SKILL.md +89 -0
  63. package/platforms/claude-code/skills/release-resource/SKILL.md +65 -0
  64. package/platforms/claude-code/skills/syntaur-protocol/SKILL.md +1 -0
  65. package/platforms/codex/skills/claim-resource/SKILL.md +89 -0
  66. package/platforms/codex/skills/release-resource/SKILL.md +65 -0
  67. package/platforms/codex/skills/syntaur-protocol/SKILL.md +1 -0
  68. package/skills/claim-resource/SKILL.md +89 -0
  69. package/skills/release-resource/SKILL.md +65 -0
  70. package/skills/syntaur-protocol/SKILL.md +1 -0
  71. package/dashboard/dist/assets/channel-DKdluNz1.js +0 -1
  72. package/dashboard/dist/assets/classDiagram-VBA2DB6C-93dPLc4W.js +0 -1
  73. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-93dPLc4W.js +0 -1
  74. package/dashboard/dist/assets/clone-vnWuXQgZ.js +0 -1
  75. package/dashboard/dist/assets/index-B9uCPhOL.js +0 -510
  76. package/dashboard/dist/assets/index-BKoccIZR.css +0 -1
  77. 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 };