@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.
- package/README.md +183 -183
- package/context/codex-base-prompt.md +148 -148
- package/context/compute-worker.md +23 -23
- package/context/pibo-compaction-prompt.md +100 -100
- package/context/pibo-native-tooling.md +18 -18
- package/context/pibo-system-prompt.md +77 -77
- package/dist/apps/chat/agent-profiles.js +2 -2
- package/dist/apps/chat/agent-store.js +263 -250
- package/dist/apps/chat/chat-request-normalizers.js +10 -0
- package/dist/apps/chat/data/project-service.js +168 -168
- package/dist/apps/chat/data/read-state-service.js +18 -18
- package/dist/apps/chat/data/session-query-service.js +25 -25
- package/dist/apps/chat/data/timeline-query-service.js +19 -19
- package/dist/apps/chat/loop-api.js +176 -0
- package/dist/apps/chat/static-assets.js +854 -854
- package/dist/apps/chat/web-app.js +6 -6
- package/dist/apps/chat/workflow-manual-trigger-runtime.js +149 -46
- package/dist/apps/chat/workflow-persistence.js +255 -255
- package/dist/apps/chat-ui/assets/{dist-yCYNNb5d.js → dist-BwKObYnX.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BCB6zezO.js → dist-CKtT8YGm.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CnVsqwSG.js → dist-CS7wdk0Z.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-HqTN67dc.js → dist-D-cxLQO1.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BNMu92bb.js → dist-DUlaXAk7.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CzE6k3F3.js → dist-DlATLa-U.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Dq4GxJi3.js → dist-GdEM8UW1.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BZ2eTC4f.js → dist-LHRs1Nhr.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-D811wJeV.js → dist-Y-AA2omI.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-WyXdYl-w.js → dist-nOLTkZrJ.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BHa-kcGl.js → dist-wE9nop9V.js} +1 -1
- package/dist/apps/chat-ui/assets/{index-DwHJfmiF.js → index-8W_yMHQI.js} +6 -6
- package/dist/apps/chat-ui/index.html +17 -17
- package/dist/apps/chat-ui/manifest.webmanifest +25 -25
- package/dist/apps/chat-ui/sw.js +47 -47
- package/dist/apps/chat-vscode-web/index.html +12 -12
- package/dist/apps/cli-ui/cliSessionsCommand.js +23 -23
- package/dist/apps/context-files-ui/index.html +11 -11
- package/dist/cli.js +61 -44
- package/dist/compute/cli.js +54 -54
- package/dist/core/routed-session.js +30 -1
- package/dist/core/runtime.js +6 -1
- package/dist/core/session-router.js +4 -2
- package/dist/cron/cli.js +15 -15
- package/dist/cron/store.js +49 -49
- package/dist/data/cli.js +23 -23
- package/dist/data/event-log.js +23 -23
- package/dist/data/message-store.js +27 -27
- package/dist/data/navigation-store.js +9 -9
- package/dist/data/observation-store.js +4 -4
- package/dist/data/payload-store.js +17 -17
- package/dist/data/schema.js +433 -433
- package/dist/data/session-store.js +4 -4
- package/dist/data/telemetry-queries.js +54 -54
- package/dist/data/telemetry.js +197 -197
- package/dist/debug/events.js +12 -12
- package/dist/debug/failures.js +6 -6
- package/dist/debug/index.js +227 -227
- package/dist/debug/messages.js +6 -6
- package/dist/debug/pty.js +124 -124
- package/dist/debug/session.js +29 -29
- package/dist/debug/tools.js +5 -5
- package/dist/debug/web-snapshot-browser-scripts.js +294 -294
- package/dist/debug/web-streaming-browser-library.js +925 -925
- package/dist/debug/web-streaming-browser-scripts.js +232 -232
- package/dist/debug/web-streaming-provider-telemetry.js +4 -4
- package/dist/debug/web.js +93 -93
- package/dist/gateway/cli.js +19 -19
- package/dist/gateway/server.js +4 -2
- package/dist/gateway/web.js +2 -2
- package/dist/loops/channel.js +8 -0
- package/dist/loops/cli.js +208 -0
- package/dist/loops/plugin.js +16 -0
- package/dist/loops/prompts.js +83 -0
- package/dist/loops/service.js +357 -0
- package/dist/loops/stopping.js +170 -0
- package/dist/loops/store.js +531 -0
- package/dist/loops/templates.js +232 -0
- package/dist/loops/tools.js +167 -0
- package/dist/loops/types.js +1 -0
- package/dist/mcp/config-command.js +53 -53
- package/dist/mcp/index.js +21 -21
- package/dist/mcp/registry.js +11 -11
- package/dist/pi-packages/cli.js +11 -11
- package/dist/plugins/builtin.js +8 -0
- package/dist/plugins/context-files-store.js +110 -110
- package/dist/plugins/context-files.js +4 -4
- package/dist/plugins/registry.js +23 -12
- package/dist/ralph/cli.js +18 -18
- package/dist/ralph/templates.js +140 -140
- package/dist/reliability/store.js +226 -226
- package/dist/sessions/pibo-data-store.js +16 -16
- package/dist/sessions/sqlite-store.js +53 -53
- package/dist/setup/cli.js +58 -58
- package/dist/tools/agent-browser-wrapper.js +80 -80
- package/dist/tools/browser-use-cdp.js +12 -12
- package/dist/tools/browser-use-wrapper.js +762 -762
- package/dist/tools/guides.js +589 -538
- package/dist/tools/index.js +122 -99
- package/dist/tools/registry.js +21 -3
- package/dist/tools/runtime/node-worker-source.js +205 -205
- package/dist/tools/runtime/python-worker-source.js +177 -177
- package/dist/vscode/cli.js +9 -9
- package/dist/web-annotations/cdp.js +900 -900
- package/dist/web-annotations/store.js +96 -96
- package/docs/README.md +23 -23
- package/docs/ops/install-developer-host.md +112 -112
- package/docs/ops/install-user-host.md +96 -96
- package/docs/ops/upgrade-user-to-developer-host.md +69 -69
- package/docs/ops/vscode-extension-release.md +160 -160
- package/package.json +98 -95
- package/skills/builtin/graphify/SKILL.md +52 -52
- package/skills/builtin/loop/SKILL.md +69 -0
- package/skills/builtin/pi-agent-harness/SKILL.md +319 -319
- package/skills/builtin/pi-agent-harness/agents/openai.yaml +4 -4
- package/skills/builtin/pibo-docker-system/SKILL.md +170 -170
- package/skills/builtin/pibo-spec-writing/SKILL.md +330 -330
- package/skills/builtin/prd/SKILL.md +143 -143
- package/skills/builtin/ralph-loop/SKILL.md +361 -359
- package/skills/builtin/ralph-prd-json/SKILL.md +123 -123
- package/skills/builtin/skill-creator/LICENSE.txt +201 -201
- package/skills/builtin/skill-creator/SKILL.md +513 -513
- package/skills/builtin/skill-creator/agents/analyzer.md +274 -274
- package/skills/builtin/skill-creator/agents/comparator.md +202 -202
- package/skills/builtin/skill-creator/agents/grader.md +223 -223
- package/skills/builtin/skill-creator/assets/eval_review.html +146 -146
- package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -471
- package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -1325
- package/skills/builtin/skill-creator/references/schemas.md +430 -430
- package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -401
- package/skills/builtin/skill-creator/scripts/generate_report.py +326 -326
- package/skills/builtin/skill-creator/scripts/improve_description.py +247 -247
- package/skills/builtin/skill-creator/scripts/package_skill.py +136 -136
- package/skills/builtin/skill-creator/scripts/quick_validate.py +102 -102
- package/skills/builtin/skill-creator/scripts/run_eval.py +310 -310
- package/skills/builtin/skill-creator/scripts/run_loop.py +328 -328
- package/skills/builtin/skill-creator/scripts/utils.py +47 -47
- package/skills/builtin/web-annotations/SKILL.md +93 -93
- package/src/mcp/LICENSE.mcp-cli +21 -21
- package/dist/apps/vscode-artifacts/latest.vsix +0 -0
- 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
|
}
|