Commit Graph

155 Commits

Author SHA1 Message Date
can1357 25e30bfd0b fix(tests): typed evaluator regression tests for strict check 2026-08-13 01:25:50 +02:00
can1357 ea10cce8d8 style: applied biome formatting to merged pull request sources 2026-08-13 01:23:48 +02:00
can1357 ae5d58be2f Merge PR #8163: fix(coding-agent): restore is*ToolResult guards on legacy pi shim (@roboomp) 2026-08-13 01:14:49 +02:00
can1357 0c06adc423 fix(extensions): preserve additional property semantics 2026-08-13 01:14:49 +02:00
can1357 00cabe5513 Merge PR #8144: fix(extensions): preserve unsafe schemas during plugin install (@roboomp) 2026-08-13 01:14:49 +02:00
can1357 340eaeb65c fix(coding-agent): avoid mutating shared omptype builder 2026-08-13 01:14:46 +02:00
roboomp 1fa80a89ad fix(coding-agent): preserved legacy find and ls result guards
Legacy find and ls tool definitions still emit tool-result events through
omp's custom-event branch. Export their historical named guards so static
legacy imports validate, while narrowing only toolName and retaining unknown
details.

Fixes #8161
2026-08-10 13:35:27 +00:00
roboomp f178cee9a9 fix(coding-agent): restore is*ToolResult guards on legacy pi shim
Legacy pi's @earendil-works/pi-coding-agent root exported an
is<Tool>ToolResult family of ToolResultEvent type guards. omp dropped
them from the public API in 10.2.3 and the legacy shim's
`export * from "../index"` never forwarded them, so extensions importing
them (pi-lean-ctx@3.9.18 uses isEditToolResult/isWriteToolResult) failed
Bun's static export check and aborted `omp install`.

Restore isBashToolResult, isReadToolResult, isEditToolResult,
isWriteToolResult, and isGrepToolResult on the shim to match the
upstream pi surface.

Fixes #8161
2026-08-10 13:27:52 +00:00
roboomp cafa9930c8 fix(extensions): restored raw TypeBox object properties
- Reintroduced the legacy Object boundary as a normalizer that lifts direct raw JSON Schema properties into callable Unsafe schemas before delegating to omptype Object.
- Normalized raw additionalProperties schemas through the same path while retaining the no-allocation fast path for fully callable property maps.
- Added an extension-remap regression covering raw string properties mixed with optional runtime schemas.

Fixes #8143
2026-08-10 08:12:35 +00:00
roboomp 5e712d176d fix(extensions): preserve nested unsafe schema keywords
- Added type.withJsonSchema so a schema emits a raw JSON document verbatim even when embedded, surviving Type.Object/Type.Optional composition.
- Routed legacy Type.Unsafe through the authoritative JSON Schema validator and the IR-level emission override so JSON-Schema-only keywords (patternProperties, propertyNames, ...) stay in the nested wire schema and runtime no longer over-rejects pattern-matched keys.
- Isolated the emitted document from validator JIT annotations via a pristine clone.
- Updated the typebox remap test to assert the serialized ark wire.

Fixes #8143
2026-08-10 08:02:04 +00:00
roboomp e414585155 fix(extensions): preserved unsafe schemas during install
- Lifted legacy Type.Unsafe documents into callable omptype schemas so Optional and Object composition preserve validation and required fields.
- Ran installed extension factories against the normal throwaway loader surface before accepting a plugin install.
- Added regression coverage and documented the stronger rollback gate.

Fixes #8143
2026-08-10 07:37:28 +00:00
Evandro 2fa1c0f3b7 fix(coding-agent): preserve ArkType command API compatibility 2026-08-08 21:33:51 -03:00
can1357 e9888367d1 refactor: migrated packages to internal utility modules and removed external dependencies
- Implemented in-house, zero-dependency utility modules in `pi-utils` covering DOM manipulation, markdown parsing, templating, browser automation helpers, and terminal buffers.
- Migrated packages across the repository to consume the new internal utilities and `omptype` schema validators instead of external dependencies.
- Removed multiple external runtime and development dependencies including Zod, Marked, LRU cache, Turndown, and Puppeteer browser packages.
2026-08-05 13:39:09 +02:00
roboomp 2cfaa7adbc fix(coding-agent): restored legacy convertToPng export
- Restored the package-root image conversion contract through the legacy compatibility shim.

