jg-agent-hq 2.0.0 → 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 +9 -0
- package/README.md +4 -4
- package/api/README.md +51 -8
- package/dist/cli/cli.js +35 -3
- package/dist/cli/utilities.d.ts +3 -0
- package/dist/cli/utilities.js +30 -0
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/types.d.ts +102 -0
- package/dist/contracts/types.js +24 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/plans/authority.d.ts +2 -0
- package/dist/plans/authority.js +8 -0
- package/dist/plans/documents.d.ts +17 -0
- package/dist/plans/documents.js +24 -2
- package/dist/plans/files.js +3 -1
- package/dist/plans/plans.js +3 -1
- package/dist/plans/types.d.ts +5 -0
- package/dist/providers/claude/claude.js +2 -0
- package/dist/providers/claude/history/types.d.ts +23 -0
- package/dist/providers/claude/transformers.js +14 -1
- package/dist/providers/codex/codex.js +4 -0
- package/dist/providers/codex/transformers.js +30 -3
- package/dist/providers/codex/types.d.ts +34 -1
- package/dist/providers/codex/types.js +11 -2
- package/dist/runtime/runtime.d.ts +2 -0
- package/dist/runtime/runtime.js +2 -0
- package/dist/runtime/state/index.d.ts +1 -1
- package/dist/runtime/state/index.js +1 -1
- package/dist/runtime/state/state.d.ts +16 -1
- package/dist/runtime/state/state.js +94 -3
- package/dist/snapshots/capture.d.ts +14 -0
- package/dist/snapshots/capture.js +142 -0
- package/dist/snapshots/database.d.ts +2 -0
- package/dist/snapshots/database.js +15 -51
- package/dist/snapshots/fences.d.ts +15 -0
- package/dist/snapshots/fences.js +64 -0
- package/dist/snapshots/index.d.ts +2 -0
- package/dist/snapshots/index.js +3 -0
- package/dist/snapshots/snapshots.d.ts +4 -1
- package/dist/snapshots/snapshots.js +27 -113
- package/dist/snapshots/snapshots.worker.js +5 -1
- package/dist/snapshots/types.d.ts +11 -0
- package/dist/snapshots/types.js +5 -1
- package/dist/storage/index.d.ts +2 -1
- package/dist/storage/index.js +2 -1
- package/dist/storage/schema/constants.d.ts +2 -0
- package/dist/storage/schema/constants.js +3 -0
- package/dist/storage/schema/index.d.ts +4 -0
- package/dist/storage/schema/index.js +5 -0
- package/dist/storage/schema/schema.d.ts +16 -0
- package/dist/storage/schema/schema.js +73 -0
- package/dist/storage/schema/types.d.ts +17 -0
- package/dist/storage/schema/types.js +8 -0
- package/dist/storage/schema/v1-to-v2.sql +1 -0
- package/dist/storage/schema/v1.sql +538 -0
- package/dist/storage/types.d.ts +0 -5
- package/dist/storage/types.js +0 -6
- package/dist/storage/upgrade/index.d.ts +2 -0
- package/dist/storage/upgrade/index.js +2 -0
- package/dist/storage/upgrade/types.d.ts +61 -0
- package/dist/storage/upgrade/types.js +42 -0
- package/dist/storage/upgrade/upgrade.d.ts +33 -0
- package/dist/storage/upgrade/upgrade.js +196 -0
- package/dist/storage/upgrade/upgrade.worker.d.ts +1 -0
- package/dist/storage/upgrade/upgrade.worker.js +220 -0
- package/dist/store/schema.d.ts +2 -0
- package/dist/store/schema.js +16 -25
- package/dist/store/schema.sql +2 -1
- package/dist/store/store.d.ts +2 -0
- package/dist/store/store.js +2 -0
- package/docs/recovery.md +15 -1
- package/errors/README.md +34 -28
- package/package.json +2 -2
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
CREATE TABLE hq_schema (
|
|
2
|
+
id INTEGER NOT NULL CONSTRAINT hq_pk_schema__id PRIMARY KEY CHECK (id = 1),
|
|
3
|
+
schema_hash TEXT NOT NULL CHECK (length(schema_hash) = 64),
|
|
4
|
+
action_key_hash TEXT NOT NULL CHECK (length(action_key_hash) = 64)
|
|
5
|
+
) STRICT;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE hq_native_history_index (
|
|
8
|
+
provider TEXT NOT NULL CHECK (length(provider) > 0),
|
|
9
|
+
native_id TEXT NOT NULL CHECK (length(native_id) > 0),
|
|
10
|
+
workspace_root TEXT NOT NULL,
|
|
11
|
+
name TEXT,
|
|
12
|
+
created_at INTEGER NOT NULL,
|
|
13
|
+
updated_at INTEGER NOT NULL,
|
|
14
|
+
native_state TEXT NOT NULL,
|
|
15
|
+
observed_at INTEGER NOT NULL,
|
|
16
|
+
runtime_epoch TEXT NOT NULL,
|
|
17
|
+
continuation_cursor TEXT,
|
|
18
|
+
CONSTRAINT hq_pk_nhi__provider_native_id PRIMARY KEY (provider, native_id)
|
|
19
|
+
) STRICT;
|
|
20
|
+
|
|
21
|
+
CREATE INDEX hq_idx_nhi__provider_workspace_root_created_at_native_id
|
|
22
|
+
ON hq_native_history_index (provider, workspace_root, created_at DESC, native_id DESC);
|
|
23
|
+
|
|
24
|
+
CREATE TABLE hq_thread (
|
|
25
|
+
id TEXT NOT NULL,
|
|
26
|
+
provider TEXT NOT NULL CHECK (length(provider) > 0),
|
|
27
|
+
native_id TEXT CHECK (native_id IS NULL OR length(native_id) > 0),
|
|
28
|
+
native_lineage TEXT CHECK (native_lineage IS NULL OR json_valid(native_lineage)),
|
|
29
|
+
fork_source_thread_id TEXT,
|
|
30
|
+
is_archived INTEGER NOT NULL DEFAULT 0 CHECK (is_archived IN (0, 1)),
|
|
31
|
+
name TEXT NOT NULL COLLATE NOCASE,
|
|
32
|
+
workspace_root TEXT NOT NULL,
|
|
33
|
+
ownership TEXT NOT NULL CHECK (ownership IN ('managed', 'uncertain')),
|
|
34
|
+
runtime_epoch TEXT,
|
|
35
|
+
active_turn_id TEXT,
|
|
36
|
+
last_turn_id TEXT,
|
|
37
|
+
last_turn_state TEXT CHECK (last_turn_state IS NULL OR last_turn_state IN ('completed', 'failed', 'interrupted')),
|
|
38
|
+
pending_action_id TEXT,
|
|
39
|
+
state TEXT NOT NULL CHECK (state IN ('creating', 'inactive', 'idle', 'starting', 'running', 'waiting-input', 'waiting-approval', 'stopping', 'completed', 'failed', 'interrupted', 'unknown')),
|
|
40
|
+
registration_action_id TEXT NOT NULL,
|
|
41
|
+
created_at INTEGER NOT NULL,
|
|
42
|
+
updated_at INTEGER NOT NULL,
|
|
43
|
+
CONSTRAINT hq_pk_t__id PRIMARY KEY (id),
|
|
44
|
+
CONSTRAINT hq_fk_t__fork_source_thread_id FOREIGN KEY (fork_source_thread_id) REFERENCES hq_thread(id),
|
|
45
|
+
CONSTRAINT hq_uq_t__provider_native_id UNIQUE (provider, native_id),
|
|
46
|
+
CONSTRAINT hq_uq_t__name UNIQUE (name),
|
|
47
|
+
CONSTRAINT hq_uq_t__pending_action_id UNIQUE (pending_action_id),
|
|
48
|
+
CONSTRAINT hq_fk_t__registration_action_id FOREIGN KEY (registration_action_id) REFERENCES hq_action(id),
|
|
49
|
+
CONSTRAINT hq_fk_t__pending_action_id FOREIGN KEY (pending_action_id) REFERENCES hq_action(id),
|
|
50
|
+
CONSTRAINT hq_chk_t__native_id_creation CHECK (native_id IS NOT NULL OR state IN ('creating', 'unknown'))
|
|
51
|
+
) STRICT;
|
|
52
|
+
|
|
53
|
+
CREATE INDEX hq_idx_t__workspace_root_created_at_id_desc ON hq_thread (workspace_root, created_at DESC, id DESC);
|
|
54
|
+
CREATE INDEX hq_idx_t__runtime_epoch_ownership ON hq_thread (runtime_epoch, ownership);
|
|
55
|
+
|
|
56
|
+
CREATE TABLE hq_action (
|
|
57
|
+
id TEXT NOT NULL,
|
|
58
|
+
digest TEXT NOT NULL CHECK (length(digest) = 64),
|
|
59
|
+
requested_runtime_epoch TEXT NOT NULL,
|
|
60
|
+
runtime_epoch TEXT NOT NULL,
|
|
61
|
+
kind TEXT NOT NULL,
|
|
62
|
+
provider TEXT,
|
|
63
|
+
control_state TEXT CHECK (control_state IS NULL OR control_state IN ('accepted','applied','held')),
|
|
64
|
+
thread_id TEXT,
|
|
65
|
+
expected_turn_id TEXT,
|
|
66
|
+
native_turn_id TEXT,
|
|
67
|
+
native_request_id TEXT,
|
|
68
|
+
delivery TEXT NOT NULL CHECK (delivery IN ('queued', 'submitted', 'acknowledged', 'uncertain', 'failed', 'canceled')),
|
|
69
|
+
completion TEXT CHECK (completion IS NULL OR completion IN ('completed', 'failed', 'interrupted')),
|
|
70
|
+
failure TEXT CHECK (failure IS NULL OR failure IN ('state-conflict', 'access-denied', 'agent-unavailable', 'operation-failed')),
|
|
71
|
+
related_action_id TEXT,
|
|
72
|
+
queued_input TEXT,
|
|
73
|
+
result TEXT,
|
|
74
|
+
input_sha256 TEXT CHECK (input_sha256 IS NULL OR length(input_sha256) = 64),
|
|
75
|
+
plan_context TEXT,
|
|
76
|
+
collaboration_context TEXT CHECK (collaboration_context IS NULL OR json_valid(collaboration_context)),
|
|
77
|
+
collaboration_collection TEXT CHECK (collaboration_collection IS NULL OR json_valid(collaboration_collection)),
|
|
78
|
+
queue_ready INTEGER NOT NULL DEFAULT 0 CHECK (queue_ready IN (0, 1)),
|
|
79
|
+
requested_name TEXT,
|
|
80
|
+
created_at INTEGER NOT NULL,
|
|
81
|
+
updated_at INTEGER NOT NULL,
|
|
82
|
+
CONSTRAINT hq_pk_a__id PRIMARY KEY (id),
|
|
83
|
+
CONSTRAINT hq_fk_a__thread_id FOREIGN KEY (thread_id) REFERENCES hq_thread(id),
|
|
84
|
+
CONSTRAINT hq_fk_a__related_action_id FOREIGN KEY (related_action_id) REFERENCES hq_action(id),
|
|
85
|
+
CONSTRAINT hq_chk_a__queued_input_kind CHECK (queued_input IS NULL OR kind = 'queue'),
|
|
86
|
+
CONSTRAINT hq_chk_a__queued_body_required CHECK (delivery != 'queued' OR (kind = 'queue' AND queued_input IS NOT NULL))
|
|
87
|
+
) STRICT;
|
|
88
|
+
|
|
89
|
+
CREATE INDEX hq_idx_a__provider_created_at_id_desc ON hq_action (provider, created_at DESC, id DESC) WHERE thread_id IS NULL;
|
|
90
|
+
CREATE INDEX hq_idx_a__provider_epoch_pending_control ON hq_action (provider, runtime_epoch) WHERE kind IN ('account-login','account-logout','mcp-reload') AND delivery IN ('submitted','uncertain','acknowledged') AND completion IS NULL;
|
|
91
|
+
CREATE INDEX hq_idx_a__thread_id_created_at_id_desc ON hq_action (thread_id, created_at DESC, id DESC);
|
|
92
|
+
CREATE INDEX hq_idx_a__thread_id_delivery_created_at_id ON hq_action (thread_id, delivery, created_at, id);
|
|
93
|
+
CREATE INDEX hq_idx_a__native_turn_id ON hq_action (native_turn_id);
|
|
94
|
+
CREATE INDEX hq_idx_a__thread_turn_input ON hq_action (thread_id, native_turn_id, input_sha256) WHERE input_sha256 IS NOT NULL;
|
|
95
|
+
CREATE INDEX hq_idx_a__runtime_epoch_delivery ON hq_action (runtime_epoch, delivery);
|
|
96
|
+
CREATE INDEX hq_idx_a__runtime_epoch_submitted ON hq_action (runtime_epoch) WHERE delivery = 'submitted';
|
|
97
|
+
CREATE INDEX hq_idx_a__requested_name_delivery ON hq_action (requested_name, delivery);
|
|
98
|
+
CREATE UNIQUE INDEX hq_uidx_a__runtime_epoch_native_request_id ON hq_action (runtime_epoch, native_request_id) WHERE native_request_id IS NOT NULL;
|
|
99
|
+
|
|
100
|
+
CREATE TABLE hq_native_approval (
|
|
101
|
+
id TEXT NOT NULL,
|
|
102
|
+
thread_id TEXT NOT NULL,
|
|
103
|
+
native_turn_id TEXT NOT NULL,
|
|
104
|
+
runtime_epoch TEXT NOT NULL,
|
|
105
|
+
native_request_id TEXT NOT NULL,
|
|
106
|
+
digest TEXT NOT NULL CHECK (length(digest) = 64),
|
|
107
|
+
kind TEXT NOT NULL CHECK (kind IN ('command', 'file-change', 'permission', 'question', 'elicitation')),
|
|
108
|
+
is_blocking INTEGER NOT NULL CHECK (is_blocking IN (0, 1)),
|
|
109
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'answered', 'expired')),
|
|
110
|
+
reply_action_id TEXT,
|
|
111
|
+
created_at INTEGER NOT NULL,
|
|
112
|
+
updated_at INTEGER NOT NULL,
|
|
113
|
+
CONSTRAINT hq_pk_na__id PRIMARY KEY (id),
|
|
114
|
+
CONSTRAINT hq_uq_na__runtime_epoch_thread_id_native_request_id UNIQUE (runtime_epoch, thread_id, native_request_id),
|
|
115
|
+
CONSTRAINT hq_fk_na__thread_id FOREIGN KEY (thread_id) REFERENCES hq_thread(id),
|
|
116
|
+
CONSTRAINT hq_fk_na__reply_action_id FOREIGN KEY (reply_action_id) REFERENCES hq_action(id)
|
|
117
|
+
) STRICT;
|
|
118
|
+
|
|
119
|
+
CREATE INDEX hq_idx_na__thread_id_state_created_at_id_desc ON hq_native_approval (thread_id, state, created_at DESC, id DESC);
|
|
120
|
+
CREATE INDEX hq_idx_na__thread_id_created_at_id_desc ON hq_native_approval (thread_id, created_at DESC, id DESC);
|
|
121
|
+
CREATE INDEX hq_idx_na__runtime_epoch_pending ON hq_native_approval (runtime_epoch) WHERE state = 'pending';
|
|
122
|
+
|
|
123
|
+
CREATE TABLE hq_event (
|
|
124
|
+
sequence INTEGER CONSTRAINT hq_pk_e__sequence PRIMARY KEY AUTOINCREMENT,
|
|
125
|
+
runtime_epoch TEXT NOT NULL,
|
|
126
|
+
thread_id TEXT,
|
|
127
|
+
action_id TEXT,
|
|
128
|
+
native_turn_id TEXT,
|
|
129
|
+
native_item_id TEXT,
|
|
130
|
+
kind TEXT NOT NULL,
|
|
131
|
+
event_key TEXT,
|
|
132
|
+
digest TEXT,
|
|
133
|
+
created_at INTEGER NOT NULL,
|
|
134
|
+
CONSTRAINT hq_uq_e__runtime_epoch_event_key UNIQUE (runtime_epoch, event_key),
|
|
135
|
+
CONSTRAINT hq_fk_e__thread_id FOREIGN KEY (thread_id) REFERENCES hq_thread(id),
|
|
136
|
+
CONSTRAINT hq_fk_e__action_id FOREIGN KEY (action_id) REFERENCES hq_action(id)
|
|
137
|
+
) STRICT;
|
|
138
|
+
|
|
139
|
+
CREATE INDEX hq_idx_e__thread_id_sequence ON hq_event (thread_id, sequence);
|
|
140
|
+
|
|
141
|
+
CREATE TABLE hq_plan_operation (
|
|
142
|
+
id TEXT NOT NULL,
|
|
143
|
+
directory TEXT NOT NULL,
|
|
144
|
+
state TEXT NOT NULL CHECK (state IN ('prepared', 'completed')),
|
|
145
|
+
intent TEXT NOT NULL,
|
|
146
|
+
CONSTRAINT hq_pk_po__id PRIMARY KEY (id)
|
|
147
|
+
) STRICT;
|
|
148
|
+
CREATE UNIQUE INDEX hq_uidx_po__directory_prepared ON hq_plan_operation (directory) WHERE state = 'prepared';
|
|
149
|
+
|
|
150
|
+
CREATE TABLE hq_plan_milestone (
|
|
151
|
+
directory TEXT NOT NULL,
|
|
152
|
+
ordinal INTEGER NOT NULL CHECK (ordinal > 0),
|
|
153
|
+
milestone TEXT NOT NULL,
|
|
154
|
+
CONSTRAINT hq_pk_pm__directory_ordinal PRIMARY KEY (directory, ordinal)
|
|
155
|
+
) STRICT;
|
|
156
|
+
|
|
157
|
+
CREATE TABLE hq_plan_projection (
|
|
158
|
+
directory TEXT NOT NULL,
|
|
159
|
+
source_hash TEXT,
|
|
160
|
+
CONSTRAINT hq_pk_pp__directory PRIMARY KEY (directory)
|
|
161
|
+
) STRICT;
|
|
162
|
+
|
|
163
|
+
CREATE TABLE hq_plan_revision_projection (
|
|
164
|
+
directory TEXT NOT NULL,
|
|
165
|
+
source_hash TEXT,
|
|
166
|
+
CONSTRAINT hq_pk_prp__directory PRIMARY KEY (directory)
|
|
167
|
+
) STRICT;
|
|
168
|
+
CREATE TABLE hq_plan_record (
|
|
169
|
+
directory TEXT NOT NULL,
|
|
170
|
+
collection TEXT NOT NULL,
|
|
171
|
+
record_id TEXT NOT NULL,
|
|
172
|
+
entry TEXT NOT NULL,
|
|
173
|
+
CONSTRAINT hq_pk_pr__directory_collection_record_id PRIMARY KEY (directory, collection, record_id)
|
|
174
|
+
) STRICT;
|
|
175
|
+
|
|
176
|
+
CREATE TABLE hq_thread_plan (
|
|
177
|
+
thread_id TEXT NOT NULL,
|
|
178
|
+
directory TEXT NOT NULL,
|
|
179
|
+
context TEXT NOT NULL,
|
|
180
|
+
authorization_id TEXT,
|
|
181
|
+
milestone_id TEXT,
|
|
182
|
+
CONSTRAINT hq_chk_tp__execution_scope_complete CHECK (authorization_id IS NOT NULL OR milestone_id IS NULL),
|
|
183
|
+
CONSTRAINT hq_pk_tp__thread_id PRIMARY KEY (thread_id),
|
|
184
|
+
CONSTRAINT hq_fk_tp__thread_id FOREIGN KEY (thread_id) REFERENCES hq_thread(id)
|
|
185
|
+
) STRICT;
|
|
186
|
+
CREATE INDEX hq_idx_tp__directory_thread_id ON hq_thread_plan (directory, thread_id);
|
|
187
|
+
|
|
188
|
+
CREATE UNIQUE INDEX hq_uidx_tp__authorization_id_milestone_id_execution
|
|
189
|
+
ON hq_thread_plan (authorization_id, milestone_id) WHERE authorization_id IS NOT NULL AND milestone_id IS NOT NULL;
|
|
190
|
+
|
|
191
|
+
CREATE UNIQUE INDEX hq_uidx_tp__authorization_id_plan_execution
|
|
192
|
+
ON hq_thread_plan (authorization_id) WHERE authorization_id IS NOT NULL AND milestone_id IS NULL;
|
|
193
|
+
|
|
194
|
+
CREATE TABLE hq_browser_action (
|
|
195
|
+
id TEXT CONSTRAINT hq_pk_ba__id PRIMARY KEY,
|
|
196
|
+
operator_id TEXT NOT NULL,
|
|
197
|
+
digest TEXT NOT NULL CHECK (length(digest) = 64),
|
|
198
|
+
native_thread_id TEXT,
|
|
199
|
+
native_input_sha256 TEXT CHECK (native_input_sha256 IS NULL OR length(native_input_sha256) = 64),
|
|
200
|
+
receipt TEXT NOT NULL CHECK (json_valid(receipt))
|
|
201
|
+
) STRICT;
|
|
202
|
+
|
|
203
|
+
CREATE INDEX hq_idx_ba__submitted_epoch ON hq_browser_action (json_extract(receipt, '$.runtimeEpoch'))
|
|
204
|
+
WHERE json_extract(receipt, '$.state') = 'submitted';
|
|
205
|
+
CREATE UNIQUE INDEX hq_uidx_ba__native_action ON hq_browser_action (json_extract(receipt, '$.nativeActionId'));
|
|
206
|
+
|
|
207
|
+
CREATE TABLE hq_claude_file (
|
|
208
|
+
workspace_root TEXT NOT NULL, native_id TEXT NOT NULL, identity TEXT NOT NULL,
|
|
209
|
+
file_size INTEGER NOT NULL, byte_offset INTEGER NOT NULL, revision TEXT NOT NULL,
|
|
210
|
+
leaf_id TEXT, name TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL,
|
|
211
|
+
supported INTEGER NOT NULL, seen TEXT NOT NULL, workspace_state TEXT NOT NULL,
|
|
212
|
+
CONSTRAINT hq_pk_cf__workspace_root_native_id PRIMARY KEY (workspace_root, native_id)
|
|
213
|
+
) STRICT;
|
|
214
|
+
CREATE INDEX hq_idx_cf__workspace_root_created_at_native_id_desc
|
|
215
|
+
ON hq_claude_file(workspace_root, created_at DESC, native_id DESC);
|
|
216
|
+
CREATE TABLE hq_claude_entry (
|
|
217
|
+
workspace_root TEXT NOT NULL, native_id TEXT NOT NULL, uuid TEXT NOT NULL,
|
|
218
|
+
parent_uuid TEXT, turn_id TEXT NOT NULL, byte_offset INTEGER NOT NULL, byte_length INTEGER NOT NULL,
|
|
219
|
+
created_at INTEGER NOT NULL, is_visible INTEGER NOT NULL,
|
|
220
|
+
item_kind TEXT NOT NULL CHECK (item_kind IN ('user-message','agent-message','command','tool','file-change','unsupported')),
|
|
221
|
+
is_current INTEGER NOT NULL, turn_start_offset INTEGER, anchor_id TEXT,
|
|
222
|
+
CONSTRAINT hq_pk_ce__workspace_root_native_id_uuid PRIMARY KEY (workspace_root, native_id, uuid),
|
|
223
|
+
CONSTRAINT hq_fk_ce__workspace_root_native_id FOREIGN KEY (workspace_root, native_id)
|
|
224
|
+
REFERENCES hq_claude_file(workspace_root, native_id) ON DELETE CASCADE
|
|
225
|
+
) STRICT;
|
|
226
|
+
CREATE INDEX hq_idx_ce__workspace_native_offset_current
|
|
227
|
+
ON hq_claude_entry(workspace_root, native_id, byte_offset) WHERE is_current = 1 AND is_visible = 1;
|
|
228
|
+
CREATE INDEX hq_idx_ce__workspace_native_turn_offset_current
|
|
229
|
+
ON hq_claude_entry(workspace_root, native_id, turn_id, byte_offset) WHERE is_current = 1 AND is_visible = 1;
|
|
230
|
+
CREATE INDEX hq_idx_ce__workspace_native_turn_start_current
|
|
231
|
+
ON hq_claude_entry(workspace_root, native_id, byte_offset)
|
|
232
|
+
WHERE is_current = 1 AND is_visible = 1 AND byte_offset = turn_start_offset;
|
|
233
|
+
CREATE INDEX hq_idx_ce__workspace_native_kind_offset_current
|
|
234
|
+
ON hq_claude_entry(workspace_root, native_id, item_kind, byte_offset)
|
|
235
|
+
WHERE is_current = 1 AND is_visible = 1;
|
|
236
|
+
CREATE INDEX hq_idx_ce__workspace_native_turn_kind_offset_current
|
|
237
|
+
ON hq_claude_entry(workspace_root, native_id, turn_id, item_kind, byte_offset)
|
|
238
|
+
WHERE is_current = 1 AND is_visible = 1;
|
|
239
|
+
|
|
240
|
+
CREATE TABLE hq_collaboration_task (
|
|
241
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
242
|
+
id TEXT NOT NULL UNIQUE,
|
|
243
|
+
workspace_root TEXT NOT NULL,
|
|
244
|
+
owner_operator_ref TEXT NOT NULL,
|
|
245
|
+
title TEXT NOT NULL,
|
|
246
|
+
plan TEXT CHECK (plan IS NULL OR json_valid(plan)),
|
|
247
|
+
policy TEXT NOT NULL CHECK (json_valid(policy)),
|
|
248
|
+
policy_revision INTEGER NOT NULL CHECK (policy_revision > 0),
|
|
249
|
+
spawn_count INTEGER NOT NULL DEFAULT 0 CHECK (spawn_count >= 0),
|
|
250
|
+
automatic_turn_count INTEGER NOT NULL DEFAULT 0 CHECK (automatic_turn_count >= 0),
|
|
251
|
+
state TEXT NOT NULL CHECK (state IN ('active','paused','stopped')),
|
|
252
|
+
lifecycle_revision INTEGER NOT NULL CHECK (lifecycle_revision > 0),
|
|
253
|
+
created_at INTEGER NOT NULL
|
|
254
|
+
) STRICT;
|
|
255
|
+
CREATE INDEX hq_idx_ct__owner_workspace_sequence
|
|
256
|
+
ON hq_collaboration_task(owner_operator_ref, workspace_root, sequence);
|
|
257
|
+
|
|
258
|
+
CREATE TABLE hq_task_agent (
|
|
259
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
260
|
+
task_id TEXT NOT NULL REFERENCES hq_collaboration_task(id),
|
|
261
|
+
agent_id TEXT NOT NULL REFERENCES hq_thread(id),
|
|
262
|
+
parent_agent_id TEXT,
|
|
263
|
+
role TEXT,
|
|
264
|
+
permissions TEXT NOT NULL CHECK (json_valid(permissions)),
|
|
265
|
+
revision INTEGER NOT NULL CHECK (revision > 0),
|
|
266
|
+
state TEXT NOT NULL CHECK (state IN ('active','paused','stopped')),
|
|
267
|
+
is_revoked INTEGER NOT NULL CHECK (is_revoked IN (0,1)),
|
|
268
|
+
created_at INTEGER NOT NULL,
|
|
269
|
+
CONSTRAINT hq_uq_ta__task_agent UNIQUE(task_id, agent_id),
|
|
270
|
+
CONSTRAINT hq_fk_ta__parent FOREIGN KEY (task_id, parent_agent_id) REFERENCES hq_task_agent(task_id, agent_id),
|
|
271
|
+
CONSTRAINT hq_chk_ta__parent CHECK (parent_agent_id IS NULL OR parent_agent_id != agent_id)
|
|
272
|
+
) STRICT;
|
|
273
|
+
CREATE INDEX hq_idx_ta__task_sequence ON hq_task_agent(task_id, sequence);
|
|
274
|
+
CREATE INDEX hq_idx_ta__agent_task ON hq_task_agent(agent_id, task_id);
|
|
275
|
+
CREATE INDEX hq_idx_ta__agent_sequence ON hq_task_agent(agent_id, sequence);
|
|
276
|
+
CREATE INDEX hq_idx_ta__parent ON hq_task_agent(task_id, parent_agent_id) WHERE parent_agent_id IS NOT NULL;
|
|
277
|
+
|
|
278
|
+
CREATE TABLE hq_skill_grant (
|
|
279
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
280
|
+
id TEXT NOT NULL UNIQUE,
|
|
281
|
+
task_id TEXT NOT NULL REFERENCES hq_collaboration_task(id),
|
|
282
|
+
issuer_operator_ref TEXT NOT NULL,
|
|
283
|
+
revision INTEGER NOT NULL CHECK (revision > 0),
|
|
284
|
+
eligible_agent_ids TEXT CHECK (eligible_agent_ids IS NULL OR json_valid(eligible_agent_ids)),
|
|
285
|
+
skills TEXT NOT NULL CHECK (json_valid(skills)),
|
|
286
|
+
effects TEXT NOT NULL CHECK (json_valid(effects)),
|
|
287
|
+
scopes TEXT NOT NULL CHECK (json_valid(scopes)),
|
|
288
|
+
plan TEXT CHECK (plan IS NULL OR json_valid(plan)),
|
|
289
|
+
revoked_at INTEGER,
|
|
290
|
+
created_at INTEGER NOT NULL,
|
|
291
|
+
CONSTRAINT hq_uq_sg__task_id UNIQUE(task_id, id)
|
|
292
|
+
) STRICT;
|
|
293
|
+
CREATE INDEX hq_idx_sg__task_sequence ON hq_skill_grant(task_id, sequence);
|
|
294
|
+
|
|
295
|
+
CREATE TABLE hq_stream (
|
|
296
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
297
|
+
id TEXT NOT NULL UNIQUE,
|
|
298
|
+
task_id TEXT NOT NULL REFERENCES hq_collaboration_task(id),
|
|
299
|
+
title TEXT NOT NULL,
|
|
300
|
+
purpose TEXT NOT NULL,
|
|
301
|
+
creator TEXT NOT NULL CHECK (json_valid(creator)),
|
|
302
|
+
is_archived INTEGER NOT NULL CHECK (is_archived IN (0,1)),
|
|
303
|
+
created_at INTEGER NOT NULL,
|
|
304
|
+
CONSTRAINT hq_uq_s__task_id UNIQUE(task_id, id)
|
|
305
|
+
) STRICT;
|
|
306
|
+
CREATE INDEX hq_idx_s__task_sequence ON hq_stream(task_id, sequence);
|
|
307
|
+
CREATE INDEX hq_idx_s__task_archived_sequence ON hq_stream(task_id, is_archived, sequence);
|
|
308
|
+
|
|
309
|
+
CREATE TABLE hq_subscription (
|
|
310
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
311
|
+
task_id TEXT NOT NULL,
|
|
312
|
+
stream_id TEXT NOT NULL,
|
|
313
|
+
agent_id TEXT NOT NULL,
|
|
314
|
+
is_active INTEGER NOT NULL CHECK (is_active IN (0,1)),
|
|
315
|
+
notify INTEGER NOT NULL CHECK (notify IN (0,1)),
|
|
316
|
+
starting_sequence INTEGER NOT NULL CHECK (starting_sequence >= 0),
|
|
317
|
+
read_sequence INTEGER NOT NULL CHECK (read_sequence >= starting_sequence),
|
|
318
|
+
established_by TEXT NOT NULL CHECK (json_valid(established_by)),
|
|
319
|
+
updated_at INTEGER NOT NULL,
|
|
320
|
+
CONSTRAINT hq_uq_su__stream_agent UNIQUE(stream_id, agent_id),
|
|
321
|
+
CONSTRAINT hq_fk_su__stream FOREIGN KEY (task_id, stream_id) REFERENCES hq_stream(task_id, id),
|
|
322
|
+
CONSTRAINT hq_fk_su__agent FOREIGN KEY (task_id, agent_id) REFERENCES hq_task_agent(task_id, agent_id)
|
|
323
|
+
) STRICT;
|
|
324
|
+
CREATE INDEX hq_idx_su__stream_sequence ON hq_subscription(stream_id, sequence) WHERE is_active = 1 AND notify = 1;
|
|
325
|
+
CREATE INDEX hq_idx_su__agent_task_stream ON hq_subscription(agent_id, task_id, stream_id) WHERE is_active = 1;
|
|
326
|
+
CREATE INDEX hq_idx_su__agent_task_sequence ON hq_subscription(agent_id, task_id, sequence) WHERE is_active = 1;
|
|
327
|
+
|
|
328
|
+
CREATE TABLE hq_message (
|
|
329
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
330
|
+
id TEXT NOT NULL UNIQUE,
|
|
331
|
+
task_id TEXT NOT NULL,
|
|
332
|
+
task_token TEXT GENERATED ALWAYS AS (replace(task_id, '-', '')) STORED,
|
|
333
|
+
stream_id TEXT NOT NULL,
|
|
334
|
+
stream_token TEXT GENERATED ALWAYS AS (replace(stream_id, '-', '')) STORED,
|
|
335
|
+
author TEXT NOT NULL CHECK (json_valid(author)),
|
|
336
|
+
author_agent_id TEXT,
|
|
337
|
+
kind TEXT NOT NULL CHECK (kind IN ('information','request','reply','status')),
|
|
338
|
+
body_bytes INTEGER GENERATED ALWAYS AS (length(CAST(body AS BLOB))) STORED,
|
|
339
|
+
reference_count INTEGER GENERATED ALWAYS AS (json_array_length(artifact_references)) STORED,
|
|
340
|
+
summary TEXT NOT NULL CHECK (length(CAST(summary AS BLOB)) <= 1024),
|
|
341
|
+
body TEXT NOT NULL CHECK (length(CAST(body AS BLOB)) <= 8192),
|
|
342
|
+
artifact_references TEXT NOT NULL CHECK (json_valid(artifact_references) AND json_array_length(artifact_references) <= 16),
|
|
343
|
+
reply_to_message_id TEXT,
|
|
344
|
+
fanout_after_sequence INTEGER NOT NULL DEFAULT 0,
|
|
345
|
+
fanout_through_sequence INTEGER NOT NULL,
|
|
346
|
+
fanout_complete INTEGER NOT NULL CHECK (fanout_complete IN (0,1)),
|
|
347
|
+
created_at INTEGER NOT NULL,
|
|
348
|
+
CONSTRAINT hq_uq_m__task_id UNIQUE(task_id, id),
|
|
349
|
+
CONSTRAINT hq_uq_m__task_id_sequence UNIQUE(task_id, id, sequence),
|
|
350
|
+
CONSTRAINT hq_fk_m__stream FOREIGN KEY (task_id, stream_id) REFERENCES hq_stream(task_id, id),
|
|
351
|
+
CONSTRAINT hq_fk_m__author FOREIGN KEY (task_id, author_agent_id) REFERENCES hq_task_agent(task_id, agent_id),
|
|
352
|
+
CONSTRAINT hq_fk_m__reply FOREIGN KEY (task_id, reply_to_message_id) REFERENCES hq_message(task_id, id)
|
|
353
|
+
) STRICT;
|
|
354
|
+
CREATE INDEX hq_idx_m__task_sequence ON hq_message(task_id, sequence);
|
|
355
|
+
CREATE INDEX hq_idx_m__stream_sequence ON hq_message(stream_id, sequence);
|
|
356
|
+
CREATE INDEX hq_idx_m__task_kind_sequence ON hq_message(task_id, kind, sequence);
|
|
357
|
+
CREATE INDEX hq_idx_m__task_author_sequence ON hq_message(task_id, author_agent_id, sequence);
|
|
358
|
+
CREATE INDEX hq_idx_m__fanout_sequence ON hq_message(sequence) WHERE fanout_complete = 0;
|
|
359
|
+
CREATE INDEX hq_idx_m__task_fanout_sequence ON hq_message(task_id, sequence) WHERE fanout_complete = 0;
|
|
360
|
+
CREATE TRIGGER hq_trg_m__immutable BEFORE UPDATE OF sequence, id, task_id, stream_id, author, author_agent_id, kind, summary, body, artifact_references, reply_to_message_id, created_at ON hq_message
|
|
361
|
+
BEGIN SELECT RAISE(ABORT, 'HQ message publications are immutable'); END;
|
|
362
|
+
|
|
363
|
+
CREATE VIRTUAL TABLE hq_message_search USING fts5(task_token, stream_token, summary, body, content='hq_message', content_rowid='sequence');
|
|
364
|
+
CREATE TRIGGER hq_trg_m__search_insert AFTER INSERT ON hq_message
|
|
365
|
+
BEGIN
|
|
366
|
+
INSERT INTO hq_message_search(rowid, task_token, stream_token, summary, body) VALUES (new.sequence, new.task_token, new.stream_token, new.summary, new.body);
|
|
367
|
+
END;
|
|
368
|
+
CREATE TRIGGER hq_trg_m__search_delete AFTER DELETE ON hq_message
|
|
369
|
+
BEGIN
|
|
370
|
+
INSERT INTO hq_message_search(hq_message_search, rowid, task_token, stream_token, summary, body) VALUES ('delete', old.sequence, old.task_token, old.stream_token, old.summary, old.body);
|
|
371
|
+
END;
|
|
372
|
+
|
|
373
|
+
CREATE TABLE hq_request (
|
|
374
|
+
id TEXT NOT NULL PRIMARY KEY,
|
|
375
|
+
sequence INTEGER NOT NULL UNIQUE,
|
|
376
|
+
task_id TEXT NOT NULL,
|
|
377
|
+
stream_id TEXT NOT NULL,
|
|
378
|
+
specification TEXT NOT NULL CHECK (json_valid(specification)),
|
|
379
|
+
target_agent_id TEXT,
|
|
380
|
+
assignee_agent_id TEXT,
|
|
381
|
+
is_claimable INTEGER NOT NULL CHECK (is_claimable IN (0,1)),
|
|
382
|
+
state TEXT NOT NULL CHECK (state IN ('open','claimed','waiting-children','waiting-input','interrupted','resolved','canceled')),
|
|
383
|
+
current_action_id TEXT REFERENCES hq_action(id),
|
|
384
|
+
parent_request_id TEXT REFERENCES hq_request(id),
|
|
385
|
+
parent_action_id TEXT REFERENCES hq_action(id),
|
|
386
|
+
child_request_ids TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(child_request_ids) AND json_type(child_request_ids) = 'array' AND json_array_length(child_request_ids) <= 32),
|
|
387
|
+
wait_generation INTEGER NOT NULL DEFAULT 0 CHECK (wait_generation >= 0),
|
|
388
|
+
continuation_action_id TEXT,
|
|
389
|
+
clarification_consumed_action_id TEXT REFERENCES hq_action(id),
|
|
390
|
+
pending_action_id TEXT,
|
|
391
|
+
pending_input_message_id TEXT REFERENCES hq_message(id),
|
|
392
|
+
manual_dispatch_id TEXT,
|
|
393
|
+
last_action_id TEXT REFERENCES hq_action(id),
|
|
394
|
+
last_report_id TEXT,
|
|
395
|
+
dispatch_count INTEGER NOT NULL DEFAULT 0 CHECK (dispatch_count >= 0),
|
|
396
|
+
required_authority TEXT CHECK (required_authority IS NULL OR required_authority IN ('requester','operator')),
|
|
397
|
+
pause_agent_revision INTEGER,
|
|
398
|
+
dispatch_blocked_reason TEXT,
|
|
399
|
+
failure_reason TEXT,
|
|
400
|
+
grant_id TEXT,
|
|
401
|
+
grant_revision INTEGER,
|
|
402
|
+
skill_name TEXT,
|
|
403
|
+
skill_mode TEXT,
|
|
404
|
+
outcome TEXT CHECK (outcome IS NULL OR outcome IN ('completed','failed')),
|
|
405
|
+
result_references TEXT NOT NULL CHECK (json_valid(result_references) AND json_array_length(result_references) <= 16),
|
|
406
|
+
return_stream_id TEXT NOT NULL,
|
|
407
|
+
created_at INTEGER NOT NULL,
|
|
408
|
+
updated_at INTEGER NOT NULL,
|
|
409
|
+
CONSTRAINT hq_fk_r__message FOREIGN KEY (task_id, id, sequence) REFERENCES hq_message(task_id, id, sequence),
|
|
410
|
+
CONSTRAINT hq_fk_r__stream FOREIGN KEY (task_id, stream_id) REFERENCES hq_stream(task_id, id),
|
|
411
|
+
CONSTRAINT hq_fk_r__return FOREIGN KEY (task_id, return_stream_id) REFERENCES hq_stream(task_id, id),
|
|
412
|
+
CONSTRAINT hq_fk_r__target FOREIGN KEY (task_id, target_agent_id) REFERENCES hq_task_agent(task_id, agent_id),
|
|
413
|
+
CONSTRAINT hq_fk_r__assignee FOREIGN KEY (task_id, assignee_agent_id) REFERENCES hq_task_agent(task_id, agent_id),
|
|
414
|
+
CONSTRAINT hq_fk_r__grant FOREIGN KEY (task_id, grant_id) REFERENCES hq_skill_grant(task_id, id),
|
|
415
|
+
CONSTRAINT hq_chk_r__assignment CHECK ((target_agent_id IS NOT NULL AND is_claimable = 0) OR (target_agent_id IS NULL AND is_claimable = 1)),
|
|
416
|
+
CONSTRAINT hq_chk_r__grant CHECK ((grant_id IS NULL AND grant_revision IS NULL) OR (grant_id IS NOT NULL AND grant_revision > 0)),
|
|
417
|
+
CONSTRAINT hq_chk_r__resolution CHECK ((state = 'resolved' AND outcome IS NOT NULL) OR (state != 'resolved' AND outcome IS NULL))
|
|
418
|
+
) STRICT;
|
|
419
|
+
CREATE INDEX hq_idx_r__task_sequence ON hq_request(task_id, sequence);
|
|
420
|
+
CREATE INDEX hq_idx_r__task_state ON hq_request(task_id, state, sequence);
|
|
421
|
+
CREATE INDEX hq_idx_r__stream_sequence ON hq_request(task_id, stream_id, sequence);
|
|
422
|
+
CREATE INDEX hq_idx_r__assignee_state ON hq_request(task_id, assignee_agent_id, state, sequence);
|
|
423
|
+
CREATE INDEX hq_idx_r__target_state ON hq_request(task_id, target_agent_id, state, sequence);
|
|
424
|
+
CREATE INDEX hq_idx_r__assignee_sequence ON hq_request(task_id, assignee_agent_id, sequence);
|
|
425
|
+
CREATE INDEX hq_idx_r__target_sequence ON hq_request(task_id, target_agent_id, sequence);
|
|
426
|
+
CREATE UNIQUE INDEX hq_uidx_r__assignee_active ON hq_request(assignee_agent_id) WHERE current_action_id IS NOT NULL;
|
|
427
|
+
CREATE INDEX hq_idx_r__dispatch_sequence ON hq_request(sequence) WHERE current_action_id IS NOT NULL OR pending_action_id IS NOT NULL;
|
|
428
|
+
CREATE INDEX hq_idx_r__task_active ON hq_request(task_id, sequence) WHERE current_action_id IS NOT NULL;
|
|
429
|
+
CREATE INDEX hq_idx_r__parent_state ON hq_request(parent_request_id, state);
|
|
430
|
+
CREATE INDEX hq_idx_r__waiting_sequence ON hq_request(sequence) WHERE state = 'waiting-children';
|
|
431
|
+
CREATE INDEX hq_idx_r__assignee_waiting ON hq_request(assignee_agent_id, sequence) WHERE state = 'waiting-children';
|
|
432
|
+
CREATE TRIGGER hq_trg_r__parent_immutable BEFORE UPDATE OF parent_request_id, parent_action_id ON hq_request
|
|
433
|
+
WHEN new.parent_request_id IS NOT old.parent_request_id OR new.parent_action_id IS NOT old.parent_action_id
|
|
434
|
+
BEGIN SELECT RAISE(ABORT, 'HQ request parent links are immutable'); END;
|
|
435
|
+
|
|
436
|
+
CREATE TABLE hq_report (
|
|
437
|
+
id TEXT NOT NULL PRIMARY KEY,
|
|
438
|
+
task_id TEXT NOT NULL,
|
|
439
|
+
request_id TEXT NOT NULL,
|
|
440
|
+
action_id TEXT NOT NULL UNIQUE REFERENCES hq_action(id),
|
|
441
|
+
reply_message_id TEXT NOT NULL UNIQUE,
|
|
442
|
+
sequence INTEGER NOT NULL UNIQUE,
|
|
443
|
+
stream_id TEXT NOT NULL,
|
|
444
|
+
task_token TEXT GENERATED ALWAYS AS (replace(task_id, '-', '')) STORED,
|
|
445
|
+
stream_token TEXT GENERATED ALWAYS AS (replace(stream_id, '-', '')) STORED,
|
|
446
|
+
author_agent_id TEXT NOT NULL,
|
|
447
|
+
provider TEXT NOT NULL,
|
|
448
|
+
native_id TEXT NOT NULL,
|
|
449
|
+
native_turn_id TEXT NOT NULL,
|
|
450
|
+
outcome TEXT NOT NULL CHECK (outcome IN ('completed','waiting-children','needs-input','paused','failed')),
|
|
451
|
+
payload BLOB NOT NULL CHECK (length(payload) <= 1048576),
|
|
452
|
+
byte_count INTEGER GENERATED ALWAYS AS (length(payload)) STORED,
|
|
453
|
+
sha256 TEXT NOT NULL CHECK (length(sha256) = 64),
|
|
454
|
+
created_at INTEGER NOT NULL,
|
|
455
|
+
CONSTRAINT hq_fk_re__request FOREIGN KEY (task_id, request_id) REFERENCES hq_message(task_id, id),
|
|
456
|
+
CONSTRAINT hq_fk_re__reply FOREIGN KEY (task_id, reply_message_id, sequence) REFERENCES hq_message(task_id, id, sequence),
|
|
457
|
+
CONSTRAINT hq_fk_re__author FOREIGN KEY (task_id, author_agent_id) REFERENCES hq_task_agent(task_id, agent_id)
|
|
458
|
+
) STRICT;
|
|
459
|
+
CREATE INDEX hq_idx_re__task_sequence ON hq_report(task_id, sequence);
|
|
460
|
+
CREATE TRIGGER hq_trg_re__immutable BEFORE UPDATE ON hq_report
|
|
461
|
+
BEGIN SELECT RAISE(ABORT, 'HQ reports are immutable'); END;
|
|
462
|
+
CREATE VIRTUAL TABLE hq_report_search USING fts5(task_token, stream_token, payload, content='hq_report', content_rowid='sequence');
|
|
463
|
+
CREATE TRIGGER hq_trg_re__search_insert AFTER INSERT ON hq_report
|
|
464
|
+
BEGIN
|
|
465
|
+
INSERT INTO hq_report_search(rowid, task_token, stream_token, payload) VALUES (new.sequence, new.task_token, new.stream_token, CAST(new.payload AS TEXT));
|
|
466
|
+
END;
|
|
467
|
+
CREATE TRIGGER hq_trg_re__search_delete AFTER DELETE ON hq_report
|
|
468
|
+
BEGIN
|
|
469
|
+
INSERT INTO hq_report_search(hq_report_search, rowid, task_token, stream_token, payload) VALUES ('delete', old.sequence, old.task_token, old.stream_token, CAST(old.payload AS TEXT));
|
|
470
|
+
END;
|
|
471
|
+
|
|
472
|
+
CREATE TABLE hq_delivery (
|
|
473
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
474
|
+
task_id TEXT NOT NULL,
|
|
475
|
+
message_id TEXT NOT NULL,
|
|
476
|
+
message_sequence INTEGER NOT NULL,
|
|
477
|
+
recipient_agent_id TEXT NOT NULL,
|
|
478
|
+
native_action_id TEXT REFERENCES hq_action(id),
|
|
479
|
+
delivered_at INTEGER,
|
|
480
|
+
acknowledged_at INTEGER,
|
|
481
|
+
CONSTRAINT hq_uq_d__message_agent UNIQUE(message_id, recipient_agent_id),
|
|
482
|
+
CONSTRAINT hq_fk_d__message FOREIGN KEY (task_id, message_id, message_sequence) REFERENCES hq_message(task_id, id, sequence),
|
|
483
|
+
CONSTRAINT hq_fk_d__recipient FOREIGN KEY (task_id, recipient_agent_id) REFERENCES hq_task_agent(task_id, agent_id)
|
|
484
|
+
) STRICT;
|
|
485
|
+
CREATE INDEX hq_idx_d__task_sequence ON hq_delivery(task_id, sequence);
|
|
486
|
+
CREATE INDEX hq_idx_d__agent_task_sequence ON hq_delivery(recipient_agent_id, task_id, sequence);
|
|
487
|
+
CREATE INDEX hq_idx_d__agent_pending_sequence ON hq_delivery(recipient_agent_id, task_id, sequence) WHERE delivered_at IS NULL;
|
|
488
|
+
CREATE INDEX hq_idx_d__task_pending_sequence ON hq_delivery(task_id, sequence) WHERE delivered_at IS NULL;
|
|
489
|
+
CREATE INDEX hq_idx_d__agent_unack_sequence ON hq_delivery(recipient_agent_id, task_id, sequence) WHERE acknowledged_at IS NULL;
|
|
490
|
+
CREATE INDEX hq_idx_d__task_unack_sequence ON hq_delivery(task_id, sequence) WHERE acknowledged_at IS NULL;
|
|
491
|
+
|
|
492
|
+
CREATE TABLE hq_collaboration_operation (
|
|
493
|
+
id TEXT NOT NULL PRIMARY KEY,
|
|
494
|
+
task_id TEXT NOT NULL REFERENCES hq_collaboration_task(id),
|
|
495
|
+
actor TEXT NOT NULL CHECK (json_valid(actor)),
|
|
496
|
+
command_kind TEXT NOT NULL,
|
|
497
|
+
digest TEXT NOT NULL CHECK (length(digest) = 64),
|
|
498
|
+
result TEXT NOT NULL CHECK (json_valid(result)),
|
|
499
|
+
created_at INTEGER NOT NULL
|
|
500
|
+
) STRICT;
|
|
501
|
+
CREATE INDEX hq_idx_co__task_created_id ON hq_collaboration_operation(task_id, created_at, id);
|
|
502
|
+
|
|
503
|
+
CREATE TABLE hq_agent_spawn (
|
|
504
|
+
action_id TEXT NOT NULL PRIMARY KEY REFERENCES hq_action(id),
|
|
505
|
+
task_id TEXT NOT NULL,
|
|
506
|
+
parent_agent_id TEXT NOT NULL,
|
|
507
|
+
child_agent_id TEXT UNIQUE,
|
|
508
|
+
purpose TEXT NOT NULL CHECK (length(CAST(purpose AS BLOB)) <= 1024),
|
|
509
|
+
command_digest TEXT NOT NULL CHECK (length(command_digest) = 64),
|
|
510
|
+
created_at INTEGER NOT NULL,
|
|
511
|
+
CONSTRAINT hq_fk_as__parent FOREIGN KEY (task_id, parent_agent_id) REFERENCES hq_task_agent(task_id, agent_id),
|
|
512
|
+
CONSTRAINT hq_fk_as__child FOREIGN KEY (task_id, child_agent_id) REFERENCES hq_task_agent(task_id, agent_id)
|
|
513
|
+
) STRICT;
|
|
514
|
+
|
|
515
|
+
-- durable plan references support seek enumeration without repeated JSON scans
|
|
516
|
+
CREATE TABLE hq_plan_registration (
|
|
517
|
+
directory TEXT NOT NULL CONSTRAINT hq_pk_preg__directory PRIMARY KEY
|
|
518
|
+
) STRICT;
|
|
519
|
+
CREATE TRIGGER hq_trg_po__register AFTER INSERT ON hq_plan_operation
|
|
520
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (new.directory) ON CONFLICT(directory) DO NOTHING; END;
|
|
521
|
+
CREATE TRIGGER hq_trg_pp__register AFTER INSERT ON hq_plan_projection
|
|
522
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (new.directory) ON CONFLICT(directory) DO NOTHING; END;
|
|
523
|
+
CREATE TRIGGER hq_trg_prp__register AFTER INSERT ON hq_plan_revision_projection
|
|
524
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (new.directory) ON CONFLICT(directory) DO NOTHING; END;
|
|
525
|
+
CREATE TRIGGER hq_trg_tp__register AFTER INSERT ON hq_thread_plan
|
|
526
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (new.directory) ON CONFLICT(directory) DO NOTHING; END;
|
|
527
|
+
CREATE TRIGGER hq_trg_tp__register_update AFTER UPDATE OF directory ON hq_thread_plan
|
|
528
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (new.directory) ON CONFLICT(directory) DO NOTHING; END;
|
|
529
|
+
CREATE TRIGGER hq_trg_ct__register AFTER INSERT ON hq_collaboration_task WHEN new.plan IS NOT NULL
|
|
530
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (json_extract(new.plan, '$.directory')) ON CONFLICT(directory) DO NOTHING; END;
|
|
531
|
+
CREATE TRIGGER hq_trg_ct__register_update AFTER UPDATE OF plan ON hq_collaboration_task WHEN new.plan IS NOT NULL
|
|
532
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (json_extract(new.plan, '$.directory')) ON CONFLICT(directory) DO NOTHING; END;
|
|
533
|
+
CREATE TRIGGER hq_trg_sg__register AFTER INSERT ON hq_skill_grant WHEN new.plan IS NOT NULL
|
|
534
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (json_extract(new.plan, '$.directory')) ON CONFLICT(directory) DO NOTHING; END;
|
|
535
|
+
CREATE TRIGGER hq_trg_r__register AFTER INSERT ON hq_request WHEN json_extract(new.specification, '$.plan') IS NOT NULL
|
|
536
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (json_extract(new.specification, '$.plan.directory')) ON CONFLICT(directory) DO NOTHING; END;
|
|
537
|
+
CREATE TRIGGER hq_trg_r__register_update AFTER UPDATE OF specification ON hq_request WHEN json_extract(new.specification, '$.plan') IS NOT NULL
|
|
538
|
+
BEGIN INSERT INTO hq_plan_registration VALUES (json_extract(new.specification, '$.plan.directory')) ON CONFLICT(directory) DO NOTHING; END;
|
package/dist/storage/types.d.ts
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const StorageStampSchema: z.ZodObject<{
|
|
3
|
-
id: z.ZodLiteral<1>;
|
|
4
|
-
schema_hash: z.ZodString;
|
|
5
|
-
action_key_hash: z.ZodString;
|
|
6
|
-
}, z.core.$strip>;
|
|
7
2
|
export declare const StorageDescriptorSchema: z.ZodObject<{
|
|
8
3
|
databasePath: z.ZodString;
|
|
9
4
|
schemaHash: z.ZodString;
|
package/dist/storage/types.js
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { STORAGE_CONNECTION_SETTINGS } from './constants.js';
|
|
3
|
-
// singleton identity binding the current HQ schema and private action key
|
|
4
|
-
export const StorageStampSchema = z.object({
|
|
5
|
-
id: z.literal(1),
|
|
6
|
-
schema_hash: z.string().regex(/^[a-f0-9]{64}$/),
|
|
7
|
-
action_key_hash: z.string().regex(/^[a-f0-9]{64}$/),
|
|
8
|
-
});
|
|
9
3
|
// trusted Node-only metadata; application tables have independent schema ownership
|
|
10
4
|
export const StorageDescriptorSchema = z.object({
|
|
11
5
|
databasePath: z.string().min(1),
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const UpgradeOptionsSchema: z.ZodObject<{
|
|
3
|
+
stateRoot: z.ZodString;
|
|
4
|
+
backupDirectory: z.ZodString;
|
|
5
|
+
allowedRoots: z.ZodArray<z.ZodString>;
|
|
6
|
+
coordinationRoot: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, z.core.$strict>;
|
|
8
|
+
export type IHqStorageUpgradeOptions = z.infer<typeof UpgradeOptionsSchema>;
|
|
9
|
+
export declare const UpgradeResultSchema: z.ZodObject<{
|
|
10
|
+
stateRoot: z.ZodString;
|
|
11
|
+
state: z.ZodEnum<{
|
|
12
|
+
current: "current";
|
|
13
|
+
upgraded: "upgraded";
|
|
14
|
+
}>;
|
|
15
|
+
fromVersion: z.ZodNumber;
|
|
16
|
+
toVersion: z.ZodNumber;
|
|
17
|
+
fromSchemaHash: z.ZodString;
|
|
18
|
+
toSchemaHash: z.ZodString;
|
|
19
|
+
backupDirectory: z.ZodNullable<z.ZodString>;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
export type IHqStorageUpgradeResult = z.infer<typeof UpgradeResultSchema>;
|
|
22
|
+
export declare const UpgradeWorkerInputSchema: z.ZodObject<{
|
|
23
|
+
stateRoot: z.ZodString;
|
|
24
|
+
backupDirectory: z.ZodString;
|
|
25
|
+
allowedRoots: z.ZodArray<z.ZodString>;
|
|
26
|
+
coordinationRoot: z.ZodOptional<z.ZodString>;
|
|
27
|
+
actionKeyHash: z.ZodString;
|
|
28
|
+
}, z.core.$strict>;
|
|
29
|
+
export declare const UpgradeWorkerResponseSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
30
|
+
kind: z.ZodLiteral<"result">;
|
|
31
|
+
result: z.ZodObject<{
|
|
32
|
+
stateRoot: z.ZodString;
|
|
33
|
+
state: z.ZodEnum<{
|
|
34
|
+
current: "current";
|
|
35
|
+
upgraded: "upgraded";
|
|
36
|
+
}>;
|
|
37
|
+
fromVersion: z.ZodNumber;
|
|
38
|
+
toVersion: z.ZodNumber;
|
|
39
|
+
fromSchemaHash: z.ZodString;
|
|
40
|
+
toSchemaHash: z.ZodString;
|
|
41
|
+
backupDirectory: z.ZodNullable<z.ZodString>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
44
|
+
kind: z.ZodLiteral<"error">;
|
|
45
|
+
code: z.ZodString;
|
|
46
|
+
message: z.ZodString;
|
|
47
|
+
cause: z.ZodOptional<z.ZodInstanceOf<Error>>;
|
|
48
|
+
data: z.ZodObject<{
|
|
49
|
+
kind: z.ZodEnum<{
|
|
50
|
+
"state-conflict": "state-conflict";
|
|
51
|
+
"access-denied": "access-denied";
|
|
52
|
+
"agent-unavailable": "agent-unavailable";
|
|
53
|
+
"operation-failed": "operation-failed";
|
|
54
|
+
"invalid-request": "invalid-request";
|
|
55
|
+
"authentication-required": "authentication-required";
|
|
56
|
+
"not-found": "not-found";
|
|
57
|
+
}>;
|
|
58
|
+
phase: z.ZodString;
|
|
59
|
+
backupDirectory: z.ZodNullable<z.ZodString>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
}, z.core.$strip>], "kind">;
|