@pasko70/pibo 1.0.5 → 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 -250
- 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 +42 -5
- 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 +47 -0
- 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 +3168 -1811
- 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-CI0Xj2Cp.js → dist-B4lw9z4F.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-aMr2VYOu.js → dist-BbTaHWON.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-u2OzzOTm.js → dist-BcT_c1EJ.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Di1ScJ22.js → dist-CGINd7XU.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-wiRpAHIv.js → dist-CrBzZkUp.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CaNOvqMY.js → dist-CyyISotB.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-zgYUl2B-.js → dist-DFbnFNpX.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CNlhGq5i.js → dist-DGLWQLX8.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BGxHKHPX.js → dist-DfcIkFSN.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DrM-H3e1.js → dist-sKDHTwaT.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DpmEro5R.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 +174 -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 +252 -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 +66 -2
- 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 +214 -0
- package/dist/user-skills/manager.js +35 -0
- package/dist/user-skills/store.js +267 -0
- package/dist/user-skills/types.js +1 -0
- 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/{.codex/skills → 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-B_E935fP.js +0 -151
- package/dist/apps/chat-ui/assets/index-Dk-opWl3.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
- /package/{.codex/skills → skills/builtin}/pi-agent-harness/agents/openai.yaml +0 -0
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { PiboWebHttpError } from "../../web/http.js";
|
|
3
|
+
import { allocateWorkflowPublishedVersion, canonicalWorkflowDefinitionJson, hashPromptAssetMarkdown, hashWorkflowDefinitionJson, normalizeWorkflowPromptAssetLabel, sanitizeWorkflowDiagnostics, workflowDraftDefinitionForPublishedVersion, } from "./workflow-persistence-model.js";
|
|
4
|
+
export { canonicalWorkflowDefinitionJson, compareWorkflowSemver, hashPromptAssetMarkdown, hashWorkflowDefinitionJson, normalizeForCanonicalJson, normalizeWorkflowPromptAssetLabel, parseWorkflowSemver, sanitizeWorkflowDiagnostics, } from "./workflow-persistence-model.js";
|
|
5
|
+
export class ChatWorkflowDraftStore {
|
|
6
|
+
dataStore;
|
|
7
|
+
constructor(dataStore) {
|
|
8
|
+
this.dataStore = dataStore;
|
|
9
|
+
this.dataStore.db.exec(`
|
|
10
|
+
CREATE TABLE IF NOT EXISTS workflow_ui_drafts (
|
|
11
|
+
draft_id TEXT PRIMARY KEY,
|
|
12
|
+
workflow_id TEXT NOT NULL,
|
|
13
|
+
source TEXT NOT NULL,
|
|
14
|
+
status TEXT NOT NULL,
|
|
15
|
+
base_workflow_id TEXT,
|
|
16
|
+
base_workflow_version TEXT,
|
|
17
|
+
base_definition_hash TEXT,
|
|
18
|
+
target_workflow_version TEXT,
|
|
19
|
+
version_intent TEXT NOT NULL,
|
|
20
|
+
definition_json TEXT NOT NULL,
|
|
21
|
+
diagnostics_json TEXT NOT NULL,
|
|
22
|
+
validation_json TEXT,
|
|
23
|
+
validation_state TEXT NOT NULL,
|
|
24
|
+
revision INTEGER NOT NULL,
|
|
25
|
+
created_at TEXT NOT NULL,
|
|
26
|
+
updated_at TEXT NOT NULL
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_ui_drafts_one_active
|
|
30
|
+
ON workflow_ui_drafts(workflow_id)
|
|
31
|
+
WHERE status = 'draft';
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_ui_drafts_updated
|
|
33
|
+
ON workflow_ui_drafts(updated_at, draft_id);
|
|
34
|
+
`);
|
|
35
|
+
}
|
|
36
|
+
getDraft(draftId) {
|
|
37
|
+
const row = this.dataStore.db.prepare("SELECT * FROM workflow_ui_drafts WHERE draft_id = ?").get(draftId);
|
|
38
|
+
return row ? workflowDraftFromStoreRow(row) : undefined;
|
|
39
|
+
}
|
|
40
|
+
findActiveDraftByWorkflowId(workflowId) {
|
|
41
|
+
const row = this.dataStore.db
|
|
42
|
+
.prepare("SELECT * FROM workflow_ui_drafts WHERE workflow_id = ? AND status = 'draft' ORDER BY updated_at DESC, draft_id ASC LIMIT 1")
|
|
43
|
+
.get(workflowId);
|
|
44
|
+
return row ? workflowDraftFromStoreRow(row) : undefined;
|
|
45
|
+
}
|
|
46
|
+
listDrafts(filter = {}) {
|
|
47
|
+
const rows = filter.workflowId
|
|
48
|
+
? this.dataStore.db
|
|
49
|
+
.prepare("SELECT * FROM workflow_ui_drafts WHERE workflow_id = ? ORDER BY updated_at DESC, draft_id ASC")
|
|
50
|
+
.all(filter.workflowId)
|
|
51
|
+
: this.dataStore.db
|
|
52
|
+
.prepare("SELECT * FROM workflow_ui_drafts ORDER BY workflow_id ASC, updated_at DESC, draft_id ASC")
|
|
53
|
+
.all();
|
|
54
|
+
return rows.map(workflowDraftFromStoreRow);
|
|
55
|
+
}
|
|
56
|
+
saveDraft(record) {
|
|
57
|
+
this.dataStore.transaction(() => {
|
|
58
|
+
const conflict = this.dataStore.db
|
|
59
|
+
.prepare("SELECT draft_id FROM workflow_ui_drafts WHERE workflow_id = ? AND status = 'draft' AND draft_id <> ? LIMIT 1")
|
|
60
|
+
.get(record.workflowId, record.draftId);
|
|
61
|
+
if (conflict) {
|
|
62
|
+
throw new PiboWebHttpError(`Workflow '${record.workflowId}' already has an active draft '${conflict.draft_id}'`, 409);
|
|
63
|
+
}
|
|
64
|
+
this.dataStore.db.prepare(`
|
|
65
|
+
INSERT INTO workflow_ui_drafts (
|
|
66
|
+
draft_id,
|
|
67
|
+
workflow_id,
|
|
68
|
+
source,
|
|
69
|
+
status,
|
|
70
|
+
base_workflow_id,
|
|
71
|
+
base_workflow_version,
|
|
72
|
+
base_definition_hash,
|
|
73
|
+
target_workflow_version,
|
|
74
|
+
version_intent,
|
|
75
|
+
definition_json,
|
|
76
|
+
diagnostics_json,
|
|
77
|
+
validation_json,
|
|
78
|
+
validation_state,
|
|
79
|
+
revision,
|
|
80
|
+
created_at,
|
|
81
|
+
updated_at
|
|
82
|
+
) VALUES (${Array.from({ length: 16 }, () => "?").join(", ")})
|
|
83
|
+
ON CONFLICT(draft_id) DO UPDATE SET
|
|
84
|
+
workflow_id = excluded.workflow_id,
|
|
85
|
+
source = excluded.source,
|
|
86
|
+
status = excluded.status,
|
|
87
|
+
base_workflow_id = excluded.base_workflow_id,
|
|
88
|
+
base_workflow_version = excluded.base_workflow_version,
|
|
89
|
+
base_definition_hash = excluded.base_definition_hash,
|
|
90
|
+
target_workflow_version = excluded.target_workflow_version,
|
|
91
|
+
version_intent = excluded.version_intent,
|
|
92
|
+
definition_json = excluded.definition_json,
|
|
93
|
+
diagnostics_json = excluded.diagnostics_json,
|
|
94
|
+
validation_json = excluded.validation_json,
|
|
95
|
+
validation_state = excluded.validation_state,
|
|
96
|
+
revision = excluded.revision,
|
|
97
|
+
created_at = excluded.created_at,
|
|
98
|
+
updated_at = excluded.updated_at
|
|
99
|
+
`).run(record.draftId, record.workflowId, record.source, record.status, record.baseWorkflowId ?? null, record.baseWorkflowVersion ?? null, record.baseDefinitionHash ?? null, record.targetWorkflowVersion ?? null, record.versionIntent, JSON.stringify(record.definition), JSON.stringify(sanitizeWorkflowDiagnostics(record.diagnostics)), record.validation ? JSON.stringify(record.validation) : null, record.validationState, record.revision, record.createdAt, record.updatedAt);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function workflowDraftFromStoreRow(row) {
|
|
104
|
+
return {
|
|
105
|
+
draftId: row.draft_id,
|
|
106
|
+
workflowId: row.workflow_id,
|
|
107
|
+
source: row.source,
|
|
108
|
+
status: row.status,
|
|
109
|
+
...(row.base_workflow_id ? { baseWorkflowId: row.base_workflow_id } : {}),
|
|
110
|
+
...(row.base_workflow_version ? { baseWorkflowVersion: row.base_workflow_version } : {}),
|
|
111
|
+
...(row.base_definition_hash ? { baseDefinitionHash: row.base_definition_hash } : {}),
|
|
112
|
+
...(row.target_workflow_version ? { targetWorkflowVersion: row.target_workflow_version } : {}),
|
|
113
|
+
versionIntent: row.version_intent,
|
|
114
|
+
definition: JSON.parse(row.definition_json),
|
|
115
|
+
diagnostics: sanitizeWorkflowDiagnostics(JSON.parse(row.diagnostics_json)),
|
|
116
|
+
...(row.validation_json ? { validation: JSON.parse(row.validation_json) } : {}),
|
|
117
|
+
validationState: row.validation_state,
|
|
118
|
+
revision: row.revision,
|
|
119
|
+
createdAt: row.created_at,
|
|
120
|
+
updatedAt: row.updated_at,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export class ChatWorkflowPublishedVersionStore {
|
|
124
|
+
dataStore;
|
|
125
|
+
constructor(dataStore) {
|
|
126
|
+
this.dataStore = dataStore;
|
|
127
|
+
this.dataStore.db.exec(`
|
|
128
|
+
CREATE TABLE IF NOT EXISTS workflow_published_versions (
|
|
129
|
+
workflow_id TEXT NOT NULL,
|
|
130
|
+
version TEXT NOT NULL,
|
|
131
|
+
source TEXT NOT NULL,
|
|
132
|
+
status TEXT NOT NULL,
|
|
133
|
+
definition_hash TEXT NOT NULL,
|
|
134
|
+
definition_json TEXT NOT NULL,
|
|
135
|
+
published_from_draft_id TEXT,
|
|
136
|
+
published_by TEXT,
|
|
137
|
+
published_at TEXT NOT NULL,
|
|
138
|
+
created_at TEXT NOT NULL,
|
|
139
|
+
PRIMARY KEY (workflow_id, version)
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_published_versions_workflow
|
|
143
|
+
ON workflow_published_versions(workflow_id, version);
|
|
144
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_published_versions_published_at
|
|
145
|
+
ON workflow_published_versions(published_at);
|
|
146
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_published_versions_draft
|
|
147
|
+
ON workflow_published_versions(published_from_draft_id)
|
|
148
|
+
WHERE published_from_draft_id IS NOT NULL;
|
|
149
|
+
`);
|
|
150
|
+
}
|
|
151
|
+
getPublishedVersionByDraftId(draftId) {
|
|
152
|
+
const row = this.dataStore.db
|
|
153
|
+
.prepare("SELECT * FROM workflow_published_versions WHERE published_from_draft_id = ? ORDER BY published_at ASC LIMIT 1")
|
|
154
|
+
.get(draftId);
|
|
155
|
+
return row ? workflowPublishedVersionFromStoreRow(row) : undefined;
|
|
156
|
+
}
|
|
157
|
+
listPublishedVersions(filter = {}) {
|
|
158
|
+
const rows = filter.workflowId
|
|
159
|
+
? this.dataStore.db
|
|
160
|
+
.prepare("SELECT * FROM workflow_published_versions WHERE workflow_id = ? ORDER BY workflow_id ASC, version ASC")
|
|
161
|
+
.all(filter.workflowId)
|
|
162
|
+
: this.dataStore.db
|
|
163
|
+
.prepare("SELECT * FROM workflow_published_versions ORDER BY workflow_id ASC, version ASC")
|
|
164
|
+
.all();
|
|
165
|
+
return rows.map(workflowPublishedVersionFromStoreRow);
|
|
166
|
+
}
|
|
167
|
+
publishDraft(input) {
|
|
168
|
+
return this.dataStore.transaction(() => {
|
|
169
|
+
const alreadyPublished = this.getPublishedVersionByDraftId(input.draft.draftId);
|
|
170
|
+
if (alreadyPublished)
|
|
171
|
+
return { record: alreadyPublished, alreadyPublished: true };
|
|
172
|
+
const existingVersions = [
|
|
173
|
+
...input.reservedVersions,
|
|
174
|
+
...this.listPublishedVersions({ workflowId: input.draft.workflowId }).map((record) => record.version),
|
|
175
|
+
];
|
|
176
|
+
const version = allocateWorkflowPublishedVersion({
|
|
177
|
+
draft: input.draft,
|
|
178
|
+
versionIntent: input.versionIntent,
|
|
179
|
+
existingVersions,
|
|
180
|
+
});
|
|
181
|
+
const definition = workflowDraftDefinitionForPublishedVersion(input.draft.definition, input.draft.workflowId, version);
|
|
182
|
+
const now = new Date().toISOString();
|
|
183
|
+
const record = {
|
|
184
|
+
workflowId: input.draft.workflowId,
|
|
185
|
+
version,
|
|
186
|
+
source: "ui",
|
|
187
|
+
status: "published",
|
|
188
|
+
definition,
|
|
189
|
+
definitionHash: hashWorkflowDefinitionJson(definition),
|
|
190
|
+
publishedFromDraftId: input.draft.draftId,
|
|
191
|
+
publishedBy: input.publishedBy,
|
|
192
|
+
publishedAt: now,
|
|
193
|
+
createdAt: now,
|
|
194
|
+
};
|
|
195
|
+
this.insertPublishedVersion(record);
|
|
196
|
+
return { record, alreadyPublished: false };
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
insertPublishedVersion(record) {
|
|
200
|
+
this.dataStore.db.prepare(`
|
|
201
|
+
INSERT INTO workflow_published_versions (
|
|
202
|
+
workflow_id,
|
|
203
|
+
version,
|
|
204
|
+
source,
|
|
205
|
+
status,
|
|
206
|
+
definition_hash,
|
|
207
|
+
definition_json,
|
|
208
|
+
published_from_draft_id,
|
|
209
|
+
published_by,
|
|
210
|
+
published_at,
|
|
211
|
+
created_at
|
|
212
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
213
|
+
`).run(record.workflowId, record.version, record.source, record.status, record.definitionHash, canonicalWorkflowDefinitionJson(record.definition), record.publishedFromDraftId ?? null, record.publishedBy ?? null, record.publishedAt, record.createdAt);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function workflowPublishedVersionFromStoreRow(row) {
|
|
217
|
+
return {
|
|
218
|
+
workflowId: row.workflow_id,
|
|
219
|
+
version: row.version,
|
|
220
|
+
source: row.source,
|
|
221
|
+
status: row.status,
|
|
222
|
+
definitionHash: row.definition_hash,
|
|
223
|
+
definition: JSON.parse(row.definition_json),
|
|
224
|
+
...(row.published_from_draft_id ? { publishedFromDraftId: row.published_from_draft_id } : {}),
|
|
225
|
+
...(row.published_by ? { publishedBy: row.published_by } : {}),
|
|
226
|
+
publishedAt: row.published_at,
|
|
227
|
+
createdAt: row.created_at,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
export class ChatWorkflowPromptAssetStore {
|
|
231
|
+
dataStore;
|
|
232
|
+
constructor(dataStore) {
|
|
233
|
+
this.dataStore = dataStore;
|
|
234
|
+
this.dataStore.db.exec(`
|
|
235
|
+
CREATE TABLE IF NOT EXISTS workflow_prompt_assets (
|
|
236
|
+
asset_id TEXT PRIMARY KEY,
|
|
237
|
+
source TEXT NOT NULL,
|
|
238
|
+
display_name TEXT NOT NULL,
|
|
239
|
+
description TEXT,
|
|
240
|
+
active_revision_id TEXT,
|
|
241
|
+
created_at TEXT NOT NULL,
|
|
242
|
+
updated_at TEXT NOT NULL
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
CREATE TABLE IF NOT EXISTS workflow_prompt_asset_revisions (
|
|
246
|
+
revision_id TEXT PRIMARY KEY,
|
|
247
|
+
asset_id TEXT NOT NULL,
|
|
248
|
+
content_hash TEXT NOT NULL,
|
|
249
|
+
markdown TEXT NOT NULL,
|
|
250
|
+
created_at TEXT NOT NULL,
|
|
251
|
+
created_by TEXT,
|
|
252
|
+
based_on_revision_id TEXT
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_prompt_asset_revisions_asset
|
|
256
|
+
ON workflow_prompt_asset_revisions(asset_id, created_at DESC);
|
|
257
|
+
`);
|
|
258
|
+
}
|
|
259
|
+
listAssets() {
|
|
260
|
+
const rows = this.dataStore.db
|
|
261
|
+
.prepare("SELECT * FROM workflow_prompt_assets ORDER BY display_name ASC, asset_id ASC")
|
|
262
|
+
.all();
|
|
263
|
+
return rows.map(workflowPromptAssetFromStoreRow);
|
|
264
|
+
}
|
|
265
|
+
getAsset(assetId) {
|
|
266
|
+
const row = this.dataStore.db
|
|
267
|
+
.prepare("SELECT * FROM workflow_prompt_assets WHERE asset_id = ?")
|
|
268
|
+
.get(assetId);
|
|
269
|
+
return row ? workflowPromptAssetFromStoreRow(row) : undefined;
|
|
270
|
+
}
|
|
271
|
+
getActiveRevision(assetId) {
|
|
272
|
+
const asset = this.getAsset(assetId);
|
|
273
|
+
if (!asset?.activeRevisionId)
|
|
274
|
+
return undefined;
|
|
275
|
+
const row = this.dataStore.db
|
|
276
|
+
.prepare("SELECT * FROM workflow_prompt_asset_revisions WHERE asset_id = ? AND revision_id = ?")
|
|
277
|
+
.get(assetId, asset.activeRevisionId);
|
|
278
|
+
return row ? workflowPromptAssetRevisionFromStoreRow(row) : undefined;
|
|
279
|
+
}
|
|
280
|
+
saveRevision(input) {
|
|
281
|
+
return this.dataStore.transaction(() => {
|
|
282
|
+
const now = new Date().toISOString();
|
|
283
|
+
const assetId = input.assetId?.trim() || `ui.promptAssets.${randomUUID()}`;
|
|
284
|
+
const existing = this.getAsset(assetId);
|
|
285
|
+
const revisionId = `wpar_${randomUUID()}`;
|
|
286
|
+
const contentHash = hashPromptAssetMarkdown(input.markdown);
|
|
287
|
+
this.dataStore.db.prepare(`
|
|
288
|
+
INSERT INTO workflow_prompt_assets (
|
|
289
|
+
asset_id,
|
|
290
|
+
source,
|
|
291
|
+
display_name,
|
|
292
|
+
description,
|
|
293
|
+
active_revision_id,
|
|
294
|
+
created_at,
|
|
295
|
+
updated_at
|
|
296
|
+
) VALUES (${Array.from({ length: 7 }, () => "?").join(", ")})
|
|
297
|
+
ON CONFLICT(asset_id) DO UPDATE SET
|
|
298
|
+
display_name = excluded.display_name,
|
|
299
|
+
description = excluded.description,
|
|
300
|
+
active_revision_id = excluded.active_revision_id,
|
|
301
|
+
updated_at = excluded.updated_at
|
|
302
|
+
`).run(assetId, "ui", normalizeWorkflowPromptAssetLabel(input.displayName), input.description?.trim() || null, revisionId, existing?.createdAt ?? now, now);
|
|
303
|
+
this.dataStore.db.prepare(`
|
|
304
|
+
INSERT INTO workflow_prompt_asset_revisions (
|
|
305
|
+
revision_id,
|
|
306
|
+
asset_id,
|
|
307
|
+
content_hash,
|
|
308
|
+
markdown,
|
|
309
|
+
created_at,
|
|
310
|
+
created_by,
|
|
311
|
+
based_on_revision_id
|
|
312
|
+
) VALUES (${Array.from({ length: 7 }, () => "?").join(", ")})
|
|
313
|
+
`).run(revisionId, assetId, contentHash, input.markdown, now, input.actorId ?? null, existing?.activeRevisionId ?? null);
|
|
314
|
+
const asset = this.getAsset(assetId);
|
|
315
|
+
const revision = this.getActiveRevision(assetId);
|
|
316
|
+
if (!asset || !revision)
|
|
317
|
+
throw new Error(`Failed to save workflow prompt asset '${assetId}'`);
|
|
318
|
+
return workflowPromptAssetDocumentFromRecords(asset, revision);
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function workflowPromptAssetFromStoreRow(row) {
|
|
323
|
+
return {
|
|
324
|
+
assetId: row.asset_id,
|
|
325
|
+
source: row.source,
|
|
326
|
+
displayName: row.display_name,
|
|
327
|
+
...(row.description ? { description: row.description } : {}),
|
|
328
|
+
...(row.active_revision_id ? { activeRevisionId: row.active_revision_id } : {}),
|
|
329
|
+
createdAt: row.created_at,
|
|
330
|
+
updatedAt: row.updated_at,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function workflowPromptAssetRevisionFromStoreRow(row) {
|
|
334
|
+
return {
|
|
335
|
+
revisionId: row.revision_id,
|
|
336
|
+
assetId: row.asset_id,
|
|
337
|
+
contentHash: row.content_hash,
|
|
338
|
+
markdown: row.markdown,
|
|
339
|
+
createdAt: row.created_at,
|
|
340
|
+
...(row.created_by ? { createdBy: row.created_by } : {}),
|
|
341
|
+
...(row.based_on_revision_id ? { basedOnRevisionId: row.based_on_revision_id } : {}),
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
export function workflowPromptAssetDocumentFromRecords(asset, revision) {
|
|
345
|
+
return {
|
|
346
|
+
id: asset.assetId,
|
|
347
|
+
displayName: asset.displayName,
|
|
348
|
+
...(asset.description ? { description: asset.description } : {}),
|
|
349
|
+
source: asset.source,
|
|
350
|
+
readOnly: false,
|
|
351
|
+
revisionId: revision.revisionId,
|
|
352
|
+
contentHash: revision.contentHash,
|
|
353
|
+
markdown: revision.markdown,
|
|
354
|
+
createdAt: asset.createdAt,
|
|
355
|
+
updatedAt: asset.updatedAt,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
export class ChatWorkflowArchiveStore {
|
|
359
|
+
dataStore;
|
|
360
|
+
constructor(dataStore) {
|
|
361
|
+
this.dataStore = dataStore;
|
|
362
|
+
this.dataStore.db.exec(`
|
|
363
|
+
CREATE TABLE IF NOT EXISTS workflow_archive_states (
|
|
364
|
+
workflow_id TEXT PRIMARY KEY,
|
|
365
|
+
source TEXT NOT NULL,
|
|
366
|
+
archived INTEGER NOT NULL,
|
|
367
|
+
archived_at TEXT,
|
|
368
|
+
archived_by TEXT,
|
|
369
|
+
archive_reason TEXT,
|
|
370
|
+
updated_at TEXT NOT NULL
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_archive_states_archived
|
|
374
|
+
ON workflow_archive_states(archived, updated_at);
|
|
375
|
+
`);
|
|
376
|
+
}
|
|
377
|
+
setWorkflowArchived(input) {
|
|
378
|
+
const existing = this.getWorkflowArchiveState(input.workflowId);
|
|
379
|
+
const now = new Date().toISOString();
|
|
380
|
+
const archiveReason = input.archiveReason ?? existing?.archiveReason;
|
|
381
|
+
const record = {
|
|
382
|
+
workflowId: input.workflowId,
|
|
383
|
+
source: "ui",
|
|
384
|
+
archived: true,
|
|
385
|
+
archivedAt: existing?.archivedAt ?? now,
|
|
386
|
+
archivedBy: input.archivedBy,
|
|
387
|
+
...(archiveReason ? { archiveReason } : {}),
|
|
388
|
+
updatedAt: now,
|
|
389
|
+
};
|
|
390
|
+
this.saveWorkflowArchiveState(record);
|
|
391
|
+
return record;
|
|
392
|
+
}
|
|
393
|
+
saveWorkflowArchiveState(record) {
|
|
394
|
+
this.dataStore.db.prepare(`
|
|
395
|
+
INSERT INTO workflow_archive_states (
|
|
396
|
+
workflow_id,
|
|
397
|
+
source,
|
|
398
|
+
archived,
|
|
399
|
+
archived_at,
|
|
400
|
+
archived_by,
|
|
401
|
+
archive_reason,
|
|
402
|
+
updated_at
|
|
403
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
404
|
+
ON CONFLICT(workflow_id) DO UPDATE SET
|
|
405
|
+
source = excluded.source,
|
|
406
|
+
archived = excluded.archived,
|
|
407
|
+
archived_at = excluded.archived_at,
|
|
408
|
+
archived_by = excluded.archived_by,
|
|
409
|
+
archive_reason = excluded.archive_reason,
|
|
410
|
+
updated_at = excluded.updated_at
|
|
411
|
+
`).run(record.workflowId, record.source, record.archived ? 1 : 0, record.archivedAt ?? null, record.archivedBy ?? null, record.archiveReason ?? null, record.updatedAt);
|
|
412
|
+
}
|
|
413
|
+
getWorkflowArchiveState(workflowId) {
|
|
414
|
+
const row = this.dataStore.db.prepare("SELECT * FROM workflow_archive_states WHERE workflow_id = ?").get(workflowId);
|
|
415
|
+
return row ? workflowArchiveStateFromStoreRow(row) : undefined;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
function workflowArchiveStateFromStoreRow(row) {
|
|
419
|
+
return {
|
|
420
|
+
workflowId: row.workflow_id,
|
|
421
|
+
source: row.source,
|
|
422
|
+
archived: row.archived === 1,
|
|
423
|
+
...(row.archived_at ? { archivedAt: row.archived_at } : {}),
|
|
424
|
+
...(row.archived_by ? { archivedBy: row.archived_by } : {}),
|
|
425
|
+
...(row.archive_reason ? { archiveReason: row.archive_reason } : {}),
|
|
426
|
+
updatedAt: row.updated_at,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
export class ChatWorkflowTombstoneStore {
|
|
430
|
+
dataStore;
|
|
431
|
+
constructor(dataStore) {
|
|
432
|
+
this.dataStore = dataStore;
|
|
433
|
+
this.dataStore.db.exec(`
|
|
434
|
+
CREATE TABLE IF NOT EXISTS workflow_delete_tombstones (
|
|
435
|
+
workflow_id TEXT PRIMARY KEY,
|
|
436
|
+
source TEXT NOT NULL,
|
|
437
|
+
deleted INTEGER NOT NULL,
|
|
438
|
+
deleted_at TEXT NOT NULL,
|
|
439
|
+
deleted_by TEXT NOT NULL,
|
|
440
|
+
last_known_title TEXT NOT NULL,
|
|
441
|
+
last_known_version TEXT,
|
|
442
|
+
last_definition_hash TEXT,
|
|
443
|
+
updated_at TEXT NOT NULL
|
|
444
|
+
);
|
|
445
|
+
|
|
446
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_delete_tombstones_deleted
|
|
447
|
+
ON workflow_delete_tombstones(deleted, updated_at);
|
|
448
|
+
`);
|
|
449
|
+
}
|
|
450
|
+
setWorkflowDeleted(input) {
|
|
451
|
+
const existing = this.getWorkflowTombstone(input.workflowId);
|
|
452
|
+
const now = new Date().toISOString();
|
|
453
|
+
const record = {
|
|
454
|
+
workflowId: input.workflowId,
|
|
455
|
+
source: "ui",
|
|
456
|
+
deleted: true,
|
|
457
|
+
deletedAt: existing?.deletedAt ?? now,
|
|
458
|
+
deletedBy: input.deletedBy,
|
|
459
|
+
lastKnownTitle: input.lastKnownTitle,
|
|
460
|
+
...(input.lastKnownVersion ? { lastKnownVersion: input.lastKnownVersion } : {}),
|
|
461
|
+
...(input.lastDefinitionHash ? { lastDefinitionHash: input.lastDefinitionHash } : {}),
|
|
462
|
+
updatedAt: now,
|
|
463
|
+
};
|
|
464
|
+
this.saveWorkflowTombstone(record);
|
|
465
|
+
return record;
|
|
466
|
+
}
|
|
467
|
+
getWorkflowTombstone(workflowId) {
|
|
468
|
+
const row = this.dataStore.db.prepare("SELECT * FROM workflow_delete_tombstones WHERE workflow_id = ? AND deleted = 1").get(workflowId);
|
|
469
|
+
return row ? workflowTombstoneFromStoreRow(row) : undefined;
|
|
470
|
+
}
|
|
471
|
+
saveWorkflowTombstone(record) {
|
|
472
|
+
this.dataStore.db.prepare(`
|
|
473
|
+
INSERT INTO workflow_delete_tombstones (
|
|
474
|
+
workflow_id,
|
|
475
|
+
source,
|
|
476
|
+
deleted,
|
|
477
|
+
deleted_at,
|
|
478
|
+
deleted_by,
|
|
479
|
+
last_known_title,
|
|
480
|
+
last_known_version,
|
|
481
|
+
last_definition_hash,
|
|
482
|
+
updated_at
|
|
483
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
484
|
+
ON CONFLICT(workflow_id) DO UPDATE SET
|
|
485
|
+
source = excluded.source,
|
|
486
|
+
deleted = excluded.deleted,
|
|
487
|
+
deleted_at = excluded.deleted_at,
|
|
488
|
+
deleted_by = excluded.deleted_by,
|
|
489
|
+
last_known_title = excluded.last_known_title,
|
|
490
|
+
last_known_version = excluded.last_known_version,
|
|
491
|
+
last_definition_hash = excluded.last_definition_hash,
|
|
492
|
+
updated_at = excluded.updated_at
|
|
493
|
+
`).run(record.workflowId, record.source, record.deleted ? 1 : 0, record.deletedAt, record.deletedBy, record.lastKnownTitle, record.lastKnownVersion ?? null, record.lastDefinitionHash ?? null, record.updatedAt);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
function workflowTombstoneFromStoreRow(row) {
|
|
497
|
+
return {
|
|
498
|
+
workflowId: row.workflow_id,
|
|
499
|
+
source: row.source,
|
|
500
|
+
deleted: row.deleted === 1,
|
|
501
|
+
deletedAt: row.deleted_at,
|
|
502
|
+
deletedBy: row.deleted_by,
|
|
503
|
+
lastKnownTitle: row.last_known_title,
|
|
504
|
+
...(row.last_known_version ? { lastKnownVersion: row.last_known_version } : {}),
|
|
505
|
+
...(row.last_definition_hash ? { lastDefinitionHash: row.last_definition_hash } : {}),
|
|
506
|
+
updatedAt: row.updated_at,
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
export class ChatWorkflowLifecycleEventStore {
|
|
510
|
+
dataStore;
|
|
511
|
+
constructor(dataStore) {
|
|
512
|
+
this.dataStore = dataStore;
|
|
513
|
+
this.dataStore.db.exec(`
|
|
514
|
+
CREATE TABLE IF NOT EXISTS workflow_lifecycle_events (
|
|
515
|
+
id TEXT PRIMARY KEY,
|
|
516
|
+
type TEXT NOT NULL,
|
|
517
|
+
actor_id TEXT,
|
|
518
|
+
workflow_id TEXT,
|
|
519
|
+
workflow_version TEXT,
|
|
520
|
+
draft_id TEXT,
|
|
521
|
+
project_id TEXT,
|
|
522
|
+
pibo_session_id TEXT,
|
|
523
|
+
workflow_run_id TEXT,
|
|
524
|
+
status TEXT,
|
|
525
|
+
validation_json TEXT,
|
|
526
|
+
diagnostics_json TEXT NOT NULL,
|
|
527
|
+
payload_json TEXT,
|
|
528
|
+
created_at TEXT NOT NULL
|
|
529
|
+
);
|
|
530
|
+
|
|
531
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_lifecycle_events_type
|
|
532
|
+
ON workflow_lifecycle_events(type, created_at);
|
|
533
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_lifecycle_events_workflow
|
|
534
|
+
ON workflow_lifecycle_events(workflow_id, workflow_version, created_at);
|
|
535
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_lifecycle_events_project_session
|
|
536
|
+
ON workflow_lifecycle_events(project_id, pibo_session_id, created_at);
|
|
537
|
+
`);
|
|
538
|
+
}
|
|
539
|
+
record(input) {
|
|
540
|
+
const event = {
|
|
541
|
+
id: input.id ?? `wfle_${randomUUID()}`,
|
|
542
|
+
type: input.type,
|
|
543
|
+
...(input.actorId ? { actorId: input.actorId } : {}),
|
|
544
|
+
...(input.workflowId ? { workflowId: input.workflowId } : {}),
|
|
545
|
+
...(input.workflowVersion ? { workflowVersion: input.workflowVersion } : {}),
|
|
546
|
+
...(input.draftId ? { draftId: input.draftId } : {}),
|
|
547
|
+
...(input.projectId ? { projectId: input.projectId } : {}),
|
|
548
|
+
...(input.piboSessionId ? { piboSessionId: input.piboSessionId } : {}),
|
|
549
|
+
...(input.workflowRunId ? { workflowRunId: input.workflowRunId } : {}),
|
|
550
|
+
...(input.status ? { status: input.status } : {}),
|
|
551
|
+
...(input.validation ? { validation: input.validation } : {}),
|
|
552
|
+
diagnostics: sanitizeWorkflowDiagnostics(input.diagnostics ?? []),
|
|
553
|
+
...(input.payload ? { payload: input.payload } : {}),
|
|
554
|
+
createdAt: input.createdAt ?? new Date().toISOString(),
|
|
555
|
+
};
|
|
556
|
+
this.dataStore.db.prepare(`
|
|
557
|
+
INSERT INTO workflow_lifecycle_events (
|
|
558
|
+
id,
|
|
559
|
+
type,
|
|
560
|
+
actor_id,
|
|
561
|
+
workflow_id,
|
|
562
|
+
workflow_version,
|
|
563
|
+
draft_id,
|
|
564
|
+
project_id,
|
|
565
|
+
pibo_session_id,
|
|
566
|
+
workflow_run_id,
|
|
567
|
+
status,
|
|
568
|
+
validation_json,
|
|
569
|
+
diagnostics_json,
|
|
570
|
+
payload_json,
|
|
571
|
+
created_at
|
|
572
|
+
) VALUES (${Array.from({ length: 14 }, () => "?").join(", ")})
|
|
573
|
+
`).run(event.id, event.type, event.actorId ?? null, event.workflowId ?? null, event.workflowVersion ?? null, event.draftId ?? null, event.projectId ?? null, event.piboSessionId ?? null, event.workflowRunId ?? null, event.status ?? null, event.validation ? JSON.stringify(event.validation) : null, JSON.stringify(event.diagnostics), event.payload ? JSON.stringify(event.payload) : null, event.createdAt);
|
|
574
|
+
return event;
|
|
575
|
+
}
|
|
576
|
+
listEvents(filter) {
|
|
577
|
+
const clauses = [];
|
|
578
|
+
const values = [];
|
|
579
|
+
if (filter.type) {
|
|
580
|
+
clauses.push("type = ?");
|
|
581
|
+
values.push(filter.type);
|
|
582
|
+
}
|
|
583
|
+
if (filter.workflowId) {
|
|
584
|
+
clauses.push("workflow_id = ?");
|
|
585
|
+
values.push(filter.workflowId);
|
|
586
|
+
}
|
|
587
|
+
if (filter.draftId) {
|
|
588
|
+
clauses.push("draft_id = ?");
|
|
589
|
+
values.push(filter.draftId);
|
|
590
|
+
}
|
|
591
|
+
if (filter.projectId) {
|
|
592
|
+
clauses.push("project_id = ?");
|
|
593
|
+
values.push(filter.projectId);
|
|
594
|
+
}
|
|
595
|
+
if (filter.piboSessionId) {
|
|
596
|
+
clauses.push("pibo_session_id = ?");
|
|
597
|
+
values.push(filter.piboSessionId);
|
|
598
|
+
}
|
|
599
|
+
if (filter.workflowRunId) {
|
|
600
|
+
clauses.push("workflow_run_id = ?");
|
|
601
|
+
values.push(filter.workflowRunId);
|
|
602
|
+
}
|
|
603
|
+
const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
604
|
+
const rows = this.dataStore.db.prepare(`
|
|
605
|
+
SELECT * FROM workflow_lifecycle_events
|
|
606
|
+
${where}
|
|
607
|
+
ORDER BY created_at DESC, id DESC
|
|
608
|
+
LIMIT ?
|
|
609
|
+
`).all(...values, filter.limit ?? 100);
|
|
610
|
+
return rows.map(workflowLifecycleEventFromStoreRow);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
function workflowLifecycleEventFromStoreRow(row) {
|
|
614
|
+
return {
|
|
615
|
+
id: row.id,
|
|
616
|
+
type: row.type,
|
|
617
|
+
...(row.actor_id ? { actorId: row.actor_id } : {}),
|
|
618
|
+
...(row.workflow_id ? { workflowId: row.workflow_id } : {}),
|
|
619
|
+
...(row.workflow_version ? { workflowVersion: row.workflow_version } : {}),
|
|
620
|
+
...(row.draft_id ? { draftId: row.draft_id } : {}),
|
|
621
|
+
...(row.project_id ? { projectId: row.project_id } : {}),
|
|
622
|
+
...(row.pibo_session_id ? { piboSessionId: row.pibo_session_id } : {}),
|
|
623
|
+
...(row.workflow_run_id ? { workflowRunId: row.workflow_run_id } : {}),
|
|
624
|
+
...(row.status ? { status: row.status } : {}),
|
|
625
|
+
...(row.validation_json ? { validation: JSON.parse(row.validation_json) } : {}),
|
|
626
|
+
diagnostics: sanitizeWorkflowDiagnostics(JSON.parse(row.diagnostics_json)),
|
|
627
|
+
...(row.payload_json ? { payload: JSON.parse(row.payload_json) } : {}),
|
|
628
|
+
createdAt: row.created_at,
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
function quoteIdentifier(value) {
|
|
632
|
+
return `"${value.replaceAll('"', '""')}"`;
|
|
633
|
+
}
|