Commit Graph

3202 Commits

Author SHA1 Message Date
diegosouzapw
e57cf437db feat(kiro): isolate OAuth sessions per connection for multi-account support (#2328) 2026-05-19 10:50:50 -03:00
diegosouzapw
6756006b4f feat(errors): expose sanitized upstream error details in client responses (#1718) 2026-05-19 10:50:01 -03:00
diegosouzapw
3355920db9 feat(installer): detect Termux and skip incompatible setup steps (#1764) 2026-05-19 10:43:11 -03:00
diegosouzapw
ae07f437b1 fix(providers): add missing isLocalProvider import and update changelog 2026-05-19 10:12:56 -03:00
clousky2020
2ae523b12c feat(T07): API Key health tracking with A3 guard, dashboard notification, and toast navigation fixes (#2412)
Integrated into release/v3.8.0
2026-05-19 09:50:51 -03:00
Benson K B
6959e067fa Merge branch 'main' resolving upstream conflicts (#2408)
Integrated into release/v3.8.0
2026-05-19 09:48:16 -03:00
Paijo
81fb3f50e8 feat: gamification & leaderboard system (#2405)
Integrated into release/v3.8.0
2026-05-19 09:46:20 -03:00
diegosouzapw
4b2e9b780a fix(db): detect missing better-sqlite3 native binding from bun/skipped postinstall (#2358)
`bun add -g omniroute` (and any runtime that does not reliably run the
better-sqlite3 postinstall script) leaves the *.node binary undownloaded.
The `bindings()` loader then throws "Could not locate the bindings file"
BEFORE any DLOPEN happens, which the previous detector missed — the user
saw a generic 500 page instead of the friendly "Run npm rebuild
better-sqlite3" guide.

Extended isNativeSqliteLoadError() to recognise:
- "Could not locate the bindings file" (bindings module preflight)
- "Cannot find module 'better-sqlite3'" (package not even installed)
- code === "MODULE_NOT_FOUND" (Node loader fallback)

isNativeSqliteLoadError is now exported so tests can pin the contract; the
detector covers both the "wrong NODE_MODULE_VERSION" and "binary never
shipped" failure modes operators have hit in practice.
2026-05-19 04:05:36 -03:00
diegosouzapw
ca42874098 fix(providers): skip CLI runtime check for kilocode OAuth-based provider (#2404)
The kilocode provider uses OAuth device flow + direct HTTPS to api.kilo.ai
and never depends on the local kilocode CLI binary at runtime. The connection
test was hard-failing with "Local CLI runtime is not installed" even when the
OAuth token itself was perfectly valid, blocking all kilocode setups on hosts
where the CLI binary was not also installed.

Removed kilocode from CLI_RUNTIME_PROVIDER_MAP and extracted the constant to
a dedicated module so unit tests can pin the contract without dragging the
full Next.js route + DB initialization into the test runtime.

CLI Tools integration (/api/cli-tools/kilo-settings, used to configure the
Kilo VSCode extension to point at OmniRoute) keeps its own runtime check
since it actually does need the CLI binary to be present.
2026-05-19 04:04:26 -03:00
diegosouzapw
266dd038f1 docs(changelog): add feature-triage entry 2026-05-19 03:39:26 -03:00
diegosouzapw
6f6837d070 fix(triage): replace timelineItems with separate gh pr open search
Remove the unsupported `timelineItems` field from `ghIssueView`, add
`ghPrSearchOpen` wrapper, and synthesize `issue.timelineItems` in the
main loop so `classifyIssue` stays unchanged.
2026-05-19 03:33:58 -03:00
diegosouzapw
7c11b952a7 feat(skill,command): mirror Phase 0 + templates from workflow
Sync body of .agents/skills/implement-features/SKILL.md and
.claude/commands/implement-features-cc.md with the canonical
.agents/workflows/implement-features-ag.md (Phase 0 pre-flight
triage + comment templates already applied in the workflow file).
SKILL.md Codex Execution Notes section preserved.
2026-05-19 03:26:04 -03:00
diegosouzapw
2e3b6d0bc6 feat(workflow): add Phase 0 pre-flight triage + new templates
Inserts Phase 0 (deterministic triage gate), collapses Phase 1.1/1.2
into stubs, replaces Phase 1.3 issue-fetch with triage-JSON iteration,
adds YAML frontmatter to idea-file template, adds 4 comment templates
(ALREADY_DELIVERED ×3 + STALE_NEED_DETAILS), expands Phase 3.1a table
to 12 verdict rows, and extends Phase 5.4 counters to cover all triage
buckets.
2026-05-19 03:22:42 -03:00
diegosouzapw
639061ac2f test(triage): add end-to-end integration test with mocked deps 2026-05-19 03:10:38 -03:00
diegosouzapw
1110ec9d37 feat(triage): add CLI entrypoint composing all triage modules 2026-05-19 03:07:00 -03:00
diegosouzapw
d3c187a62f feat(triage): add incremental resyncIdeaFile (append-only) 2026-05-19 03:02:51 -03:00
diegosouzapw
48c2d675fb feat(triage): add lifecycle detectors (stale + closed_externally) 2026-05-19 02:58:44 -03:00
diegosouzapw
f74d276e50 feat(triage): add minimal YAML frontmatter parser/serializer 2026-05-19 02:54:21 -03:00
diegosouzapw
48235a3c66 feat(triage): add resolveVersion for delivered-issue tagging 2026-05-19 02:50:26 -03:00
diegosouzapw
3fbec5065e feat(triage): add detectDelivered with confidence grading 2026-05-19 02:45:31 -03:00
diegosouzapw
8cca3630ae fix(triage): use word-boundary matching in parseChangelog per spec 2026-05-19 02:41:38 -03:00
diegosouzapw
22400a4f86 feat(triage): add CHANGELOG parser for delivery detection 2026-05-19 02:31:47 -03:00
diegosouzapw
6b05fb7906 feat(triage): add classifyIssue with quarantine + engagement override 2026-05-19 02:20:30 -03:00
diegosouzapw
b34dc46bd0 fix(triage): clarify JSON parse errors in gh wrapper 2026-05-19 02:16:01 -03:00
diegosouzapw
b9c78d192a docs(changelog): add post-release hotfixes section + extended Hall of Fame
Closes the gap between the v3.8.0 cut (PR #2323) and the current state of
release/v3.8.0 by listing 24 PRs that landed after the initial release and
crediting every contributor that was missing from the Hall of Fame table.

Added entries cover:
- 4 security hotfixes (CodeQL #243-247 + Kiro Google OAuth)
- 4 dependency bumps (mermaid, electron, prod/dev groups)
- 9 dashboard/CLI/codex features
- 3 Claude/OAuth fixes
- README acknowledgment restore

Extended Hall of Fame credits new contributors @terence71-glitch, @TF0rd,
@slider23, @t-way666, @Rikonorus, @8mbe and updates PR tallies for
@oyi77, @backryun, @thepigdestroyer, @mrmm, @dhaern, @hartmark, @gleber,
@congvc-dev, @herjarsa, @payne0420, @InkshadeWoods.
2026-05-19 01:51:57 -03:00
diegosouzapw
4b3009ad7d feat(triage): add injectable gh/git CLI wrappers 2026-05-19 01:46:19 -03:00
diegosouzapw
cfd2e19267 feat(triage): add args parser with env var fallback 2026-05-19 01:37:28 -03:00
diegosouzapw
7ba05fdae5 chore(triage): ignore _ideia/_triage.json artifact 2026-05-19 01:33:47 -03:00
diegosouzapw
3957c4d76b chore: merge main into release/v3.8.0
Sincroniza release/v3.8.0 com tudo aplicado em main:
- CodeQL #243/#244/#245 (PR #2391)
- CodeQL #246 HMAC sessionPoolKey (PR #2394)
- CodeQL #247 drop hashing sessionPoolKey (PR #2396)
- Restore 9router acknowledgment (PR #2393)
- Dependabot: electron 42.1.0 (PR #2397)
- Dependabot: production group bumps (PR #2398)
- Dependabot: development group bumps (PR #2399)
2026-05-19 01:22:47 -03:00
Diego Rodrigues de Sa e Souza
5fcccc7364 Merge pull request #2399 from diegosouzapw/dependabot/npm_and_yarn/development-04962ea3c9
deps: bump the development group with 4 updates
2026-05-19 01:18:28 -03:00
Diego Rodrigues de Sa e Souza
70d55664ee Merge pull request #2398 from diegosouzapw/dependabot/npm_and_yarn/production-527605266c
deps: bump the production group with 4 updates
2026-05-19 01:18:16 -03:00
Diego Rodrigues de Sa e Souza
1410c50fa1 Merge pull request #2397 from diegosouzapw/dependabot/npm_and_yarn/electron/electron-42.1.0
deps: bump electron from 42.0.1 to 42.1.0 in /electron
2026-05-19 01:18:01 -03:00
dependabot[bot]
e1cde147df deps: bump the development group with 4 updates
Bumps the development group with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react), [lint-staged](https://github.com/lint-staged/lint-staged) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@types/node` from 25.7.0 to 25.9.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitejs/plugin-react` from 6.0.1 to 6.0.2
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.2/packages/plugin-react)

Updates `lint-staged` from 17.0.4 to 17.0.5
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v17.0.4...v17.0.5)

Updates `typescript-eslint` from 8.59.3 to 8.59.4
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development
- dependency-name: lint-staged
  dependency-version: 17.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development
- dependency-name: typescript-eslint
  dependency-version: 8.59.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 03:49:30 +00:00
dependabot[bot]
2ebc84ea77 deps: bump the production group with 4 updates
Bumps the production group with 4 updates: [ink](https://github.com/vadimdemedes/ink), [react-reconciler](https://github.com/facebook/react/tree/HEAD/packages/react-reconciler), [tsx](https://github.com/privatenumber/tsx) and [undici](https://github.com/nodejs/undici).


Updates `ink` from 5.2.1 to 7.0.3
- [Release notes](https://github.com/vadimdemedes/ink/releases)
- [Commits](https://github.com/vadimdemedes/ink/compare/v5.2.1...v7.0.3)

Updates `react-reconciler` from 0.31.0 to 0.33.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/react-reconciler)

Updates `tsx` from 4.22.0 to 4.22.2
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.22.0...v4.22.2)

Updates `undici` from 8.2.0 to 8.3.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v8.2.0...v8.3.0)

---
updated-dependencies:
- dependency-name: ink
  dependency-version: 7.0.3
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: production
- dependency-name: react-reconciler
  dependency-version: 0.33.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production
- dependency-name: tsx
  dependency-version: 4.22.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production
- dependency-name: undici
  dependency-version: 8.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 03:48:21 +00:00
dependabot[bot]
61de0c709a deps: bump electron from 42.0.1 to 42.1.0 in /electron
Bumps [electron](https://github.com/electron/electron) from 42.0.1 to 42.1.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v42.0.1...v42.1.0)

---
updated-dependencies:
- dependency-name: electron
  dependency-version: 42.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 03:47:57 +00:00
Diego Rodrigues de Sa e Souza
e463d7945f Merge pull request #2396 from diegosouzapw/fix/codeql-247-no-hash
fix(security): drop hashing in sessionPoolKey to clear CodeQL #247
2026-05-19 00:27:28 -03:00
diegosouzapw
10c8f32bd9 fix(security): drop hashing in sessionPoolKey to clear CodeQL #247
CodeQL re-flagged the HMAC variant from #2394 at high severity (#247) —
its data-flow analysis still sees an OAuth bearer reaching .update(token)
and applies js/insufficient-password-hash, regardless of whether the hash
primitive is createHash or createHmac.

Stop hashing the token at all. The session-pool Map is keyed by the
token verbatim, falling back to "anonymous" when the input is missing
or empty. This is safe because:

  - The token is already held in CopilotSession.cookies for every pool
    entry, so the Map key adds no new in-memory exposure.
  - The pool is bounded by MAX_POOL_SIZE with LRU eviction, so memory
    stays bounded regardless of how many distinct tokens appear.
  - bcrypt/scrypt/argon2 — the only forms CodeQL accepts here — are the
    wrong tool, since their slowness exists to thwart brute-force of
    low-entropy human passwords we do not have.

Tests
- Replace the "16-char hex" shape assertion with verbatim-equality
  assertions and an explicit "empty string → anonymous" case.
- Keep the regression guard that fails if anyone ever re-introduces
  createHash/createHmac on the token (catches the alert reappearing
  before CodeQL does).
- 16/16 copilot-web tests pass.
2026-05-19 00:26:17 -03:00
Diego Rodrigues de Sa e Souza
cfa948fd9a Merge pull request #2394 from diegosouzapw/fix/codeql-246-hmac
fix(security): switch sessionPoolKey to HMAC to clear CodeQL #246
2026-05-18 23:54:27 -03:00
diegosouzapw
6fcc99ba26 fix(security): switch sessionPoolKey to HMAC to clear CodeQL #246
CodeQL re-flagged the SHA-256 inside sessionPoolKey at high severity even
after the rename/dedup in #2391 — its data-flow analysis still tracks the
OAuth bearer (accessToken → token) into createHash and applies the
js/insufficient-password-hash rule. Bcrypt/scrypt/argon2 would be wrong
here (the input is a high-entropy bearer, not a low-entropy human password
that needs brute-force protection).

Switch to HMAC-SHA-256 with a process-scope key generated at startup
(randomBytes(32)). HMAC is a MAC primitive, not a password hash, so the
CodeQL rule no longer applies; uniqueness, determinism-within-process,
and the 16-char hex shape all still hold, and as a small bonus an
off-process attacker can no longer precompute pool keys from a token
alone.

Tests
- Replace the "exact SHA-256 prefix" assertion with shape/uniqueness
  checks and a regression guard that fails if the implementation ever
  reverts to plain createHash.
- All 15 copilot-web tests pass.
2026-05-18 23:53:16 -03:00
Cong Vu Chi
65105feeaf fix(kiro): enable Google OAuth login option (#2392)
Integrated into release/v3.8.0 — enables Google OAuth login button in Kiro auth modal
2026-05-18 23:44:04 -03:00
Diego Rodrigues de Sa e Souza
205ef64ac4 Merge pull request #2393 from diegosouzapw/chore/restore-9router-acknowledgment
docs(readme): restore 9router acknowledgment
2026-05-18 23:42:37 -03:00
diegosouzapw
595e9e3b1f docs(readme): restore 9router acknowledgment
Re-adds the "Special thanks to 9router by decolua" line at the top of the
Acknowledgments section. The reference was present through v3.7.x and was
inadvertently dropped during a docs cleanup; OmniRoute is a TypeScript
rewrite that originally built on 9router's design, so this credit belongs
alongside the other "inspired-by" entries (CLIProxyAPI, Caveman, RTK).
2026-05-18 23:41:42 -03:00
Diego Rodrigues de Sa e Souza
12b34d4a93 Merge pull request #2391 from diegosouzapw/fix/codeql-243-244-245
fix(security): resolve CodeQL alerts #243/#244/#245
2026-05-18 23:40:05 -03:00
diegosouzapw
fec6164e92 fix(security): resolve CodeQL alerts #243/#244/#245
#243 (js/request-forgery, high) — providers/bulk/route.ts
- Replace `fetch(\${origin}/api/providers/validate)` (where origin came from
  spoofable `new URL(request.url).origin`) with a direct in-process call to
  validateProviderApiKey. Eliminates the SSRF vector and the HTTP round-trip
  through the same app.
- Resolve proxy once outside the loop and reuse via runWithProxyContext.
- Drop now-unused passthroughAuthHeaders helper.

#244 (js/resource-exhaustion, warn) — copilot-web.ts::solveHashcash
- Clamp upstream-supplied `difficulty` to [1, 8] before `"0".repeat(difficulty)`
  so a malicious/buggy server can't force a huge prefix allocation or push the
  10M-iteration loop into effectively unbounded work.

#245 (js/insufficient-password-hash, warn) — copilot-web.ts::getSession
- Dedupe the inline `createHash("sha256").update(accessToken)` call by reusing
  the existing sessionPoolKey helper.
- Rename its parameter from `accessToken` to `token` and document that the
  input is a high-entropy OAuth bearer used only as an in-memory Map key —
  bcrypt/scrypt/argon2 would be incorrect here, and SHA-256:16 is an
  appropriate fingerprint per docs/security/PUBLIC_CREDS.md.

Tests
- Export solveHashcash and add unit tests asserting it returns null for
  out-of-range / non-integer difficulty and produces a numeric nonce for the
  common difficulty=1 case.
- All 26 tests in copilot-web-executor.test.ts and providers-bulk-route.test.ts
  continue to pass; sessionPoolKey contract (SHA-256:16) preserved.
2026-05-18 23:27:34 -03:00
Diego Rodrigues de Sa e Souza
c24b0f9569 Merge pull request #2323 from diegosouzapw/release/v3.8.0
Release v3.8.0 — next development cycle
2026-05-18 22:59:48 -03:00
Paijo
0de964d42b feat(providers): add Gemini Web cookie-based provider (#2380)
Integrated into release/v3.8.0 — adds Gemini Web cookie-based provider with error sanitization fix applied
2026-05-18 22:55:49 -03:00
backryun
f43badc3d4 model: Add Composer 2.5 to Cursor Provider (#2381)
Integrated into release/v3.8.0 — adds Composer 2.5 models to Cursor provider and updates CLI fingerprints
2026-05-18 22:53:27 -03:00
Paijo
3394ded6bb fix: tool_use without adjacent tool_result causes Claude 400 (#2383)
Integrated into release/v3.8.0 — fixes Claude 400 error for non-adjacent tool_use/tool_result messages
2026-05-18 22:52:50 -03:00
Diego Rodrigues de Sa e Souza
fa3ee31f06 fix(dashboard): address PR #2384 follow-up review issues (#2389)
- BudgetTab: compute projectionOverBudget per key (HIGH)
- ProviderLimits: convert outer button to div role=button to fix invalid HTML nesting
- Runtime: externalize all strings via next-intl (runtime namespace)
- QuotaShare: externalize all strings via next-intl (quotaShare namespace)
- Add /api/usage/budget/bulk endpoint and switch BudgetTab to single fetch (avoid N+1)

Co-authored-by: diegosouzapw <diego.souza.pw@gmail.com>
2026-05-18 22:52:13 -03:00
diegosouzapw
3470be891e fix(ci): update pack-artifact-policy to allow new cli-helper and opencode-provider paths
New files added via package.json files[] field in the cli-tools feature:
  - src/lib/cli-helper/ (config generators, doctor checks, log-streamer, tool-detector)
  - @omniroute/opencode-provider/ (workspace package published alongside)
  - scripts/postinstall.mjs and scripts/build/sync-env.mjs (new install scripts)
2026-05-18 19:59:09 -03:00