@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
2
|
import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { dirname, extname, isAbsolute, join, resolve } from "node:path";
|
|
@@ -132,6 +132,18 @@ function uniquePath(dir, filename, currentPath) {
|
|
|
132
132
|
function managedFileName(label) {
|
|
133
133
|
return `${slugSegment(label)}.md`;
|
|
134
134
|
}
|
|
135
|
+
function labelFromManagedPath(path) {
|
|
136
|
+
const filename = path.split(/[\\/]/).pop() ?? path;
|
|
137
|
+
const extension = extname(filename);
|
|
138
|
+
const stem = extension ? filename.slice(0, -extension.length) : filename;
|
|
139
|
+
const words = stem
|
|
140
|
+
.replace(/[_-]+/g, " ")
|
|
141
|
+
.replace(/\s+/g, " ")
|
|
142
|
+
.trim();
|
|
143
|
+
if (!words)
|
|
144
|
+
return "Context File";
|
|
145
|
+
return words.replace(/\b\w/g, (letter) => letter.toUpperCase());
|
|
146
|
+
}
|
|
135
147
|
function profileForManaged(file) {
|
|
136
148
|
return {
|
|
137
149
|
key: file.key,
|
|
@@ -313,10 +325,12 @@ class ContextFileService {
|
|
|
313
325
|
}
|
|
314
326
|
}
|
|
315
327
|
list(context) {
|
|
328
|
+
this.discoverGlobalManagedFiles(context, false);
|
|
316
329
|
const catalog = context.channelContext.getCapabilityCatalog?.().contextFiles ?? [];
|
|
317
330
|
return catalog.map((file) => this.resolveCatalogInfo(context, file));
|
|
318
331
|
}
|
|
319
332
|
async read(context, key) {
|
|
333
|
+
this.discoverGlobalManagedFiles(context, false);
|
|
320
334
|
const managed = this.managed.get(key);
|
|
321
335
|
if (managed) {
|
|
322
336
|
const file = this.resolveManagedInfo(context, managed);
|
|
@@ -364,7 +378,7 @@ class ContextFileService {
|
|
|
364
378
|
kind: "working",
|
|
365
379
|
contentHash: hashContextFileContent(markdown),
|
|
366
380
|
content: markdown,
|
|
367
|
-
actorId: webSession.
|
|
381
|
+
actorId: webSession.authSession.identity.userId,
|
|
368
382
|
note: "Managed context file created",
|
|
369
383
|
});
|
|
370
384
|
const updated = this.store.updateFile({
|
|
@@ -375,7 +389,7 @@ class ContextFileService {
|
|
|
375
389
|
this.upsertManaged(updated);
|
|
376
390
|
const document = await this.read(context, updated.key);
|
|
377
391
|
this.snapshots.set(updated.key, this.snapshotFromInfo(document));
|
|
378
|
-
this.emitChanged(context, "context-file.created", "web", webSession.
|
|
392
|
+
this.emitChanged(context, "context-file.created", "web", webSession.authSession.identity.userId, document);
|
|
379
393
|
return document;
|
|
380
394
|
}
|
|
381
395
|
async createLinkedCopy(context, sourceKey, body, webSession) {
|
|
@@ -402,7 +416,7 @@ class ContextFileService {
|
|
|
402
416
|
kind: "source-snapshot",
|
|
403
417
|
contentHash: sourceDescriptor.contentHash,
|
|
404
418
|
content: sourceDescriptor.content ?? "",
|
|
405
|
-
actorId: webSession.
|
|
419
|
+
actorId: webSession.authSession.identity.userId,
|
|
406
420
|
sourceHashAtCreation: sourceDescriptor.contentHash,
|
|
407
421
|
note: "Plugin source linked",
|
|
408
422
|
});
|
|
@@ -411,7 +425,7 @@ class ContextFileService {
|
|
|
411
425
|
kind: "working",
|
|
412
426
|
contentHash: sourceDescriptor.contentHash,
|
|
413
427
|
content: sourceDescriptor.content ?? "",
|
|
414
|
-
actorId: webSession.
|
|
428
|
+
actorId: webSession.authSession.identity.userId,
|
|
415
429
|
basedOnRevisionId: sourceRevision.id,
|
|
416
430
|
sourceHashAtCreation: sourceDescriptor.contentHash,
|
|
417
431
|
note: "Managed working copy created from plugin source",
|
|
@@ -425,7 +439,7 @@ class ContextFileService {
|
|
|
425
439
|
this.upsertManaged(updated);
|
|
426
440
|
const document = await this.read(context, updated.key);
|
|
427
441
|
this.snapshots.set(updated.key, this.snapshotFromInfo(document));
|
|
428
|
-
this.emitChanged(context, "context-file.linked_from_plugin", "web", webSession.
|
|
442
|
+
this.emitChanged(context, "context-file.linked_from_plugin", "web", webSession.authSession.identity.userId, document);
|
|
429
443
|
return document;
|
|
430
444
|
}
|
|
431
445
|
async update(context, key, body, webSession) {
|
|
@@ -439,12 +453,12 @@ class ContextFileService {
|
|
|
439
453
|
if (current.markdown === markdown)
|
|
440
454
|
return current;
|
|
441
455
|
const updatedRecord = await this.writeWorkingContent(record, markdown, {
|
|
442
|
-
actorId: webSession.
|
|
456
|
+
actorId: webSession.authSession.identity.userId,
|
|
443
457
|
note: "Managed context file updated",
|
|
444
458
|
});
|
|
445
459
|
const updated = await this.read(context, updatedRecord.key);
|
|
446
460
|
this.snapshots.set(updated.key, this.snapshotFromInfo(updated));
|
|
447
|
-
this.emitChanged(context, "context-file.updated", "web", webSession.
|
|
461
|
+
this.emitChanged(context, "context-file.updated", "web", webSession.authSession.identity.userId, updated);
|
|
448
462
|
return updated;
|
|
449
463
|
}
|
|
450
464
|
async updateMetadata(context, key, body, webSession) {
|
|
@@ -473,7 +487,7 @@ class ContextFileService {
|
|
|
473
487
|
this.upsertManaged(updated);
|
|
474
488
|
const document = await this.read(context, key);
|
|
475
489
|
this.snapshots.set(key, this.snapshotFromInfo(document));
|
|
476
|
-
this.emitChanged(context, "context-file.metadata_updated", "web", webSession.
|
|
490
|
+
this.emitChanged(context, "context-file.metadata_updated", "web", webSession.authSession.identity.userId, document);
|
|
477
491
|
return document;
|
|
478
492
|
}
|
|
479
493
|
async resetToSource(context, key, webSession) {
|
|
@@ -481,15 +495,15 @@ class ContextFileService {
|
|
|
481
495
|
if (!record.sourceRef)
|
|
482
496
|
throw new PiboWebHttpError("Only linked managed files can be reset to source", 400);
|
|
483
497
|
const liveSource = this.requireLiveSourceForRecord(context, record);
|
|
484
|
-
this.ensureSourceSnapshot(record, liveSource, webSession.
|
|
498
|
+
this.ensureSourceSnapshot(record, liveSource, webSession.authSession.identity.userId, "Source snapshot refreshed during reset");
|
|
485
499
|
const updatedRecord = await this.writeWorkingContent(record, liveSource.content ?? "", {
|
|
486
|
-
actorId: webSession.
|
|
500
|
+
actorId: webSession.authSession.identity.userId,
|
|
487
501
|
sourceHash: liveSource.contentHash,
|
|
488
502
|
note: "Working copy reset to source",
|
|
489
503
|
});
|
|
490
504
|
const document = await this.read(context, updatedRecord.key);
|
|
491
505
|
this.snapshots.set(updatedRecord.key, this.snapshotFromInfo(document));
|
|
492
|
-
this.emitChanged(context, "context-file.reset_to_source", "web", webSession.
|
|
506
|
+
this.emitChanged(context, "context-file.reset_to_source", "web", webSession.authSession.identity.userId, document);
|
|
493
507
|
return document;
|
|
494
508
|
}
|
|
495
509
|
async adoptSource(context, key, webSession) {
|
|
@@ -497,15 +511,15 @@ class ContextFileService {
|
|
|
497
511
|
if (!record.sourceRef)
|
|
498
512
|
throw new PiboWebHttpError("Only linked managed files can adopt a source", 400);
|
|
499
513
|
const liveSource = this.requireLiveSourceForRecord(context, record);
|
|
500
|
-
this.ensureSourceSnapshot(record, liveSource, webSession.
|
|
514
|
+
this.ensureSourceSnapshot(record, liveSource, webSession.authSession.identity.userId, "Source snapshot adopted");
|
|
501
515
|
const updatedRecord = await this.writeWorkingContent(record, liveSource.content ?? "", {
|
|
502
|
-
actorId: webSession.
|
|
516
|
+
actorId: webSession.authSession.identity.userId,
|
|
503
517
|
sourceHash: liveSource.contentHash,
|
|
504
518
|
note: "Plugin source adopted",
|
|
505
519
|
});
|
|
506
520
|
const document = await this.read(context, updatedRecord.key);
|
|
507
521
|
this.snapshots.set(updatedRecord.key, this.snapshotFromInfo(document));
|
|
508
|
-
this.emitChanged(context, "context-file.source_adopted", "web", webSession.
|
|
522
|
+
this.emitChanged(context, "context-file.source_adopted", "web", webSession.authSession.identity.userId, document);
|
|
509
523
|
return document;
|
|
510
524
|
}
|
|
511
525
|
async restoreRevision(context, key, body, webSession) {
|
|
@@ -515,13 +529,13 @@ class ContextFileService {
|
|
|
515
529
|
if (!revision || revision.contextFileKey !== key)
|
|
516
530
|
throw new PiboWebHttpError(`Unknown revision "${revisionId}"`, 404);
|
|
517
531
|
const updatedRecord = await this.writeWorkingContent(record, revision.content, {
|
|
518
|
-
actorId: webSession.
|
|
532
|
+
actorId: webSession.authSession.identity.userId,
|
|
519
533
|
basedOnRevisionId: revision.id,
|
|
520
534
|
note: `Revision restored from ${revision.id}`,
|
|
521
535
|
});
|
|
522
536
|
const document = await this.read(context, updatedRecord.key);
|
|
523
537
|
this.snapshots.set(updatedRecord.key, this.snapshotFromInfo(document));
|
|
524
|
-
this.emitChanged(context, "context-file.revision_restored", "web", webSession.
|
|
538
|
+
this.emitChanged(context, "context-file.revision_restored", "web", webSession.authSession.identity.userId, document);
|
|
525
539
|
return document;
|
|
526
540
|
}
|
|
527
541
|
listRevisions(context, key) {
|
|
@@ -558,12 +572,13 @@ class ContextFileService {
|
|
|
558
572
|
this.store.deleteFile(key);
|
|
559
573
|
this.api.removeContextFile(key);
|
|
560
574
|
this.snapshots.delete(key);
|
|
561
|
-
this.emitChanged(context, "context-file.removed", "web", webSession.
|
|
575
|
+
this.emitChanged(context, "context-file.removed", "web", webSession.authSession.identity.userId, file);
|
|
562
576
|
return { removed: key };
|
|
563
577
|
}
|
|
564
578
|
startWatcher(context) {
|
|
565
579
|
if (this.pollTimer)
|
|
566
580
|
return;
|
|
581
|
+
this.discoverGlobalManagedFiles(context, false);
|
|
567
582
|
for (const file of this.list(context))
|
|
568
583
|
this.snapshots.set(file.key, this.snapshotFromInfo(file));
|
|
569
584
|
this.pollTimer = setInterval(() => {
|
|
@@ -578,6 +593,7 @@ class ContextFileService {
|
|
|
578
593
|
this.pollTimer = undefined;
|
|
579
594
|
}
|
|
580
595
|
async poll(context) {
|
|
596
|
+
this.discoverGlobalManagedFiles(context, true);
|
|
581
597
|
for (const file of this.list(context)) {
|
|
582
598
|
const nextSnapshot = this.snapshotFromInfo(file);
|
|
583
599
|
const previous = this.snapshots.get(file.key);
|
|
@@ -590,6 +606,70 @@ class ContextFileService {
|
|
|
590
606
|
emitContextFileEvent(context, eventType, "filesystem", undefined, contextFilePayload(file));
|
|
591
607
|
}
|
|
592
608
|
}
|
|
609
|
+
discoverGlobalManagedFiles(context, emitEvents) {
|
|
610
|
+
let entries;
|
|
611
|
+
try {
|
|
612
|
+
entries = readdirSync(this.paths.globalDir, { withFileTypes: true });
|
|
613
|
+
}
|
|
614
|
+
catch (error) {
|
|
615
|
+
const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
|
|
616
|
+
if (code === "ENOENT")
|
|
617
|
+
return [];
|
|
618
|
+
throw error;
|
|
619
|
+
}
|
|
620
|
+
const knownPaths = new Set([...this.managed.values()].map((file) => resolve(file.managedPath)));
|
|
621
|
+
const usedKeys = new Set([
|
|
622
|
+
...this.managed.keys(),
|
|
623
|
+
...(context.channelContext.getCapabilityCatalog?.().contextFiles ?? []).map((file) => file.key),
|
|
624
|
+
]);
|
|
625
|
+
const discovered = [];
|
|
626
|
+
for (const entry of entries) {
|
|
627
|
+
if (!entry.isFile())
|
|
628
|
+
continue;
|
|
629
|
+
const extension = extname(entry.name).toLowerCase();
|
|
630
|
+
if (extension !== ".md" && extension !== ".markdown")
|
|
631
|
+
continue;
|
|
632
|
+
const absolutePath = resolve(this.paths.globalDir, entry.name);
|
|
633
|
+
if (knownPaths.has(absolutePath))
|
|
634
|
+
continue;
|
|
635
|
+
const snapshot = snapshotFromSync(absolutePath);
|
|
636
|
+
if (!snapshot.exists || !snapshot.version)
|
|
637
|
+
continue;
|
|
638
|
+
const label = labelFromManagedPath(entry.name);
|
|
639
|
+
const record = this.store.createFile({
|
|
640
|
+
key: uniqueKey(`ctx:${slugSegment(entry.name.slice(0, -extension.length) || entry.name)}`, usedKeys),
|
|
641
|
+
label,
|
|
642
|
+
managedPath: absolutePath,
|
|
643
|
+
scope: "global",
|
|
644
|
+
createdAt: snapshot.updatedAt,
|
|
645
|
+
updatedAt: snapshot.updatedAt,
|
|
646
|
+
});
|
|
647
|
+
const revision = this.store.appendRevision({
|
|
648
|
+
contextFileKey: record.key,
|
|
649
|
+
kind: "working",
|
|
650
|
+
contentHash: snapshot.version,
|
|
651
|
+
content: snapshot.content ?? "",
|
|
652
|
+
createdAt: snapshot.updatedAt,
|
|
653
|
+
note: "Global context file discovered on disk",
|
|
654
|
+
});
|
|
655
|
+
const updated = this.store.updateFile({
|
|
656
|
+
...record,
|
|
657
|
+
activeRevisionId: revision.id,
|
|
658
|
+
updatedAt: snapshot.updatedAt ?? new Date().toISOString(),
|
|
659
|
+
});
|
|
660
|
+
this.upsertManaged(updated);
|
|
661
|
+
this.managed.set(updated.key, updated);
|
|
662
|
+
knownPaths.add(absolutePath);
|
|
663
|
+
usedKeys.add(updated.key);
|
|
664
|
+
const info = this.resolveManagedInfo(context, updated);
|
|
665
|
+
discovered.push(updated);
|
|
666
|
+
if (emitEvents) {
|
|
667
|
+
this.snapshots.set(updated.key, this.snapshotFromInfo(info));
|
|
668
|
+
this.emitChanged(context, "context-file.created", "filesystem", undefined, info);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
return discovered;
|
|
672
|
+
}
|
|
593
673
|
resolveCatalogInfo(context, file) {
|
|
594
674
|
const managed = this.managed.get(file.key);
|
|
595
675
|
if (managed)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { definePiboPlugin } from "./registry.js";
|
|
3
|
+
const COOKIE_NAME = "pibo_dev_session";
|
|
4
|
+
const COOKIE_MAX_AGE = 60 * 60 * 24 * 7; // 7 days
|
|
5
|
+
const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "::1", "[::1]"]);
|
|
6
|
+
function generateToken() {
|
|
7
|
+
return randomBytes(32).toString("hex");
|
|
8
|
+
}
|
|
9
|
+
function setCookie(value, maxAge = COOKIE_MAX_AGE) {
|
|
10
|
+
return `${COOKIE_NAME}=${value}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAge}`;
|
|
11
|
+
}
|
|
12
|
+
function clearCookie() {
|
|
13
|
+
return `${COOKIE_NAME}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`;
|
|
14
|
+
}
|
|
15
|
+
function getCookieValue(headers) {
|
|
16
|
+
const cookie = headers.get("cookie");
|
|
17
|
+
if (!cookie)
|
|
18
|
+
return undefined;
|
|
19
|
+
const match = cookie.match(new RegExp(`${COOKIE_NAME}=([^;]+)`));
|
|
20
|
+
return match?.[1];
|
|
21
|
+
}
|
|
22
|
+
function firstHeaderValue(value) {
|
|
23
|
+
return value?.split(",")[0]?.trim() || undefined;
|
|
24
|
+
}
|
|
25
|
+
function isLoopbackHost(value) {
|
|
26
|
+
if (!value)
|
|
27
|
+
return false;
|
|
28
|
+
try {
|
|
29
|
+
const hostname = new URL(`http://${value}`).hostname;
|
|
30
|
+
return LOOPBACK_HOSTS.has(hostname);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function isLoopbackDevAuthRequest(request) {
|
|
37
|
+
const host = firstHeaderValue(request.headers.get("host"));
|
|
38
|
+
const forwardedHost = firstHeaderValue(request.headers.get("x-forwarded-host"));
|
|
39
|
+
return isLoopbackHost(host) && (!forwardedHost || isLoopbackHost(forwardedHost));
|
|
40
|
+
}
|
|
41
|
+
function createDevAuthService() {
|
|
42
|
+
const containerToken = generateToken();
|
|
43
|
+
const debugSession = {
|
|
44
|
+
identity: {
|
|
45
|
+
userId: "dev-user-001",
|
|
46
|
+
email: "dev@pibo.local",
|
|
47
|
+
name: "Dev User",
|
|
48
|
+
image: undefined,
|
|
49
|
+
provider: "dev",
|
|
50
|
+
},
|
|
51
|
+
sessionId: "dev-session-001",
|
|
52
|
+
expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000),
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
name: "dev-auth",
|
|
56
|
+
async start() {
|
|
57
|
+
console.error("[dev-auth] Debug auth service started");
|
|
58
|
+
},
|
|
59
|
+
stop() { },
|
|
60
|
+
async getSession(headers) {
|
|
61
|
+
const token = getCookieValue(headers);
|
|
62
|
+
if (token === containerToken)
|
|
63
|
+
return debugSession;
|
|
64
|
+
return undefined;
|
|
65
|
+
},
|
|
66
|
+
async requireSession(headers) {
|
|
67
|
+
const session = await this.getSession(headers);
|
|
68
|
+
if (!session) {
|
|
69
|
+
const err = new Error("Unauthenticated");
|
|
70
|
+
err.statusCode = 401;
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
return session;
|
|
74
|
+
},
|
|
75
|
+
async handleRequest(request) {
|
|
76
|
+
if (!isLoopbackDevAuthRequest(request)) {
|
|
77
|
+
return Response.json({ error: "Dev auth only accepts loopback requests" }, { status: 403 });
|
|
78
|
+
}
|
|
79
|
+
const url = new URL(request.url);
|
|
80
|
+
if (url.pathname === "/api/auth/sign-in/social") {
|
|
81
|
+
// Simulate the Google OAuth redirect — go straight to callback
|
|
82
|
+
return new Response(null, {
|
|
83
|
+
status: 302,
|
|
84
|
+
headers: {
|
|
85
|
+
location: "/api/auth/callback/google?code=dev",
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (url.pathname === "/api/auth/callback/google") {
|
|
90
|
+
// Set session cookie and redirect to app
|
|
91
|
+
return new Response(null, {
|
|
92
|
+
status: 302,
|
|
93
|
+
headers: {
|
|
94
|
+
"Set-Cookie": setCookie(containerToken),
|
|
95
|
+
location: "/apps/chat",
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (url.pathname === "/api/auth/sign-out") {
|
|
100
|
+
return new Response(null, {
|
|
101
|
+
status: 302,
|
|
102
|
+
headers: {
|
|
103
|
+
"Set-Cookie": clearCookie(),
|
|
104
|
+
location: "/apps/chat",
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (url.pathname === "/api/auth/session") {
|
|
109
|
+
const session = await this.getSession(request.headers);
|
|
110
|
+
return Response.json(session ?? null);
|
|
111
|
+
}
|
|
112
|
+
return new Response("Not found", { status: 404 });
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export function createPiboDevAuthPlugin() {
|
|
117
|
+
return definePiboPlugin({
|
|
118
|
+
id: "pibo.dev-auth",
|
|
119
|
+
name: "Dev Auth",
|
|
120
|
+
register(api) {
|
|
121
|
+
api.registerAuthService(createDevAuthService());
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
export const PIBO_NATIVE_TOOLING_CONTEXT_FILE_KEY = "Pibo Native Tooling";
|
|
4
|
+
const PROJECT_ROOT = dirname(dirname(dirname(fileURLToPath(import.meta.url))));
|
|
5
|
+
export const PIBO_NATIVE_TOOLING_CONTEXT_FILE_PATH = resolve(PROJECT_ROOT, "context/pibo-native-tooling.md");
|
|
6
|
+
export function registerPiboNativeTooling(api) {
|
|
7
|
+
api.registerContextFile({
|
|
8
|
+
key: PIBO_NATIVE_TOOLING_CONTEXT_FILE_KEY,
|
|
9
|
+
label: "Pibo Native Tooling",
|
|
10
|
+
path: PIBO_NATIVE_TOOLING_CONTEXT_FILE_PATH,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export function addPiboNativeToolingContext(builder, context) {
|
|
14
|
+
return builder.addContextFile(context.getContextFile(PIBO_NATIVE_TOOLING_CONTEXT_FILE_KEY));
|
|
15
|
+
}
|
package/dist/plugins/registry.js
CHANGED
|
@@ -30,8 +30,10 @@ export class PiboPluginRegistry {
|
|
|
30
30
|
channels = new Map();
|
|
31
31
|
authService;
|
|
32
32
|
webApps = new Map();
|
|
33
|
+
capabilityPackages = new Map();
|
|
33
34
|
eventListeners = new Set();
|
|
34
35
|
productEventListeners = new Set();
|
|
36
|
+
ralphStopConditions = new Map();
|
|
35
37
|
pluginIds = new Set();
|
|
36
38
|
pluginNames = new Map();
|
|
37
39
|
eventErrors = [];
|
|
@@ -69,6 +71,12 @@ export class PiboPluginRegistry {
|
|
|
69
71
|
registerSkill(skill) {
|
|
70
72
|
this.addUnique(this.skills, skill.name, skill, "skill");
|
|
71
73
|
}
|
|
74
|
+
unregisterSkill(name) {
|
|
75
|
+
return this.skills.delete(name);
|
|
76
|
+
}
|
|
77
|
+
getRegisteredSkillNames() {
|
|
78
|
+
return [...this.skills.keys()];
|
|
79
|
+
}
|
|
72
80
|
registerContextFile(contextFile) {
|
|
73
81
|
this.addUnique(this.contextFiles, contextFileKey(contextFile), contextFile, "context file");
|
|
74
82
|
}
|
|
@@ -122,6 +130,33 @@ export class PiboPluginRegistry {
|
|
|
122
130
|
this.validateWebAppRoutes(app);
|
|
123
131
|
this.webApps.set(app.name, app);
|
|
124
132
|
}
|
|
133
|
+
registerCapabilityPackage(pkg) {
|
|
134
|
+
this.addUnique(this.capabilityPackages, pkg.name, { ...pkg, toolNames: [...pkg.toolNames] }, "capability package");
|
|
135
|
+
}
|
|
136
|
+
registerRalphStopCondition(condition, pluginId) {
|
|
137
|
+
if (!condition.type.trim())
|
|
138
|
+
throw new Error('Ralph stop condition type is required');
|
|
139
|
+
if (!condition.name.trim())
|
|
140
|
+
throw new Error(`Ralph stop condition "${condition.type}" name is required`);
|
|
141
|
+
if (condition.phases.length === 0)
|
|
142
|
+
throw new Error(`Ralph stop condition "${condition.type}" must support at least one phase`);
|
|
143
|
+
this.addUnique(this.ralphStopConditions, condition.type, { definition: { ...condition, phases: [...condition.phases] }, pluginId }, 'Ralph stop condition');
|
|
144
|
+
}
|
|
145
|
+
getRalphStopConditionDefinitions() {
|
|
146
|
+
return [...this.ralphStopConditions.values()].map((entry) => entry.definition);
|
|
147
|
+
}
|
|
148
|
+
getRalphStopConditionInfos() {
|
|
149
|
+
return [...this.ralphStopConditions.values()].map((entry) => ({
|
|
150
|
+
type: entry.definition.type,
|
|
151
|
+
name: entry.definition.name,
|
|
152
|
+
description: entry.definition.description,
|
|
153
|
+
phases: [...entry.definition.phases],
|
|
154
|
+
optionsSchema: entry.definition.optionsSchema,
|
|
155
|
+
defaultOptions: entry.definition.defaultOptions,
|
|
156
|
+
pluginId: entry.pluginId,
|
|
157
|
+
pluginName: entry.pluginId ? this.pluginNames.get(entry.pluginId) : undefined,
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
125
160
|
onEvent(listener) {
|
|
126
161
|
this.eventListeners.add(listener);
|
|
127
162
|
}
|
|
@@ -158,6 +193,12 @@ export class PiboPluginRegistry {
|
|
|
158
193
|
model: sessionContext.model ? { ...sessionContext.model } : undefined,
|
|
159
194
|
mainModel: sessionContext.mainModel ? { ...sessionContext.mainModel } : undefined,
|
|
160
195
|
subagentModel: sessionContext.subagentModel ? { ...sessionContext.subagentModel } : undefined,
|
|
196
|
+
thinkingLevel: sessionContext.thinkingLevel,
|
|
197
|
+
mainThinkingLevel: sessionContext.mainThinkingLevel,
|
|
198
|
+
subagentThinkingLevel: sessionContext.subagentThinkingLevel,
|
|
199
|
+
fast: sessionContext.fast,
|
|
200
|
+
mainFast: sessionContext.mainFast,
|
|
201
|
+
subagentFast: sessionContext.subagentFast,
|
|
161
202
|
builtinTools: sessionContext.builtinTools,
|
|
162
203
|
builtinToolNames: [...sessionContext.builtinToolNames],
|
|
163
204
|
autoContextFiles: sessionContext.autoContextFiles,
|
|
@@ -171,7 +212,7 @@ export class PiboPluginRegistry {
|
|
|
171
212
|
name: tool.name,
|
|
172
213
|
description: tool.description,
|
|
173
214
|
yieldable: tool.yieldable !== false,
|
|
174
|
-
hasDefinition: tool.definition !== undefined,
|
|
215
|
+
hasDefinition: tool.definition !== undefined || tool.createDefinition !== undefined,
|
|
175
216
|
pluginId: tool.pluginId,
|
|
176
217
|
pluginName: tool.pluginId ? this.pluginNames.get(tool.pluginId) : undefined,
|
|
177
218
|
...(tool.providerTool ? { providerTool: tool.providerTool } : {}),
|
|
@@ -179,6 +220,9 @@ export class PiboPluginRegistry {
|
|
|
179
220
|
skills: [...this.skills.values()].map((skill) => ({
|
|
180
221
|
name: skill.name,
|
|
181
222
|
path: skill.path,
|
|
223
|
+
kind: skill.kind ?? "plugin",
|
|
224
|
+
pluginId: skill.pluginId,
|
|
225
|
+
pluginName: skill.pluginId ? this.pluginNames.get(skill.pluginId) : undefined,
|
|
182
226
|
})),
|
|
183
227
|
subagents: [...this.subagents.values()].map((subagent) => ({
|
|
184
228
|
name: subagent.name,
|
|
@@ -211,10 +255,16 @@ export class PiboPluginRegistry {
|
|
|
211
255
|
"pibo_run_ack",
|
|
212
256
|
],
|
|
213
257
|
},
|
|
258
|
+
...[...this.capabilityPackages.values()].map((pkg) => ({
|
|
259
|
+
...pkg,
|
|
260
|
+
toolNames: [...pkg.toolNames],
|
|
261
|
+
pluginName: pkg.pluginId ? this.pluginNames.get(pkg.pluginId) : pkg.pluginName,
|
|
262
|
+
})),
|
|
214
263
|
],
|
|
215
264
|
piboTools: listInstalledCliToolAgentContexts(),
|
|
216
265
|
mcpServers: [],
|
|
217
266
|
piPackages: listPiPackages(),
|
|
267
|
+
ralphStopConditions: this.getRalphStopConditionInfos(),
|
|
218
268
|
};
|
|
219
269
|
}
|
|
220
270
|
resolveProfileName(name) {
|
|
@@ -276,13 +326,25 @@ export class PiboPluginRegistry {
|
|
|
276
326
|
}
|
|
277
327
|
createApi(pluginId) {
|
|
278
328
|
const withPluginToolContext = (tool) => ({ ...tool, pluginId: tool.pluginId ?? pluginId });
|
|
329
|
+
const withPluginSkillContext = (skill) => (skill.kind === "user"
|
|
330
|
+
? skill
|
|
331
|
+
: {
|
|
332
|
+
...skill,
|
|
333
|
+
kind: skill.kind ?? "plugin",
|
|
334
|
+
pluginId: skill.pluginId ?? pluginId,
|
|
335
|
+
});
|
|
279
336
|
const withPluginContext = (contextFile) => (contextFile.source === "managed" ? contextFile : { ...contextFile, pluginId: contextFile.pluginId ?? pluginId });
|
|
337
|
+
const withPluginPackageContext = (pkg) => ({
|
|
338
|
+
...pkg,
|
|
339
|
+
toolNames: [...pkg.toolNames],
|
|
340
|
+
pluginId: pkg.pluginId ?? pluginId,
|
|
341
|
+
});
|
|
280
342
|
return {
|
|
281
343
|
registerTool: (tool) => this.registerTool(withPluginToolContext(tool)),
|
|
282
344
|
registerTools: (tools) => this.registerTools(tools.map(withPluginToolContext)),
|
|
283
345
|
registerSubagent: (subagent) => this.registerSubagent(subagent),
|
|
284
346
|
registerSubagents: (subagents) => this.registerSubagents(subagents),
|
|
285
|
-
registerSkill: (skill) => this.registerSkill(skill),
|
|
347
|
+
registerSkill: (skill) => this.registerSkill(withPluginSkillContext(skill)),
|
|
286
348
|
registerContextFile: (contextFile) => this.registerContextFile(withPluginContext(contextFile)),
|
|
287
349
|
upsertContextFile: (contextFile) => this.upsertContextFile(withPluginContext(contextFile)),
|
|
288
350
|
removeContextFile: (key) => this.removeContextFile(key),
|
|
@@ -291,6 +353,8 @@ export class PiboPluginRegistry {
|
|
|
291
353
|
registerChannel: (channel) => this.registerChannel(channel),
|
|
292
354
|
registerAuthService: (service) => this.registerAuthService(service),
|
|
293
355
|
registerWebApp: (app) => this.registerWebApp(app),
|
|
356
|
+
registerCapabilityPackage: (pkg) => this.registerCapabilityPackage(withPluginPackageContext(pkg)),
|
|
357
|
+
registerRalphStopCondition: (condition) => this.registerRalphStopCondition(condition, pluginId),
|
|
294
358
|
onEvent: (listener) => this.onEvent(listener),
|
|
295
359
|
emitProductEvent: (event) => this.emitProductEvent(event),
|
|
296
360
|
onProductEvent: (listener) => this.onProductEvent(listener),
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { createWebAnnotationsWebApp } from "../web-annotations/api.js";
|
|
4
|
+
import { WEB_ANNOTATION_TOOL_NAMES, createWebAnnotationToolProfiles } from "../web-annotations/tools.js";
|
|
5
|
+
import { definePiboPlugin } from "./registry.js";
|
|
6
|
+
const PIBO_PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
function webAnnotationsSkillPath() {
|
|
8
|
+
return resolve(PIBO_PACKAGE_ROOT, "skills", "builtin", "web-annotations", "SKILL.md");
|
|
9
|
+
}
|
|
10
|
+
export const piboWebAnnotationsPlugin = definePiboPlugin({
|
|
11
|
+
id: "pibo.web-annotations",
|
|
12
|
+
name: "Pibo Web Annotations",
|
|
13
|
+
register(api) {
|
|
14
|
+
api.registerTools(createWebAnnotationToolProfiles());
|
|
15
|
+
api.registerWebApp(createWebAnnotationsWebApp());
|
|
16
|
+
api.registerCapabilityPackage({
|
|
17
|
+
name: "web-annotation-agent-tools",
|
|
18
|
+
description: "Expose session-scoped Web Annotation tools for listing, reading, watching, and lifecycle updates.",
|
|
19
|
+
toolNames: [...WEB_ANNOTATION_TOOL_NAMES],
|
|
20
|
+
});
|
|
21
|
+
api.registerSkill({
|
|
22
|
+
name: "web-annotations",
|
|
23
|
+
path: webAnnotationsSkillPath(),
|
|
24
|
+
kind: "builtin",
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getModels } from "@mariozechner/pi-ai";
|
|
2
|
+
import { OPENAI_COMPLETIONS_API, registerOpenAiCompatProvider, resetOpenAiCompatProviderRegistration, unregisterOpenAiCompatProvider, } from "./openai-compat.js";
|
|
3
|
+
export const MINIMAX_PROVIDER_ID = "minimax";
|
|
4
|
+
export const MINIMAX_CN_PROVIDER_ID = "minimax-cn";
|
|
5
|
+
export const MINIMAX_DEFAULT_BASE_URL = "https://api.minimax.io/v1";
|
|
6
|
+
export const MINIMAX_CN_DEFAULT_BASE_URL = "https://api.minimax.cn/v1";
|
|
7
|
+
export const MINIMAX_API_KEY_ENV = "MINIMAX_API_KEY";
|
|
8
|
+
export const MINIMAX_CN_API_KEY_ENV = "MINIMAX_API_KEY";
|
|
9
|
+
export const MINIMAX_M3_MODEL = {
|
|
10
|
+
id: "MiniMax-M3",
|
|
11
|
+
name: "MiniMax-M3",
|
|
12
|
+
reasoning: true,
|
|
13
|
+
contextWindow: 1000000,
|
|
14
|
+
maxTokens: 131072,
|
|
15
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
16
|
+
input: ["text", "image"],
|
|
17
|
+
};
|
|
18
|
+
function resolveBaseUrl(providerId, defaultBaseUrl) {
|
|
19
|
+
const envKey = `PIBO_${providerId.toUpperCase().replace(/-/g, "_")}_BASE_URL`;
|
|
20
|
+
const envOverride = process.env[envKey];
|
|
21
|
+
return envOverride && envOverride.length > 0 ? envOverride : defaultBaseUrl;
|
|
22
|
+
}
|
|
23
|
+
function buildMiniMaxSpec(providerId = MINIMAX_PROVIDER_ID, customModels = [MINIMAX_M3_MODEL]) {
|
|
24
|
+
const defaultBaseUrl = providerId === MINIMAX_CN_PROVIDER_ID
|
|
25
|
+
? MINIMAX_CN_DEFAULT_BASE_URL
|
|
26
|
+
: MINIMAX_DEFAULT_BASE_URL;
|
|
27
|
+
return {
|
|
28
|
+
id: providerId,
|
|
29
|
+
baseUrl: resolveBaseUrl(providerId, defaultBaseUrl),
|
|
30
|
+
apiKeyEnv: providerId === MINIMAX_CN_PROVIDER_ID
|
|
31
|
+
? MINIMAX_CN_API_KEY_ENV
|
|
32
|
+
: MINIMAX_API_KEY_ENV,
|
|
33
|
+
models: customModels,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function isMiniMaxProvider(provider) {
|
|
37
|
+
return provider === MINIMAX_PROVIDER_ID || provider === MINIMAX_CN_PROVIDER_ID;
|
|
38
|
+
}
|
|
39
|
+
export function findMiniMaxModel(modelRegistry, model) {
|
|
40
|
+
if (!model?.provider || !model.id)
|
|
41
|
+
return undefined;
|
|
42
|
+
if (!isMiniMaxProvider(model.provider))
|
|
43
|
+
return undefined;
|
|
44
|
+
return modelRegistry.find(model.provider, model.id);
|
|
45
|
+
}
|
|
46
|
+
export function getBuiltInMiniMaxModels(providerId = MINIMAX_PROVIDER_ID) {
|
|
47
|
+
try {
|
|
48
|
+
return getModels(providerId);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function registerMiniMaxProvider(modelRegistry, options = {}) {
|
|
55
|
+
const providerId = options.providerId ?? MINIMAX_PROVIDER_ID;
|
|
56
|
+
const spec = buildMiniMaxSpec(providerId, options.customModels ?? [MINIMAX_M3_MODEL]);
|
|
57
|
+
const baseModels = options.baseModels ?? getBuiltInMiniMaxModels(providerId);
|
|
58
|
+
return registerOpenAiCompatProvider(modelRegistry, spec, { baseModels });
|
|
59
|
+
}
|
|
60
|
+
export function unregisterMiniMaxProvider(modelRegistry, options = {}) {
|
|
61
|
+
const providerId = options.providerId ?? MINIMAX_PROVIDER_ID;
|
|
62
|
+
unregisterOpenAiCompatProvider(modelRegistry, providerId);
|
|
63
|
+
}
|
|
64
|
+
export function resetMiniMaxProviderRegistration() {
|
|
65
|
+
resetOpenAiCompatProviderRegistration();
|
|
66
|
+
}
|
|
67
|
+
export function getDefaultMiniMaxModels() {
|
|
68
|
+
return [MINIMAX_M3_MODEL];
|
|
69
|
+
}
|
|
70
|
+
export { OPENAI_COMPLETIONS_API };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export const OPENAI_COMPLETIONS_API = "openai-completions";
|
|
2
|
+
export function buildOpenAiCompatConfig(spec, baseModels = []) {
|
|
3
|
+
const baseEntries = baseModels
|
|
4
|
+
.filter((model) => model.provider === spec.id)
|
|
5
|
+
.map((model) => ({
|
|
6
|
+
id: model.id,
|
|
7
|
+
name: model.name,
|
|
8
|
+
api: OPENAI_COMPLETIONS_API,
|
|
9
|
+
baseUrl: spec.baseUrl,
|
|
10
|
+
reasoning: Boolean(model.reasoning),
|
|
11
|
+
input: [...model.input],
|
|
12
|
+
cost: { ...model.cost },
|
|
13
|
+
contextWindow: model.contextWindow,
|
|
14
|
+
maxTokens: model.maxTokens,
|
|
15
|
+
}));
|
|
16
|
+
const customEntries = spec.models.map((model) => ({
|
|
17
|
+
id: model.id,
|
|
18
|
+
name: model.name,
|
|
19
|
+
api: OPENAI_COMPLETIONS_API,
|
|
20
|
+
baseUrl: spec.baseUrl,
|
|
21
|
+
reasoning: model.reasoning ?? false,
|
|
22
|
+
input: [...model.input],
|
|
23
|
+
cost: { ...model.cost },
|
|
24
|
+
contextWindow: model.contextWindow,
|
|
25
|
+
maxTokens: model.maxTokens,
|
|
26
|
+
}));
|
|
27
|
+
const byId = new Map();
|
|
28
|
+
for (const entry of baseEntries)
|
|
29
|
+
byId.set(entry.id, entry);
|
|
30
|
+
for (const entry of customEntries)
|
|
31
|
+
byId.set(entry.id, entry);
|
|
32
|
+
return {
|
|
33
|
+
baseUrl: spec.baseUrl,
|
|
34
|
+
api: OPENAI_COMPLETIONS_API,
|
|
35
|
+
apiKey: spec.apiKeyEnv,
|
|
36
|
+
models: [...byId.values()],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function registerOpenAiCompatProvider(modelRegistry, spec, options = {}) {
|
|
40
|
+
const config = buildOpenAiCompatConfig(spec, options.baseModels);
|
|
41
|
+
modelRegistry.registerProvider(spec.id, config);
|
|
42
|
+
return { registered: true, models: config.models.length };
|
|
43
|
+
}
|
|
44
|
+
export function unregisterOpenAiCompatProvider(modelRegistry, providerId) {
|
|
45
|
+
modelRegistry.unregisterProvider(providerId);
|
|
46
|
+
}
|
|
47
|
+
export function resetOpenAiCompatProviderRegistration() {
|
|
48
|
+
}
|