@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
@@ -71,39 +71,39 @@ export class ContextFileMetadataStore {
71
71
  this.db = new DatabaseSync(resolvedPath);
72
72
  this.db.exec("PRAGMA busy_timeout = 5000");
73
73
  this.db.exec("PRAGMA journal_mode = WAL");
74
- this.db.exec(`
75
- CREATE TABLE IF NOT EXISTS context_files (
76
- key TEXT PRIMARY KEY,
77
- label TEXT NOT NULL,
78
- managed_path TEXT NOT NULL,
79
- scope TEXT NOT NULL,
80
- source_type TEXT NOT NULL,
81
- agent_profile_name TEXT,
82
- active_revision_id TEXT,
83
- source_ref TEXT,
84
- source_hash TEXT,
85
- created_at TEXT NOT NULL,
86
- updated_at TEXT NOT NULL
87
- );
88
-
89
- CREATE INDEX IF NOT EXISTS idx_context_files_scope
90
- ON context_files(scope, updated_at);
91
-
92
- CREATE TABLE IF NOT EXISTS context_file_revisions (
93
- id TEXT PRIMARY KEY,
94
- context_file_key TEXT NOT NULL,
95
- kind TEXT NOT NULL,
96
- content_hash TEXT NOT NULL,
97
- content TEXT NOT NULL,
98
- created_at TEXT NOT NULL,
99
- actor_id TEXT,
100
- based_on_revision_id TEXT,
101
- source_hash_at_creation TEXT,
102
- note TEXT
103
- );
104
-
105
- CREATE INDEX IF NOT EXISTS idx_context_file_revisions_key
106
- ON context_file_revisions(context_file_key, created_at DESC);
74
+ this.db.exec(`
75
+ CREATE TABLE IF NOT EXISTS context_files (
76
+ key TEXT PRIMARY KEY,
77
+ label TEXT NOT NULL,
78
+ managed_path TEXT NOT NULL,
79
+ scope TEXT NOT NULL,
80
+ source_type TEXT NOT NULL,
81
+ agent_profile_name TEXT,
82
+ active_revision_id TEXT,
83
+ source_ref TEXT,
84
+ source_hash TEXT,
85
+ created_at TEXT NOT NULL,
86
+ updated_at TEXT NOT NULL
87
+ );
88
+
89
+ CREATE INDEX IF NOT EXISTS idx_context_files_scope
90
+ ON context_files(scope, updated_at);
91
+
92
+ CREATE TABLE IF NOT EXISTS context_file_revisions (
93
+ id TEXT PRIMARY KEY,
94
+ context_file_key TEXT NOT NULL,
95
+ kind TEXT NOT NULL,
96
+ content_hash TEXT NOT NULL,
97
+ content TEXT NOT NULL,
98
+ created_at TEXT NOT NULL,
99
+ actor_id TEXT,
100
+ based_on_revision_id TEXT,
101
+ source_hash_at_creation TEXT,
102
+ note TEXT
103
+ );
104
+
105
+ CREATE INDEX IF NOT EXISTS idx_context_file_revisions_key
106
+ ON context_file_revisions(context_file_key, created_at DESC);
107
107
  `);
108
108
  this.migrateLegacyStore();
109
109
  }
@@ -119,20 +119,20 @@ export class ContextFileMetadataStore {
119
119
  const createdAt = input.createdAt ?? new Date().toISOString();
120
120
  const updatedAt = input.updatedAt ?? createdAt;
121
121
  this.db
122
- .prepare(`
123
- INSERT INTO context_files (
124
- key,
125
- label,
126
- managed_path,
127
- scope,
128
- source_type,
129
- agent_profile_name,
130
- active_revision_id,
131
- source_ref,
132
- source_hash,
133
- created_at,
134
- updated_at
135
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
122
+ .prepare(`
123
+ INSERT INTO context_files (
124
+ key,
125
+ label,
126
+ managed_path,
127
+ scope,
128
+ source_type,
129
+ agent_profile_name,
130
+ active_revision_id,
131
+ source_ref,
132
+ source_hash,
133
+ created_at,
134
+ updated_at
135
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
136
136
  `)
137
137
  .run(input.key, input.label, input.managedPath, input.scope, "managed", input.agentProfileName ?? null, null, input.sourceRef ?? null, input.sourceHash ?? null, createdAt, updatedAt);
138
138
  const record = this.getFile(input.key);
@@ -142,19 +142,19 @@ export class ContextFileMetadataStore {
142
142
  }
143
143
  updateFile(input) {
144
144
  this.db
145
- .prepare(`
146
- UPDATE context_files SET
147
- label = ?,
148
- managed_path = ?,
149
- scope = ?,
150
- source_type = ?,
151
- agent_profile_name = ?,
152
- active_revision_id = ?,
153
- source_ref = ?,
154
- source_hash = ?,
155
- created_at = ?,
156
- updated_at = ?
157
- WHERE key = ?
145
+ .prepare(`
146
+ UPDATE context_files SET
147
+ label = ?,
148
+ managed_path = ?,
149
+ scope = ?,
150
+ source_type = ?,
151
+ agent_profile_name = ?,
152
+ active_revision_id = ?,
153
+ source_ref = ?,
154
+ source_hash = ?,
155
+ created_at = ?,
156
+ updated_at = ?
157
+ WHERE key = ?
158
158
  `)
159
159
  .run(input.label, input.managedPath, input.scope, "managed", input.agentProfileName ?? null, input.activeRevisionId ?? null, input.sourceRef ?? null, input.sourceHash ?? null, input.createdAt, input.updatedAt, input.key);
160
160
  const record = this.getFile(input.key);
@@ -178,19 +178,19 @@ export class ContextFileMetadataStore {
178
178
  const id = `rev_${randomUUID()}`;
179
179
  const createdAt = input.createdAt ?? new Date().toISOString();
180
180
  this.db
181
- .prepare(`
182
- INSERT INTO context_file_revisions (
183
- id,
184
- context_file_key,
185
- kind,
186
- content_hash,
187
- content,
188
- created_at,
189
- actor_id,
190
- based_on_revision_id,
191
- source_hash_at_creation,
192
- note
193
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
181
+ .prepare(`
182
+ INSERT INTO context_file_revisions (
183
+ id,
184
+ context_file_key,
185
+ kind,
186
+ content_hash,
187
+ content,
188
+ created_at,
189
+ actor_id,
190
+ based_on_revision_id,
191
+ source_hash_at_creation,
192
+ note
193
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
194
194
  `)
195
195
  .run(id, input.contextFileKey, input.kind, input.contentHash, input.content, createdAt, input.actorId ?? null, input.basedOnRevisionId ?? null, input.sourceHashAtCreation ?? null, input.note ?? null);
196
196
  const revision = this.getRevision(id);
@@ -211,19 +211,19 @@ export class ContextFileMetadataStore {
211
211
  findLatestSourceSnapshot(contextFileKey, sourceHash) {
212
212
  const row = sourceHash
213
213
  ? this.db
214
- .prepare(`
215
- SELECT * FROM context_file_revisions
216
- WHERE context_file_key = ? AND kind = 'source-snapshot' AND content_hash = ?
217
- ORDER BY created_at DESC
218
- LIMIT 1
214
+ .prepare(`
215
+ SELECT * FROM context_file_revisions
216
+ WHERE context_file_key = ? AND kind = 'source-snapshot' AND content_hash = ?
217
+ ORDER BY created_at DESC
218
+ LIMIT 1
219
219
  `)
220
220
  .get(contextFileKey, sourceHash)
221
221
  : this.db
222
- .prepare(`
223
- SELECT * FROM context_file_revisions
224
- WHERE context_file_key = ? AND kind = 'source-snapshot'
225
- ORDER BY created_at DESC
226
- LIMIT 1
222
+ .prepare(`
223
+ SELECT * FROM context_file_revisions
224
+ WHERE context_file_key = ? AND kind = 'source-snapshot'
225
+ ORDER BY created_at DESC
226
+ LIMIT 1
227
227
  `)
228
228
  .get(contextFileKey);
229
229
  return row ? revisionRowToRecord(row) : undefined;
@@ -248,20 +248,20 @@ export class ContextFileMetadataStore {
248
248
  ? statSync(resolvedPath).mtime.toISOString()
249
249
  : new Date().toISOString();
250
250
  this.db
251
- .prepare(`
252
- INSERT INTO context_files (
253
- key,
254
- label,
255
- managed_path,
256
- scope,
257
- source_type,
258
- agent_profile_name,
259
- active_revision_id,
260
- source_ref,
261
- source_hash,
262
- created_at,
263
- updated_at
264
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
251
+ .prepare(`
252
+ INSERT INTO context_files (
253
+ key,
254
+ label,
255
+ managed_path,
256
+ scope,
257
+ source_type,
258
+ agent_profile_name,
259
+ active_revision_id,
260
+ source_ref,
261
+ source_hash,
262
+ created_at,
263
+ updated_at
264
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
265
265
  `)
266
266
  .run(file.key, file.label, resolvedPath, file.scope, "managed", file.agentProfileName ?? null, null, null, null, createdAt, createdAt);
267
267
  if (!existsSync(resolvedPath))
@@ -270,19 +270,19 @@ export class ContextFileMetadataStore {
270
270
  const contentHash = hashContextFileContent(content);
271
271
  const revisionId = `rev_${randomUUID()}`;
272
272
  this.db
273
- .prepare(`
274
- INSERT INTO context_file_revisions (
275
- id,
276
- context_file_key,
277
- kind,
278
- content_hash,
279
- content,
280
- created_at,
281
- actor_id,
282
- based_on_revision_id,
283
- source_hash_at_creation,
284
- note
285
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
273
+ .prepare(`
274
+ INSERT INTO context_file_revisions (
275
+ id,
276
+ context_file_key,
277
+ kind,
278
+ content_hash,
279
+ content,
280
+ created_at,
281
+ actor_id,
282
+ based_on_revision_id,
283
+ source_hash_at_creation,
284
+ note
285
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
286
286
  `)
287
287
  .run(revisionId, file.key, "working", contentHash, content, createdAt, null, null, null, "Legacy managed file import");
288
288
  this.db
@@ -227,10 +227,10 @@ function responseBuiltIndex() {
227
227
  return responseHtml(readFileSync(indexPath, "utf8"));
228
228
  }
229
229
  function fallbackHtml() {
230
- return responseHtml(`<!doctype html>
231
- <html lang="en">
232
- <head><meta charset="utf-8"><title>Pibo Context Files</title></head>
233
- <body><p>Context Files UI has not been built. Run <code>npm run context-files-ui:build</code>.</p></body>
230
+ return responseHtml(`<!doctype html>
231
+ <html lang="en">
232
+ <head><meta charset="utf-8"><title>Pibo Context Files</title></head>
233
+ <body><p>Context Files UI has not been built. Run <code>npm run context-files-ui:build</code>.</p></body>
234
234
  </html>`);
235
235
  }
236
236
  function writeSse(controller, eventName, payload, id) {
@@ -33,7 +33,7 @@ export class PiboPluginRegistry {
33
33
  capabilityPackages = new Map();
34
34
  eventListeners = new Set();
35
35
  productEventListeners = new Set();
36
- ralphStopConditions = new Map();
36
+ loopStopConditions = new Map();
37
37
  pluginIds = new Set();
38
38
  pluginNames = new Map();
39
39
  eventErrors = [];
@@ -133,20 +133,22 @@ export class PiboPluginRegistry {
133
133
  registerCapabilityPackage(pkg) {
134
134
  this.addUnique(this.capabilityPackages, pkg.name, { ...pkg, toolNames: [...pkg.toolNames] }, "capability package");
135
135
  }
136
- registerRalphStopCondition(condition, pluginId) {
136
+ registerLoopStopCondition(condition, pluginId) {
137
137
  if (!condition.type.trim())
138
- throw new Error('Ralph stop condition type is required');
138
+ throw new Error('Loop stop condition type is required');
139
139
  if (!condition.name.trim())
140
- throw new Error(`Ralph stop condition "${condition.type}" name is required`);
140
+ throw new Error(`Loop stop condition "${condition.type}" name is required`);
141
141
  if (condition.phases.length === 0)
142
- throw new Error(`Ralph stop condition "${condition.type}" must support at least one phase`);
143
- this.addUnique(this.ralphStopConditions, condition.type, { definition: { ...condition, phases: [...condition.phases] }, pluginId }, 'Ralph stop condition');
142
+ throw new Error(`Loop stop condition "${condition.type}" must support at least one phase`);
143
+ this.addUnique(this.loopStopConditions, condition.type, { definition: { ...condition, phases: [...condition.phases] }, pluginId }, 'Loop stop condition');
144
144
  }
145
- getRalphStopConditionDefinitions() {
146
- return [...this.ralphStopConditions.values()].map((entry) => entry.definition);
145
+ registerRalphStopCondition(condition, pluginId) { this.registerLoopStopCondition(condition, pluginId); }
146
+ getLoopStopConditionDefinitions() {
147
+ return [...this.loopStopConditions.values()].map((entry) => entry.definition);
147
148
  }
148
- getRalphStopConditionInfos() {
149
- return [...this.ralphStopConditions.values()].map((entry) => ({
149
+ getRalphStopConditionDefinitions() { return this.getLoopStopConditionDefinitions(); }
150
+ getLoopStopConditionInfos() {
151
+ return [...this.loopStopConditions.values()].map((entry) => ({
150
152
  type: entry.definition.type,
151
153
  name: entry.definition.name,
152
154
  description: entry.definition.description,
@@ -157,6 +159,7 @@ export class PiboPluginRegistry {
157
159
  pluginName: entry.pluginId ? this.pluginNames.get(entry.pluginId) : undefined,
158
160
  }));
159
161
  }
162
+ getRalphStopConditionInfos() { return this.getLoopStopConditionInfos(); }
160
163
  onEvent(listener) {
161
164
  this.eventListeners.add(listener);
162
165
  }
@@ -203,6 +206,7 @@ export class PiboPluginRegistry {
203
206
  builtinToolNames: [...sessionContext.builtinToolNames],
204
207
  autoContextFiles: sessionContext.autoContextFiles,
205
208
  runControl: sessionContext.toolPackages.runControl === true,
209
+ goalControl: sessionContext.toolPackages.goalControl !== false,
206
210
  };
207
211
  });
208
212
  }
@@ -255,6 +259,11 @@ export class PiboPluginRegistry {
255
259
  "pibo_run_ack",
256
260
  ],
257
261
  },
262
+ {
263
+ name: "pibo-goal-control",
264
+ description: "Expose get_goal, create_goal, and update_goal as one native goal lifecycle package.",
265
+ toolNames: ["get_goal", "create_goal", "update_goal"],
266
+ },
258
267
  ...[...this.capabilityPackages.values()].map((pkg) => ({
259
268
  ...pkg,
260
269
  toolNames: [...pkg.toolNames],
@@ -264,7 +273,8 @@ export class PiboPluginRegistry {
264
273
  piboTools: listInstalledCliToolAgentContexts(),
265
274
  mcpServers: [],
266
275
  piPackages: listPiPackages(),
267
- ralphStopConditions: this.getRalphStopConditionInfos(),
276
+ loopStopConditions: this.getLoopStopConditionInfos(),
277
+ ralphStopConditions: this.getLoopStopConditionInfos(),
268
278
  };
269
279
  }
270
280
  resolveProfileName(name) {
@@ -355,7 +365,8 @@ export class PiboPluginRegistry {
355
365
  registerAuthService: (service) => this.registerAuthService(service),
356
366
  registerWebApp: (app) => this.registerWebApp(app),
357
367
  registerCapabilityPackage: (pkg) => this.registerCapabilityPackage(withPluginPackageContext(pkg)),
358
- registerRalphStopCondition: (condition) => this.registerRalphStopCondition(condition, pluginId),
368
+ registerLoopStopCondition: (condition) => this.registerLoopStopCondition(condition, pluginId),
369
+ registerRalphStopCondition: (condition) => this.registerLoopStopCondition(condition, pluginId),
359
370
  onEvent: (listener) => this.onEvent(listener),
360
371
  emitProductEvent: (event) => this.emitProductEvent(event),
361
372
  onProductEvent: (listener) => this.onProductEvent(listener),
package/dist/ralph/cli.js CHANGED
@@ -6,24 +6,24 @@ import { DEFAULT_PIBO_PROFILE_NAME } from '../plugins/builtin.js';
6
6
  import { getRalphJobTemplate, listRalphJobTemplates } from './templates.js';
7
7
  import { parsePiboThinkingLevel } from '../core/thinking.js';
8
8
  function printDiscovery() {
9
- console.log(`pibo ralph
10
-
11
- Manage continuous Ralph Pibo agent jobs.
12
-
13
- Commands:
14
- status Show Ralph status
15
- list List Ralph jobs
16
- add Create a Ralph job
17
- edit Update a Ralph job
18
- conditions List registered built-in stop conditions
19
- templates List built-in Ralph job templates
20
- policy Show, set, or clear a job stop policy
21
- start Start a Ralph job now
22
- stop Stop after the current session finishes
23
- cancel Abort the current session and stop
24
- remove Delete a Ralph job
25
- runs List Ralph runs
26
-
9
+ console.log(`pibo ralph
10
+
11
+ Manage continuous Ralph Pibo agent jobs.
12
+
13
+ Commands:
14
+ status Show Ralph status
15
+ list List Ralph jobs
16
+ add Create a Ralph job
17
+ edit Update a Ralph job
18
+ conditions List registered built-in stop conditions
19
+ templates List built-in Ralph job templates
20
+ policy Show, set, or clear a job stop policy
21
+ start Start a Ralph job now
22
+ stop Stop after the current session finishes
23
+ cancel Abort the current session and stop
24
+ remove Delete a Ralph job
25
+ runs List Ralph runs
26
+
27
27
  Next: pibo ralph add --help`);
28
28
  }
29
29
  function targetFromOptions(options) { if (options.room)