@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
@@ -33,9 +33,9 @@ import { ChatTimelineQueryService } from "./data/timeline-query-service.js";
33
33
  import { ChatProjectService } from "./data/project-service.js";
34
34
  import { PiboDataStore } from "../../data/pibo-store.js";
35
35
  import { createDefaultPiboCronStore } from "../../cron/store.js";
36
- import { createDefaultPiboRalphStore } from "../../ralph/store.js";
36
+ import { createDefaultPiboLoopStore } from "../../loops/store.js";
37
37
  import { handleChatCronApiRequest } from "./cron-api.js";
38
- import { handleChatRalphApiRequest } from "./ralph-api.js";
38
+ import { handleChatLoopApiRequest } from "./loop-api.js";
39
39
  import { prepareWebAnnotationMessageAttachments } from "../../web-annotations/attachments.js";
40
40
  import { createDefaultWebAnnotationStore } from "../../web-annotations/store.js";
41
41
  import { CHAT_WEB_MOUNT_PATH, isChatAppPath, responseBuiltChatAsset, responseBuiltChatPublicFile, responseChatAppShell, isVscodeAppPath, responseBuiltVscodeAsset, responseVscodeAppShell } from "./static-assets.js";
@@ -3034,7 +3034,7 @@ export function createChatWebApp(options = {}) {
3034
3034
  agentStore: createAgentStore(options.agentStorePath),
3035
3035
  reliabilityStore: createReliabilityStore(options.reliabilityStorePath),
3036
3036
  cronStore: createDefaultPiboCronStore({ path: options.cronStorePath }),
3037
- ralphStore: createDefaultPiboRalphStore({ path: options.ralphStorePath }),
3037
+ loopStore: createDefaultPiboLoopStore({ path: options.ralphStorePath }),
3038
3038
  dataStore,
3039
3039
  ingestService: new ChatDataIngestService(dataStore),
3040
3040
  traceCache: new Map(),
@@ -3222,14 +3222,14 @@ export function createChatWebApp(options = {}) {
3222
3222
  if (response)
3223
3223
  return response;
3224
3224
  }
3225
- if (url.pathname.startsWith(`${CHAT_WEB_API_PREFIX}/ralph`)) {
3225
+ if (url.pathname.startsWith(`${CHAT_WEB_API_PREFIX}/loops`) || url.pathname.startsWith(`${CHAT_WEB_API_PREFIX}/loop`) || url.pathname.startsWith(`${CHAT_WEB_API_PREFIX}/ralph`)) {
3226
3226
  const webSession = await requireSession(request, context);
3227
- const response = await handleChatRalphApiRequest({
3227
+ const response = await handleChatLoopApiRequest({
3228
3228
  request,
3229
3229
  context,
3230
3230
  webSession,
3231
3231
  roomService: state.roomService,
3232
- ralphStore: state.ralphStore,
3232
+ loopStore: state.loopStore,
3233
3233
  defaultProfile,
3234
3234
  });
3235
3235
  if (response)
@@ -1,4 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { Annotation, END, START, StateGraph } from "@langchain/langgraph";
3
+ const WorkflowManualTriggerState = Annotation.Root({
4
+ execution: Annotation(),
5
+ });
2
6
  export async function runWorkflowManualTextTrigger(options) {
3
7
  const diagnostics = validateWorkflowManualTextTrigger(options.definition, options.triggerNodeId, options.input, options.resolveProfile);
4
8
  if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
@@ -17,8 +21,6 @@ export async function runWorkflowManualTextTrigger(options) {
17
21
  createdAt: now,
18
22
  updatedAt: now,
19
23
  };
20
- const nodeAttempts = [];
21
- const edgeTransfers = [];
22
24
  const triggerAttempt = {
23
25
  id: `wna_${randomUUID()}`,
24
26
  workflowRunId: run.id,
@@ -30,52 +32,153 @@ export async function runWorkflowManualTextTrigger(options) {
30
32
  startedAt: now,
31
33
  completedAt: now,
32
34
  };
33
- nodeAttempts.push(triggerAttempt);
34
- const queue = [];
35
- enqueueOutgoingEdges(options.definition, run.id, triggerAttempt, queue, edgeTransfers);
36
- const executedNodes = new Set();
37
- let lastOutput = options.input;
38
- while (queue.length) {
39
- const pending = queue.shift();
40
- if (executedNodes.has(pending.nodeId)) {
41
- const failedAt = new Date().toISOString();
42
- run.status = "failed";
43
- run.failedAt = failedAt;
44
- run.updatedAt = failedAt;
45
- return {
46
- ok: false,
47
- run,
48
- nodeAttempts,
49
- edgeTransfers,
50
- diagnostics: [{
51
- code: "WorkflowRuntimeError.joinUnsupported",
52
- message: `Workflow node '${pending.nodeId}' received more than one input, but manual trigger V1 does not support joins yet.`,
53
- severity: "error",
54
- nodeId: pending.nodeId,
55
- edgeId: pending.viaEdgeId,
56
- path: `$.edges.${pending.viaEdgeId}`,
57
- }],
58
- error: { code: "WorkflowRuntimeError.joinUnsupported", message: "Manual trigger run failed because a join node was reached." },
59
- };
60
- }
61
- executedNodes.add(pending.nodeId);
62
- const result = await runAgentNode({ ...options, runId: run.id, nodeId: pending.nodeId, input: pending.input });
63
- nodeAttempts.push(result.attempt);
64
- if (!result.ok) {
65
- const failedAt = new Date().toISOString();
66
- run.status = "failed";
67
- run.failedAt = failedAt;
68
- run.updatedAt = failedAt;
69
- return { ok: false, run, nodeAttempts, edgeTransfers, diagnostics: result.diagnostics, error: result.attempt.error };
70
- }
71
- lastOutput = result.output;
72
- enqueueOutgoingEdges(options.definition, run.id, result.attempt, queue, edgeTransfers);
35
+ const initialState = {
36
+ run,
37
+ nodeAttempts: [triggerAttempt],
38
+ edgeTransfers: [],
39
+ pending: [],
40
+ executedNodeIds: [],
41
+ lastOutput: options.input,
42
+ };
43
+ let execution;
44
+ try {
45
+ const graph = compileWorkflowManualTriggerGraph(options);
46
+ const result = await graph.invoke({ execution: initialState }, { recursionLimit: workflowGraphRecursionLimit(options.definition) });
47
+ execution = result.execution;
48
+ }
49
+ catch (error) {
50
+ const failedAt = new Date().toISOString();
51
+ run.status = "failed";
52
+ run.failedAt = failedAt;
53
+ run.updatedAt = failedAt;
54
+ return {
55
+ ok: false,
56
+ run,
57
+ nodeAttempts: initialState.nodeAttempts,
58
+ edgeTransfers: initialState.edgeTransfers,
59
+ diagnostics: [{
60
+ code: "WorkflowRuntimeError.langGraphExecutionFailed",
61
+ message: error instanceof Error ? error.message : "LangGraph execution failed with a non-Error value.",
62
+ severity: "error",
63
+ path: "$",
64
+ }],
65
+ error: {
66
+ code: "WorkflowRuntimeError.langGraphExecutionFailed",
67
+ message: "Manual trigger run failed during LangGraph execution.",
68
+ },
69
+ };
70
+ }
71
+ if (execution.failure) {
72
+ return {
73
+ ok: false,
74
+ run: execution.run,
75
+ nodeAttempts: execution.nodeAttempts,
76
+ edgeTransfers: execution.edgeTransfers,
77
+ diagnostics: execution.failure.diagnostics,
78
+ error: execution.failure.error,
79
+ };
73
80
  }
74
81
  const completedAt = new Date().toISOString();
75
- run.output = lastOutput;
76
- run.completedAt = completedAt;
77
- run.updatedAt = completedAt;
78
- return { ok: true, run, nodeAttempts, edgeTransfers, diagnostics, output: lastOutput };
82
+ execution.run.output = execution.lastOutput;
83
+ execution.run.completedAt = completedAt;
84
+ execution.run.updatedAt = completedAt;
85
+ return {
86
+ ok: true,
87
+ run: execution.run,
88
+ nodeAttempts: execution.nodeAttempts,
89
+ edgeTransfers: execution.edgeTransfers,
90
+ diagnostics,
91
+ output: execution.lastOutput,
92
+ };
93
+ }
94
+ function compileWorkflowManualTriggerGraph(options) {
95
+ const nodes = objectValue(options.definition.nodes) ?? {};
96
+ const graphNodeNames = new Map();
97
+ for (const nodeId of Object.keys(nodes))
98
+ graphNodeNames.set(nodeId, workflowGraphNodeName(nodeId));
99
+ const triggerGraphNode = graphNodeNames.get(options.triggerNodeId) ?? workflowGraphNodeName(options.triggerNodeId);
100
+ const graph = new StateGraph(WorkflowManualTriggerState);
101
+ graph.addNode(triggerGraphNode, async (state) => {
102
+ const execution = state.execution;
103
+ const triggerAttempt = execution.nodeAttempts[0];
104
+ enqueueOutgoingEdges(options.definition, execution.run.id, triggerAttempt, execution.pending, execution.edgeTransfers);
105
+ execution.current = execution.pending.shift();
106
+ return { execution };
107
+ });
108
+ for (const [nodeId, rawNode] of Object.entries(nodes)) {
109
+ if (nodeId === options.triggerNodeId || objectValue(rawNode)?.kind !== "agent")
110
+ continue;
111
+ const graphNodeName = graphNodeNames.get(nodeId);
112
+ graph.addNode(graphNodeName, async (state) => {
113
+ const execution = state.execution;
114
+ const pending = execution.current;
115
+ if (!pending || pending.nodeId !== nodeId) {
116
+ markWorkflowGraphFailure(execution, {
117
+ diagnostics: [{
118
+ code: "WorkflowRuntimeError.langGraphStateMismatch",
119
+ message: `LangGraph scheduled workflow node '${nodeId}' without its pending input.`,
120
+ severity: "error",
121
+ nodeId,
122
+ path: `$.nodes.${nodeId}`,
123
+ }],
124
+ error: { code: "WorkflowRuntimeError.langGraphStateMismatch", message: "Manual trigger run reached an invalid LangGraph state." },
125
+ });
126
+ return { execution };
127
+ }
128
+ if (execution.executedNodeIds.includes(nodeId)) {
129
+ markWorkflowGraphFailure(execution, {
130
+ diagnostics: [{
131
+ code: "WorkflowRuntimeError.joinUnsupported",
132
+ message: `Workflow node '${nodeId}' received more than one input, but manual trigger V1 does not support joins yet.`,
133
+ severity: "error",
134
+ nodeId,
135
+ edgeId: pending.viaEdgeId,
136
+ path: `$.edges.${pending.viaEdgeId}`,
137
+ }],
138
+ error: { code: "WorkflowRuntimeError.joinUnsupported", message: "Manual trigger run failed because a join node was reached." },
139
+ });
140
+ return { execution };
141
+ }
142
+ execution.executedNodeIds.push(nodeId);
143
+ const result = await runAgentNode({ ...options, runId: execution.run.id, nodeId, input: pending.input });
144
+ execution.nodeAttempts.push(result.attempt);
145
+ if (!result.ok) {
146
+ markWorkflowGraphFailure(execution, { diagnostics: result.diagnostics, error: result.attempt.error });
147
+ return { execution };
148
+ }
149
+ execution.lastOutput = result.output;
150
+ enqueueOutgoingEdges(options.definition, execution.run.id, result.attempt, execution.pending, execution.edgeTransfers);
151
+ execution.current = execution.pending.shift();
152
+ return { execution };
153
+ });
154
+ }
155
+ const route = (state) => {
156
+ if (state.execution.failure || !state.execution.current)
157
+ return END;
158
+ return graphNodeNames.get(state.execution.current.nodeId) ?? END;
159
+ };
160
+ graph.addEdge(START, triggerGraphNode);
161
+ graph.addConditionalEdges(triggerGraphNode, route);
162
+ for (const [nodeId, rawNode] of Object.entries(nodes)) {
163
+ if (nodeId === options.triggerNodeId || objectValue(rawNode)?.kind !== "agent")
164
+ continue;
165
+ graph.addConditionalEdges(graphNodeNames.get(nodeId), route);
166
+ }
167
+ return graph.compile();
168
+ }
169
+ function workflowGraphNodeName(nodeId) {
170
+ return `pibo_${Buffer.from(nodeId).toString("base64url")}`;
171
+ }
172
+ function workflowGraphRecursionLimit(definition) {
173
+ return Math.max(25, Object.keys(objectValue(definition.nodes) ?? {}).length * 2 + 2);
174
+ }
175
+ function markWorkflowGraphFailure(execution, failure) {
176
+ const failedAt = new Date().toISOString();
177
+ execution.run.status = "failed";
178
+ execution.run.failedAt = failedAt;
179
+ execution.run.updatedAt = failedAt;
180
+ execution.failure = failure;
181
+ execution.current = undefined;
79
182
  }
80
183
  export function validateWorkflowManualTextTrigger(definition, triggerNodeId, input, resolveProfile) {
81
184
  const diagnostics = [];