@pasko70/pibo 1.1.0 → 1.2.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 +106 -254
- package/context/codex-base-prompt.md +4 -0
- package/context/compute-worker.md +23 -0
- package/context/pibo-native-tooling.md +18 -0
- package/context/pibo-system-prompt.md +69 -8
- package/dist/api/simple-agent-api.js +136 -0
- package/dist/app-context.js +4 -0
- package/dist/apps/chat/agent-profiles.js +18 -3
- package/dist/apps/chat/agent-store.js +113 -16
- package/dist/apps/chat/chat-api-routes.js +311 -0
- package/dist/apps/chat/chat-capability-routes.js +90 -0
- package/dist/apps/chat/chat-files.js +178 -0
- package/dist/apps/chat/chat-request-normalizers.js +681 -0
- package/dist/apps/chat/chat-settings-routes.js +75 -0
- package/dist/apps/chat/chat-trace-helpers.js +94 -0
- package/dist/apps/chat/chat-user-skill-routes.js +149 -0
- package/dist/apps/chat/cron-api.js +213 -0
- package/dist/apps/chat/data/chat-data-mappers.js +74 -0
- package/dist/apps/chat/data/event-command-service.js +75 -0
- package/dist/apps/chat/data/navigation-query-service.js +11 -0
- package/dist/apps/chat/data/project-service.js +844 -0
- package/dist/apps/chat/data/read-state-service.js +42 -0
- package/dist/apps/chat/data/room-service.js +52 -0
- package/dist/apps/chat/data/session-query-service.js +63 -0
- package/dist/apps/chat/data/timeline-query-service.js +96 -0
- package/dist/apps/chat/event-log.js +1 -307
- package/dist/apps/chat/model-catalog.js +7 -2
- package/dist/apps/chat/output-compactor.js +126 -0
- package/dist/apps/chat/output-event-policy.js +17 -0
- package/dist/apps/chat/project-workflow-human-actions.js +347 -0
- package/dist/apps/chat/project-workflow-sessions.js +260 -0
- package/dist/apps/chat/provider-auth-actions.js +43 -0
- package/dist/apps/chat/ralph-api.js +156 -0
- package/dist/apps/chat/read-model.js +1 -218
- package/dist/apps/chat/rooms.js +1 -321
- package/dist/apps/chat/static-assets.js +996 -0
- package/dist/apps/chat/stream.js +29 -6
- package/dist/apps/chat/trace.js +179 -1003
- package/dist/apps/chat/types/event-store.js +1 -0
- package/dist/apps/chat/types/read-model.js +1 -0
- package/dist/apps/chat/types/rooms.js +36 -0
- package/dist/apps/chat/web-app.js +3131 -1959
- package/dist/apps/chat/workflow-catalog.js +572 -0
- package/dist/apps/chat/workflow-edge-compatibility.js +51 -0
- package/dist/apps/chat/workflow-json-schema-validation.js +335 -0
- package/dist/apps/chat/workflow-persistence-model.js +140 -0
- package/dist/apps/chat/workflow-persistence.js +633 -0
- package/dist/apps/chat/workflow-registered-ref-params.js +130 -0
- package/dist/apps/chat/workflow-registered-ref-pickers.js +179 -0
- package/dist/apps/chat/workflow-registered-ref-validation.js +210 -0
- package/dist/apps/chat/workflow-v2-security-validation.js +93 -0
- package/dist/apps/chat/workflow-validation-helpers.js +114 -0
- package/dist/apps/chat-ui/assets/{dist-CNLWH2qh.js → dist-B4lw9z4F.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-8e4L8ciw.js → dist-BbTaHWON.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CMZOa5ik.js → dist-BcT_c1EJ.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DNcnQRPF.js → dist-CGINd7XU.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CqqUC8Ce.js → dist-CrBzZkUp.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-D2N4-LIc.js → dist-CyyISotB.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CUqpST5w.js → dist-DFbnFNpX.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CspjOeBj.js → dist-DGLWQLX8.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-B7bbI3Qz.js → dist-DfcIkFSN.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-v4pjHlB7.js → dist-sKDHTwaT.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-D9L4MSRF.js → dist-y9D6la48.js} +1 -1
- package/dist/apps/chat-ui/assets/index-C25VYnyb.css +1 -0
- package/dist/apps/chat-ui/assets/index-CUkuvI3v.js +165 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/index.html +8 -3
- package/dist/apps/chat-ui/manifest.webmanifest +25 -0
- package/dist/apps/chat-ui/sw.js +41 -0
- package/dist/apps/cli-ui/InkSessionApp.js +1218 -0
- package/dist/apps/cli-ui/InkTerminalLine.js +53 -0
- package/dist/apps/cli-ui/InkTerminalRow.js +304 -0
- package/dist/apps/cli-ui/InkTerminalView.js +25 -0
- package/dist/apps/cli-ui/cliSessionsCommand.js +232 -0
- package/dist/apps/cli-ui/index.js +8 -0
- package/dist/apps/cli-ui/inkColors.js +67 -0
- package/dist/apps/cli-ui/inkJson.js +244 -0
- package/dist/apps/cli-ui/inkMarkdown.js +122 -0
- package/dist/apps/context-files-ui/assets/{dist-DFi2YGux.js → dist-BOiGdrG-.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-DyfSeBMu.js → dist-DK01b7x4.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-CwbH_3RN.js → dist-DPG9jOQ-.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-dTBsFYAl.js → dist-Dp5AH00p.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-CxRLRmMx.js → dist-DqYw0LH7.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-MyZgX9K2.js → dist-TF5iO5ML.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-DQXzt2Ng.js → dist-TbjAhles.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-YwR9dpb-.js → dist-ZsBbt0uY.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-CKQF1zEu.js → dist-kmsvtHkH.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-BJW3917N.js → dist-vnd7PMu3.js} +1 -1
- package/dist/apps/context-files-ui/assets/{index-BwRDoHMC.css → index-B92tL3Pp.css} +1 -1
- package/dist/apps/context-files-ui/assets/{index-GwvjXytt.js → index-BhAWD3dv.js} +2 -2
- package/dist/apps/context-files-ui/index.html +2 -2
- package/dist/auth/better-auth.js +2 -1
- package/dist/auth/login-actions.js +251 -0
- package/dist/auth/openai-codex-usage.js +147 -0
- package/dist/bin/pibo.js +0 -0
- package/dist/bin/rg.js +15 -0
- package/dist/cli-session/fakeSessionSource.js +804 -0
- package/dist/cli-session/index.js +3 -0
- package/dist/cli-session/localSessionSource.js +1144 -0
- package/dist/cli-session/sessionSource.js +13 -0
- package/dist/cli.js +142 -14
- package/dist/compute/cli.js +415 -0
- package/dist/compute/docker.js +827 -0
- package/dist/compute/resource-health.js +333 -0
- package/dist/compute/resource-policy.js +98 -0
- package/dist/config/config.js +9 -5
- package/dist/core/context-build.js +677 -0
- package/dist/core/model-defaults.js +51 -9
- package/dist/core/pibo-home.js +8 -0
- package/dist/core/profiles.js +48 -0
- package/dist/core/provider-telemetry.js +222 -0
- package/dist/core/routed-session.js +441 -47
- package/dist/core/runtime-telemetry.js +853 -0
- package/dist/core/runtime.js +103 -15
- package/dist/core/session-errors.js +47 -0
- package/dist/core/session-model.js +39 -0
- package/dist/core/session-router.js +292 -62
- package/dist/core/shared-app.js +17 -0
- package/dist/core/skill-expansion.js +43 -0
- package/dist/core/system-prompt-template.js +9 -9
- package/dist/core/telemetry-staleness.js +128 -0
- package/dist/core/test-output-compaction.js +145 -0
- package/dist/core/user-settings.js +73 -0
- package/dist/cron/channel.js +28 -0
- package/dist/cron/cli.js +230 -0
- package/dist/cron/plugin.js +11 -0
- package/dist/cron/schedule.js +214 -0
- package/dist/cron/service.js +177 -0
- package/dist/cron/store.js +349 -0
- package/dist/cron/types.js +1 -0
- package/dist/data/cli.js +184 -0
- package/dist/data/event-log.js +106 -0
- package/dist/data/final-app-space-cutover-migration.js +728 -0
- package/dist/data/ingest-service.js +389 -0
- package/dist/data/message-store.js +62 -0
- package/dist/data/navigation-store.js +75 -0
- package/dist/data/observation-store.js +46 -0
- package/dist/data/payload-store.js +144 -0
- package/dist/data/pibo-store.js +59 -0
- package/dist/data/schema.js +434 -0
- package/dist/data/session-store.js +63 -0
- package/dist/data/shared-app-migration.js +757 -0
- package/dist/data/sqlite-schema.js +12 -0
- package/dist/data/telemetry-preview.js +65 -0
- package/dist/data/telemetry-queries.js +212 -0
- package/dist/data/telemetry-retention.js +50 -0
- package/dist/data/telemetry-rows.js +158 -0
- package/dist/data/telemetry.js +357 -0
- package/dist/debug/delta-compaction.js +99 -0
- package/dist/debug/detail-format.js +86 -0
- package/dist/debug/events.js +149 -29
- package/dist/debug/failures.js +162 -0
- package/dist/debug/index.js +655 -30
- package/dist/debug/messages.js +185 -0
- package/dist/debug/next-commands.js +6 -0
- package/dist/debug/payloads.js +123 -0
- package/dist/debug/pty.js +924 -0
- package/dist/debug/session.js +45 -15
- package/dist/debug/sql.js +1 -1
- package/dist/debug/stores.js +18 -13
- package/dist/debug/summary.js +72 -0
- package/dist/debug/telemetry.js +649 -0
- package/dist/debug/tools.js +168 -0
- package/dist/debug/trace-render-check.js +151 -0
- package/dist/debug/trace.js +152 -27
- package/dist/debug/web-artifacts.js +63 -0
- package/dist/debug/web-options.js +313 -0
- package/dist/debug/web-render-analysis.js +310 -0
- package/dist/debug/web-snapshot-browser-scripts.js +303 -0
- package/dist/debug/web-streaming-benchmark-analysis.js +605 -0
- package/dist/debug/web-streaming-browser-library.js +928 -0
- package/dist/debug/web-streaming-browser-scripts.js +242 -0
- package/dist/debug/web-streaming-provider-telemetry.js +194 -0
- package/dist/debug/web-streaming-report.js +493 -0
- package/dist/debug/web-streaming-types.js +1 -0
- package/dist/debug/web.js +574 -0
- package/dist/gateway/backup.js +83 -0
- package/dist/gateway/cli.js +511 -0
- package/dist/gateway/fallback.js +155 -0
- package/dist/gateway/pidfile.js +84 -0
- package/dist/gateway/protocol.js +16 -0
- package/dist/gateway/server.js +172 -17
- package/dist/gateway/tool.js +54 -51
- package/dist/gateway/web.js +74 -2
- package/dist/index.js +3 -1
- package/dist/local/client.js +3 -3
- package/dist/local/extension.js +8 -5
- package/dist/plugins/builtin.js +251 -49
- package/dist/plugins/chat-vscode-web.js +28 -0
- package/dist/plugins/codex-compat.js +0 -41
- package/dist/plugins/context-files.js +98 -18
- package/dist/plugins/dev-auth.js +124 -0
- package/dist/plugins/native-tooling.js +15 -0
- package/dist/plugins/registry.js +49 -1
- package/dist/plugins/web-annotations.js +27 -0
- package/dist/providers/minimax.js +70 -0
- package/dist/providers/openai-compat.js +48 -0
- package/dist/ralph/channel.js +8 -0
- package/dist/ralph/cli.js +152 -0
- package/dist/ralph/plugin.js +14 -0
- package/dist/ralph/service.js +271 -0
- package/dist/ralph/stopping.js +151 -0
- package/dist/ralph/store.js +450 -0
- package/dist/ralph/templates.js +200 -0
- package/dist/ralph/types.js +1 -0
- package/dist/reliability/store.js +42 -26
- package/dist/runs/registry.js +72 -35
- package/dist/session-ui/commandCatalog.js +193 -0
- package/dist/session-ui/commandResults.js +95 -0
- package/dist/session-ui/index.js +7 -0
- package/dist/session-ui/ownerViewModel.js +27 -0
- package/dist/session-ui/roomSessionViewModel.js +69 -0
- package/dist/session-ui/statusViewModel.js +127 -0
- package/dist/session-ui/terminalCards.js +210 -0
- package/dist/session-ui/terminalRows.js +937 -0
- package/dist/session-ui/terminalValue.js +45 -0
- package/dist/sessions/pibo-data-store.js +178 -0
- package/dist/sessions/sqlite-store.js +78 -12
- package/dist/sessions/store.js +11 -4
- package/dist/sessions/workflow-session-kind.js +20 -0
- package/dist/setup/cli.js +567 -0
- package/dist/shared/trace-async-agent-runs.js +127 -0
- package/dist/shared/trace-engine.js +96 -0
- package/dist/shared/trace-event-projection.js +679 -0
- package/dist/shared/trace-live-reducer.js +191 -0
- package/dist/shared/trace-nodes.js +76 -0
- package/dist/shared/trace-order.js +11 -10
- package/dist/shared/trace-patch-nodes.js +83 -0
- package/dist/shared/trace-run-notifications.js +69 -0
- package/dist/shared/trace-subagent-links.js +46 -0
- package/dist/shared/trace-transcript.js +303 -0
- package/dist/shared/trace-types.js +1 -0
- package/dist/shared-app.js +4 -0
- package/dist/signals/aggregate.js +65 -0
- package/dist/signals/events.js +1 -0
- package/dist/signals/projector.js +158 -0
- package/dist/signals/registry.js +513 -0
- package/dist/signals/store.js +1 -0
- package/dist/signals/types.js +1 -0
- package/dist/skills/cli.js +117 -0
- package/dist/tools/agent-browser-leases.js +219 -0
- package/dist/tools/agent-browser-wrapper.js +99 -0
- package/dist/tools/browser-pool.js +623 -0
- package/dist/tools/browser-use-cdp.js +56 -4
- package/dist/tools/browser-use-leases.js +215 -37
- package/dist/tools/browser-use-wrapper.js +508 -65
- package/dist/tools/cdp-client.js +189 -0
- package/dist/tools/guides.js +203 -4
- package/dist/tools/index.js +666 -16
- package/dist/tools/npm-runtime.js +136 -0
- package/dist/tools/registry.js +107 -8
- package/dist/tools/runtime/index.js +3 -0
- package/dist/tools/runtime/node-backend.js +225 -0
- package/dist/tools/runtime/node-worker-source.js +206 -0
- package/dist/tools/runtime/python-backend.js +227 -0
- package/dist/tools/runtime/python-worker-source.js +178 -0
- package/dist/tools/runtime/registry.js +255 -0
- package/dist/tools/runtime/tool.js +168 -0
- package/dist/tools/runtime/types.js +1 -0
- package/dist/tools/web-search.js +2 -1
- package/dist/user-skills/installer.js +39 -36
- package/dist/user-skills/store.js +50 -11
- package/dist/web/auth.js +5 -1
- package/dist/web/channel.js +86 -0
- package/dist/web/http.js +79 -14
- package/dist/web-annotations/api.js +348 -0
- package/dist/web-annotations/attachments.js +201 -0
- package/dist/web-annotations/cdp.js +1107 -0
- package/dist/web-annotations/index.js +7 -0
- package/dist/web-annotations/store.js +407 -0
- package/dist/web-annotations/tools.js +350 -0
- package/dist/web-annotations/types.js +34 -0
- package/dist/web-annotations/validation.js +288 -0
- package/docs/README.md +23 -0
- package/docs/ops/install-developer-host.md +112 -0
- package/docs/ops/install-user-host.md +76 -0
- package/docs/ops/upgrade-user-to-developer-host.md +69 -0
- package/package.json +24 -10
- package/skills/builtin/pi-agent-harness/SKILL.md +24 -24
- package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
- package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
- package/skills/builtin/prd/SKILL.md +143 -0
- package/skills/builtin/ralph-loop/SKILL.md +359 -0
- package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
- package/skills/builtin/skill-creator/LICENSE.txt +202 -0
- package/skills/builtin/skill-creator/SKILL.md +513 -0
- package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
- package/skills/builtin/skill-creator/agents/comparator.md +202 -0
- package/skills/builtin/skill-creator/agents/grader.md +223 -0
- package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
- package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/builtin/skill-creator/references/schemas.md +430 -0
- package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
- package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
- package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
- package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
- package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
- package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
- package/skills/builtin/skill-creator/scripts/utils.py +47 -0
- package/skills/builtin/web-annotations/SKILL.md +93 -0
- package/dist/apps/chat-ui/assets/index-D2Qxambd.js +0 -151
- package/dist/apps/chat-ui/assets/index-DXx368XK.css +0 -1
- package/dist/env.js +0 -32
- package/dist/plugins/core-tools.js +0 -94
- package/dist/plugins/example.js +0 -67
- package/dist/plugins/remote-agent.js +0 -9
- package/dist/remote/channel.js +0 -176
- package/dist/remote/client.js +0 -92
- package/dist/remote/examples/tui-controller.js +0 -263
- package/dist/remote/protocol.js +0 -55
- package/dist/remote/session-client.js +0 -189
- package/dist/sessions/bindings.js +0 -41
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export class ChatReadStateService {
|
|
2
|
+
store;
|
|
3
|
+
constructor(store) {
|
|
4
|
+
this.store = store;
|
|
5
|
+
}
|
|
6
|
+
markSessionRead(piboSessionId, lastReadStreamId) {
|
|
7
|
+
const now = new Date().toISOString();
|
|
8
|
+
this.store.db.prepare(`
|
|
9
|
+
INSERT INTO app_session_read_state (session_id, last_read_stream_id, last_read_at, updated_at)
|
|
10
|
+
VALUES (?, ?, ?, ?)
|
|
11
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
12
|
+
last_read_stream_id = MAX(app_session_read_state.last_read_stream_id, excluded.last_read_stream_id),
|
|
13
|
+
last_read_at = excluded.last_read_at,
|
|
14
|
+
updated_at = excluded.updated_at
|
|
15
|
+
`).run(piboSessionId, lastReadStreamId, now, now);
|
|
16
|
+
}
|
|
17
|
+
countUnreadMessagesBySession(input) {
|
|
18
|
+
const counts = new Map();
|
|
19
|
+
if (!input.piboSessionIds.length)
|
|
20
|
+
return counts;
|
|
21
|
+
for (let offset = 0; offset < input.piboSessionIds.length; offset += 400) {
|
|
22
|
+
const ids = [...new Set(input.piboSessionIds)].slice(offset, offset + 400);
|
|
23
|
+
const placeholders = ids.map(() => "?").join(", ");
|
|
24
|
+
const rows = this.store.db.prepare(`
|
|
25
|
+
SELECT e.session_id, COUNT(*) AS count
|
|
26
|
+
FROM event_log e
|
|
27
|
+
LEFT JOIN app_session_read_state reads ON reads.session_id = e.session_id
|
|
28
|
+
WHERE e.session_id IN (${placeholders})
|
|
29
|
+
AND e.stream_id > COALESCE(reads.last_read_stream_id, 0)
|
|
30
|
+
AND (
|
|
31
|
+
(e.retention_class = 'chat_message' AND e.type IN ('user.message.accepted', 'assistant_message'))
|
|
32
|
+
OR e.type = 'session_error'
|
|
33
|
+
)
|
|
34
|
+
GROUP BY e.session_id
|
|
35
|
+
`).all(...ids);
|
|
36
|
+
for (const row of rows)
|
|
37
|
+
if (Number(row.count) > 0)
|
|
38
|
+
counts.set(row.session_id, Number(row.count));
|
|
39
|
+
}
|
|
40
|
+
return counts;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { roomWorkspaceFromMetadata } from "../types/rooms.js";
|
|
3
|
+
import { roomFromRow } from "./chat-data-mappers.js";
|
|
4
|
+
export class ChatRoomService {
|
|
5
|
+
store;
|
|
6
|
+
constructor(store) {
|
|
7
|
+
this.store = store;
|
|
8
|
+
}
|
|
9
|
+
createRoom(input) {
|
|
10
|
+
const now = new Date().toISOString();
|
|
11
|
+
const room = { id: input.id ?? `room_${randomUUID()}`, name: input.name, topic: input.topic, workspace: roomWorkspaceFromMetadata(input.metadata), type: input.type ?? "chat", parentRoomId: input.parentRoomId, createdAt: now, updatedAt: now, retentionPolicyId: input.retentionPolicyId, metadata: input.metadata ?? {} };
|
|
12
|
+
const columns = ["id", "name", "topic", "type", "parent_room_id", "workspace", "retention_policy_id", "metadata_json", "created_at", "updated_at"];
|
|
13
|
+
this.store.db.prepare(`INSERT INTO rooms (${columns.join(", ")}) VALUES (${columns.map(() => "?").join(", ")})`).run(room.id, room.name, room.topic ?? null, room.type, room.parentRoomId ?? null, room.workspace ?? null, room.retentionPolicyId ?? null, JSON.stringify(room.metadata), room.createdAt, room.updatedAt);
|
|
14
|
+
return room;
|
|
15
|
+
}
|
|
16
|
+
updateRoom(id, input) {
|
|
17
|
+
const existing = this.getRoom(id);
|
|
18
|
+
if (!existing)
|
|
19
|
+
return undefined;
|
|
20
|
+
const metadata = input.metadata ?? existing.metadata;
|
|
21
|
+
const updated = { ...existing, name: input.name ?? existing.name, topic: input.topic === null ? undefined : input.topic ?? existing.topic, parentRoomId: input.parentRoomId === null ? undefined : input.parentRoomId ?? existing.parentRoomId, retentionPolicyId: input.retentionPolicyId === null ? undefined : input.retentionPolicyId ?? existing.retentionPolicyId, metadata, workspace: roomWorkspaceFromMetadata(metadata), updatedAt: new Date().toISOString() };
|
|
22
|
+
this.store.db.prepare("UPDATE rooms SET name = ?, topic = ?, parent_room_id = ?, workspace = ?, retention_policy_id = ?, metadata_json = ?, updated_at = ? WHERE id = ?").run(updated.name, updated.topic ?? null, updated.parentRoomId ?? null, updated.workspace ?? null, updated.retentionPolicyId ?? null, JSON.stringify(updated.metadata), updated.updatedAt, id);
|
|
23
|
+
return this.getRoom(id);
|
|
24
|
+
}
|
|
25
|
+
deleteRooms(ids) {
|
|
26
|
+
if (!ids.length)
|
|
27
|
+
return 0;
|
|
28
|
+
const placeholders = ids.map(() => "?").join(", ");
|
|
29
|
+
const result = this.store.db.prepare(`DELETE FROM rooms WHERE id IN (${placeholders})`).run(...ids);
|
|
30
|
+
return Number(result.changes ?? 0);
|
|
31
|
+
}
|
|
32
|
+
getRoom(id) { const row = this.store.db.prepare("SELECT * FROM rooms WHERE id = ?").get(id); return row ? roomFromRow(row) : undefined; }
|
|
33
|
+
listRooms() { return this.store.db.prepare("SELECT * FROM rooms ORDER BY updated_at DESC, id ASC").all().map(roomFromRow); }
|
|
34
|
+
listRoomTree() { const byId = new Map(this.listRooms().map((room) => [room.id, { ...room, children: [] }])); const roots = []; for (const node of byId.values()) {
|
|
35
|
+
const parent = node.parentRoomId ? byId.get(node.parentRoomId) : undefined;
|
|
36
|
+
if (parent)
|
|
37
|
+
parent.children.push(node);
|
|
38
|
+
else
|
|
39
|
+
roots.push(node);
|
|
40
|
+
} return roots; }
|
|
41
|
+
listRoomSubtree(roomId) { const root = this.getRoom(roomId); if (!root)
|
|
42
|
+
return []; const rooms = this.listRooms(); const byParent = new Map(); for (const room of rooms)
|
|
43
|
+
if (room.parentRoomId)
|
|
44
|
+
byParent.set(room.parentRoomId, [...(byParent.get(room.parentRoomId) ?? []), room]); const result = []; const visit = (room) => { result.push(room); for (const child of byParent.get(room.id) ?? [])
|
|
45
|
+
visit(child); }; visit(root); return result; }
|
|
46
|
+
ensureDefaultRoom(input = {}) { const existing = this.store.db.prepare("SELECT * FROM rooms WHERE json_extract(metadata_json, '$.default') IS 1 ORDER BY updated_at DESC, id ASC LIMIT 1").get(); if (existing)
|
|
47
|
+
return roomFromRow(existing); return this.createRoom({ name: input.name ?? "Shared Chat", type: "chat", metadata: { default: true } }); }
|
|
48
|
+
updateReadCursor(roomId, lastReadStreamId) { const now = new Date().toISOString(); this.store.db.prepare("INSERT INTO app_room_read_state (room_id, last_read_stream_id, last_read_at, updated_at) VALUES (?, ?, ?, ?) ON CONFLICT(room_id) DO UPDATE SET last_read_stream_id = MAX(app_room_read_state.last_read_stream_id, excluded.last_read_stream_id), last_read_at = excluded.last_read_at, updated_at = excluded.updated_at").run(roomId, lastReadStreamId, now, now); }
|
|
49
|
+
requireRoom(roomId) { const room = this.getRoom(roomId); if (!room)
|
|
50
|
+
throw new Error("Room not found"); return room; }
|
|
51
|
+
close() { }
|
|
52
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { chatRoomIdFromMetadata } from "../types/rooms.js";
|
|
2
|
+
import { sessionFromRow, statusFromOutputEvent } from "./chat-data-mappers.js";
|
|
3
|
+
export class ChatSessionQueryService {
|
|
4
|
+
store;
|
|
5
|
+
constructor(store) {
|
|
6
|
+
this.store = store;
|
|
7
|
+
}
|
|
8
|
+
upsertSession(session, status = "idle") {
|
|
9
|
+
const roomId = chatRoomIdFromMetadata(session.metadata) ?? "room_default";
|
|
10
|
+
this.store.sessions.upsertSession({ session, roomId, status, lastActivityAt: session.updatedAt });
|
|
11
|
+
this.upsertNavigation(session, roomId, status, session.updatedAt);
|
|
12
|
+
}
|
|
13
|
+
upsertSessionsIfChanged(sessions) {
|
|
14
|
+
for (const session of sessions)
|
|
15
|
+
this.upsertSession(session);
|
|
16
|
+
return { checked: sessions.length, written: sessions.length, skipped: 0 };
|
|
17
|
+
}
|
|
18
|
+
recordEvent(event, session) {
|
|
19
|
+
if (session)
|
|
20
|
+
this.upsertSession(session, statusFromOutputEvent(event));
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
listSessions() {
|
|
24
|
+
const rows = this.store.db.prepare("SELECT * FROM sessions WHERE deleted_at IS NULL ORDER BY last_activity_at DESC, created_at DESC").all();
|
|
25
|
+
return rows.map(sessionFromRow);
|
|
26
|
+
}
|
|
27
|
+
getSession(piboSessionId) {
|
|
28
|
+
const row = this.store.db.prepare("SELECT * FROM sessions WHERE id = ? AND deleted_at IS NULL").get(piboSessionId);
|
|
29
|
+
return row ? sessionFromRow(row) : undefined;
|
|
30
|
+
}
|
|
31
|
+
hasSessionActivity(piboSessionId) {
|
|
32
|
+
const row = this.store.db.prepare("SELECT 1 AS found FROM event_log WHERE session_id = ? AND type NOT IN ('assistant_delta', 'thinking_delta', 'tool_execution_updated') LIMIT 1").get(piboSessionId);
|
|
33
|
+
return Boolean(row) || this.getSession(piboSessionId)?.status === "running";
|
|
34
|
+
}
|
|
35
|
+
deleteSessions(piboSessionIds) {
|
|
36
|
+
if (!piboSessionIds.length)
|
|
37
|
+
return 0;
|
|
38
|
+
const placeholders = piboSessionIds.map(() => "?").join(", ");
|
|
39
|
+
this.store.db.prepare(`DELETE FROM observations WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
|
|
40
|
+
this.store.db.prepare(`DELETE FROM chat_messages WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
|
|
41
|
+
this.store.db.prepare(`DELETE FROM event_log WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
|
|
42
|
+
this.store.db.prepare(`DELETE FROM session_navigation WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
|
|
43
|
+
const result = this.store.db.prepare(`UPDATE sessions SET deleted_at = COALESCE(deleted_at, ?) WHERE id IN (${placeholders})`).run(new Date().toISOString(), ...piboSessionIds);
|
|
44
|
+
return Number(result.changes ?? 0);
|
|
45
|
+
}
|
|
46
|
+
close() { }
|
|
47
|
+
upsertNavigation(session, roomId, status, now) {
|
|
48
|
+
this.store.navigation.upsertSession({
|
|
49
|
+
roomId,
|
|
50
|
+
sessionId: session.id,
|
|
51
|
+
rootSessionId: session.parentId ? (typeof session.metadata?.rootSessionId === "string" ? session.metadata.rootSessionId : session.parentId) : session.id,
|
|
52
|
+
parentId: session.parentId,
|
|
53
|
+
originId: session.originId,
|
|
54
|
+
title: session.title || "Untitled Session",
|
|
55
|
+
profile: session.profile,
|
|
56
|
+
status,
|
|
57
|
+
archivedAt: typeof session.metadata?.archivedAt === "string" ? session.metadata.archivedAt : undefined,
|
|
58
|
+
lastActivityAt: now,
|
|
59
|
+
sortKey: now,
|
|
60
|
+
updatedAt: now,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { storedChatEventFromV2Row, storedPiboEventFromV2Row } from "./chat-data-mappers.js";
|
|
2
|
+
export class ChatTimelineQueryService {
|
|
3
|
+
store;
|
|
4
|
+
constructor(store) {
|
|
5
|
+
this.store = store;
|
|
6
|
+
}
|
|
7
|
+
listEvents(input = {}) {
|
|
8
|
+
const clauses = [];
|
|
9
|
+
const values = [];
|
|
10
|
+
if (input.roomId) {
|
|
11
|
+
clauses.push("room_id = ?");
|
|
12
|
+
values.push(input.roomId);
|
|
13
|
+
}
|
|
14
|
+
if (input.piboSessionId) {
|
|
15
|
+
clauses.push("session_id = ?");
|
|
16
|
+
values.push(input.piboSessionId);
|
|
17
|
+
}
|
|
18
|
+
if (input.afterStreamId !== undefined) {
|
|
19
|
+
clauses.push("stream_id > ?");
|
|
20
|
+
values.push(input.afterStreamId);
|
|
21
|
+
}
|
|
22
|
+
const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
23
|
+
const limit = Math.max(1, Math.min(input.limit ?? 1000, 5000));
|
|
24
|
+
const rows = this.store.db.prepare(`SELECT * FROM event_log ${where} ORDER BY stream_id ASC LIMIT ?`).all(...values, limit);
|
|
25
|
+
return rows.map(storedChatEventFromV2Row);
|
|
26
|
+
}
|
|
27
|
+
listSessionEvents(piboSessionId, limit = 1000) {
|
|
28
|
+
return this.listTraceEvents({ piboSessionId, limit, includeLive: true });
|
|
29
|
+
}
|
|
30
|
+
listAllSessionEvents(piboSessionId) {
|
|
31
|
+
return this.listTraceEvents({ piboSessionId, limit: 10000, includeLive: true });
|
|
32
|
+
}
|
|
33
|
+
listTraceEvents(input) {
|
|
34
|
+
const piboSessionId = typeof input === "string" ? input : input.piboSessionId;
|
|
35
|
+
const limit = Math.max(1, Math.min((typeof input === "string" ? undefined : input.limit) ?? 2000, 10000));
|
|
36
|
+
const beforeOrAtSequence = typeof input === "string" ? undefined : input.beforeOrAtSequence;
|
|
37
|
+
const beforeSequence = typeof input === "string" ? undefined : input.beforeSequence;
|
|
38
|
+
const includeLive = typeof input === "string" ? false : input.includeLive === true;
|
|
39
|
+
const clauses = ["session_id = ?"];
|
|
40
|
+
const values = [piboSessionId];
|
|
41
|
+
if (!includeLive)
|
|
42
|
+
clauses.push("type NOT IN ('assistant_delta', 'thinking_delta', 'tool_execution_updated')");
|
|
43
|
+
if (beforeSequence !== undefined) {
|
|
44
|
+
clauses.push("session_sequence < ?");
|
|
45
|
+
values.push(beforeSequence);
|
|
46
|
+
}
|
|
47
|
+
else if (beforeOrAtSequence !== undefined) {
|
|
48
|
+
clauses.push("session_sequence <= ?");
|
|
49
|
+
values.push(beforeOrAtSequence);
|
|
50
|
+
}
|
|
51
|
+
const rows = this.store.db.prepare(`
|
|
52
|
+
SELECT * FROM (
|
|
53
|
+
SELECT * FROM event_log
|
|
54
|
+
WHERE ${clauses.join(" AND ")}
|
|
55
|
+
ORDER BY session_sequence DESC, stream_id DESC
|
|
56
|
+
LIMIT ?
|
|
57
|
+
)
|
|
58
|
+
ORDER BY session_sequence ASC, stream_id ASC
|
|
59
|
+
`).all(...values, limit);
|
|
60
|
+
return rows.map(storedPiboEventFromV2Row).filter((event) => event !== undefined);
|
|
61
|
+
}
|
|
62
|
+
countEventsByType(input = {}) {
|
|
63
|
+
const clauses = [];
|
|
64
|
+
const values = [];
|
|
65
|
+
if (input.piboSessionId) {
|
|
66
|
+
clauses.push("session_id = ?");
|
|
67
|
+
values.push(input.piboSessionId);
|
|
68
|
+
}
|
|
69
|
+
if (input.eventTypes?.length) {
|
|
70
|
+
clauses.push(`type IN (${input.eventTypes.map(() => "?").join(", ")})`);
|
|
71
|
+
values.push(...input.eventTypes);
|
|
72
|
+
}
|
|
73
|
+
const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
74
|
+
const rows = this.store.db.prepare(`SELECT type, COUNT(*) AS count FROM event_log ${where} GROUP BY type ORDER BY type`).all(...values);
|
|
75
|
+
return rows.map((row) => ({ eventType: row.type, count: Number(row.count) }));
|
|
76
|
+
}
|
|
77
|
+
getLatestEventSequence(piboSessionId) {
|
|
78
|
+
const row = this.store.db.prepare("SELECT COALESCE(MAX(session_sequence), 0) AS latest_sequence FROM event_log WHERE session_id = ?").get(piboSessionId);
|
|
79
|
+
return row.latest_sequence;
|
|
80
|
+
}
|
|
81
|
+
getLatestStreamId(input = {}) {
|
|
82
|
+
const clauses = [];
|
|
83
|
+
const values = [];
|
|
84
|
+
if (input.roomId) {
|
|
85
|
+
clauses.push("room_id = ?");
|
|
86
|
+
values.push(input.roomId);
|
|
87
|
+
}
|
|
88
|
+
if (input.piboSessionId) {
|
|
89
|
+
clauses.push("session_id = ?");
|
|
90
|
+
values.push(input.piboSessionId);
|
|
91
|
+
}
|
|
92
|
+
const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
93
|
+
const row = this.store.db.prepare(`SELECT MAX(stream_id) AS stream_id FROM event_log ${where}`).get(...values);
|
|
94
|
+
return row?.stream_id ?? undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -1,307 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { mkdirSync } from "node:fs";
|
|
3
|
-
import { dirname, resolve } from "node:path";
|
|
4
|
-
import { DatabaseSync } from "node:sqlite";
|
|
5
|
-
export class ChatEventLog {
|
|
6
|
-
db;
|
|
7
|
-
constructor(path) {
|
|
8
|
-
const resolvedPath = path === ":memory:" ? path : resolve(path);
|
|
9
|
-
if (resolvedPath !== ":memory:") {
|
|
10
|
-
mkdirSync(dirname(resolvedPath), { recursive: true });
|
|
11
|
-
}
|
|
12
|
-
this.db = new DatabaseSync(resolvedPath);
|
|
13
|
-
this.db.exec("PRAGMA busy_timeout = 5000");
|
|
14
|
-
if (resolvedPath !== ":memory:")
|
|
15
|
-
this.db.exec("PRAGMA journal_mode = WAL");
|
|
16
|
-
this.db.exec(`
|
|
17
|
-
CREATE TABLE IF NOT EXISTS chat_events (
|
|
18
|
-
stream_id INTEGER PRIMARY KEY,
|
|
19
|
-
room_id TEXT,
|
|
20
|
-
pibo_session_id TEXT,
|
|
21
|
-
event_id TEXT NOT NULL,
|
|
22
|
-
event_type TEXT NOT NULL,
|
|
23
|
-
actor_type TEXT,
|
|
24
|
-
actor_id TEXT,
|
|
25
|
-
client_txn_id TEXT,
|
|
26
|
-
created_at TEXT NOT NULL,
|
|
27
|
-
retention_class TEXT NOT NULL,
|
|
28
|
-
payload_json TEXT NOT NULL
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
CREATE INDEX IF NOT EXISTS idx_chat_events_room_stream
|
|
32
|
-
ON chat_events(room_id, stream_id);
|
|
33
|
-
CREATE INDEX IF NOT EXISTS idx_chat_events_session_stream
|
|
34
|
-
ON chat_events(pibo_session_id, stream_id);
|
|
35
|
-
CREATE INDEX IF NOT EXISTS idx_chat_events_event_id
|
|
36
|
-
ON chat_events(event_id);
|
|
37
|
-
CREATE UNIQUE INDEX IF NOT EXISTS idx_chat_events_client_txn
|
|
38
|
-
ON chat_events(room_id, actor_id, client_txn_id)
|
|
39
|
-
WHERE client_txn_id IS NOT NULL;
|
|
40
|
-
|
|
41
|
-
CREATE TABLE IF NOT EXISTS chat_retention_policies (
|
|
42
|
-
id TEXT PRIMARY KEY,
|
|
43
|
-
delete_live_deltas_after_ms INTEGER,
|
|
44
|
-
delete_trace_events_after_ms INTEGER,
|
|
45
|
-
delete_chat_messages_after_ms INTEGER
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
CREATE TABLE IF NOT EXISTS chat_session_reads (
|
|
49
|
-
pibo_session_id TEXT NOT NULL,
|
|
50
|
-
principal_id TEXT NOT NULL,
|
|
51
|
-
last_read_stream_id INTEGER NOT NULL,
|
|
52
|
-
updated_at TEXT NOT NULL,
|
|
53
|
-
PRIMARY KEY(pibo_session_id, principal_id)
|
|
54
|
-
);
|
|
55
|
-
`);
|
|
56
|
-
}
|
|
57
|
-
appendEvent(input) {
|
|
58
|
-
const eventId = input.eventId ?? `ce_${randomUUID()}`;
|
|
59
|
-
const createdAt = input.createdAt ?? new Date().toISOString();
|
|
60
|
-
const payloadJson = JSON.stringify(input.payload);
|
|
61
|
-
const result = this.db
|
|
62
|
-
.prepare(`
|
|
63
|
-
INSERT OR IGNORE INTO chat_events (
|
|
64
|
-
room_id,
|
|
65
|
-
pibo_session_id,
|
|
66
|
-
event_id,
|
|
67
|
-
event_type,
|
|
68
|
-
actor_type,
|
|
69
|
-
actor_id,
|
|
70
|
-
client_txn_id,
|
|
71
|
-
created_at,
|
|
72
|
-
retention_class,
|
|
73
|
-
payload_json
|
|
74
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
75
|
-
`)
|
|
76
|
-
.run(input.roomId ?? null, input.piboSessionId ?? null, eventId, input.eventType, input.actorType ?? null, input.actorId ?? null, input.clientTxnId ?? null, createdAt, input.retentionClass, payloadJson);
|
|
77
|
-
if (input.clientTxnId) {
|
|
78
|
-
const existing = this.findByClientTxn(input.roomId, input.actorId, input.clientTxnId);
|
|
79
|
-
if (existing)
|
|
80
|
-
return existing;
|
|
81
|
-
}
|
|
82
|
-
const streamId = Number(result.lastInsertRowid);
|
|
83
|
-
const stored = this.db.prepare("SELECT * FROM chat_events WHERE stream_id = ?").get(streamId);
|
|
84
|
-
if (!stored)
|
|
85
|
-
throw new Error(`Failed to append chat event "${eventId}"`);
|
|
86
|
-
return eventFromRow(stored);
|
|
87
|
-
}
|
|
88
|
-
appendOutputEvent(event, input = {}) {
|
|
89
|
-
return this.appendEvent({
|
|
90
|
-
roomId: input.roomId,
|
|
91
|
-
piboSessionId: event.piboSessionId,
|
|
92
|
-
eventId: "eventId" in event && event.eventId ? `pibo:${event.piboSessionId}:${event.eventId}:${event.type}` : undefined,
|
|
93
|
-
eventType: event.type,
|
|
94
|
-
actorType: actorTypeForOutputEvent(event),
|
|
95
|
-
actorId: input.actorId,
|
|
96
|
-
retentionClass: retentionClassForOutputEvent(event),
|
|
97
|
-
payload: event,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
listEvents(input = {}) {
|
|
101
|
-
const clauses = [];
|
|
102
|
-
const values = [];
|
|
103
|
-
if (input.roomId) {
|
|
104
|
-
clauses.push("room_id = ?");
|
|
105
|
-
values.push(input.roomId);
|
|
106
|
-
}
|
|
107
|
-
if (input.piboSessionId) {
|
|
108
|
-
clauses.push("pibo_session_id = ?");
|
|
109
|
-
values.push(input.piboSessionId);
|
|
110
|
-
}
|
|
111
|
-
if (input.afterStreamId !== undefined) {
|
|
112
|
-
clauses.push("stream_id > ?");
|
|
113
|
-
values.push(input.afterStreamId);
|
|
114
|
-
}
|
|
115
|
-
const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
116
|
-
const limit = Math.max(1, Math.min(input.limit ?? 1000, 5000));
|
|
117
|
-
const rows = this.db
|
|
118
|
-
.prepare(`SELECT * FROM chat_events ${where} ORDER BY stream_id ASC LIMIT ?`)
|
|
119
|
-
.all(...values, limit);
|
|
120
|
-
return rows.map(eventFromRow);
|
|
121
|
-
}
|
|
122
|
-
getEvent(streamId) {
|
|
123
|
-
const row = this.db.prepare("SELECT * FROM chat_events WHERE stream_id = ?").get(streamId);
|
|
124
|
-
return row ? eventFromRow(row) : undefined;
|
|
125
|
-
}
|
|
126
|
-
findByClientTxn(roomId, actorId, clientTxnId) {
|
|
127
|
-
if (!roomId || !actorId)
|
|
128
|
-
return undefined;
|
|
129
|
-
const row = this.db
|
|
130
|
-
.prepare(`
|
|
131
|
-
SELECT * FROM chat_events
|
|
132
|
-
WHERE room_id = ? AND actor_id = ? AND client_txn_id = ?
|
|
133
|
-
ORDER BY stream_id ASC
|
|
134
|
-
LIMIT 1
|
|
135
|
-
`)
|
|
136
|
-
.get(roomId, actorId, clientTxnId);
|
|
137
|
-
return row ? eventFromRow(row) : undefined;
|
|
138
|
-
}
|
|
139
|
-
getLatestStreamId(input = {}) {
|
|
140
|
-
const clauses = [];
|
|
141
|
-
const values = [];
|
|
142
|
-
if (input.roomId) {
|
|
143
|
-
clauses.push("room_id = ?");
|
|
144
|
-
values.push(input.roomId);
|
|
145
|
-
}
|
|
146
|
-
if (input.piboSessionId) {
|
|
147
|
-
clauses.push("pibo_session_id = ?");
|
|
148
|
-
values.push(input.piboSessionId);
|
|
149
|
-
}
|
|
150
|
-
const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
151
|
-
const row = this.db.prepare(`SELECT MAX(stream_id) AS stream_id FROM chat_events ${where}`).get(...values);
|
|
152
|
-
return row?.stream_id ?? undefined;
|
|
153
|
-
}
|
|
154
|
-
getSessionReadCursor(piboSessionId, principalId) {
|
|
155
|
-
const row = this.db
|
|
156
|
-
.prepare("SELECT * FROM chat_session_reads WHERE pibo_session_id = ? AND principal_id = ?")
|
|
157
|
-
.get(piboSessionId, principalId);
|
|
158
|
-
return row?.last_read_stream_id;
|
|
159
|
-
}
|
|
160
|
-
markSessionRead(piboSessionId, principalId, lastReadStreamId) {
|
|
161
|
-
this.db
|
|
162
|
-
.prepare(`
|
|
163
|
-
INSERT INTO chat_session_reads (pibo_session_id, principal_id, last_read_stream_id, updated_at)
|
|
164
|
-
VALUES (?, ?, ?, ?)
|
|
165
|
-
ON CONFLICT(pibo_session_id, principal_id) DO UPDATE SET
|
|
166
|
-
last_read_stream_id = MAX(chat_session_reads.last_read_stream_id, excluded.last_read_stream_id),
|
|
167
|
-
updated_at = excluded.updated_at
|
|
168
|
-
`)
|
|
169
|
-
.run(piboSessionId, principalId, lastReadStreamId, new Date().toISOString());
|
|
170
|
-
}
|
|
171
|
-
countUnreadMessages(input) {
|
|
172
|
-
const clauses = [
|
|
173
|
-
"retention_class = 'chat_message'",
|
|
174
|
-
"event_type IN ('user.message.accepted', 'assistant_message')",
|
|
175
|
-
"(actor_type IS NULL OR actor_type != 'user' OR actor_id IS NULL OR actor_id != ?)",
|
|
176
|
-
];
|
|
177
|
-
const values = [input.principalId];
|
|
178
|
-
if (input.roomId) {
|
|
179
|
-
clauses.push("room_id = ?");
|
|
180
|
-
values.push(input.roomId);
|
|
181
|
-
}
|
|
182
|
-
if (input.piboSessionId) {
|
|
183
|
-
clauses.push("pibo_session_id = ?");
|
|
184
|
-
values.push(input.piboSessionId);
|
|
185
|
-
}
|
|
186
|
-
if (input.afterStreamId !== undefined) {
|
|
187
|
-
clauses.push("stream_id > ?");
|
|
188
|
-
values.push(input.afterStreamId);
|
|
189
|
-
}
|
|
190
|
-
const row = this.db
|
|
191
|
-
.prepare(`SELECT COUNT(*) AS count FROM chat_events WHERE ${clauses.join(" AND ")}`)
|
|
192
|
-
.get(...values);
|
|
193
|
-
return Number(row?.count ?? 0);
|
|
194
|
-
}
|
|
195
|
-
deleteSessions(piboSessionIds) {
|
|
196
|
-
if (!piboSessionIds.length)
|
|
197
|
-
return 0;
|
|
198
|
-
const placeholders = piboSessionIds.map(() => "?").join(", ");
|
|
199
|
-
this.db.prepare(`DELETE FROM chat_session_reads WHERE pibo_session_id IN (${placeholders})`).run(...piboSessionIds);
|
|
200
|
-
const result = this.db.prepare(`DELETE FROM chat_events WHERE pibo_session_id IN (${placeholders})`).run(...piboSessionIds);
|
|
201
|
-
return Number(result.changes ?? 0);
|
|
202
|
-
}
|
|
203
|
-
deleteRooms(roomIds) {
|
|
204
|
-
if (!roomIds.length)
|
|
205
|
-
return 0;
|
|
206
|
-
const placeholders = roomIds.map(() => "?").join(", ");
|
|
207
|
-
const result = this.db.prepare(`DELETE FROM chat_events WHERE room_id IN (${placeholders})`).run(...roomIds);
|
|
208
|
-
return Number(result.changes ?? 0);
|
|
209
|
-
}
|
|
210
|
-
upsertRetentionPolicy(policy) {
|
|
211
|
-
this.db
|
|
212
|
-
.prepare(`
|
|
213
|
-
INSERT INTO chat_retention_policies (
|
|
214
|
-
id,
|
|
215
|
-
delete_live_deltas_after_ms,
|
|
216
|
-
delete_trace_events_after_ms,
|
|
217
|
-
delete_chat_messages_after_ms
|
|
218
|
-
) VALUES (?, ?, ?, ?)
|
|
219
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
220
|
-
delete_live_deltas_after_ms = excluded.delete_live_deltas_after_ms,
|
|
221
|
-
delete_trace_events_after_ms = excluded.delete_trace_events_after_ms,
|
|
222
|
-
delete_chat_messages_after_ms = excluded.delete_chat_messages_after_ms
|
|
223
|
-
`)
|
|
224
|
-
.run(policy.id, policy.deleteLiveDeltasAfterMs ?? null, policy.deleteTraceEventsAfterMs ?? null, policy.deleteChatMessagesAfterMs ?? null);
|
|
225
|
-
return this.getRetentionPolicy(policy.id) ?? policy;
|
|
226
|
-
}
|
|
227
|
-
getRetentionPolicy(id) {
|
|
228
|
-
const row = this.db.prepare("SELECT * FROM chat_retention_policies WHERE id = ?").get(id);
|
|
229
|
-
return row ? policyFromRow(row) : undefined;
|
|
230
|
-
}
|
|
231
|
-
purgeExpired(input = {}) {
|
|
232
|
-
const now = input.now ?? new Date();
|
|
233
|
-
const policy = input.policy ?? this.getRetentionPolicy("default") ?? { id: "default" };
|
|
234
|
-
const batchSize = Math.max(1, Math.min(input.batchSize ?? 500, 5000));
|
|
235
|
-
const clauses = [];
|
|
236
|
-
const values = [];
|
|
237
|
-
addRetentionClause(clauses, values, "live_delta", policy.deleteLiveDeltasAfterMs, now);
|
|
238
|
-
addRetentionClause(clauses, values, "trace_event", policy.deleteTraceEventsAfterMs, now);
|
|
239
|
-
addRetentionClause(clauses, values, "chat_message", policy.deleteChatMessagesAfterMs, now);
|
|
240
|
-
if (!clauses.length)
|
|
241
|
-
return 0;
|
|
242
|
-
const result = this.db
|
|
243
|
-
.prepare(`
|
|
244
|
-
DELETE FROM chat_events
|
|
245
|
-
WHERE stream_id IN (
|
|
246
|
-
SELECT stream_id FROM chat_events
|
|
247
|
-
WHERE ${clauses.join(" OR ")}
|
|
248
|
-
ORDER BY stream_id ASC
|
|
249
|
-
LIMIT ${batchSize}
|
|
250
|
-
)
|
|
251
|
-
`)
|
|
252
|
-
.run(...values);
|
|
253
|
-
return Number(result.changes ?? 0);
|
|
254
|
-
}
|
|
255
|
-
close() {
|
|
256
|
-
this.db.close();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
export function createDefaultChatEventLog(cwd = process.cwd()) {
|
|
260
|
-
return new ChatEventLog(resolve(cwd, ".pibo/web-chat.sqlite"));
|
|
261
|
-
}
|
|
262
|
-
function eventFromRow(row) {
|
|
263
|
-
return {
|
|
264
|
-
streamId: row.stream_id,
|
|
265
|
-
roomId: row.room_id ?? undefined,
|
|
266
|
-
piboSessionId: row.pibo_session_id ?? undefined,
|
|
267
|
-
eventId: row.event_id,
|
|
268
|
-
eventType: row.event_type,
|
|
269
|
-
actorType: row.actor_type,
|
|
270
|
-
actorId: row.actor_id ?? undefined,
|
|
271
|
-
clientTxnId: row.client_txn_id ?? undefined,
|
|
272
|
-
createdAt: row.created_at,
|
|
273
|
-
retentionClass: row.retention_class,
|
|
274
|
-
payload: JSON.parse(row.payload_json),
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
function policyFromRow(row) {
|
|
278
|
-
return {
|
|
279
|
-
id: row.id,
|
|
280
|
-
deleteLiveDeltasAfterMs: row.delete_live_deltas_after_ms ?? undefined,
|
|
281
|
-
deleteTraceEventsAfterMs: row.delete_trace_events_after_ms ?? undefined,
|
|
282
|
-
deleteChatMessagesAfterMs: row.delete_chat_messages_after_ms ?? undefined,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
function retentionClassForOutputEvent(event) {
|
|
286
|
-
if (event.type === "assistant_delta" || event.type === "thinking_delta")
|
|
287
|
-
return "live_delta";
|
|
288
|
-
if (event.type === "assistant_message" || event.type === "message_started" || event.type === "message_finished") {
|
|
289
|
-
return "chat_message";
|
|
290
|
-
}
|
|
291
|
-
return "trace_event";
|
|
292
|
-
}
|
|
293
|
-
function actorTypeForOutputEvent(event) {
|
|
294
|
-
if (event.type === "assistant_delta" || event.type === "assistant_message" || event.type.startsWith("thinking_")) {
|
|
295
|
-
return "assistant";
|
|
296
|
-
}
|
|
297
|
-
if (event.type === "message_queued" || event.type === "message_started" || event.type === "message_finished") {
|
|
298
|
-
return "user";
|
|
299
|
-
}
|
|
300
|
-
return "agent";
|
|
301
|
-
}
|
|
302
|
-
function addRetentionClause(clauses, values, retentionClass, ageMs, now) {
|
|
303
|
-
if (!ageMs || ageMs <= 0)
|
|
304
|
-
return;
|
|
305
|
-
clauses.push("(retention_class = ? AND created_at < ?)");
|
|
306
|
-
values.push(retentionClass, new Date(now.getTime() - ageMs).toISOString());
|
|
307
|
-
}
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createAgentSessionServices } from "@mariozechner/pi-coding-agent";
|
|
2
|
+
import { registerMiniMaxProvider } from "../../providers/minimax.js";
|
|
2
3
|
export function buildModelCatalogFromRegistry(registry) {
|
|
3
4
|
const providers = new Map();
|
|
4
5
|
for (const model of registry.getAll()) {
|
|
@@ -31,12 +32,16 @@ export function buildModelCatalogFromRegistry(registry) {
|
|
|
31
32
|
})),
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
|
-
export async function
|
|
35
|
+
export async function loadModelCatalogWithServices(createServices, cwd = process.cwd(), extensionHook) {
|
|
35
36
|
try {
|
|
36
|
-
const services = await
|
|
37
|
+
const services = await createServices({ cwd });
|
|
38
|
+
extensionHook?.(services.modelRegistry);
|
|
37
39
|
return buildModelCatalogFromRegistry(services.modelRegistry);
|
|
38
40
|
}
|
|
39
41
|
catch {
|
|
40
42
|
return { providers: [] };
|
|
41
43
|
}
|
|
42
44
|
}
|
|
45
|
+
export async function loadModelCatalog(cwd = process.cwd()) {
|
|
46
|
+
return loadModelCatalogWithServices(createAgentSessionServices, cwd, registerMiniMaxProvider);
|
|
47
|
+
}
|