- Covered PNG passthrough, image conversion, and decoder failure behavior.

Fixes #7610
2026-08-04 07:31:16 +00:00
can1357 bc39ffa265 feat: introduced omptype validation package and migrated workspace dependencies
- Introduce `@oh-my-pi/omptype` as a new ArkType-compatible schema validation package featuring a lazy JIT runtime, JSON Schema emission, and compatibility adapters.
- Replace `arktype` across workspace packages and test utilities with `@oh-my-pi/omptype`.
- Add benchmark suites, tests, and documentation for the new validation engine and adapters.
- Update workspace build, test runner, and release configurations to include the new package.
2026-08-03 21:56:48 +02:00
can1357 0244e18e43 fix(extensions): refreshed formerly synchronous sources on reload walks
- A reload that drops a module's last require() edge leaves the permanent
  hooks serving it from the synchronous snapshot map, which was only
  refreshed while the path stayed flagged; an edit after the downgrade
  replayed stale bytes. Ensure now re-rewrites and refreshes the snapshot
  for every ever-synchronous path on each graph walk.
- Added the mirror reload regression (require edge dropped + source edited).
2026-08-03 05:42:07 +02:00
can1357 e1ac59e5df fix(extensions): served sync-upgraded modules from earlier async load hooks
- A reload that adds a require() edge to an already-hooked ESM module never
  re-registers hooks, and the original async onLoad filter keeps matching;
  require() rejects async onLoad results, so the async hook now serves the
  pre-rewritten synchronous source inline when one exists.
- Added a same-process reload regression covering the async-to-sync upgrade.
2026-08-03 05:33:06 +02:00
can1357 c83bff390d Merge PR #7406: fix(coding-agent): restore legacy compaction exports (@roboomp) 2026-08-03 05:26:10 +02:00
roboomp b53b1d1e65 fix(extensions): rewalked sync-upgraded ESM graphs
Requeued already-processed ESM modules when a later CommonJS require upgraded them to synchronous loading, propagating the sync marker through their descendants.

Added an end-to-end regression covering normal discovery before a lazy CommonJS require of the same ESM graph.

Fixes #7402
2026-08-02 22:17:59 +00:00
roboomp 326fee3387 fix(coding-agent): preserved legacy simple stream options
- Routed streamSimpleOpenAIResponses through the central simple-stream dispatcher.
- Added wire-level coverage for hidden reasoning summary translation.

Fixes #7403
2026-08-02 22:15:12 +00:00
roboomp fb62feeecf fix(extensions): retained lazy ESM sources
Kept pre-rewritten synchronous ESM sources available to permanent load hooks after the initial extension import settles, while refreshing them on reload.

Added an end-to-end regression for a CommonJS dependency that lazily requires a nested ESM cluster.

Fixes #7402
2026-08-02 22:09:44 +00:00
roboomp c34c2830ce fix(coding-agent): restored legacy compaction shims
- Re-exported serializeConversation from the legacy coding-agent package root.
- Aliased the upstream simple OpenAI Responses stream name to OMPs equivalent.
- Added regression coverage for both compatibility exports.

Fixes #7403
2026-08-02 22:03:20 +00:00
roboomp e682e25b24 fix(extensions): resolved compiled dependency graphs
Resolved nested ESM imports required by CommonJS packages, deterministic dual-package graph convergence, and package-main directory requires in compiled binaries.

Added focused graph-rewrite regressions and documented the fix.

Fixes #7402
2026-08-02 22:02:44 +00:00
can1357 be834905a6 test(extensions): tighten nested wildcard coverage 2026-08-01 20:13:39 +02:00
Harsha Vardhan 98f0c58224 fix(extensions): bundle nested wildcard export subpaths for compiled binaries
The compiled registry enumerated each `exports` wildcard with a single-level
glob and explicitly skipped any key containing a slash, so a nested subpath
like `slash-commands/helpers/active-oauth-account` never entered the bundled
registry. Node matches `*` across `/`, so that import is legitimate: it
resolves from source, then falls through to `Bun.resolveSync` inside a
compiled binary and dies under bunfs. Reproducible on the published 17.2.1
binary with a real extension (`quota-hud.ts`).

