| Files | Last commit | Last update |
|---|---|---|
fix(cli): reject empty/non-decimal --port and --host, ignore invalid env values (#1125) * fix(cli): reject empty/non-decimal --port and --host, ignore invalid env values Number('') is 0, so '--port=' and THINKRAIL_PORT='' silently selected port 0, and values like 0x10 or out-of-range env ports were accepted. Parse ports as strict decimals (0-65535), reject empty --host, and fall back to defaults for invalid THINKRAIL_PORT/THINKRAIL_HOST. Adds tests and updates apps/cli/SPEC.md. * docs(cli): restore the analytics sentence in SPEC --------- Co-authored-by: Rinat S <rinat.suleimanov@jetbrains.com> | 16 hours ago | |
fix(cli): reject empty/non-decimal --port and --host, ignore invalid env values (#1125) * fix(cli): reject empty/non-decimal --port and --host, ignore invalid env values Number('') is 0, so '--port=' and THINKRAIL_PORT='' silently selected port 0, and values like 0x10 or out-of-range env ports were accepted. Parse ports as strict decimals (0-65535), reject empty --host, and fall back to defaults for invalid THINKRAIL_PORT/THINKRAIL_HOST. Adds tests and updates apps/cli/SPEC.md. * docs(cli): restore the analytics sentence in SPEC --------- Co-authored-by: Rinat S <rinat.suleimanov@jetbrains.com> | 16 hours ago | |
feat(website): add consented journey analytics foundation (#524) * Update website analytics specs for settled mechanics * feat(website): add consented journey analytics foundation * fix(website): clear journey enrichment when consent becomes unknown * feat(website): instrument attribution events (#526) * feat(website): instrument attribution events * test(website): cover unattributed install events * feat(website): persist campaign attribution context (#528) * feat(website): persist campaign attribution context * fix(website): import attribution through its public surface * fix(website): invalidate download bridge on new acquisition * fix(website): keep attribution context through unknown consent * feat(website): add attribution claim protocol core (#529) * feat(website): add attribution claim protocol core * feat(website): deploy browser attribution claims (#530) * feat(website): deploy browser attribution claims * fix(website): require confirmation before binding attribution claims * feat(analytics): add first-install lifecycle (#531) * feat(analytics): add first-install lifecycle * fix(analytics): claim first installs once across concurrent hosts * feat(analytics): link browser acquisition to product usage (#532) * feat(analytics): link browser acquisition to product usage * fix(analytics): revoke queued campaign basics and allow claim confirmation * test(analytics): verify website-to-product attribution contract (#534) * refactor(attribution): drop landing page key from claim touches * fix(website): keep attribution D1 out of preview deployments * fix(website): derive analytics keys from public page paths * test(website): validate analytics across every generated page * fix(website): guard analytics and assets on all built pages * refactor(website): drop extra build checks and simplify the 404 page * feat(website): link claims silently and open the blog * fix(web): describe website attribution in plain language * fix(web): avoid promising deletion in the attribution note * fix(web): describe the blog opening as conditional * adjusts wording * docs: align privacy specs with the simplified settings copy * fix(website): bind claims only with current Marketing consent * docs(web): drop removed privacy copy from the panels spec | 1 month ago | |
feat(website): add consented journey analytics foundation (#524) * Update website analytics specs for settled mechanics * feat(website): add consented journey analytics foundation * fix(website): clear journey enrichment when consent becomes unknown * feat(website): instrument attribution events (#526) * feat(website): instrument attribution events * test(website): cover unattributed install events * feat(website): persist campaign attribution context (#528) * feat(website): persist campaign attribution context * fix(website): import attribution through its public surface * fix(website): invalidate download bridge on new acquisition * fix(website): keep attribution context through unknown consent * feat(website): add attribution claim protocol core (#529) * feat(website): add attribution claim protocol core * feat(website): deploy browser attribution claims (#530) * feat(website): deploy browser attribution claims * fix(website): require confirmation before binding attribution claims * feat(analytics): add first-install lifecycle (#531) * feat(analytics): add first-install lifecycle * fix(analytics): claim first installs once across concurrent hosts * feat(analytics): link browser acquisition to product usage (#532) * feat(analytics): link browser acquisition to product usage * fix(analytics): revoke queued campaign basics and allow claim confirmation * test(analytics): verify website-to-product attribution contract (#534) * refactor(attribution): drop landing page key from claim touches * fix(website): keep attribution D1 out of preview deployments * fix(website): derive analytics keys from public page paths * test(website): validate analytics across every generated page * fix(website): guard analytics and assets on all built pages * refactor(website): drop extra build checks and simplify the 404 page * feat(website): link claims silently and open the blog * fix(web): describe website attribution in plain language * fix(web): avoid promising deletion in the attribution note * fix(web): describe the blog opening as conditional * adjusts wording * docs: align privacy specs with the simplified settings copy * fix(website): bind claims only with current Marketing consent * docs(web): drop removed privacy copy from the panels spec | 1 month ago | |
feat: unconditional PII-free PostHog error tracking with readable stacks (#769) * feat(analytics): report sanitized exceptions through the basic PostHog sink * feat(host): report crashes, failed requests and logged errors to error tracking * feat: forward UI errors to host error tracking over client.reportError * feat(desktop): forward handled main-process errors to host error tracking * docs: document unconditional sanitized error reports in specs, README and AGENTS.md * test(artifacts): tolerate allow-listed error reports in the desktop analytics probe * feat(analytics): keep raw frames and chunk ids for PostHog symbolication * feat(web): send PostHog chunk ids with client error reports * feat(cli): embed the binary's source map for readable error stacks * feat(release): upload web and desktop-runtime source maps to PostHog * test(release): pin source-map credential scoping in the build action * docs: document source-map upload and readable error stacks * fix(analytics): carry the report's handled flag into the root exception mechanism * docs: pin client error reports to protocol v90 after rebasing onto main * feat(analytics): send a classifier instead of error message text * fix(host): wait at most 1 s for the crash report and tag the crash kind * fix(desktop): derive runtime chunk ids from the code, its map and the release * build(release): run posthog-cli only after a pinned SHA-256 check of its binary * fix: report stable boundary ids, route main's new desktop errors and scope release credentials * fix(analytics): cut the message out of every stack before the SDK parses frames --------- Co-authored-by: danyaberezun <danya.berezun@gmail.com> | 16 days ago | |
feat: unconditional PII-free PostHog error tracking with readable stacks (#769) * feat(analytics): report sanitized exceptions through the basic PostHog sink * feat(host): report crashes, failed requests and logged errors to error tracking * feat: forward UI errors to host error tracking over client.reportError * feat(desktop): forward handled main-process errors to host error tracking * docs: document unconditional sanitized error reports in specs, README and AGENTS.md * test(artifacts): tolerate allow-listed error reports in the desktop analytics probe * feat(analytics): keep raw frames and chunk ids for PostHog symbolication * feat(web): send PostHog chunk ids with client error reports * feat(cli): embed the binary's source map for readable error stacks * feat(release): upload web and desktop-runtime source maps to PostHog * test(release): pin source-map credential scoping in the build action * docs: document source-map upload and readable error stacks * fix(analytics): carry the report's handled flag into the root exception mechanism * docs: pin client error reports to protocol v90 after rebasing onto main * feat(analytics): send a classifier instead of error message text * fix(host): wait at most 1 s for the crash report and tag the crash kind * fix(desktop): derive runtime chunk ids from the code, its map and the release * build(release): run posthog-cli only after a pinned SHA-256 check of its binary * fix: report stable boundary ids, route main's new desktop errors and scope release credentials * fix(analytics): cut the message out of every stack before the SDK parses frames --------- Co-authored-by: danyaberezun <danya.berezun@gmail.com> | 16 days ago | |
feat(extensions): ship web access as a ThinkRail extension whose switch also covers its skills (#965) * feat(extensions): ship web access as a ThinkRail extension whose switch also drops its skills * fix(extensions): keep a disabled extension's skills out of pi's inputs and reload again after a mid-reload toggle * fix(agent): keep web_search headless for a user's own pi-web-access while the web-access extension is off * fix(agent): reload again only when the extension policy moved during a reload | 10 days ago | |
feat(extensions): ship web access as a ThinkRail extension whose switch also covers its skills (#965) * feat(extensions): ship web access as a ThinkRail extension whose switch also drops its skills * fix(extensions): keep a disabled extension's skills out of pi's inputs and reload again after a mid-reload toggle * fix(agent): keep web_search headless for a user's own pi-web-access while the web-access extension is off * fix(agent): reload again only when the extension policy moved during a reload | 10 days ago | |
refactor(desktop): standardize Electrobun builds and isolate artifact tests (#443) * chore(desktop): upgrade Electrobun to 2.0.1 * chore: align the Bun toolchain and types to 1.4.0 * refactor(desktop): replace handwritten types with the official SDK * refactor(desktop): use framework builds and isolate artifact tests * ci: expose the expanded macOS app for private signing * docs(ci): align signing ownership with the private pipeline * docs(testing): record artifact collector contract ownership * docs(ci): preserve private action ownership after rebase | 1 month ago | |
feat(updates): add consent-driven update flows (#558) * docs(updates): define consent-driven update flows * docs(updates): define consent-driven update flows * feat(updates): add explicit native download flow * fix(updates): restore progress for fallback transfers * feat(updates): run CLI host updates from the UI * docs(transport): record host update capability * fix(updates): harden installer and self-update paths * fix(updates): bind mixed-case Windows executables * fix(updates): reject unbound binary layouts * test(updates): complete release scenario coverage * docs(updates): tighten update contracts * fix(updates): retain ready packages after late download failures * fix(updates): reject unsupported installation prefixes * fix(updates): reject delayed-expansion prefixes * refactor(updates): keep installer audit scoped * docs(updates): align host update protocol after rebase * fix(updates): allow safe Unicode install prefixes * docs(updates): record download cancellation limitation | 1 month ago | |
feat(updates): add consent-driven update flows (#558) * docs(updates): define consent-driven update flows * docs(updates): define consent-driven update flows * feat(updates): add explicit native download flow * fix(updates): restore progress for fallback transfers * feat(updates): run CLI host updates from the UI * docs(transport): record host update capability * fix(updates): harden installer and self-update paths * fix(updates): bind mixed-case Windows executables * fix(updates): reject unbound binary layouts * test(updates): complete release scenario coverage * docs(updates): tighten update contracts * fix(updates): retain ready packages after late download failures * fix(updates): reject unsupported installation prefixes * fix(updates): reject delayed-expansion prefixes * refactor(updates): keep installer audit scoped * docs(updates): align host update protocol after rebase * fix(updates): allow safe Unicode install prefixes * docs(updates): record download cancellation limitation | 1 month ago | |
fix(windows): stop console window flashes (#448) * todo: Apply windowsHide fix to affected spawn calls ThinkRail-Todo: 01a08104-c495-7083-bdef-a785ba4037ba/t_26a98b523886 * todo: Add windowsHide to jbcentral spawns (quota poll + login) ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_1b7077fac04f * todo: Add windowsHide to server spawns: dialog, editors, trash ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_6faf37140e27 * todo: Add windowsHide to CLI spawns: bootstrap browser open + detached powershell ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_052b9b40bfe0 * todo: Record the windows-hide invariant in the relevant SPEC(s) ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_5de6fa0928a6 * todo: Add shared spawn helpers over node:child_process (spawnSyncCaptured + spawnDetached) ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_2cadbc5853a6 * todo: Convert sync switch-flashers: gitExec.git() + shellBusy.childrenViaCim ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_891fe346f36a * todo: Convert runBounded to node:child_process spawn (preserve BoundedRun contract) ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_4be1923e206d * todo: Convert jbcentral runProcess + login, dialog picker, editors/bootstrap/powershell detached ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_6455e559f5ae * todo: Update specs: architecture invariant (real reason), subprocess SPEC, shared SPEC ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_d68cc06cfe82 * todo: Verify: typecheck + lint + unit tests (runBounded, shellBusy, dialog, editors, jbcentral non-win) ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_0742a4f9aa9d * todo: Review full PR diff, comments, and CI ThinkRail-Todo: 01a08153-fc27-7e1c-a971-36c0e43ce7b0/t_b86c6620881a * fix(windows): handle detached spawn launch errors * fix(windows): use Bun native hidden spawn | 1 month ago | |
Add review clearing and chat deletion (#218) * review shipped — drop from V2 deferred list * add review clear and chat trash * fix deleted chats reappearing * fix(server): keep chat deletion recoverable * fix(review): converge clear across clients * fix(binary): bundle Linux trash parser * fix(binary): stage OS-trash helpers * fix(agent): retain chats when trash fails * fix(review): archive records on clear * fix(web): reconcile chats after reconnect * test(e2e): close socket in reconnect coverage * docs(spec): record review in V1 scope * fix(agent): fail closed on transcript lookup * fix(agent): reject live commands during a chat delete * fix(agent): single-flight chat deletion * fix(web): keep Clear available for a fully-finished review | 2 months ago | |
feat(updates): add consent-driven update flows (#558) * docs(updates): define consent-driven update flows * docs(updates): define consent-driven update flows * feat(updates): add explicit native download flow * fix(updates): restore progress for fallback transfers * feat(updates): run CLI host updates from the UI * docs(transport): record host update capability * fix(updates): harden installer and self-update paths * fix(updates): bind mixed-case Windows executables * fix(updates): reject unbound binary layouts * test(updates): complete release scenario coverage * docs(updates): tighten update contracts * fix(updates): retain ready packages after late download failures * fix(updates): reject unsupported installation prefixes * fix(updates): reject delayed-expansion prefixes * refactor(updates): keep installer audit scoped * docs(updates): align host update protocol after rebase * fix(updates): allow safe Unicode install prefixes * docs(updates): record download cancellation limitation | 1 month ago | |
feat(updates): add consent-driven update flows (#558) * docs(updates): define consent-driven update flows * docs(updates): define consent-driven update flows * feat(updates): add explicit native download flow * fix(updates): restore progress for fallback transfers * feat(updates): run CLI host updates from the UI * docs(transport): record host update capability * fix(updates): harden installer and self-update paths * fix(updates): bind mixed-case Windows executables * fix(updates): reject unbound binary layouts * test(updates): complete release scenario coverage * docs(updates): tighten update contracts * fix(updates): retain ready packages after late download failures * fix(updates): reject unsupported installation prefixes * fix(updates): reject delayed-expansion prefixes * refactor(updates): keep installer audit scoped * docs(updates): align host update protocol after rebase * fix(updates): allow safe Unicode install prefixes * docs(updates): record download cancellation limitation | 1 month ago | |
feat(updates): add consent-driven update flows (#558) * docs(updates): define consent-driven update flows * docs(updates): define consent-driven update flows * feat(updates): add explicit native download flow * fix(updates): restore progress for fallback transfers * feat(updates): run CLI host updates from the UI * docs(transport): record host update capability * fix(updates): harden installer and self-update paths * fix(updates): bind mixed-case Windows executables * fix(updates): reject unbound binary layouts * test(updates): complete release scenario coverage * docs(updates): tighten update contracts * fix(updates): retain ready packages after late download failures * fix(updates): reject unsupported installation prefixes * fix(updates): reject delayed-expansion prefixes * refactor(updates): keep installer audit scoped * docs(updates): align host update protocol after rebase * fix(updates): allow safe Unicode install prefixes * docs(updates): record download cancellation limitation | 1 month ago | |
feat(updates): add consent-driven update flows (#558) * docs(updates): define consent-driven update flows * docs(updates): define consent-driven update flows * feat(updates): add explicit native download flow * fix(updates): restore progress for fallback transfers * feat(updates): run CLI host updates from the UI * docs(transport): record host update capability * fix(updates): harden installer and self-update paths * fix(updates): bind mixed-case Windows executables * fix(updates): reject unbound binary layouts * test(updates): complete release scenario coverage * docs(updates): tighten update contracts * fix(updates): retain ready packages after late download failures * fix(updates): reject unsupported installation prefixes * fix(updates): reject delayed-expansion prefixes * refactor(updates): keep installer audit scoped * docs(updates): align host update protocol after rebase * fix(updates): allow safe Unicode install prefixes * docs(updates): record download cancellation limitation | 1 month ago | |
M15: CLI host bin + browser open (apps/cli) (#10) * M15: CLI host bin + browser open (apps/cli) The `thinkrail-pi` bin now boots the engine host in-process and opens the browser, replacing the M0 `createServer()` stub. - apps/cli/src/args.ts: pure parseArgs(argv, env) -> CliOptions + USAGE (--port/--host with =value form, --no-open, -h/--help, positional project-dir, THINKRAIL_PI_PORT/_HOST/_STATIC_DIR fallbacks, validation). - apps/cli/src/index.ts: bootstrap() — resolveShellEnv first; resolve static dir; createServer with EADDRINUSE fallback to an OS-assigned port; log URL + cross-platform browser open (open/start/xdg-open) unless --no-open; SIGINT/SIGTERM -> server.stop() -> exit. - apps/cli/src/args.test.ts: 12 unit tests for parseArgs. - server/host/server.ts: stop() now disposes agent sessions (+ terminals), matching the host SPEC; added optional boot-time projectPath (best-effort openProject; non-repo is a warning, not a boot failure). - apps/cli/package.json: add @thinkrail-pi/shared dep + test script. - Specs updated (apps/cli/SPEC.md draft->active, host/SPEC.md); dev.ts comment. Verified: lint, typecheck, unit tests (incl. 12 new), no-agent e2e (13/13), and bin smoke tests (serves /health + SPA + deep-route fallback, --help/exit codes, port-collision fallback, project-dir open + non-repo warning, clean SIGTERM shutdown). * apps/cli: single-file binary build + disable image autoResize (no photon) Ship a truly self-contained `thinkrail-pi` executable and keep image-read working without bundling photon's WASM resizer. Server (agent): - buildSessionSettings(cwd): the user's real settings + an in-memory `images.autoResize:false` override (applyOverrides — never persisted), passed to every createAgentSession (new + disk-reopen). The read tool now sends image files raw, so image-read needs no photon (its wasm can't be bundled into the single-file binary). The web UI downsizes user-attached images itself. - unit test: buildSessionSettings(...).getImageAutoResize() === false. CLI binary (apps/cli): - scripts/build-binary.ts: enumerate apps/web/dist, write a transient web-assets.generated.ts (a `with { type: "file" }` import per asset + a {route,data}[] manifest + content-hash version), `bun build --compile` src/compiled-entry.ts, then delete the generated file. `--target` passes through for cross-compile; each target bundles its bun-pty lib. - src/compiled-entry.ts: stage embedded web files to a per-build cache dir (XDG_CACHE_HOME/~/.cache/temp, idempotent), set THINKRAIL_PI_STATIC_DIR, hand off to index.ts. bun-pty self-extracts automatically; no photon wasm. - src/web-assets.generated.d.ts: committed type contract (tsc resolves it when the generated .ts is absent); the .ts is gitignored + tsconfig-excluded. - package.json: `build:binary` (cli + root); .gitignore the generated manifest. Verified: lint, typecheck, unit tests (15), no-agent e2e (13), `bun run build`, and the produced single-file binary booted ALONE from a clean dir (no node_modules) serving /health + the ThinkRail SPA + hashed JS assets, staging the UI to the cache dir, exiting cleanly on SIGTERM. | 4 months ago |
| Files | Last commit | Last update |
|---|---|---|
| 16 hours ago | ||
| 16 hours ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 16 days ago | ||
| 16 days ago | ||
| 10 days ago | ||
| 10 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 4 months ago |