@gavinc-cn/touchstone-dsh 0.2.0 → 0.4.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 (116) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +23 -15
  3. package/README.zh.md +17 -12
  4. package/auth.py +0 -0
  5. package/backend/lib/access.js +44 -0
  6. package/backend/lib/agents.js +341 -0
  7. package/backend/lib/args.js +94 -0
  8. package/backend/lib/auth.js +195 -0
  9. package/backend/lib/board.js +6227 -0
  10. package/backend/lib/builtin-assets.js +1177 -0
  11. package/backend/lib/casescan.js +456 -0
  12. package/backend/lib/chat.js +2090 -0
  13. package/backend/lib/cookie.js +76 -0
  14. package/backend/lib/db.js +2260 -0
  15. package/backend/lib/dshdriver.js +1148 -0
  16. package/backend/lib/dshevents.js +851 -0
  17. package/backend/lib/export-cases.js +261 -0
  18. package/backend/lib/feishu.js +1747 -0
  19. package/backend/lib/feishu_cfg.js +262 -0
  20. package/backend/lib/feishu_conv.js +1484 -0
  21. package/backend/lib/feishu_device.js +428 -0
  22. package/backend/lib/feishu_inbound.js +2077 -0
  23. package/backend/lib/feishu_provision.js +886 -0
  24. package/backend/lib/feishu_rest.js +398 -0
  25. package/backend/lib/feishu_slash.js +568 -0
  26. package/backend/lib/feishu_ws.js +950 -0
  27. package/backend/lib/http.js +312 -0
  28. package/backend/lib/lib.js +973 -0
  29. package/backend/lib/loadcase.js +749 -0
  30. package/backend/lib/loadgen.js +1407 -0
  31. package/backend/lib/localbus.js +164 -0
  32. package/backend/lib/lock.js +426 -0
  33. package/backend/lib/proc.js +361 -0
  34. package/backend/lib/prompts.js +1021 -0
  35. package/backend/lib/pybase64.js +114 -0
  36. package/backend/lib/pyjson.js +214 -0
  37. package/backend/lib/query.js +125 -0
  38. package/backend/lib/rag.js +1310 -0
  39. package/backend/lib/runner.js +4546 -0
  40. package/backend/lib/seed_hint.js +40 -0
  41. package/backend/lib/servercaps.js +182 -0
  42. package/backend/lib/serverstate.js +227 -0
  43. package/backend/lib/sessparse.js +1176 -0
  44. package/backend/lib/sse.js +207 -0
  45. package/backend/lib/static.js +84 -0
  46. package/backend/lib/taskjson.js +302 -0
  47. package/backend/lib/waitq.js +2114 -0
  48. package/backend/lib/worktree.js +588 -0
  49. package/backend/lib/zstd-frames.js +218 -0
  50. package/backend/routes/admin.js +553 -0
  51. package/backend/routes/agents.js +149 -0
  52. package/backend/routes/assets.js +145 -0
  53. package/backend/routes/board.js +1228 -0
  54. package/backend/routes/feishu.js +269 -0
  55. package/backend/routes/feishu_app.js +249 -0
  56. package/backend/routes/feishu_hook.js +358 -0
  57. package/backend/routes/index.js +298 -0
  58. package/backend/routes/projects.js +1138 -0
  59. package/backend/routes/sessions.js +1003 -0
  60. package/backend/routes/tasks.js +1530 -0
  61. package/backend/schema/fixtures/ancient.sql +189 -0
  62. package/backend/schema/fixtures/pre_alter.sql +177 -0
  63. package/backend/schema/migrations.json +154 -0
  64. package/backend/schema/schema.json +1451 -0
  65. package/backend/schema/schema.sql +216 -0
  66. package/backend/server.js +505 -0
  67. package/board.py +96 -13
  68. package/builtin_assets.py +0 -0
  69. package/builtin_prompts/free_style/flow.md +0 -0
  70. package/builtin_prompts/free_style/load_test.md +0 -0
  71. package/builtin_prompts/free_style/templates/bug_report_template.md +0 -0
  72. package/builtin_prompts/free_style/templates/case_template.md +0 -0
  73. package/builtin_prompts/free_style/templates/index_template.md +0 -0
  74. package/builtin_prompts/free_style/templates/load_charts_template.md +0 -0
  75. package/builtin_prompts/free_style/templates/load_index_template.md +0 -0
  76. package/builtin_prompts/free_style/templates/load_plan_template.md +0 -0
  77. package/builtin_prompts/free_style/templates/load_scenario_template.md +0 -0
  78. package/builtin_prompts/free_style/templates/status_template.md +0 -0
  79. package/chat.py +33 -0
  80. package/db.py +294 -129
  81. package/dsh-plugin/cordis.patch.yml +0 -0
  82. package/dsh-plugin/install.sh +22 -8
  83. package/dsh-plugin/lib/client.bundle.js +111 -2
  84. package/dsh-plugin/lib/index.js +340 -29
  85. package/dsh-plugin/lib/pack-closure.mjs +291 -0
  86. package/dsh-plugin/scripts/build.mjs +0 -0
  87. package/dsh-plugin/scripts/prepack-check.mjs +30 -2
  88. package/dsh-plugin/scripts/select-bundle.mjs +0 -0
  89. package/dsh-plugin/src/client.js +111 -2
  90. package/dshevents.py +0 -0
  91. package/export_cases.py +0 -0
  92. package/extensions/dsh-autocommit/asset.json +0 -0
  93. package/extensions/dsh-autocommit/pkg/lib/index.mjs +0 -0
  94. package/extensions/dsh-autocommit/pkg/package.json +0 -0
  95. package/feishu.py +417 -3
  96. package/feishu_conv.py +0 -0
  97. package/lib.py +0 -0
  98. package/lifecycle.py +116 -13
  99. package/loadcase.py +0 -0
  100. package/loadgen.py +0 -0
  101. package/localbus.py +0 -0
  102. package/migrate_p7b.py +0 -0
  103. package/package.json +6 -1
  104. package/platcompat.py +0 -0
  105. package/prompts.py +0 -0
  106. package/rag.py +0 -0
  107. package/requirements.txt +0 -0
  108. package/server.py +155 -11
  109. package/touchstone.py +0 -0
  110. package/waitq.py +0 -0
  111. package/webui/dist-plugin/assets/index-3QsYQi7y.css +1 -0
  112. package/webui/dist-plugin/assets/index-B8AMtW7y.js +486 -0
  113. package/webui/dist-plugin/index.html +2 -2
  114. package/worktree.py +0 -0
  115. package/webui/dist-plugin/assets/index-JLwyZZxC.js +0 -484
  116. package/webui/dist-plugin/assets/index-tJ0TlvQ3.css +0 -1