Enumeration is now recursive, with every path segment held to the same
private/hidden rules as the leaf, so a `.private/` or `_internal/` directory
is no more exported than a private file. Directory index modules stay
excluded: `./x/*` must not serve `x/y` from `y/index.ts`, which Node would
not resolve either.
2026-08-02 01:14:33 +10:00
roboomp 922e7a58ef fix(coding-agent): re-export compact from legacy pi shim
Legacy pi extensions import `compact` from the `@earendil-works/pi-coding-agent`
package root (aliased to the legacy shim). It lives in
`@oh-my-pi/pi-agent-core/compaction` (same module as the already-bridged
`estimateTokens`) and the coding-agent barrel does not forward it, so the shim's
`export * from "../index"` left it off the surface and a named import failed
Bun's static export check during plugin validation
(`omp plugin install npm:pi-claude-bridge`).

`keyHint` (also named in the report) already resolves via the modes/components
barrel, so only `compact` needed bridging.

Fixes #7174
2026-07-31 12:07:44 +00:00
roboomp 766ccbf24a fix(coding-agent): add createEditTool/createWriteTool to legacy pi shim
The legacy @oh-my-pi/pi-coding-agent shim exported the read/bash/grep/find/ls
tool factories but omitted the edit and write ones. pi extensions importing
createEditTool or createWriteTool (e.g. gentle-pi) failed Bun's static export
check during extension validation, blocking omp install.

Added createEditTool/createEditToolDefinition and createWriteTool/
createWriteToolDefinition, mirroring the upstream pi surface and the existing
sibling factories. The unsupported operations seam throws a descriptive error
like createGrepTool does.

Fixes #7094
2026-07-30 14:36:10 +00:00
Diogo Soares Rodrigues 6eaf090ccc fix(cursor): repair pi_edit and close the scoped-grep approval bypass
Three defects the exec bridge shipped with, all found by review.

`pi_edit` never worked. The session removes `edit` from the tool
registry for Cursor so the model is steered to full-file `write`
(8ba0498eb), but that same registry is the bridge's tool source, so the
native frame — which the server sends regardless of the advertised
catalog — resolved nothing and answered `Tool "edit" not available`.
Retaining the instance is not enough either: `PiEditExecArgs` carries
`old_text`/`new_text` pairs, which only `replace` accepts, while the
default mode is `hashline` (`{ input: string }`). `EditTool` now takes
an optional mode, and the bridge resolves a pinned `replace` instance
through its fallback resolver.

A `pi_grep` frame carrying `context` or `limit` escaped the approval
gate. Honoring those needs a per-call tool, and the per-call instance
was built raw while every registry tool is wrapped — so exactly those
calls skipped `tools.approval.grep` and the exec-tier SSH check. Both
callsites now go through one `createBridgeGrepFactory`.

Advisors ignored the same two fields: only the primary session supplied
the factory. They now get it too, gated on the advisor actually holding
`grep` so the factory cannot grant a denied tool.

