@pasko70/pibo 1.9.13 → 1.10.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 (139) hide show
  1. package/README.md +183 -183
  2. package/context/codex-base-prompt.md +148 -148
  3. package/context/compute-worker.md +23 -23
  4. package/context/pibo-compaction-prompt.md +100 -100
  5. package/context/pibo-native-tooling.md +18 -18
  6. package/context/pibo-system-prompt.md +77 -77
  7. package/dist/apps/chat/agent-profiles.js +2 -2
  8. package/dist/apps/chat/agent-store.js +263 -250
  9. package/dist/apps/chat/chat-request-normalizers.js +10 -0
  10. package/dist/apps/chat/data/project-service.js +168 -168
  11. package/dist/apps/chat/data/read-state-service.js +18 -18
  12. package/dist/apps/chat/data/session-query-service.js +25 -25
  13. package/dist/apps/chat/data/timeline-query-service.js +19 -19
  14. package/dist/apps/chat/loop-api.js +176 -0
  15. package/dist/apps/chat/static-assets.js +854 -854
  16. package/dist/apps/chat/web-app.js +6 -6
  17. package/dist/apps/chat/workflow-manual-trigger-runtime.js +149 -46
  18. package/dist/apps/chat/workflow-persistence.js +255 -255
  19. package/dist/apps/chat-ui/assets/{dist-yCYNNb5d.js → dist-BwKObYnX.js} +1 -1
  20. package/dist/apps/chat-ui/assets/{dist-BCB6zezO.js → dist-CKtT8YGm.js} +1 -1
  21. package/dist/apps/chat-ui/assets/{dist-CnVsqwSG.js → dist-CS7wdk0Z.js} +1 -1
  22. package/dist/apps/chat-ui/assets/{dist-HqTN67dc.js → dist-D-cxLQO1.js} +1 -1
  23. package/dist/apps/chat-ui/assets/{dist-BNMu92bb.js → dist-DUlaXAk7.js} +1 -1
  24. package/dist/apps/chat-ui/assets/{dist-CzE6k3F3.js → dist-DlATLa-U.js} +1 -1
  25. package/dist/apps/chat-ui/assets/{dist-Dq4GxJi3.js → dist-GdEM8UW1.js} +1 -1
  26. package/dist/apps/chat-ui/assets/{dist-BZ2eTC4f.js → dist-LHRs1Nhr.js} +1 -1
  27. package/dist/apps/chat-ui/assets/{dist-D811wJeV.js → dist-Y-AA2omI.js} +1 -1
  28. package/dist/apps/chat-ui/assets/{dist-WyXdYl-w.js → dist-nOLTkZrJ.js} +1 -1
  29. package/dist/apps/chat-ui/assets/{dist-BHa-kcGl.js → dist-wE9nop9V.js} +1 -1
  30. package/dist/apps/chat-ui/assets/{index-DwHJfmiF.js → index-8W_yMHQI.js} +6 -6
  31. package/dist/apps/chat-ui/index.html +17 -17
  32. package/dist/apps/chat-ui/manifest.webmanifest +25 -25
  33. package/dist/apps/chat-ui/sw.js +47 -47
  34. package/dist/apps/chat-vscode-web/index.html +12 -12
  35. package/dist/apps/cli-ui/cliSessionsCommand.js +23 -23
  36. package/dist/apps/context-files-ui/index.html +11 -11
  37. package/dist/cli.js +61 -44
  38. package/dist/compute/cli.js +54 -54
  39. package/dist/core/routed-session.js +30 -1
  40. package/dist/core/runtime.js +6 -1
  41. package/dist/core/session-router.js +4 -2
  42. package/dist/cron/cli.js +15 -15
  43. package/dist/cron/store.js +49 -49
  44. package/dist/data/cli.js +23 -23
  45. package/dist/data/event-log.js +23 -23
  46. package/dist/data/message-store.js +27 -27
  47. package/dist/data/navigation-store.js +9 -9
  48. package/dist/data/observation-store.js +4 -4
  49. package/dist/data/payload-store.js +17 -17
  50. package/dist/data/schema.js +433 -433
  51. package/dist/data/session-store.js +4 -4
  52. package/dist/data/telemetry-queries.js +54 -54
  53. package/dist/data/telemetry.js +197 -197
  54. package/dist/debug/events.js +12 -12
  55. package/dist/debug/failures.js +6 -6
  56. package/dist/debug/index.js +227 -227
  57. package/dist/debug/messages.js +6 -6
  58. package/dist/debug/pty.js +124 -124
  59. package/dist/debug/session.js +29 -29
  60. package/dist/debug/tools.js +5 -5
  61. package/dist/debug/web-snapshot-browser-scripts.js +294 -294
  62. package/dist/debug/web-streaming-browser-library.js +925 -925
  63. package/dist/debug/web-streaming-browser-scripts.js +232 -232
  64. package/dist/debug/web-streaming-provider-telemetry.js +4 -4
  65. package/dist/debug/web.js +93 -93
  66. package/dist/gateway/cli.js +19 -19
  67. package/dist/gateway/server.js +4 -2
  68. package/dist/gateway/web.js +2 -2
  69. package/dist/loops/channel.js +8 -0
  70. package/dist/loops/cli.js +208 -0
  71. package/dist/loops/plugin.js +16 -0
  72. package/dist/loops/prompts.js +83 -0
  73. package/dist/loops/service.js +357 -0
  74. package/dist/loops/stopping.js +170 -0
  75. package/dist/loops/store.js +531 -0
  76. package/dist/loops/templates.js +232 -0
  77. package/dist/loops/tools.js +167 -0
  78. package/dist/loops/types.js +1 -0
  79. package/dist/mcp/config-command.js +53 -53
  80. package/dist/mcp/index.js +21 -21
  81. package/dist/mcp/registry.js +11 -11
  82. package/dist/pi-packages/cli.js +11 -11
  83. package/dist/plugins/builtin.js +8 -0
  84. package/dist/plugins/context-files-store.js +110 -110
  85. package/dist/plugins/context-files.js +4 -4
  86. package/dist/plugins/registry.js +23 -12
  87. package/dist/ralph/cli.js +18 -18
  88. package/dist/ralph/templates.js +140 -140
  89. package/dist/reliability/store.js +226 -226
  90. package/dist/sessions/pibo-data-store.js +16 -16
  91. package/dist/sessions/sqlite-store.js +53 -53
  92. package/dist/setup/cli.js +58 -58
  93. package/dist/tools/agent-browser-wrapper.js +80 -80
  94. package/dist/tools/browser-use-cdp.js +12 -12
  95. package/dist/tools/browser-use-wrapper.js +762 -762
  96. package/dist/tools/guides.js +589 -538
  97. package/dist/tools/index.js +122 -99
  98. package/dist/tools/registry.js +21 -3
  99. package/dist/tools/runtime/node-worker-source.js +205 -205
  100. package/dist/tools/runtime/python-worker-source.js +177 -177
  101. package/dist/vscode/cli.js +9 -9
  102. package/dist/web-annotations/cdp.js +900 -900
  103. package/dist/web-annotations/store.js +96 -96
  104. package/docs/README.md +23 -23
  105. package/docs/ops/install-developer-host.md +112 -112
  106. package/docs/ops/install-user-host.md +96 -96
  107. package/docs/ops/upgrade-user-to-developer-host.md +69 -69
  108. package/docs/ops/vscode-extension-release.md +160 -160
  109. package/package.json +98 -95
  110. package/skills/builtin/graphify/SKILL.md +52 -52
  111. package/skills/builtin/loop/SKILL.md +69 -0
  112. package/skills/builtin/pi-agent-harness/SKILL.md +319 -319
  113. package/skills/builtin/pi-agent-harness/agents/openai.yaml +4 -4
  114. package/skills/builtin/pibo-docker-system/SKILL.md +170 -170
  115. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -330
  116. package/skills/builtin/prd/SKILL.md +143 -143
  117. package/skills/builtin/ralph-loop/SKILL.md +361 -359
  118. package/skills/builtin/ralph-prd-json/SKILL.md +123 -123
  119. package/skills/builtin/skill-creator/LICENSE.txt +201 -201
  120. package/skills/builtin/skill-creator/SKILL.md +513 -513
  121. package/skills/builtin/skill-creator/agents/analyzer.md +274 -274
  122. package/skills/builtin/skill-creator/agents/comparator.md +202 -202
  123. package/skills/builtin/skill-creator/agents/grader.md +223 -223
  124. package/skills/builtin/skill-creator/assets/eval_review.html +146 -146
  125. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -471
  126. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -1325
  127. package/skills/builtin/skill-creator/references/schemas.md +430 -430
  128. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -401
  129. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -326
  130. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -247
  131. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -136
  132. package/skills/builtin/skill-creator/scripts/quick_validate.py +102 -102
  133. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -310
  134. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -328
  135. package/skills/builtin/skill-creator/scripts/utils.py +47 -47
  136. package/skills/builtin/web-annotations/SKILL.md +93 -93
  137. package/src/mcp/LICENSE.mcp-cli +21 -21
  138. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  139. package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.9.13.vsix +0 -0