@@ -0,0 +1,1451 @@
1
+ {
2
+ "format": 1,
3
+ "schemaVersion": 1,
4
+ "generatedBy": "tools/export_schema.py",
5
+ "note": "目标 schema(实测导出)。列顺序不入契约:老库经 ALTER 补列的顺序与新库 DDL 顺序不同,比对按列集合。",
6
+ "tables": [
7
+ {
8
+ "name": "users",
9
+ "ddl": "CREATE TABLE users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n username TEXT UNIQUE NOT NULL,\n pass_hash TEXT NOT NULL,\n salt TEXT NOT NULL,\n must_change_pw INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL\n)",
10
+ "columns": [
11
+ {
12
+ "name": "id",
13
+ "type": "INTEGER",
14
+ "notnull": 0,
15
+ "dflt": null,
16
+ "pk": 1
17
+ },
18
+ {
19
+ "name": "username",
20
+ "type": "TEXT",
21
+ "notnull": 1,
22
+ "dflt": null,
23
+ "pk": 0
24
+ },
25
+ {
26
+ "name": "pass_hash",
27
+ "type": "TEXT",
28
+ "notnull": 1,
29
+ "dflt": null,
30
+ "pk": 0
31
+ },
32
+ {
33
+ "name": "salt",
34
+ "type": "TEXT",
35
+ "notnull": 1,
36
+ "dflt": null,
37
+ "pk": 0
38
+ },
39
+ {
40
+ "name": "must_change_pw",
41
+ "type": "INTEGER",
42
+ "notnull": 1,
43
+ "dflt": "0",
44
+ "pk": 0
45
+ },
46
+ {
47
+ "name": "created_at",
48
+ "type": "TEXT",
49
+ "notnull": 1,
50
+ "dflt": null,
51
+ "pk": 0
52
+ }
53
+ ],
54
+ "indexes": [
55
+ {
56
+ "name": "sqlite_autoindex_users_1",
57
+ "unique": 1,
58
+ "origin": "u",
59
+ "partial": 0,
60
+ "sql": null,
61
+ "columns": [
62
+ "username"
63
+ ]
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ "name": "sessions",
69
+ "ddl": "CREATE TABLE sessions (\n token TEXT PRIMARY KEY,\n user_id INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n expires_at TEXT NOT NULL\n)",
70
+ "columns": [
71
+ {
72
+ "name": "token",
73
+ "type": "TEXT",
74
+ "notnull": 0,
75
+ "dflt": null,
76
+ "pk": 1
77
+ },
78
+ {
79
+ "name": "user_id",
80
+ "type": "INTEGER",
81
+ "notnull": 1,
82
+ "dflt": null,
83
+ "pk": 0
84
+ },
85
+ {
86
+ "name": "created_at",
87
+ "type": "TEXT",
88
+ "notnull": 1,
89
+ "dflt": null,
90
+ "pk": 0
91
+ },
92
+ {
93
+ "name": "expires_at",
94
+ "type": "TEXT",
95
+ "notnull": 1,
96
+ "dflt": null,
97
+ "pk": 0
98
+ }
99
+ ],
100
+ "indexes": [
101
+ {
102
+ "name": "sqlite_autoindex_sessions_1",
103
+ "unique": 1,
104
+ "origin": "pk",
105
+ "partial": 0,
106
+ "sql": null,
107
+ "columns": [
108
+ "token"
109
+ ]
110
+ }
111
+ ]
112
+ },
113
+ {
114
+ "name": "projects",
115
+ "ddl": "CREATE TABLE projects (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL DEFAULT 0,\n name TEXT NOT NULL,\n project_dir TEXT NOT NULL,\n agent_path TEXT NOT NULL DEFAULT '',\n work_dir TEXT NOT NULL,\n bug_dir TEXT NOT NULL,\n guide_text TEXT NOT NULL DEFAULT '',\n commit_spec TEXT NOT NULL DEFAULT '',\n deploy_spec TEXT NOT NULL DEFAULT '',\n env_label TEXT NOT NULL DEFAULT '',\n model TEXT NOT NULL DEFAULT '',\n skill_understand TEXT NOT NULL DEFAULT '',\n skill_deploy TEXT NOT NULL DEFAULT '',\n skill_commit TEXT NOT NULL DEFAULT '',\n skill_test TEXT NOT NULL DEFAULT '',\n skill_cases TEXT NOT NULL DEFAULT '',\n reasoning_effort TEXT NOT NULL DEFAULT '',\n permission_mode TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL\n, archived INTEGER NOT NULL DEFAULT 0)",
116
+ "columns": [
117
+ {
118
+ "name": "id",
119
+ "type": "INTEGER",
120
+ "notnull": 0,
121
+ "dflt": null,
122
+ "pk": 1
123
+ },
124
+ {
125
+ "name": "user_id",
126
+ "type": "INTEGER",
127
+ "notnull": 1,
128
+ "dflt": "0",
129
+ "pk": 0
130
+ },
131
+ {
132
+ "name": "name",
133
+ "type": "TEXT",
134
+ "notnull": 1,
135
+ "dflt": null,
136
+ "pk": 0
137
+ },
138
+ {
139
+ "name": "project_dir",
140
+ "type": "TEXT",
141
+ "notnull": 1,
142
+ "dflt": null,
143
+ "pk": 0
144
+ },
145
+ {
146
+ "name": "agent_path",
147
+ "type": "TEXT",
148
+ "notnull": 1,
149
+ "dflt": "''",
150
+ "pk": 0
151
+ },
152
+ {
153
+ "name": "work_dir",
154
+ "type": "TEXT",
155
+ "notnull": 1,
156
+ "dflt": null,
157
+ "pk": 0
158
+ },
159
+ {
160
+ "name": "bug_dir",
161
+ "type": "TEXT",
162
+ "notnull": 1,
163
+ "dflt": null,
164
+ "pk": 0
165
+ },
166
+ {
167
+ "name": "guide_text",
168
+ "type": "TEXT",
169
+ "notnull": 1,
170
+ "dflt": "''",
171
+ "pk": 0
172
+ },
173
+ {
174
+ "name": "commit_spec",
175
+ "type": "TEXT",
176
+ "notnull": 1,
177
+ "dflt": "''",
178
+ "pk": 0
179
+ },
180
+ {
181
+ "name": "deploy_spec",
182
+ "type": "TEXT",
183
+ "notnull": 1,
184
+ "dflt": "''",
185
+ "pk": 0
186
+ },
187
+ {
188
+ "name": "env_label",
189
+ "type": "TEXT",
190
+ "notnull": 1,
191
+ "dflt": "''",
192
+ "pk": 0
193
+ },
194
+ {
195
+ "name": "model",
196
+ "type": "TEXT",
197
+ "notnull": 1,
198
+ "dflt": "''",
199
+ "pk": 0
200
+ },
201
+ {
202
+ "name": "skill_understand",
203
+ "type": "TEXT",
204
+ "notnull": 1,
205
+ "dflt": "''",
206
+ "pk": 0
207
+ },
208
+ {
209
+ "name": "skill_deploy",
210
+ "type": "TEXT",
211
+ "notnull": 1,
212
+ "dflt": "''",
213
+ "pk": 0
214
+ },
215
+ {
216
+ "name": "skill_commit",
217
+ "type": "TEXT",
218
+ "notnull": 1,
219
+ "dflt": "''",
220
+ "pk": 0
221
+ },
222
+ {
223
+ "name": "skill_test",
224
+ "type": "TEXT",
225
+ "notnull": 1,
226
+ "dflt": "''",
227
+ "pk": 0
228
+ },
229
+ {
230
+ "name": "skill_cases",
231
+ "type": "TEXT",
232
+ "notnull": 1,
233
+ "dflt": "''",
234
+ "pk": 0
235
+ },
236
+ {
237
+ "name": "reasoning_effort",
238
+ "type": "TEXT",
239
+ "notnull": 1,
240
+ "dflt": "''",
241
+ "pk": 0
242
+ },
243
+ {
244
+ "name": "permission_mode",
245
+ "type": "TEXT",
246
+ "notnull": 1,
247
+ "dflt": "''",
248
+ "pk": 0
249
+ },
250
+ {
251
+ "name": "created_at",
252
+ "type": "TEXT",
253
+ "notnull": 1,
254
+ "dflt": null,
255
+ "pk": 0
256
+ },
257
+ {
258
+ "name": "archived",
259
+ "type": "INTEGER",
260
+ "notnull": 1,
261
+ "dflt": "0",
262
+ "pk": 0
263
+ }
264
+ ],
265
+ "indexes": [
266
+ {
267
+ "name": "idx_projects_user_name",
268
+ "unique": 1,
269
+ "origin": "c",
270
+ "partial": 0,
271
+ "sql": "CREATE UNIQUE INDEX idx_projects_user_name ON projects(user_id, name)",
272
+ "columns": [
273
+ "user_id",
274
+ "name"
275
+ ]
276
+ }
277
+ ]
278
+ },
279
+ {
280
+ "name": "tasks",
281
+ "ddl": "CREATE TABLE tasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id INTEGER NOT NULL,\n name TEXT NOT NULL,\n auto_fix INTEGER NOT NULL DEFAULT 0,\n retest TEXT NOT NULL DEFAULT '不复测',\n stop_type TEXT NOT NULL DEFAULT 'rounds',\n stop_value TEXT NOT NULL DEFAULT '1',\n task_type TEXT NOT NULL DEFAULT 'normal',\n start_stage TEXT NOT NULL DEFAULT '',\n end_stage TEXT NOT NULL DEFAULT '',\n payload TEXT NOT NULL DEFAULT '',\n extra TEXT NOT NULL DEFAULT '',\n status TEXT NOT NULL DEFAULT 'queued',\n session_id TEXT NOT NULL DEFAULT '',\n model TEXT NOT NULL DEFAULT '',\n permission TEXT NOT NULL DEFAULT '',\n auto_commit INTEGER NOT NULL DEFAULT 0,\n auto_deploy INTEGER NOT NULL DEFAULT 0,\n auto_retest INTEGER NOT NULL DEFAULT 0,\n cases_base INTEGER NOT NULL DEFAULT 0,\n fresh_prompt INTEGER NOT NULL DEFAULT 0,\n current_round INTEGER NOT NULL DEFAULT 0,\n new_bugs INTEGER NOT NULL DEFAULT 0,\n date_from TEXT NOT NULL DEFAULT '',\n date_to TEXT NOT NULL DEFAULT '',\n -- 复压标记(2026-10-06):1=下一次执行只跑发压运行(跳过 agent 轮),用后即清\n load_rerun INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n started_at TEXT,\n ended_at TEXT,\n error TEXT NOT NULL DEFAULT ''\n)",
282
+ "columns": [
283
+ {
284
+ "name": "id",
285
+ "type": "INTEGER",
286
+ "notnull": 0,
287
+ "dflt": null,
288
+ "pk": 1
289
+ },
290
+ {
291
+ "name": "project_id",
292
+ "type": "INTEGER",
293
+ "notnull": 1,
294
+ "dflt": null,
295
+ "pk": 0
296
+ },
297
+ {
298
+ "name": "name",
299
+ "type": "TEXT",
300
+ "notnull": 1,
301
+ "dflt": null,
302
+ "pk": 0
303
+ },
304
+ {
305
+ "name": "auto_fix",
306
+ "type": "INTEGER",
307
+ "notnull": 1,
308
+ "dflt": "0",
309
+ "pk": 0
310
+ },
311
+ {
312
+ "name": "retest",
313
+ "type": "TEXT",
314
+ "notnull": 1,
315
+ "dflt": "'不复测'",
316
+ "pk": 0
317
+ },
318
+ {
319
+ "name": "stop_type",
320
+ "type": "TEXT",
321
+ "notnull": 1,
322
+ "dflt": "'rounds'",
323
+ "pk": 0
324
+ },
325
+ {
326
+ "name": "stop_value",
327
+ "type": "TEXT",
328
+ "notnull": 1,
329
+ "dflt": "'1'",
330
+ "pk": 0
331
+ },
332
+ {
333
+ "name": "task_type",
334
+ "type": "TEXT",
335
+ "notnull": 1,
336
+ "dflt": "'normal'",
337
+ "pk": 0
338
+ },
339
+ {
340
+ "name": "start_stage",
341
+ "type": "TEXT",
342
+ "notnull": 1,
343
+ "dflt": "''",
344
+ "pk": 0
345
+ },
346
+ {
347
+ "name": "end_stage",
348
+ "type": "TEXT",
349
+ "notnull": 1,
350
+ "dflt": "''",
351
+ "pk": 0
352
+ },
353
+ {
354
+ "name": "payload",
355
+ "type": "TEXT",
356
+ "notnull": 1,
357
+ "dflt": "''",
358
+ "pk": 0
359
+ },
360
+ {
361
+ "name": "extra",
362
+ "type": "TEXT",
363
+ "notnull": 1,
364
+ "dflt": "''",
365
+ "pk": 0
366
+ },
367
+ {
368
+ "name": "status",
369
+ "type": "TEXT",
370
+ "notnull": 1,
371
+ "dflt": "'queued'",
372
+ "pk": 0
373
+ },
374
+ {
375
+ "name": "session_id",
376
+ "type": "TEXT",
377
+ "notnull": 1,
378
+ "dflt": "''",
379
+ "pk": 0
380
+ },
381
+ {
382
+ "name": "model",
383
+ "type": "TEXT",
384
+ "notnull": 1,
385
+ "dflt": "''",
386
+ "pk": 0
387
+ },
388
+ {
389
+ "name": "permission",
390
+ "type": "TEXT",
391
+ "notnull": 1,
392
+ "dflt": "''",
393
+ "pk": 0
394
+ },
395
+ {
396
+ "name": "auto_commit",
397
+ "type": "INTEGER",
398
+ "notnull": 1,
399
+ "dflt": "0",
400
+ "pk": 0
401
+ },
402
+ {
403
+ "name": "auto_deploy",
404
+ "type": "INTEGER",
405
+ "notnull": 1,
406
+ "dflt": "0",
407
+ "pk": 0
408
+ },
409
+ {
410
+ "name": "auto_retest",
411
+ "type": "INTEGER",
412
+ "notnull": 1,
413
+ "dflt": "0",
414
+ "pk": 0
415
+ },
416
+ {
417
+ "name": "cases_base",
418
+ "type": "INTEGER",
419
+ "notnull": 1,
420
+ "dflt": "0",
421
+ "pk": 0
422
+ },
423
+ {
424
+ "name": "fresh_prompt",
425
+ "type": "INTEGER",
426
+ "notnull": 1,
427
+ "dflt": "0",
428
+ "pk": 0
429
+ },
430
+ {
431
+ "name": "current_round",
432
+ "type": "INTEGER",
433
+ "notnull": 1,
434
+ "dflt": "0",
435
+ "pk": 0
436
+ },
437
+ {
438
+ "name": "new_bugs",
439
+ "type": "INTEGER",
440
+ "notnull": 1,
441
+ "dflt": "0",
442
+ "pk": 0
443
+ },
444
+ {
445
+ "name": "date_from",
446
+ "type": "TEXT",
447
+ "notnull": 1,
448
+ "dflt": "''",
449
+ "pk": 0
450
+ },
451
+ {
452
+ "name": "date_to",
453
+ "type": "TEXT",
454
+ "notnull": 1,
455
+ "dflt": "''",
456
+ "pk": 0
457
+ },
458
+ {
459
+ "name": "load_rerun",
460
+ "type": "INTEGER",
461
+ "notnull": 1,
462
+ "dflt": "0",
463
+ "pk": 0
464
+ },
465
+ {
466
+ "name": "created_at",
467
+ "type": "TEXT",
468
+ "notnull": 1,
469
+ "dflt": null,
470
+ "pk": 0
471
+ },
472
+ {
473
+ "name": "started_at",
474
+ "type": "TEXT",
475
+ "notnull": 0,
476
+ "dflt": null,
477
+ "pk": 0
478
+ },
479
+ {
480
+ "name": "ended_at",
481
+ "type": "TEXT",
482
+ "notnull": 0,
483
+ "dflt": null,
484
+ "pk": 0
485
+ },
486
+ {
487
+ "name": "error",
488
+ "type": "TEXT",
489
+ "notnull": 1,
490
+ "dflt": "''",
491
+ "pk": 0
492
+ }
493
+ ],
494
+ "indexes": [
495
+ {
496
+ "name": "idx_tasks_project",
497
+ "unique": 0,
498
+ "origin": "c",
499
+ "partial": 0,
500
+ "sql": "CREATE INDEX idx_tasks_project ON tasks(project_id)",
501
+ "columns": [
502
+ "project_id"
503
+ ]
504
+ }
505
+ ]
506
+ },
507
+ {
508
+ "name": "rounds",
509
+ "ddl": "CREATE TABLE rounds (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL,\n round_no INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n exit_code INTEGER,\n log_path TEXT NOT NULL DEFAULT '',\n started_at TEXT NOT NULL,\n ended_at TEXT,\n summary TEXT NOT NULL DEFAULT '',\n kind TEXT NOT NULL DEFAULT 'agent',\n run_key TEXT NOT NULL DEFAULT ''\n)",
510
+ "columns": [
511
+ {
512
+ "name": "id",
513
+ "type": "INTEGER",
514
+ "notnull": 0,
515
+ "dflt": null,
516
+ "pk": 1
517
+ },
518
+ {
519
+ "name": "task_id",
520
+ "type": "INTEGER",
521
+ "notnull": 1,
522
+ "dflt": null,
523
+ "pk": 0
524
+ },
525
+ {
526
+ "name": "round_no",
527
+ "type": "INTEGER",
528
+ "notnull": 1,
529
+ "dflt": null,
530
+ "pk": 0
531
+ },
532
+ {
533
+ "name": "status",
534
+ "type": "TEXT",
535
+ "notnull": 1,
536
+ "dflt": "'running'",
537
+ "pk": 0
538
+ },
539
+ {
540
+ "name": "exit_code",
541
+ "type": "INTEGER",
542
+ "notnull": 0,
543
+ "dflt": null,
544
+ "pk": 0
545
+ },
546
+ {
547
+ "name": "log_path",
548
+ "type": "TEXT",
549
+ "notnull": 1,
550
+ "dflt": "''",
551
+ "pk": 0
552
+ },
553
+ {
554
+ "name": "started_at",
555
+ "type": "TEXT",
556
+ "notnull": 1,
557
+ "dflt": null,
558
+ "pk": 0
559
+ },
560
+ {
561
+ "name": "ended_at",
562
+ "type": "TEXT",
563
+ "notnull": 0,
564
+ "dflt": null,
565
+ "pk": 0
566
+ },
567
+ {
568
+ "name": "summary",
569
+ "type": "TEXT",
570
+ "notnull": 1,
571
+ "dflt": "''",
572
+ "pk": 0
573
+ },
574
+ {
575
+ "name": "kind",
576
+ "type": "TEXT",
577
+ "notnull": 1,
578
+ "dflt": "'agent'",
579
+ "pk": 0
580
+ },
581
+ {
582
+ "name": "run_key",
583
+ "type": "TEXT",
584
+ "notnull": 1,
585
+ "dflt": "''",
586
+ "pk": 0
587
+ }
588
+ ],
589
+ "indexes": [
590
+ {
591
+ "name": "idx_rounds_task",
592
+ "unique": 0,
593
+ "origin": "c",
594
+ "partial": 0,
595
+ "sql": "CREATE INDEX idx_rounds_task ON rounds(task_id)",
596
+ "columns": [
597
+ "task_id"
598
+ ]
599
+ }
600
+ ]
601
+ },
602
+ {
603
+ "name": "board_cards",
604
+ "ddl": "CREATE TABLE board_cards (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id INTEGER NOT NULL,\n title TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n column_key TEXT NOT NULL DEFAULT 'todo',\n sort_order INTEGER NOT NULL DEFAULT 0,\n session_id TEXT NOT NULL DEFAULT '',\n sessions TEXT NOT NULL DEFAULT '[]',\n block_kind TEXT,\n block_text TEXT NOT NULL DEFAULT '',\n parent_card_id INTEGER,\n readonly INTEGER NOT NULL DEFAULT 0,\n model TEXT NOT NULL DEFAULT '',\n scheduled_at INTEGER,\n worktree TEXT NOT NULL DEFAULT '',\n jira_key TEXT NOT NULL DEFAULT '',\n last_error TEXT NOT NULL DEFAULT '',\n last_error_at INTEGER,\n origin TEXT,\n done_at TEXT,\n trashed INTEGER NOT NULL DEFAULT 0,\n trashed_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n -- 2026-10-07 起:卡片状态(列)被平台/agent 改动、而用户还没打开过卡片 ⇒ 1\n -- (前端卡面打「有更新」标记,用户打开卡片详情即清 0)。用户自己拖列/点按钮\n -- 造成的列变化不置位(见 update_board_card 的 mark_unread 形参)。\n unread INTEGER NOT NULL DEFAULT 0\n)",
605
+ "columns": [
606
+ {
607
+ "name": "id",
608
+ "type": "INTEGER",
609
+ "notnull": 0,
610
+ "dflt": null,
611
+ "pk": 1
612
+ },
613
+ {
614
+ "name": "project_id",
615
+ "type": "INTEGER",
616
+ "notnull": 1,
617
+ "dflt": null,
618
+ "pk": 0
619
+ },
620
+ {
621
+ "name": "title",
622
+ "type": "TEXT",
623
+ "notnull": 1,
624
+ "dflt": null,
625
+ "pk": 0
626
+ },
627
+ {
628
+ "name": "description",
629
+ "type": "TEXT",
630
+ "notnull": 1,
631
+ "dflt": "''",
632
+ "pk": 0
633
+ },
634
+ {
635
+ "name": "column_key",
636
+ "type": "TEXT",
637
+ "notnull": 1,
638
+ "dflt": "'todo'",
639
+ "pk": 0
640
+ },
641
+ {
642
+ "name": "sort_order",
643
+ "type": "INTEGER",
644
+ "notnull": 1,
645
+ "dflt": "0",
646
+ "pk": 0
647
+ },
648
+ {
649
+ "name": "session_id",
650
+ "type": "TEXT",
651
+ "notnull": 1,
652
+ "dflt": "''",
653
+ "pk": 0
654
+ },
655
+ {
656
+ "name": "sessions",
657
+ "type": "TEXT",
658
+ "notnull": 1,
659
+ "dflt": "'[]'",
660
+ "pk": 0
661
+ },
662
+ {
663
+ "name": "block_kind",
664
+ "type": "TEXT",
665
+ "notnull": 0,
666
+ "dflt": null,
667
+ "pk": 0
668
+ },
669
+ {
670
+ "name": "block_text",
671
+ "type": "TEXT",
672
+ "notnull": 1,
673
+ "dflt": "''",
674
+ "pk": 0
675
+ },
676
+ {
677
+ "name": "parent_card_id",
678
+ "type": "INTEGER",
679
+ "notnull": 0,
680
+ "dflt": null,
681
+ "pk": 0
682
+ },
683
+ {
684
+ "name": "readonly",
685
+ "type": "INTEGER",
686
+ "notnull": 1,
687
+ "dflt": "0",
688
+ "pk": 0
689
+ },
690
+ {
691
+ "name": "model",
692
+ "type": "TEXT",
693
+ "notnull": 1,
694
+ "dflt": "''",
695
+ "pk": 0
696
+ },
697
+ {
698
+ "name": "scheduled_at",
699
+ "type": "INTEGER",
700
+ "notnull": 0,
701
+ "dflt": null,
702
+ "pk": 0
703
+ },
704
+ {
705
+ "name": "worktree",
706
+ "type": "TEXT",
707
+ "notnull": 1,
708
+ "dflt": "''",
709
+ "pk": 0
710
+ },
711
+ {
712
+ "name": "jira_key",
713
+ "type": "TEXT",
714
+ "notnull": 1,
715
+ "dflt": "''",
716
+ "pk": 0
717
+ },
718
+ {
719
+ "name": "last_error",
720
+ "type": "TEXT",
721
+ "notnull": 1,
722
+ "dflt": "''",
723
+ "pk": 0
724
+ },
725
+ {
726
+ "name": "last_error_at",
727
+ "type": "INTEGER",
728
+ "notnull": 0,
729
+ "dflt": null,
730
+ "pk": 0
731
+ },
732
+ {
733
+ "name": "origin",
734
+ "type": "TEXT",
735
+ "notnull": 0,
736
+ "dflt": null,
737
+ "pk": 0
738
+ },
739
+ {
740
+ "name": "done_at",
741
+ "type": "TEXT",
742
+ "notnull": 0,
743
+ "dflt": null,
744
+ "pk": 0
745
+ },
746
+ {
747
+ "name": "trashed",
748
+ "type": "INTEGER",
749
+ "notnull": 1,
750
+ "dflt": "0",
751
+ "pk": 0
752
+ },
753
+ {
754
+ "name": "trashed_at",
755
+ "type": "TEXT",
756
+ "notnull": 0,
757
+ "dflt": null,
758
+ "pk": 0
759
+ },
760
+ {
761
+ "name": "created_at",
762
+ "type": "TEXT",
763
+ "notnull": 1,
764
+ "dflt": null,
765
+ "pk": 0
766
+ },
767
+ {
768
+ "name": "updated_at",
769
+ "type": "TEXT",
770
+ "notnull": 1,
771
+ "dflt": null,
772
+ "pk": 0
773
+ },
774
+ {
775
+ "name": "unread",
776
+ "type": "INTEGER",
777
+ "notnull": 1,
778
+ "dflt": "0",
779
+ "pk": 0
780
+ }
781
+ ],
782
+ "indexes": [
783
+ {
784
+ "name": "idx_board_cards_project",
785
+ "unique": 0,
786
+ "origin": "c",
787
+ "partial": 0,
788
+ "sql": "CREATE INDEX idx_board_cards_project ON board_cards(project_id)",
789
+ "columns": [
790
+ "project_id"
791
+ ]
792
+ }
793
+ ]
794
+ },
795
+ {
796
+ "name": "board_comments",
797
+ "ddl": "CREATE TABLE board_comments (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n card_id INTEGER NOT NULL,\n text TEXT NOT NULL,\n sent INTEGER NOT NULL DEFAULT 0,\n session_id TEXT NOT NULL DEFAULT '',\n sent_text TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL\n)",
798
+ "columns": [
799
+ {
800
+ "name": "id",
801
+ "type": "INTEGER",
802
+ "notnull": 0,
803
+ "dflt": null,
804
+ "pk": 1
805
+ },
806
+ {
807
+ "name": "card_id",
808
+ "type": "INTEGER",
809
+ "notnull": 1,
810
+ "dflt": null,
811
+ "pk": 0
812
+ },
813
+ {
814
+ "name": "text",
815
+ "type": "TEXT",
816
+ "notnull": 1,
817
+ "dflt": null,
818
+ "pk": 0
819
+ },
820
+ {
821
+ "name": "sent",
822
+ "type": "INTEGER",
823
+ "notnull": 1,
824
+ "dflt": "0",
825
+ "pk": 0
826
+ },
827
+ {
828
+ "name": "session_id",
829
+ "type": "TEXT",
830
+ "notnull": 1,
831
+ "dflt": "''",
832
+ "pk": 0
833
+ },
834
+ {
835
+ "name": "sent_text",
836
+ "type": "TEXT",
837
+ "notnull": 1,
838
+ "dflt": "''",
839
+ "pk": 0
840
+ },
841
+ {
842
+ "name": "created_at",
843
+ "type": "TEXT",
844
+ "notnull": 1,
845
+ "dflt": null,
846
+ "pk": 0
847
+ }
848
+ ],
849
+ "indexes": [
850
+ {
851
+ "name": "idx_board_comments_card",
852
+ "unique": 0,
853
+ "origin": "c",
854
+ "partial": 0,
855
+ "sql": "CREATE INDEX idx_board_comments_card ON board_comments(card_id)",
856
+ "columns": [
857
+ "card_id"
858
+ ]
859
+ }
860
+ ]
861
+ },
862
+ {
863
+ "name": "board_settings",
864
+ "ddl": "CREATE TABLE board_settings (\n project_id INTEGER PRIMARY KEY,\n json TEXT NOT NULL DEFAULT '{}'\n)",
865
+ "columns": [
866
+ {
867
+ "name": "project_id",
868
+ "type": "INTEGER",
869
+ "notnull": 0,
870
+ "dflt": null,
871
+ "pk": 1
872
+ },
873
+ {
874
+ "name": "json",
875
+ "type": "TEXT",
876
+ "notnull": 1,
877
+ "dflt": "'{}'",
878
+ "pk": 0
879
+ }
880
+ ],
881
+ "indexes": []
882
+ },
883
+ {
884
+ "name": "app_settings",
885
+ "ddl": "CREATE TABLE app_settings (\n key TEXT PRIMARY KEY,\n json TEXT NOT NULL DEFAULT '{}'\n)",
886
+ "columns": [
887
+ {
888
+ "name": "key",
889
+ "type": "TEXT",
890
+ "notnull": 0,
891
+ "dflt": null,
892
+ "pk": 1
893
+ },
894
+ {
895
+ "name": "json",
896
+ "type": "TEXT",
897
+ "notnull": 1,
898
+ "dflt": "'{}'",
899
+ "pk": 0
900
+ }
901
+ ],
902
+ "indexes": [
903
+ {
904
+ "name": "sqlite_autoindex_app_settings_1",
905
+ "unique": 1,
906
+ "origin": "pk",
907
+ "partial": 0,
908
+ "sql": null,
909
+ "columns": [
910
+ "key"
911
+ ]
912
+ }
913
+ ]
914
+ },
915
+ {
916
+ "name": "user_prefs",
917
+ "ddl": "CREATE TABLE user_prefs (\n user_id INTEGER NOT NULL,\n project_id INTEGER NOT NULL DEFAULT 0, -- 0=跨项目全局偏好(预留)\n key TEXT NOT NULL,\n value TEXT NOT NULL DEFAULT '{}',\n updated_at TEXT NOT NULL,\n PRIMARY KEY (user_id, project_id, key)\n)",
918
+ "columns": [
919
+ {
920
+ "name": "user_id",
921
+ "type": "INTEGER",
922
+ "notnull": 1,
923
+ "dflt": null,
924
+ "pk": 1
925
+ },
926
+ {
927
+ "name": "project_id",
928
+ "type": "INTEGER",
929
+ "notnull": 1,
930
+ "dflt": "0",
931
+ "pk": 2
932
+ },
933
+ {
934
+ "name": "key",
935
+ "type": "TEXT",
936
+ "notnull": 1,
937
+ "dflt": null,
938
+ "pk": 3
939
+ },
940
+ {
941
+ "name": "value",
942
+ "type": "TEXT",
943
+ "notnull": 1,
944
+ "dflt": "'{}'",
945
+ "pk": 0
946
+ },
947
+ {
948
+ "name": "updated_at",
949
+ "type": "TEXT",
950
+ "notnull": 1,
951
+ "dflt": null,
952
+ "pk": 0
953
+ }
954
+ ],
955
+ "indexes": [
956
+ {
957
+ "name": "sqlite_autoindex_user_prefs_1",
958
+ "unique": 1,
959
+ "origin": "pk",
960
+ "partial": 0,
961
+ "sql": null,
962
+ "columns": [
963
+ "user_id",
964
+ "project_id",
965
+ "key"
966
+ ]
967
+ }
968
+ ]
969
+ },
970
+ {
971
+ "name": "feishu_hooks",
972
+ "ddl": "CREATE TABLE feishu_hooks (\n project_id INTEGER PRIMARY KEY,\n webhook_url TEXT NOT NULL DEFAULT '',\n webhook_secret TEXT NOT NULL DEFAULT '',\n events TEXT NOT NULL DEFAULT 'blocked_interaction,task_failed',\n enabled INTEGER NOT NULL DEFAULT 1\n)",
973
+ "columns": [
974
+ {
975
+ "name": "project_id",
976
+ "type": "INTEGER",
977
+ "notnull": 0,
978
+ "dflt": null,
979
+ "pk": 1
980
+ },
981
+ {
982
+ "name": "webhook_url",
983
+ "type": "TEXT",
984
+ "notnull": 1,
985
+ "dflt": "''",
986
+ "pk": 0
987
+ },
988
+ {
989
+ "name": "webhook_secret",
990
+ "type": "TEXT",
991
+ "notnull": 1,
992
+ "dflt": "''",
993
+ "pk": 0
994
+ },
995
+ {
996
+ "name": "events",
997
+ "type": "TEXT",
998
+ "notnull": 1,
999
+ "dflt": "'blocked_interaction,task_failed'",
1000
+ "pk": 0
1001
+ },
1002
+ {
1003
+ "name": "enabled",
1004
+ "type": "INTEGER",
1005
+ "notnull": 1,
1006
+ "dflt": "1",
1007
+ "pk": 0
1008
+ }
1009
+ ],
1010
+ "indexes": []
1011
+ },
1012
+ {
1013
+ "name": "feishu_outbox",
1014
+ "ddl": "CREATE TABLE feishu_outbox (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL DEFAULT 0, -- 投递归属用户(0=系统/遗留,设置页按用户过滤)\n target TEXT NOT NULL,\n secret TEXT NOT NULL DEFAULT '',\n payload TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n retries INTEGER NOT NULL DEFAULT 0,\n next_at REAL NOT NULL DEFAULT 0,\n dedup_key TEXT NOT NULL DEFAULT '',\n last_error TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL\n)",
1015
+ "columns": [
1016
+ {
1017
+ "name": "id",
1018
+ "type": "INTEGER",
1019
+ "notnull": 0,
1020
+ "dflt": null,
1021
+ "pk": 1
1022
+ },
1023
+ {
1024
+ "name": "user_id",
1025
+ "type": "INTEGER",
1026
+ "notnull": 1,
1027
+ "dflt": "0",
1028
+ "pk": 0
1029
+ },
1030
+ {
1031
+ "name": "target",
1032
+ "type": "TEXT",
1033
+ "notnull": 1,
1034
+ "dflt": null,
1035
+ "pk": 0
1036
+ },
1037
+ {
1038
+ "name": "secret",
1039
+ "type": "TEXT",
1040
+ "notnull": 1,
1041
+ "dflt": "''",
1042
+ "pk": 0
1043
+ },
1044
+ {
1045
+ "name": "payload",
1046
+ "type": "TEXT",
1047
+ "notnull": 1,
1048
+ "dflt": null,
1049
+ "pk": 0
1050
+ },
1051
+ {
1052
+ "name": "status",
1053
+ "type": "TEXT",
1054
+ "notnull": 1,
1055
+ "dflt": "'pending'",
1056
+ "pk": 0
1057
+ },
1058
+ {
1059
+ "name": "retries",
1060
+ "type": "INTEGER",
1061
+ "notnull": 1,
1062
+ "dflt": "0",
1063
+ "pk": 0
1064
+ },
1065
+ {
1066
+ "name": "next_at",
1067
+ "type": "REAL",
1068
+ "notnull": 1,
1069
+ "dflt": "0",
1070
+ "pk": 0
1071
+ },
1072
+ {
1073
+ "name": "dedup_key",
1074
+ "type": "TEXT",
1075
+ "notnull": 1,
1076
+ "dflt": "''",
1077
+ "pk": 0
1078
+ },
1079
+ {
1080
+ "name": "last_error",
1081
+ "type": "TEXT",
1082
+ "notnull": 1,
1083
+ "dflt": "''",
1084
+ "pk": 0
1085
+ },
1086
+ {
1087
+ "name": "created_at",
1088
+ "type": "TEXT",
1089
+ "notnull": 1,
1090
+ "dflt": null,
1091
+ "pk": 0
1092
+ }
1093
+ ],
1094
+ "indexes": []
1095
+ },
1096
+ {
1097
+ "name": "feishu_user_cfgs",
1098
+ "ddl": "CREATE TABLE feishu_user_cfgs (\n user_id INTEGER PRIMARY KEY,\n json TEXT NOT NULL DEFAULT '{}'\n)",
1099
+ "columns": [
1100
+ {
1101
+ "name": "user_id",
1102
+ "type": "INTEGER",
1103
+ "notnull": 0,
1104
+ "dflt": null,
1105
+ "pk": 1
1106
+ },
1107
+ {
1108
+ "name": "json",
1109
+ "type": "TEXT",
1110
+ "notnull": 1,
1111
+ "dflt": "'{}'",
1112
+ "pk": 0
1113
+ }
1114
+ ],
1115
+ "indexes": []
1116
+ },
1117
+ {
1118
+ "name": "feishu_bindings",
1119
+ "ddl": "CREATE TABLE feishu_bindings (\n open_id TEXT PRIMARY KEY,\n user_id INTEGER NOT NULL UNIQUE,\n default_project_id INTEGER NOT NULL DEFAULT 0,\n bound_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')),\n cur_sid TEXT NOT NULL DEFAULT '', -- 当前会话 id(空=未绑定会话)\n cur_project_id INTEGER NOT NULL DEFAULT 0, -- 当前会话所属项目(投递队列归属)\n cur_title TEXT NOT NULL DEFAULT '', -- 绑定时标题快照\n cur_bound_at TEXT NOT NULL DEFAULT '' -- 绑定时刻(localtime)\n)",
1120
+ "columns": [
1121
+ {
1122
+ "name": "open_id",
1123
+ "type": "TEXT",
1124
+ "notnull": 0,
1125
+ "dflt": null,
1126
+ "pk": 1
1127
+ },
1128
+ {
1129
+ "name": "user_id",
1130
+ "type": "INTEGER",
1131
+ "notnull": 1,
1132
+ "dflt": null,
1133
+ "pk": 0
1134
+ },
1135
+ {
1136
+ "name": "default_project_id",
1137
+ "type": "INTEGER",
1138
+ "notnull": 1,
1139
+ "dflt": "0",
1140
+ "pk": 0
1141
+ },
1142
+ {
1143
+ "name": "bound_at",
1144
+ "type": "TEXT",
1145
+ "notnull": 1,
1146
+ "dflt": "datetime('now', 'localtime')",
1147
+ "pk": 0
1148
+ },
1149
+ {
1150
+ "name": "cur_sid",
1151
+ "type": "TEXT",
1152
+ "notnull": 1,
1153
+ "dflt": "''",
1154
+ "pk": 0
1155
+ },
1156
+ {
1157
+ "name": "cur_project_id",
1158
+ "type": "INTEGER",
1159
+ "notnull": 1,
1160
+ "dflt": "0",
1161
+ "pk": 0
1162
+ },
1163
+ {
1164
+ "name": "cur_title",
1165
+ "type": "TEXT",
1166
+ "notnull": 1,
1167
+ "dflt": "''",
1168
+ "pk": 0
1169
+ },
1170
+ {
1171
+ "name": "cur_bound_at",
1172
+ "type": "TEXT",
1173
+ "notnull": 1,
1174
+ "dflt": "''",
1175
+ "pk": 0
1176
+ }
1177
+ ],
1178
+ "indexes": [
1179
+ {
1180
+ "name": "sqlite_autoindex_feishu_bindings_1",
1181
+ "unique": 1,
1182
+ "origin": "pk",
1183
+ "partial": 0,
1184
+ "sql": null,
1185
+ "columns": [
1186
+ "open_id"
1187
+ ]
1188
+ },
1189
+ {
1190
+ "name": "sqlite_autoindex_feishu_bindings_2",
1191
+ "unique": 1,
1192
+ "origin": "u",
1193
+ "partial": 0,
1194
+ "sql": null,
1195
+ "columns": [
1196
+ "user_id"
1197
+ ]
1198
+ }
1199
+ ]
1200
+ },
1201
+ {
1202
+ "name": "wait_items",
1203
+ "ddl": "CREATE TABLE wait_items (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id INTEGER NOT NULL,\n kind TEXT NOT NULL,\n target_id TEXT NOT NULL,\n state TEXT NOT NULL DEFAULT 'waiting',\n seq INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n claimed_at TEXT,\n claimed_by TEXT,\n ended_at TEXT,\n not_before REAL NOT NULL DEFAULT 0,\n retries INTEGER NOT NULL DEFAULT 0,\n meta TEXT NOT NULL DEFAULT '{}',\n -- v3c(2026-09-23):证据与心跳迁到行(v3 §2.4)——last_seen=最近一次心跳\n -- 时间戳(epoch 秒,waitq.touch_unit 写);evidence=证据 JSON 文本\n -- (desc/reason/pid 登记证据 + busy=…(poll|sse) 心跳证据,判活读口同此处)\n last_seen REAL NOT NULL DEFAULT 0,\n evidence TEXT NOT NULL DEFAULT ''\n)",
1204
+ "columns": [
1205
+ {
1206
+ "name": "id",
1207
+ "type": "INTEGER",
1208
+ "notnull": 0,
1209
+ "dflt": null,
1210
+ "pk": 1
1211
+ },
1212
+ {
1213
+ "name": "project_id",
1214
+ "type": "INTEGER",
1215
+ "notnull": 1,
1216
+ "dflt": null,
1217
+ "pk": 0
1218
+ },
1219
+ {
1220
+ "name": "kind",
1221
+ "type": "TEXT",
1222
+ "notnull": 1,
1223
+ "dflt": null,
1224
+ "pk": 0
1225
+ },
1226
+ {
1227
+ "name": "target_id",
1228
+ "type": "TEXT",
1229
+ "notnull": 1,
1230
+ "dflt": null,
1231
+ "pk": 0
1232
+ },
1233
+ {
1234
+ "name": "state",
1235
+ "type": "TEXT",
1236
+ "notnull": 1,
1237
+ "dflt": "'waiting'",
1238
+ "pk": 0
1239
+ },
1240
+ {
1241
+ "name": "seq",
1242
+ "type": "INTEGER",
1243
+ "notnull": 1,
1244
+ "dflt": null,
1245
+ "pk": 0
1246
+ },
1247
+ {
1248
+ "name": "created_at",
1249
+ "type": "TEXT",
1250
+ "notnull": 1,
1251
+ "dflt": null,
1252
+ "pk": 0
1253
+ },
1254
+ {
1255
+ "name": "claimed_at",
1256
+ "type": "TEXT",
1257
+ "notnull": 0,
1258
+ "dflt": null,
1259
+ "pk": 0
1260
+ },
1261
+ {
1262
+ "name": "claimed_by",
1263
+ "type": "TEXT",
1264
+ "notnull": 0,
1265
+ "dflt": null,
1266
+ "pk": 0
1267
+ },
1268
+ {
1269
+ "name": "ended_at",
1270
+ "type": "TEXT",
1271
+ "notnull": 0,
1272
+ "dflt": null,
1273
+ "pk": 0
1274
+ },
1275
+ {
1276
+ "name": "not_before",
1277
+ "type": "REAL",
1278
+ "notnull": 1,
1279
+ "dflt": "0",
1280
+ "pk": 0
1281
+ },
1282
+ {
1283
+ "name": "retries",
1284
+ "type": "INTEGER",
1285
+ "notnull": 1,
1286
+ "dflt": "0",
1287
+ "pk": 0
1288
+ },
1289
+ {
1290
+ "name": "meta",
1291
+ "type": "TEXT",
1292
+ "notnull": 1,
1293
+ "dflt": "'{}'",
1294
+ "pk": 0
1295
+ },
1296
+ {
1297
+ "name": "last_seen",
1298
+ "type": "REAL",
1299
+ "notnull": 1,
1300
+ "dflt": "0",
1301
+ "pk": 0
1302
+ },
1303
+ {
1304
+ "name": "evidence",
1305
+ "type": "TEXT",
1306
+ "notnull": 1,
1307
+ "dflt": "''",
1308
+ "pk": 0
1309
+ }
1310
+ ],
1311
+ "indexes": [
1312
+ {
1313
+ "name": "idx_wait_active",
1314
+ "unique": 1,
1315
+ "origin": "c",
1316
+ "partial": 1,
1317
+ "sql": "CREATE UNIQUE INDEX idx_wait_active ON wait_items(kind, target_id)\n WHERE state IN ('waiting','starting','running','finishing')",
1318
+ "columns": [
1319
+ "kind",
1320
+ "target_id"
1321
+ ]
1322
+ },
1323
+ {
1324
+ "name": "idx_wait_pick",
1325
+ "unique": 0,
1326
+ "origin": "c",
1327
+ "partial": 0,
1328
+ "sql": "CREATE INDEX idx_wait_pick ON wait_items(state, project_id, seq)",
1329
+ "columns": [
1330
+ "state",
1331
+ "project_id",
1332
+ "seq"
1333
+ ]
1334
+ }
1335
+ ]
1336
+ },
1337
+ {
1338
+ "name": "chat_msgs",
1339
+ "ddl": "CREATE TABLE chat_msgs (\n id TEXT PRIMARY KEY,\n project_id INTEGER NOT NULL,\n sid TEXT NOT NULL,\n task_id INTEGER,\n card_id INTEGER,\n message TEXT NOT NULL,\n state TEXT NOT NULL,\n error TEXT NOT NULL DEFAULT '',\n inject INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n started_at INTEGER,\n ended_at INTEGER\n)",
1340
+ "columns": [
1341
+ {
1342
+ "name": "id",
1343
+ "type": "TEXT",
1344
+ "notnull": 0,
1345
+ "dflt": null,
1346
+ "pk": 1
1347
+ },
1348
+ {
1349
+ "name": "project_id",
1350
+ "type": "INTEGER",
1351
+ "notnull": 1,
1352
+ "dflt": null,
1353
+ "pk": 0
1354
+ },
1355
+ {
1356
+ "name": "sid",
1357
+ "type": "TEXT",
1358
+ "notnull": 1,
1359
+ "dflt": null,
1360
+ "pk": 0
1361
+ },
1362
+ {
1363
+ "name": "task_id",
1364
+ "type": "INTEGER",
1365
+ "notnull": 0,
1366
+ "dflt": null,
1367
+ "pk": 0
1368
+ },
1369
+ {
1370
+ "name": "card_id",
1371
+ "type": "INTEGER",
1372
+ "notnull": 0,
1373
+ "dflt": null,
1374
+ "pk": 0
1375
+ },
1376
+ {
1377
+ "name": "message",
1378
+ "type": "TEXT",
1379
+ "notnull": 1,
1380
+ "dflt": null,
1381
+ "pk": 0
1382
+ },
1383
+ {
1384
+ "name": "state",
1385
+ "type": "TEXT",
1386
+ "notnull": 1,
1387
+ "dflt": null,
1388
+ "pk": 0
1389
+ },
1390
+ {
1391
+ "name": "error",
1392
+ "type": "TEXT",
1393
+ "notnull": 1,
1394
+ "dflt": "''",
1395
+ "pk": 0
1396
+ },
1397
+ {
1398
+ "name": "inject",
1399
+ "type": "INTEGER",
1400
+ "notnull": 1,
1401
+ "dflt": "0",
1402
+ "pk": 0
1403
+ },
1404
+ {
1405
+ "name": "created_at",
1406
+ "type": "INTEGER",
1407
+ "notnull": 1,
1408
+ "dflt": null,
1409
+ "pk": 0
1410
+ },
1411
+ {
1412
+ "name": "started_at",
1413
+ "type": "INTEGER",
1414
+ "notnull": 0,
1415
+ "dflt": null,
1416
+ "pk": 0
1417
+ },
1418
+ {
1419
+ "name": "ended_at",
1420
+ "type": "INTEGER",
1421
+ "notnull": 0,
1422
+ "dflt": null,
1423
+ "pk": 0
1424
+ }
1425
+ ],
1426
+ "indexes": [
1427
+ {
1428
+ "name": "idx_chat_msgs_sid",
1429
+ "unique": 0,
1430
+ "origin": "c",
1431
+ "partial": 0,
1432
+ "sql": "CREATE INDEX idx_chat_msgs_sid ON chat_msgs(sid, created_at)",
1433
+ "columns": [
1434
+ "sid",
1435
+ "created_at"
1436
+ ]
1437
+ },
1438
+ {
1439
+ "name": "sqlite_autoindex_chat_msgs_1",
1440
+ "unique": 1,
1441
+ "origin": "pk",
1442
+ "partial": 0,
1443
+ "sql": null,
1444
+ "columns": [
1445
+ "id"
1446
+ ]
1447
+ }
1448
+ ]
1449
+ }
1450
+ ]
1451
+ }