Also moves the pure Pi arg translation to `providers/cursor-pi-args`.
The legacy shim shares it and is compiled into the bundled virtual
registry, where `./providers/*` cannot match a nested specifier — it
fell through to `Bun.resolveSync`, unsatisfiable under bunfs (#3442) —
and the exec module would have dragged the protobuf graph along.

Verified against real files and the real module graph: `pi_edit` mutates
a temp file, the bundled probe executes the shim's shared module in a
subprocess, and the grep test drives the shared factory. Mutation-
checked: returning a raw tool from the factory, ignoring the pinned edit
mode, dropping the `getTool` fallback, or moving the helpers back to a
nested path each fails a test.

(cherry picked from commit e46ba22b634e449005f7c22b6d0efd19a45ce1f8)
2026-07-30 01:42:23 +02:00
can1357 f2251b7d59 chore: normalize changelogs and formatting after merging open fixes 2026-07-29 23:09:40 +02:00
can1357 e0415a9e90 test: cover legacy pi CLI exports
(cherry picked from commit a0e11651f72a69c80486dffbb8dbdd96d6a382f5)
2026-07-29 23:08:25 +02:00
can1357 a0e53f73c0 Merge PR #6848: fix(coding-agent): restore isRetryableAssistantError in legacy pi-ai shim (@roboomp) 2026-07-28 10:59:35 +02:00
roboomp 846cd36d92 fix(coding-agent): bridge isContextOverflow in legacy pi-ai shim
Upstream @earendil-works/pi-ai re-exported isContextOverflow from its
package root, but omp's @oh-my-pi/pi-ai barrel forwards only
./error/rate-limit, so the shim's `export * from "@oh-my-pi/pi-ai"` left
it off the surface. Plugins importing it (pi-blackhole) tripped Bun's
static named-export check during validation, both on disk and through the
omp-legacy-pi-bundled: virtual namespace.

Audited the upstream root surface rather than fix one symbol at a time:
of its runtime exports only isContextOverflow (now under
@oh-my-pi/pi-ai/error) and parseJsonWithRepair/parseStreamingJson/
repairJson (relocated to @oh-my-pi/pi-utils) still exist in omp. Bridge
exactly that set through the shim and pin it with a regression test that
exercises each helper's behavior.

Fixes #6859
2026-07-28 05:34:20 +00:00
roboomp d4956e6de2 fix(coding-agent): restore isRetryableAssistantError in legacy pi-ai shim
Historical @earendil-works/pi-ai exports isRetryableAssistantError from its
package root (utils/retry.ts), but OMP's legacy-pi-ai-shim re-exports
@oh-my-pi/pi-ai, whose root never carried the symbol. Plugins importing it
(e.g. @router-for-me/pi-cliproxyapi-provider >= 1.4.9) failed Bun's static
named-export validation, rolling back install.

Port the upstream transient-error classifier into the shim, preserving the
provider-error wording tables so legacy retry semantics match.

Fixes #6847
2026-07-28 03:35:46 +00:00
omp-eval c8b37c8d2e fix(plugins): return bare Kitty delete sequences from legacy pi-tui shim
Upstream Pi's deleteKittyImage/deleteAllKittyImages return unwrapped control
sequences; legacy callers such as pi-sprite wrap tmux passthrough themselves.
Aliasing OMP's auto-wrapping encodeKittyDeleteImage (and hand-wrapping
deleteAllKittyImages) double-wrapped under tmux, so the outer terminal dropped
the delete command. Match the upstream bare-sequence contract and pin it in
the regression test.
2026-07-26 15:41:31 +02:00
can1357 5905ec0430 Merge PR #6507: fix(plugins): restore pi-sprite legacy compatibility (@roboomp) 2026-07-26 15:41:31 +02:00
can1357 e1b607f9ee Merge PR #6584: fix(coding-agent): re-export estimateTokens from legacy pi shim (@roboomp) 2026-07-26 15:41:30 +02:00
roboomp 52b5e7f838 fix(coding-agent): restored legacy pi automode compatibility
Restored the historical clampThinkingLevel export through the legacy pi-ai shim and exposed ModelRegistry.getApiKeyAndHeaders for extension request authentication.

Added compatibility and auth result regression coverage.

Fixes #6648
2026-07-25 22:14:11 +00:00
roboomp 7f1da393df fix(coding-agent): re-export estimateTokens from legacy pi shim
Legacy pi's @earendil-works/pi-coding-agent re-exported estimateTokens
from its coding-agent package root. In omp it lives in
@oh-my-pi/pi-agent-core/compaction and the coding-agent barrel does not
forward it, so the shim's `export * from "../index"` left it off the
surface. A named import tripped Bun's static export check during plugin
validation (e.g. `omp plugin install pi-blackhole`).

Re-export estimateTokens from the shim and pin it with a regression test.

Fixes #6583
2026-07-25 05:35:08 +00:00
roboomp c5685a0080 fix(plugins): restored pi-sprite legacy compatibility
- Added the legacy createExtensionRuntime adapter with fresh pre-bind state.

- Restored terminal capability and Kitty image deletion helpers required by pi-sprite.