@@ -46,105 +46,105 @@ export class PiboReliabilityStore {
46
46
  if (resolvedPath !== ":memory:")
47
47
  this.db.exec("PRAGMA journal_mode = WAL");
48
48
  migratePiboRunControllerColumn(this.db);
49
- this.db.exec(`
50
- CREATE TABLE IF NOT EXISTS pibo_event_stream (
51
- stream_id INTEGER PRIMARY KEY,
52
- topic TEXT NOT NULL,
53
- key TEXT,
54
- event_id TEXT NOT NULL,
55
- idempotency_key TEXT,
56
- created_at TEXT NOT NULL,
57
- retention_class TEXT NOT NULL,
58
- payload_json TEXT NOT NULL
59
- );
60
- CREATE UNIQUE INDEX IF NOT EXISTS idx_pibo_event_stream_event
61
- ON pibo_event_stream(topic, event_id);
62
- CREATE UNIQUE INDEX IF NOT EXISTS idx_pibo_event_stream_idempotency
63
- ON pibo_event_stream(topic, idempotency_key)
64
- WHERE idempotency_key IS NOT NULL;
65
- CREATE INDEX IF NOT EXISTS idx_pibo_event_stream_topic_stream
66
- ON pibo_event_stream(topic, stream_id);
67
-
68
- CREATE TABLE IF NOT EXISTS pibo_event_consumers (
69
- consumer TEXT NOT NULL,
70
- topic TEXT NOT NULL,
71
- last_stream_id INTEGER NOT NULL,
72
- updated_at TEXT NOT NULL,
73
- PRIMARY KEY(consumer, topic)
74
- );
75
-
76
- CREATE TABLE IF NOT EXISTS pibo_jobs (
77
- job_id TEXT PRIMARY KEY,
78
- queue TEXT NOT NULL,
79
- state TEXT NOT NULL,
80
- payload_json TEXT NOT NULL,
81
- run_at TEXT NOT NULL,
82
- priority INTEGER NOT NULL DEFAULT 0,
83
- worker_id TEXT,
84
- claim_expires_at TEXT,
85
- attempts INTEGER NOT NULL DEFAULT 0,
86
- max_attempts INTEGER NOT NULL DEFAULT 1,
87
- idempotency_key TEXT,
88
- created_at TEXT NOT NULL,
89
- updated_at TEXT NOT NULL,
90
- expires_at TEXT,
91
- last_error TEXT
92
- );
93
- CREATE UNIQUE INDEX IF NOT EXISTS idx_pibo_jobs_idempotency
94
- ON pibo_jobs(queue, idempotency_key)
95
- WHERE idempotency_key IS NOT NULL;
96
- CREATE INDEX IF NOT EXISTS idx_pibo_jobs_live_claim
97
- ON pibo_jobs(queue, state, run_at, priority DESC, created_at)
98
- WHERE state = 'pending';
99
- CREATE INDEX IF NOT EXISTS idx_pibo_jobs_expired_claim
100
- ON pibo_jobs(queue, state, claim_expires_at, priority DESC, created_at)
101
- WHERE state = 'running';
102
-
103
- CREATE TABLE IF NOT EXISTS pibo_dead_jobs (
104
- job_id TEXT PRIMARY KEY,
105
- queue TEXT NOT NULL,
106
- payload_json TEXT NOT NULL,
107
- attempts INTEGER NOT NULL,
108
- max_attempts INTEGER NOT NULL,
109
- idempotency_key TEXT,
110
- created_at TEXT NOT NULL,
111
- updated_at TEXT NOT NULL,
112
- expires_at TEXT,
113
- last_error TEXT,
114
- dead_at TEXT NOT NULL,
115
- dead_reason TEXT NOT NULL
116
- );
117
- CREATE INDEX IF NOT EXISTS idx_pibo_dead_jobs_queue_dead_at
118
- ON pibo_dead_jobs(queue, dead_at);
119
-
120
- CREATE TABLE IF NOT EXISTS pibo_runs (
121
- run_id TEXT PRIMARY KEY,
122
- kind TEXT NOT NULL,
123
- controller_pibo_session_id TEXT NOT NULL,
124
- status TEXT NOT NULL,
125
- completion_policy TEXT NOT NULL,
126
- consumed INTEGER NOT NULL DEFAULT 0,
127
- tool_name TEXT NOT NULL,
128
- summary TEXT,
129
- result_json TEXT,
130
- error TEXT,
131
- notified_status TEXT,
132
- acknowledged_status TEXT,
133
- created_at TEXT NOT NULL,
134
- updated_at TEXT NOT NULL,
135
- completed_at TEXT,
136
- job_id TEXT,
137
- retryable INTEGER NOT NULL DEFAULT 0,
138
- max_attempts INTEGER NOT NULL DEFAULT 1
139
- );
140
- CREATE INDEX IF NOT EXISTS idx_pibo_runs_controller_updated
141
- ON pibo_runs(controller_pibo_session_id, updated_at);
142
- CREATE INDEX IF NOT EXISTS idx_pibo_runs_status
143
- ON pibo_runs(status);
49
+ this.db.exec(`
50
+ CREATE TABLE IF NOT EXISTS pibo_event_stream (
51
+ stream_id INTEGER PRIMARY KEY,
52
+ topic TEXT NOT NULL,
53
+ key TEXT,
54
+ event_id TEXT NOT NULL,
55
+ idempotency_key TEXT,
56
+ created_at TEXT NOT NULL,
57
+ retention_class TEXT NOT NULL,
58
+ payload_json TEXT NOT NULL
59
+ );
60
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_pibo_event_stream_event
61
+ ON pibo_event_stream(topic, event_id);
62
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_pibo_event_stream_idempotency
63
+ ON pibo_event_stream(topic, idempotency_key)
64
+ WHERE idempotency_key IS NOT NULL;
65
+ CREATE INDEX IF NOT EXISTS idx_pibo_event_stream_topic_stream
66
+ ON pibo_event_stream(topic, stream_id);
67
+
68
+ CREATE TABLE IF NOT EXISTS pibo_event_consumers (
69
+ consumer TEXT NOT NULL,
70
+ topic TEXT NOT NULL,
71
+ last_stream_id INTEGER NOT NULL,
72
+ updated_at TEXT NOT NULL,
73
+ PRIMARY KEY(consumer, topic)
74
+ );
75
+
76
+ CREATE TABLE IF NOT EXISTS pibo_jobs (
77
+ job_id TEXT PRIMARY KEY,
78
+ queue TEXT NOT NULL,
79
+ state TEXT NOT NULL,
80
+ payload_json TEXT NOT NULL,
81
+ run_at TEXT NOT NULL,
82
+ priority INTEGER NOT NULL DEFAULT 0,
83
+ worker_id TEXT,
84
+ claim_expires_at TEXT,
85
+ attempts INTEGER NOT NULL DEFAULT 0,
86
+ max_attempts INTEGER NOT NULL DEFAULT 1,
87
+ idempotency_key TEXT,
88
+ created_at TEXT NOT NULL,
89
+ updated_at TEXT NOT NULL,
90
+ expires_at TEXT,
91
+ last_error TEXT
92
+ );
93
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_pibo_jobs_idempotency
94
+ ON pibo_jobs(queue, idempotency_key)
95
+ WHERE idempotency_key IS NOT NULL;
96
+ CREATE INDEX IF NOT EXISTS idx_pibo_jobs_live_claim
97
+ ON pibo_jobs(queue, state, run_at, priority DESC, created_at)
98
+ WHERE state = 'pending';
99
+ CREATE INDEX IF NOT EXISTS idx_pibo_jobs_expired_claim
100
+ ON pibo_jobs(queue, state, claim_expires_at, priority DESC, created_at)
101
+ WHERE state = 'running';
102
+
103
+ CREATE TABLE IF NOT EXISTS pibo_dead_jobs (
104
+ job_id TEXT PRIMARY KEY,
105
+ queue TEXT NOT NULL,
106
+ payload_json TEXT NOT NULL,
107
+ attempts INTEGER NOT NULL,
108
+ max_attempts INTEGER NOT NULL,
109
+ idempotency_key TEXT,
110
+ created_at TEXT NOT NULL,
111
+ updated_at TEXT NOT NULL,
112
+ expires_at TEXT,
113
+ last_error TEXT,
114
+ dead_at TEXT NOT NULL,
115
+ dead_reason TEXT NOT NULL
116
+ );
117
+ CREATE INDEX IF NOT EXISTS idx_pibo_dead_jobs_queue_dead_at
118
+ ON pibo_dead_jobs(queue, dead_at);
119
+
120
+ CREATE TABLE IF NOT EXISTS pibo_runs (
121
+ run_id TEXT PRIMARY KEY,
122
+ kind TEXT NOT NULL,
123
+ controller_pibo_session_id TEXT NOT NULL,
124
+ status TEXT NOT NULL,
125
+ completion_policy TEXT NOT NULL,
126
+ consumed INTEGER NOT NULL DEFAULT 0,
127
+ tool_name TEXT NOT NULL,
128
+ summary TEXT,
129
+ result_json TEXT,
130
+ error TEXT,
131
+ notified_status TEXT,
132
+ acknowledged_status TEXT,
133
+ created_at TEXT NOT NULL,
134
+ updated_at TEXT NOT NULL,
135
+ completed_at TEXT,
136
+ job_id TEXT,
137
+ retryable INTEGER NOT NULL DEFAULT 0,
138
+ max_attempts INTEGER NOT NULL DEFAULT 1
139
+ );
140
+ CREATE INDEX IF NOT EXISTS idx_pibo_runs_controller_updated
141
+ ON pibo_runs(controller_pibo_session_id, updated_at);
142
+ CREATE INDEX IF NOT EXISTS idx_pibo_runs_status
143
+ ON pibo_runs(status);
144
144
  `);
145
- this.appendEventStatement = this.db.prepare(`
146
- INSERT INTO pibo_event_stream (topic, key, event_id, idempotency_key, created_at, retention_class, payload_json)
147
- VALUES (?, ?, ?, ?, ?, ?, ?)
145
+ this.appendEventStatement = this.db.prepare(`
146
+ INSERT INTO pibo_event_stream (topic, key, event_id, idempotency_key, created_at, retention_class, payload_json)
147
+ VALUES (?, ?, ?, ?, ?, ?, ?)
148
148
  `);
149
149
  this.getEventByStreamIdStatement = this.db.prepare("SELECT * FROM pibo_event_stream WHERE stream_id = ?");
150
150
  this.getEventByTopicEventIdStatement = this.db.prepare("SELECT * FROM pibo_event_stream WHERE topic = ? AND event_id = ?");
@@ -202,12 +202,12 @@ export class PiboReliabilityStore {
202
202
  }
203
203
  const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
204
204
  const rows = this.db
205
- .prepare(`
206
- SELECT topic, key, retention_class, COUNT(*) AS count
207
- FROM pibo_event_stream
208
- ${where}
209
- GROUP BY topic, key, retention_class
210
- ORDER BY topic, key, retention_class
205
+ .prepare(`
206
+ SELECT topic, key, retention_class, COUNT(*) AS count
207
+ FROM pibo_event_stream
208
+ ${where}
209
+ GROUP BY topic, key, retention_class
210
+ ORDER BY topic, key, retention_class
211
211
  `)
212
212
  .all(...values);
213
213
  return rows.map((row) => ({
@@ -223,12 +223,12 @@ export class PiboReliabilityStore {
223
223
  }
224
224
  saveConsumerOffset(topic, consumer, streamId) {
225
225
  this.db
226
- .prepare(`
227
- INSERT INTO pibo_event_consumers (consumer, topic, last_stream_id, updated_at)
228
- VALUES (?, ?, ?, ?)
229
- ON CONFLICT(consumer, topic) DO UPDATE SET
230
- last_stream_id = MAX(pibo_event_consumers.last_stream_id, excluded.last_stream_id),
231
- updated_at = excluded.updated_at
226
+ .prepare(`
227
+ INSERT INTO pibo_event_consumers (consumer, topic, last_stream_id, updated_at)
228
+ VALUES (?, ?, ?, ?)
229
+ ON CONFLICT(consumer, topic) DO UPDATE SET
230
+ last_stream_id = MAX(pibo_event_consumers.last_stream_id, excluded.last_stream_id),
231
+ updated_at = excluded.updated_at
232
232
  `)
233
233
  .run(consumer, topic, streamId, now());
234
234
  }
@@ -260,23 +260,23 @@ export class PiboReliabilityStore {
260
260
  values.push(input.beforeStreamId);
261
261
  }
262
262
  if (!input.destructive) {
263
- clauses.push(`
264
- stream_id <= COALESCE(
265
- (SELECT MIN(last_stream_id) FROM pibo_event_consumers WHERE pibo_event_consumers.topic = pibo_event_stream.topic),
266
- stream_id
267
- )
263
+ clauses.push(`
264
+ stream_id <= COALESCE(
265
+ (SELECT MIN(last_stream_id) FROM pibo_event_consumers WHERE pibo_event_consumers.topic = pibo_event_stream.topic),
266
+ stream_id
267
+ )
268
268
  `);
269
269
  }
270
270
  const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
271
271
  const result = this.db
272
- .prepare(`
273
- DELETE FROM pibo_event_stream
274
- WHERE stream_id IN (
275
- SELECT stream_id FROM pibo_event_stream
276
- ${where}
277
- ORDER BY stream_id ASC
278
- LIMIT ${clampLimit(input.limit, 500)}
279
- )
272
+ .prepare(`
273
+ DELETE FROM pibo_event_stream
274
+ WHERE stream_id IN (
275
+ SELECT stream_id FROM pibo_event_stream
276
+ ${where}
277
+ ORDER BY stream_id ASC
278
+ LIMIT ${clampLimit(input.limit, 500)}
279
+ )
280
280
  `)
281
281
  .run(...values);
282
282
  return Number(result.changes ?? 0);
@@ -285,11 +285,11 @@ export class PiboReliabilityStore {
285
285
  const timestamp = now();
286
286
  const jobId = input.jobId ?? `job_${randomUUID()}`;
287
287
  const result = this.db
288
- .prepare(`
289
- INSERT OR IGNORE INTO pibo_jobs (
290
- job_id, queue, state, payload_json, run_at, priority, worker_id, claim_expires_at,
291
- attempts, max_attempts, idempotency_key, created_at, updated_at, expires_at, last_error
292
- ) VALUES (?, ?, 'pending', ?, ?, ?, NULL, NULL, 0, ?, ?, ?, ?, ?, NULL)
288
+ .prepare(`
289
+ INSERT OR IGNORE INTO pibo_jobs (
290
+ job_id, queue, state, payload_json, run_at, priority, worker_id, claim_expires_at,
291
+ attempts, max_attempts, idempotency_key, created_at, updated_at, expires_at, last_error
292
+ ) VALUES (?, ?, 'pending', ?, ?, ?, NULL, NULL, 0, ?, ?, ?, ?, ?, NULL)
293
293
  `)
294
294
  .run(jobId, input.queue, json(input.payload), input.runAt ?? timestamp, input.priority ?? 0, Math.max(1, input.maxAttempts ?? 1), input.idempotencyKey ?? null, timestamp, timestamp, input.expiresAt ?? null);
295
295
  if (Number(result.changes ?? 0) === 0 && input.idempotencyKey) {
@@ -313,20 +313,20 @@ export class PiboReliabilityStore {
313
313
  }
314
314
  this.moveExpiredJobs(timestamp);
315
315
  const rows = this.db
316
- .prepare(`
317
- UPDATE pibo_jobs
318
- SET state = 'running',
319
- worker_id = ?,
320
- claim_expires_at = ?,
321
- attempts = attempts + 1,
322
- updated_at = ?
323
- WHERE job_id IN (
324
- SELECT job_id FROM pibo_jobs
325
- WHERE ${clauses.join(" AND ")}
326
- ORDER BY priority DESC, run_at ASC, created_at ASC
327
- LIMIT ?
328
- )
329
- RETURNING *
316
+ .prepare(`
317
+ UPDATE pibo_jobs
318
+ SET state = 'running',
319
+ worker_id = ?,
320
+ claim_expires_at = ?,
321
+ attempts = attempts + 1,
322
+ updated_at = ?
323
+ WHERE job_id IN (
324
+ SELECT job_id FROM pibo_jobs
325
+ WHERE ${clauses.join(" AND ")}
326
+ ORDER BY priority DESC, run_at ASC, created_at ASC
327
+ LIMIT ?
328
+ )
329
+ RETURNING *
330
330
  `)
331
331
  .all(workerId, claimExpiresAt, timestamp, ...values, clampLimit(limit));
332
332
  return rows.map(jobFromRow);
@@ -335,18 +335,18 @@ export class PiboReliabilityStore {
335
335
  const timestamp = now();
336
336
  const claimExpiresAt = new Date(Date.now() + visibilityTimeoutMs).toISOString();
337
337
  const row = this.db
338
- .prepare(`
339
- UPDATE pibo_jobs
340
- SET state = 'running',
341
- worker_id = ?,
342
- claim_expires_at = ?,
343
- attempts = attempts + 1,
344
- updated_at = ?
345
- WHERE job_id = ?
346
- AND state = 'pending'
347
- AND run_at <= ?
348
- AND (expires_at IS NULL OR expires_at > ?)
349
- RETURNING *
338
+ .prepare(`
339
+ UPDATE pibo_jobs
340
+ SET state = 'running',
341
+ worker_id = ?,
342
+ claim_expires_at = ?,
343
+ attempts = attempts + 1,
344
+ updated_at = ?
345
+ WHERE job_id = ?
346
+ AND state = 'pending'
347
+ AND run_at <= ?
348
+ AND (expires_at IS NULL OR expires_at > ?)
349
+ RETURNING *
350
350
  `)
351
351
  .get(workerId, claimExpiresAt, timestamp, jobId, timestamp, timestamp);
352
352
  return row ? jobFromRow(row) : undefined;
@@ -354,13 +354,13 @@ export class PiboReliabilityStore {
354
354
  ack(jobId, workerId) {
355
355
  const timestamp = now();
356
356
  const result = this.db
357
- .prepare(`
358
- DELETE FROM pibo_jobs
359
- WHERE job_id = ?
360
- AND state = 'running'
361
- AND worker_id = ?
362
- AND claim_expires_at IS NOT NULL
363
- AND claim_expires_at > ?
357
+ .prepare(`
358
+ DELETE FROM pibo_jobs
359
+ WHERE job_id = ?
360
+ AND state = 'running'
361
+ AND worker_id = ?
362
+ AND claim_expires_at IS NOT NULL
363
+ AND claim_expires_at > ?
364
364
  `)
365
365
  .run(jobId, workerId, timestamp);
366
366
  return Number(result.changes ?? 0) > 0;
@@ -378,15 +378,15 @@ export class PiboReliabilityStore {
378
378
  const delayMs = input.delayMs ?? retryDelayMs(job.attempts, input);
379
379
  const runAt = new Date(asDate(input.now).getTime() + delayMs).toISOString();
380
380
  this.db
381
- .prepare(`
382
- UPDATE pibo_jobs
383
- SET state = 'pending',
384
- worker_id = NULL,
385
- claim_expires_at = NULL,
386
- run_at = ?,
387
- updated_at = ?,
388
- last_error = ?
389
- WHERE job_id = ?
381
+ .prepare(`
382
+ UPDATE pibo_jobs
383
+ SET state = 'pending',
384
+ worker_id = NULL,
385
+ claim_expires_at = NULL,
386
+ run_at = ?,
387
+ updated_at = ?,
388
+ last_error = ?
389
+ WHERE job_id = ?
390
390
  `)
391
391
  .run(runAt, timestamp, input.error ?? null, jobId);
392
392
  return true;
@@ -403,14 +403,14 @@ export class PiboReliabilityStore {
403
403
  const timestamp = now();
404
404
  const claimExpiresAt = new Date(Date.now() + Math.max(1, extendMs)).toISOString();
405
405
  const result = this.db
406
- .prepare(`
407
- UPDATE pibo_jobs
408
- SET claim_expires_at = ?, updated_at = ?
409
- WHERE job_id = ?
410
- AND state = 'running'
411
- AND worker_id = ?
412
- AND claim_expires_at IS NOT NULL
413
- AND claim_expires_at > ?
406
+ .prepare(`
407
+ UPDATE pibo_jobs
408
+ SET claim_expires_at = ?, updated_at = ?
409
+ WHERE job_id = ?
410
+ AND state = 'running'
411
+ AND worker_id = ?
412
+ AND claim_expires_at IS NOT NULL
413
+ AND claim_expires_at > ?
414
414
  `)
415
415
  .run(claimExpiresAt, timestamp, jobId, workerId, timestamp);
416
416
  return Number(result.changes ?? 0) > 0;
@@ -477,12 +477,12 @@ export class PiboReliabilityStore {
477
477
  maxAttempts,
478
478
  });
479
479
  this.db
480
- .prepare(`
481
- INSERT INTO pibo_runs (
482
- run_id, kind, controller_pibo_session_id, status, completion_policy, consumed, tool_name,
483
- summary, result_json, error, notified_status, acknowledged_status, created_at, updated_at,
484
- completed_at, job_id, retryable, max_attempts
485
- ) VALUES (?, 'tool', ?, 'running', ?, 0, ?, ?, NULL, NULL, NULL, NULL, ?, ?, NULL, ?, ?, ?)
480
+ .prepare(`
481
+ INSERT INTO pibo_runs (
482
+ run_id, kind, controller_pibo_session_id, status, completion_policy, consumed, tool_name,
483
+ summary, result_json, error, notified_status, acknowledged_status, created_at, updated_at,
484
+ completed_at, job_id, retryable, max_attempts
485
+ ) VALUES (?, 'tool', ?, 'running', ?, 0, ?, ?, NULL, NULL, NULL, NULL, ?, ?, NULL, ?, ?, ?)
486
486
  `)
487
487
  .run(runId, input.controllerPiboSessionId, input.completionPolicy, input.toolName, `${input.toolName} run is running.`, timestamp, timestamp, job.jobId, input.retryable ? 1 : 0, maxAttempts);
488
488
  this.claimJob(job.jobId, `run-registry:${process.pid}`, 24 * 60 * 60 * 1000);
@@ -494,22 +494,22 @@ export class PiboReliabilityStore {
494
494
  return undefined;
495
495
  const next = { ...existing, ...patch, updatedAt: patch.updatedAt ?? now() };
496
496
  this.db
497
- .prepare(`
498
- UPDATE pibo_runs SET
499
- status = ?,
500
- completion_policy = ?,
501
- consumed = ?,
502
- summary = ?,
503
- result_json = ?,
504
- error = ?,
505
- notified_status = ?,
506
- acknowledged_status = ?,
507
- updated_at = ?,
508
- completed_at = ?,
509
- job_id = ?,
510
- retryable = ?,
511
- max_attempts = ?
512
- WHERE run_id = ?
497
+ .prepare(`
498
+ UPDATE pibo_runs SET
499
+ status = ?,
500
+ completion_policy = ?,
501
+ consumed = ?,
502
+ summary = ?,
503
+ result_json = ?,
504
+ error = ?,
505
+ notified_status = ?,
506
+ acknowledged_status = ?,
507
+ updated_at = ?,
508
+ completed_at = ?,
509
+ job_id = ?,
510
+ retryable = ?,
511
+ max_attempts = ?
512
+ WHERE run_id = ?
513
513
  `)
514
514
  .run(next.status, next.completionPolicy, next.consumed ? 1 : 0, next.summary ?? null, next.result ? JSON.stringify(next.result) : null, next.error ?? null, next.notifiedStatus ?? null, next.acknowledgedStatus ?? null, next.updatedAt, next.completedAt ?? null, next.jobId ?? null, next.retryable ? 1 : 0, next.maxAttempts, runId);
515
515
  return this.requireRun(runId);
@@ -619,13 +619,13 @@ export class PiboReliabilityStore {
619
619
  }
620
620
  getLiveWorkerJob(jobId, workerId, timestamp) {
621
621
  return this.db
622
- .prepare(`
623
- SELECT * FROM pibo_jobs
624
- WHERE job_id = ?
625
- AND state = 'running'
626
- AND worker_id = ?
627
- AND claim_expires_at IS NOT NULL
628
- AND claim_expires_at > ?
622
+ .prepare(`
623
+ SELECT * FROM pibo_jobs
624
+ WHERE job_id = ?
625
+ AND state = 'running'
626
+ AND worker_id = ?
627
+ AND claim_expires_at IS NOT NULL
628
+ AND claim_expires_at > ?
629
629
  `)
630
630
  .get(jobId, workerId, timestamp);
631
631
  }
@@ -636,26 +636,26 @@ export class PiboReliabilityStore {
636
636
  }
637
637
  hasUnexpiredJobClaim(jobId, timestamp) {
638
638
  const row = this.db
639
- .prepare(`
640
- SELECT job_id FROM pibo_jobs
641
- WHERE job_id = ?
642
- AND state = 'running'
643
- AND claim_expires_at IS NOT NULL
644
- AND claim_expires_at > ?
639
+ .prepare(`
640
+ SELECT job_id FROM pibo_jobs
641
+ WHERE job_id = ?
642
+ AND state = 'running'
643
+ AND claim_expires_at IS NOT NULL
644
+ AND claim_expires_at > ?
645
645
  `)
646
646
  .get(jobId, timestamp);
647
647
  return row !== undefined;
648
648
  }
649
649
  releaseJobForRetry(jobId, timestamp) {
650
650
  this.db
651
- .prepare(`
652
- UPDATE pibo_jobs
653
- SET state = 'pending',
654
- worker_id = NULL,
655
- claim_expires_at = NULL,
656
- run_at = ?,
657
- updated_at = ?
658
- WHERE job_id = ?
651
+ .prepare(`
652
+ UPDATE pibo_jobs
653
+ SET state = 'pending',
654
+ worker_id = NULL,
655
+ claim_expires_at = NULL,
656
+ run_at = ?,
657
+ updated_at = ?
658
+ WHERE job_id = ?
659
659
  `)
660
660
  .run(timestamp, timestamp, jobId);
661
661
  }
@@ -666,11 +666,11 @@ export class PiboReliabilityStore {
666
666
  }
667
667
  moveJobToDead(row, error, reason, timestamp) {
668
668
  this.db
669
- .prepare(`
670
- INSERT OR REPLACE INTO pibo_dead_jobs (
671
- job_id, queue, payload_json, attempts, max_attempts, idempotency_key, created_at,
672
- updated_at, expires_at, last_error, dead_at, dead_reason
673
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
669
+ .prepare(`
670
+ INSERT OR REPLACE INTO pibo_dead_jobs (
671
+ job_id, queue, payload_json, attempts, max_attempts, idempotency_key, created_at,
672
+ updated_at, expires_at, last_error, dead_at, dead_reason
673
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
674
674
  `)
675
675
  .run(row.job_id, row.queue, row.payload_json, row.attempts, row.max_attempts, row.idempotency_key, row.created_at, timestamp, row.expires_at, error, timestamp, reason);
676
676
  this.db.prepare("DELETE FROM pibo_jobs WHERE job_id = ?").run(row.job_id);
@@ -53,20 +53,20 @@ export class PiboDataSessionStore {
53
53
  activeModel: input.activeModel === null ? undefined : input.activeModel ? { ...input.activeModel } : existing.activeModel,
54
54
  updatedAt: new Date().toISOString(),
55
55
  };
56
- this.db.prepare(`
57
- UPDATE sessions SET
58
- pi_session_id = ?,
59
- root_session_id = ?,
60
- parent_id = ?,
61
- origin_id = ?,
62
- profile = ?,
63
- active_model_json = ?,
64
- workspace = ?,
65
- title = ?,
66
- metadata_json = ?,
67
- updated_at = ?,
68
- last_activity_at = MAX(last_activity_at, ?)
69
- WHERE id = ? AND deleted_at IS NULL
56
+ this.db.prepare(`
57
+ UPDATE sessions SET
58
+ pi_session_id = ?,
59
+ root_session_id = ?,
60
+ parent_id = ?,
61
+ origin_id = ?,
62
+ profile = ?,
63
+ active_model_json = ?,
64
+ workspace = ?,
65
+ title = ?,
66
+ metadata_json = ?,
67
+ updated_at = ?,
68
+ last_activity_at = MAX(last_activity_at, ?)
69
+ WHERE id = ? AND deleted_at IS NULL
70
70
  `).run(updated.piSessionId, rootSessionId(updated), updated.parentId ?? null, updated.originId ?? null, updated.profile, updated.activeModel ? JSON.stringify(updated.activeModel) : null, updated.workspace ?? null, updated.title ?? "Untitled Session", JSON.stringify(updated.metadata ?? {}), updated.updatedAt, updated.updatedAt, id);
71
71
  return this.get(id);
72
72
  }
@@ -129,8 +129,8 @@ export class PiboDataSessionStore {
129
129
  "channel", "kind", "profile", "active_model_json", "workspace", "title", "first_message_preview",
130
130
  "status", "metadata_json", "created_at", "updated_at", "last_activity_at",
131
131
  ];
132
- this.db.prepare(`
133
- INSERT INTO sessions (${columns.join(", ")}) VALUES (${columns.map(() => "?").join(", ")})
132
+ this.db.prepare(`
133
+ INSERT INTO sessions (${columns.join(", ")}) VALUES (${columns.map(() => "?").join(", ")})
134
134
  `).run(session.id, session.piSessionId, roomIdFromMetadata(session.metadata), rootSessionId(session), session.parentId ?? null, session.originId ?? null, session.channel, session.kind, session.profile, session.activeModel ? JSON.stringify(session.activeModel) : null, session.workspace ?? null, session.title ?? "Untitled Session", previewText(session.title ?? "") ?? null, "idle", JSON.stringify(session.metadata ?? {}), session.createdAt, session.updatedAt, session.updatedAt);
135
135
  }
136
136
  }