- Covered package-root imports and runtime behavior with regression tests.

Fixes #6506
2026-07-24 11:18:20 +00:00
can1357 be94acbf71 fix(extensions): handle TypeScript import-equals require specifiers
Collect TSImportEqualsDeclaration/TSExternalModuleReference targets so
legacy .ts/.cts extensions using `import x = require("pkg")` get their
bare dependencies pinned like plain require() calls. Fold of the #6256
follow-up (comicchang/oh-my-pi@1e54b68) requested on #6324.
2026-07-23 11:37:12 +02:00
Jeff Scott Ward 0b9adcb4c8 fix(extensions): resolve transitive CJS deps
Preserve runtime package resolution in compiled binaries across CommonJS
dependency graphs and mixed-module packages.

Refs #6173
Co-authored-by: Comic Chang <comicchang@gmail.com>
2026-07-22 19:38:23 -04:00
Comic Chang 1ede6ae628 fix(extensions): load legacy plugins in compiled binaries 2026-07-22 18:42:14 -04:00
can1357 b9072f1991 fix(extensibility): validate Type.Unsafe against the draft-2020-12 upgraded schema
Aligns the shim's runtime safeParse/__validator with the wire/tool-call
path, so legacy draft-07 documents (tuple items) accept the same values
validateToolArguments does. Adds a regression test.
2026-07-22 21:13:21 +02:00
roboomp 040c1d5891 fix(extensibility): validated unsafe schemas at runtime
Used the shared JSON Schema validator for Type.Unsafe so direct safeParse calls and composed shim schemas reject invalid values while preserving valid input identity.

Added direct and composed runtime regression assertions.
2026-07-21 22:42:09 +00:00
roboomp 49e63c1f2c fix(extensibility): added Type.Unsafe to typebox shim
Preserved raw JSON Schema documents while keeping the shim validator identity-based, allowing provider wire conversion and runtime argument validation to consume MCP input schemas.

Added direct shim and remapped-extension regression coverage.

Fixes #6221
2026-07-21 22:34:44 +00:00
can1357 1bf08608a4 Merge PR #4964: fix(cli): resolve bundled extension imports (@roboomp)
# Conflicts:
#	packages/coding-agent/src/extensibility/plugins/legacy-pi-compat.ts
#	packages/coding-agent/src/main.ts
#	packages/coding-agent/src/prompts/system/workflow-notice.md
#	packages/coding-agent/test/extensibility/legacy-pi-bundled-virtual.test.ts
2026-07-20 22:53:16 +02:00
roboomp 5082763d49 fix(extensibility): guarantee string getPackageDir in compiled shim builds
omp's canonical getPackageDir() returns undefined inside a bun --compile
binary (import.meta.dir is /$bunfs/root, no owning package.json — issue
#1423). Re-exporting it directly broke pi's string-valued contract:
legacy extensions doing path.join(getPackageDir(), ...) crashed at
runtime in the shipped binary, the primary distribution.

Wrap the canonical helper so the shim always returns a string, falling
back to the executable's directory in compiled mode (where the binary is
the install root). PI_PACKAGE_DIR and dev/source/npm-dist walk-up still
win. Test covers the compiled-mode fallback via isCompiledBinary spy.

Fixes #5968
2026-07-18 06:50:00 +00:00
roboomp 4a25993682 fix(extensibility): re-export getPackageDir/getProjectDir from legacy pi shim
The legacy pi compatibility shim only forwarded getAgentDir (via
`export * from "../index"`). getProjectDir and getPackageDir were absent,
so any pi extension importing either from @earendil-works/pi-coding-agent
failed Bun's static export check during extension validation and the
install was rolled back.

Re-export getProjectDir from @oh-my-pi/pi-utils and getPackageDir from
omp's canonical config helper (returns the coding-agent package root,
matching pi semantics).

Fixes #5968
2026-07-18 06:41:55 +00:00
can1357 0f26558d03 chore: reformat 2026-07-17 07:40:21 +02:00
can1357 cf434411f6 merge PR #5744 via eval/pr-5744: fix(tui): reinstated host stdin listeners removed during tool load 2026-07-17 04:40:04 +02:00