@open-mercato/cezar 0.9.1 → 0.9.2-pr710.1256
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/LICENSE +21 -0
- package/README.md +157 -32
- package/dist/agent-config/account-identity.d.ts +44 -0
- package/dist/agent-config/account-identity.js +128 -0
- package/dist/agent-config/account-identity.js.map +1 -0
- package/dist/agent-config/catalog.d.ts +9 -1
- package/dist/agent-config/catalog.js +18 -0
- package/dist/agent-config/catalog.js.map +1 -1
- package/dist/agent-config/files.d.ts +1 -1
- package/dist/agent-config/model-settings/claude.d.ts +2 -0
- package/dist/agent-config/model-settings/claude.js +11 -0
- package/dist/agent-config/model-settings/claude.js.map +1 -0
- package/dist/agent-config/model-settings/codex.d.ts +2 -0
- package/dist/agent-config/model-settings/codex.js +16 -0
- package/dist/agent-config/model-settings/codex.js.map +1 -0
- package/dist/agent-config/model-settings/opencode.d.ts +2 -0
- package/dist/agent-config/model-settings/opencode.js +8 -0
- package/dist/agent-config/model-settings/opencode.js.map +1 -0
- package/dist/agent-config/model-settings/pi.d.ts +12 -0
- package/dist/agent-config/model-settings/pi.js +18 -0
- package/dist/agent-config/model-settings/pi.js.map +1 -0
- package/dist/agent-config/model-settings/shared.d.ts +9 -0
- package/dist/agent-config/model-settings/shared.js +93 -0
- package/dist/agent-config/model-settings/shared.js.map +1 -0
- package/dist/agent-config/model-settings/types.d.ts +9 -0
- package/dist/agent-config/model-settings/types.js +2 -0
- package/dist/agent-config/model-settings/types.js.map +1 -0
- package/dist/agent-config/models.d.ts +9 -0
- package/dist/agent-config/models.js +32 -0
- package/dist/agent-config/models.js.map +1 -0
- package/dist/agent-config/service.d.ts +1 -1
- package/dist/agent-config/service.js +4 -4
- package/dist/agent-config/service.js.map +1 -1
- package/dist/agent-config/validate.d.ts +1 -1
- package/dist/automations/coordinator.d.ts +26 -0
- package/dist/automations/coordinator.js +66 -0
- package/dist/automations/coordinator.js.map +1 -0
- package/dist/automations/github-poller.d.ts +74 -0
- package/dist/automations/github-poller.js +234 -0
- package/dist/automations/github-poller.js.map +1 -0
- package/dist/automations/scheduler.d.ts +42 -0
- package/dist/automations/scheduler.js +192 -0
- package/dist/automations/scheduler.js.map +1 -0
- package/dist/automations/store.d.ts +65 -0
- package/dist/automations/store.js +298 -0
- package/dist/automations/store.js.map +1 -0
- package/dist/automations/task-template.d.ts +18 -0
- package/dist/automations/task-template.js +95 -0
- package/dist/automations/task-template.js.map +1 -0
- package/dist/automations/types.d.ts +255 -0
- package/dist/automations/types.js +159 -0
- package/dist/automations/types.js.map +1 -0
- package/dist/config.d.ts +19 -112
- package/dist/config.js +48 -5
- package/dist/config.js.map +1 -1
- package/dist/contract/agent-config.d.ts +153 -0
- package/dist/contract/agent-profiles.d.ts +347 -0
- package/dist/contract/automations.d.ts +935 -0
- package/dist/contract/events.d.ts +104 -0
- package/dist/contract/github.d.ts +467 -0
- package/dist/contract/health.d.ts +102 -0
- package/dist/contract/index.d.ts +16 -0
- package/dist/contract/index.js +1830 -0
- package/dist/contract/projects.d.ts +210 -0
- package/dist/contract/repo.d.ts +234 -0
- package/dist/contract/runs.d.ts +1407 -0
- package/dist/contract/skills.d.ts +232 -0
- package/dist/contract/workflows.d.ts +218 -0
- package/dist/contract/workspace.d.ts +577 -0
- package/dist/core/agent-env.d.ts +1 -1
- package/dist/core/agent-env.js +41 -16
- package/dist/core/agent-env.js.map +1 -1
- package/dist/core/agent-model-policy.d.ts +10 -0
- package/dist/core/agent-model-policy.js +36 -0
- package/dist/core/agent-model-policy.js.map +1 -0
- package/dist/core/agent-profiles.d.ts +62 -0
- package/dist/core/agent-profiles.js +90 -0
- package/dist/core/agent-profiles.js.map +1 -0
- package/dist/core/agent-runner.d.ts +49 -7
- package/dist/core/agent-runner.js +48 -3
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/ask.d.ts +45 -124
- package/dist/core/ask.js +103 -13
- package/dist/core/ask.js.map +1 -1
- package/dist/core/backend-detect.d.ts +5 -5
- package/dist/core/backend-detect.js +44 -7
- package/dist/core/backend-detect.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +2 -2
- package/dist/core/claude-cli-runner.js +61 -13
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/claude-ui-mapper.d.ts +1 -1
- package/dist/core/codex-app-server-runner.d.ts +1 -1
- package/dist/core/codex-app-server-runner.js +65 -3
- package/dist/core/codex-app-server-runner.js.map +1 -1
- package/dist/core/codex-app-server-transport.d.ts +6 -1
- package/dist/core/codex-app-server-transport.js +17 -3
- package/dist/core/codex-app-server-transport.js.map +1 -1
- package/dist/core/codex-model-catalog.d.ts +1 -1
- package/dist/core/codex-ui-mapper.d.ts +5 -1
- package/dist/core/codex-ui-mapper.js +74 -17
- package/dist/core/codex-ui-mapper.js.map +1 -1
- package/dist/core/model-identity.d.ts +24 -12
- package/dist/core/model-identity.js +41 -24
- package/dist/core/model-identity.js.map +1 -1
- package/dist/core/model-presets.d.ts +10 -4
- package/dist/core/model-presets.js +52 -9
- package/dist/core/model-presets.js.map +1 -1
- package/dist/core/opencode-model-catalog.d.ts +30 -0
- package/dist/core/opencode-model-catalog.js +126 -0
- package/dist/core/opencode-model-catalog.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +2 -2
- package/dist/core/opencode-ui-mapper.d.ts +4 -1
- package/dist/core/opencode-ui-mapper.js +45 -7
- package/dist/core/opencode-ui-mapper.js.map +1 -1
- package/dist/core/pi-runner.d.ts +24 -0
- package/dist/core/pi-runner.js +349 -0
- package/dist/core/pi-runner.js.map +1 -0
- package/dist/core/pi-ui-mapper.d.ts +34 -0
- package/dist/core/pi-ui-mapper.js +270 -0
- package/dist/core/pi-ui-mapper.js.map +1 -0
- package/dist/core/provider-auth.d.ts +154 -0
- package/dist/core/provider-auth.js +509 -0
- package/dist/core/provider-auth.js.map +1 -0
- package/dist/core/provider-availability.d.ts +3 -0
- package/dist/core/provider-availability.js +14 -0
- package/dist/core/provider-availability.js.map +1 -0
- package/dist/core/runner-factory.d.ts +1 -1
- package/dist/core/runner-factory.js +3 -0
- package/dist/core/runner-factory.js.map +1 -1
- package/dist/core/runner-model-catalog.d.ts +1 -1
- package/dist/core/shell-env.d.ts +28 -0
- package/dist/core/shell-env.js +56 -0
- package/dist/core/shell-env.js.map +1 -0
- package/dist/core/tool-display.d.ts +1 -1
- package/dist/core/ui-events.d.ts +2 -2
- package/dist/core/ui-events.js +1 -1
- package/dist/core/usage-limit.d.ts +42 -0
- package/dist/core/usage-limit.js +209 -0
- package/dist/core/usage-limit.js.map +1 -0
- package/dist/git-diff-base.d.ts +85 -0
- package/dist/git-diff-base.js +180 -0
- package/dist/git-diff-base.js.map +1 -0
- package/dist/git-worktree.d.ts +46 -6
- package/dist/git-worktree.js +46 -9
- package/dist/git-worktree.js.map +1 -1
- package/dist/handoff.d.ts +2 -2
- package/dist/handoff.js +1 -1
- package/dist/index.js +66 -8
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +69 -6
- package/dist/paths.js +86 -9
- package/dist/paths.js.map +1 -1
- package/dist/planner.d.ts +2 -2
- package/dist/planner.js +7 -1
- package/dist/planner.js.map +1 -1
- package/dist/release/manifests.d.ts +81 -0
- package/dist/release/manifests.js +74 -0
- package/dist/release/manifests.js.map +1 -0
- package/dist/release/snapshot.d.ts +9 -23
- package/dist/release/snapshot.js +9 -22
- package/dist/release/snapshot.js.map +1 -1
- package/dist/release/stable.d.ts +15 -29
- package/dist/release/stable.js +14 -27
- package/dist/release/stable.js.map +1 -1
- package/dist/runs/agent-tmpdir.d.ts +41 -0
- package/dist/runs/agent-tmpdir.js +183 -0
- package/dist/runs/agent-tmpdir.js.map +1 -0
- package/dist/runs/auto-name.d.ts +1 -1
- package/dist/runs/auto-name.js +6 -1
- package/dist/runs/auto-name.js.map +1 -1
- package/dist/runs/event-history.d.ts +50 -0
- package/dist/runs/event-history.js +613 -0
- package/dist/runs/event-history.js.map +1 -0
- package/dist/runs/retention.d.ts +1 -1
- package/dist/runs/run-index.d.ts +19 -0
- package/dist/runs/run-index.js +43 -0
- package/dist/runs/run-index.js.map +1 -0
- package/dist/runs/store.d.ts +209 -344
- package/dist/runs/store.js +298 -39
- package/dist/runs/store.js.map +1 -1
- package/dist/runs/ui-event-sink.d.ts +1 -1
- package/dist/server/app-type.d.ts +21 -0
- package/dist/server/app-type.js +2 -0
- package/dist/server/app-type.js.map +1 -0
- package/dist/server/capabilities.d.ts +21 -6
- package/dist/server/capabilities.js +27 -1
- package/dist/server/capabilities.js.map +1 -1
- package/dist/server/forge/github.d.ts +58 -151
- package/dist/server/forge/github.js +530 -6
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/forge/index.d.ts +19 -3
- package/dist/server/forge/index.js +28 -1
- package/dist/server/forge/index.js.map +1 -1
- package/dist/server/forge/types.d.ts +86 -1
- package/dist/server/git-changes.d.ts +10 -8
- package/dist/server/git-changes.js +19 -17
- package/dist/server/git-changes.js.map +1 -1
- package/dist/server/git.d.ts +2 -0
- package/dist/server/git.js +9 -0
- package/dist/server/git.js.map +1 -1
- package/dist/server/github.d.ts +3 -3
- package/dist/server/github.js +1 -1
- package/dist/server/github.js.map +1 -1
- package/dist/server/open-in-app.d.ts +2 -1
- package/dist/server/open-in-app.js +3 -1
- package/dist/server/open-in-app.js.map +1 -1
- package/dist/server/open-in-terminal.d.ts +46 -1
- package/dist/server/open-in-terminal.js +72 -13
- package/dist/server/open-in-terminal.js.map +1 -1
- package/dist/server/pr.d.ts +2 -2
- package/dist/server/project-context.d.ts +20 -3
- package/dist/server/project-context.js +30 -1
- package/dist/server/project-context.js.map +1 -1
- package/dist/server/provider-action-gate.d.ts +8 -0
- package/dist/server/provider-action-gate.js +56 -0
- package/dist/server/provider-action-gate.js.map +1 -0
- package/dist/server/provider-auth-runtime.d.ts +21 -0
- package/dist/server/provider-auth-runtime.js +66 -0
- package/dist/server/provider-auth-runtime.js.map +1 -0
- package/dist/server/server.d.ts +12802 -47
- package/dist/server/server.js +2857 -949
- package/dist/server/server.js.map +1 -1
- package/dist/server/validators.d.ts +97 -0
- package/dist/server/validators.js +86 -0
- package/dist/server/validators.js.map +1 -0
- package/dist/server/ws.d.ts +2 -2
- package/dist/server/ws.js +2 -2
- package/dist/server/ws.js.map +1 -1
- package/dist/server-install/engine.d.ts +1 -1
- package/dist/server-install/engine.js +5 -18
- package/dist/server-install/engine.js.map +1 -1
- package/dist/server-install/platforms/macosx-ngrok.d.ts +1 -1
- package/dist/server-install/platforms/ubuntu-vps.d.ts +16 -1
- package/dist/server-install/platforms/ubuntu-vps.js +83 -1
- package/dist/server-install/platforms/ubuntu-vps.js.map +1 -1
- package/dist/server-install/state.d.ts +1 -1
- package/dist/server-install/steps.d.ts +2 -2
- package/dist/server-install/steps.js +6 -2
- package/dist/server-install/steps.js.map +1 -1
- package/dist/server-install/strategies.d.ts +1 -1
- package/dist/server-install/types.d.ts +38 -424
- package/dist/server-install/ui.d.ts +1 -1
- package/dist/skills-banner.d.ts +7 -6
- package/dist/skills-banner.js +7 -6
- package/dist/skills-banner.js.map +1 -1
- package/dist/skills-remote.d.ts +2 -2
- package/dist/skills-update.d.ts +88 -0
- package/dist/skills-update.js +392 -0
- package/dist/skills-update.js.map +1 -0
- package/dist/skills.d.ts +2 -0
- package/dist/skills.js +7 -2
- package/dist/skills.js.map +1 -1
- package/dist/todos.d.ts +2 -28
- package/dist/todos.js +1 -1
- package/dist/ui-state.d.ts +16 -2
- package/dist/ui-state.js +14 -1
- package/dist/ui-state.js.map +1 -1
- package/dist/workflows/load.d.ts +1 -1
- package/dist/workflows/run.d.ts +276 -15
- package/dist/workflows/run.js +1261 -159
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +62 -224
- package/dist/workflows/types.js +25 -2
- package/dist/workflows/types.js.map +1 -1
- package/dist/workspace/agent-accounts.d.ts +153 -0
- package/dist/workspace/agent-accounts.js +304 -0
- package/dist/workspace/agent-accounts.js.map +1 -0
- package/dist/workspace/agent-profiles.d.ts +78 -0
- package/dist/workspace/agent-profiles.js +115 -0
- package/dist/workspace/agent-profiles.js.map +1 -0
- package/dist/workspace/config.d.ts +94 -206
- package/dist/workspace/config.js +226 -14
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/migrations.d.ts +1 -1
- package/dist/workspace/migrations.js +19 -4
- package/dist/workspace/migrations.js.map +1 -1
- package/dist/workspace/projects-cli.js +54 -4
- package/dist/workspace/projects-cli.js.map +1 -1
- package/dist/workspace/projects.d.ts +26 -2
- package/dist/workspace/projects.js +42 -3
- package/dist/workspace/projects.js.map +1 -1
- package/dist/workspace/semaphore.d.ts +51 -0
- package/dist/workspace/semaphore.js +53 -3
- package/dist/workspace/semaphore.js.map +1 -1
- package/dist/workspace/ui-state.d.ts +16 -5
- package/dist/workspace/ui-state.js +18 -7
- package/dist/workspace/ui-state.js.map +1 -1
- package/package.json +17 -39
- package/scripts/inline-contract.mjs +112 -0
- package/scripts/mock-claude.mjs +59 -1
- package/scripts/mock-pi-rpc.mjs +83 -0
- package/scripts/sync-readme.mjs +20 -0
- package/web/dist/assets/alert-dialog-BVs3QSmP.js +1 -0
- package/web/dist/assets/arrow-down-D7T7XuF6.js +1 -0
- package/web/dist/assets/arrow-left-B1dRFd8y.js +1 -0
- package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
- package/web/dist/assets/centered-state-DdRLYi9u.js +43 -0
- package/web/dist/assets/chevron-right-Dh0t3AL8.js +1 -0
- package/web/dist/assets/{chunk-BO2N2NFS-DtrdTCWa.js → chunk-BO2N2NFS-DE6qKn3r.js} +8 -8
- package/web/dist/assets/circle-check-4FDOlh9u.js +1 -0
- package/web/dist/assets/circle-x-CgTVbqX5.js +1 -0
- package/web/dist/assets/collapsible-BoADzTok.js +1 -0
- package/web/dist/assets/commit-list-BCcCkRbU.js +1 -0
- package/web/dist/assets/compare-variants-B7gTgGqR.js +1 -0
- package/web/dist/assets/{core-DePtBHcl.js → core-BCsw8oQw.js} +1 -1
- package/web/dist/assets/diff-ecfV3-op.js +3 -0
- package/web/dist/assets/diff-stat-C2KGLVnZ.js +1 -0
- package/web/dist/assets/{diff-view-DCeSegKk.js → diff-view-CQtonQ4L.js} +4 -4
- package/web/dist/assets/dropdown-menu-WcGoirf2.js +1 -0
- package/web/dist/assets/editable-title-SqNK-wuI.js +1 -0
- package/web/dist/assets/{ellipsis-vertical-CNnSLn5a.js → ellipsis-vertical-ClTFrwit.js} +1 -1
- package/web/dist/assets/{file-D4GBh1ao.js → file-BU0mWida.js} +1 -1
- package/web/dist/assets/folder-rsgCF0aw.js +1 -0
- package/web/dist/assets/{git-pull-request-DnR8Xh4_.js → git-pull-request-BFhIKb83.js} +1 -1
- package/web/dist/assets/git-toolbar-CF1_tzqz.js +1 -0
- package/web/dist/assets/github-CyjPz-Ks.js +1 -0
- package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
- package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
- package/web/dist/assets/image-preview-iEzCyEmz.js +1 -0
- package/web/dist/assets/index-BN09RpYY.css +2 -0
- package/web/dist/assets/index-CyG7aE1W.js +7 -0
- package/web/dist/assets/lib-BQXq3kEf.js +1 -0
- package/web/dist/assets/lib-BxQXEXDF.js +1 -0
- package/web/dist/assets/markdown-CNAa22LB.js +2 -0
- package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
- package/web/dist/assets/new-task-form-CWhQZbsX.js +1 -0
- package/web/dist/assets/pill-BO5s2x3N.js +1 -0
- package/web/dist/assets/project-router-Dm4OhAPE.js +1 -0
- package/web/dist/assets/prompt-templates-CP__OCDQ.js +15 -0
- package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
- package/web/dist/assets/{refresh-cw-BT8E96Tm.js → refresh-cw-DyiysCoP.js} +1 -1
- package/web/dist/assets/repo-git-B1WM6N8T.js +1 -0
- package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/dist/assets/run-diff-CKx4d9Oo.js +3 -0
- package/web/dist/assets/run-header-DpbfOtNi.js +1 -0
- package/web/dist/assets/{search-x-BDjaMrzG.js → search-x-DRvk-6x4.js} +1 -1
- package/web/dist/assets/skill-empty-hint-D5vsHfMr.js +1 -0
- package/web/dist/assets/skills-BiWfHmCR.js +1 -0
- package/web/dist/assets/skills-XGltyIJ_.js +1 -0
- package/web/dist/assets/sparkles-BugkDxWO.js +1 -0
- package/web/dist/assets/{square-terminal-Ckjjn0vb.js → square-terminal-Drp2h-o8.js} +1 -1
- package/web/dist/assets/tab-link-CiRLRlnY.js +1 -0
- package/web/dist/assets/task-changes-C2hKkEtc.js +1 -0
- package/web/dist/assets/task-commits-CwGs_Opa.js +1 -0
- package/web/dist/assets/task-files-5KUgFzX3.js +2 -0
- package/web/dist/assets/task-thread-B3AFO3SS.js +9 -0
- package/web/dist/assets/textarea-Dn90Eun6.js +1 -0
- package/web/dist/assets/thread-loading-_1hPuk76.js +1 -0
- package/web/dist/assets/{trash-2-DAyZ0VSi.js → trash-2-BKEc5Sp2.js} +1 -1
- package/web/dist/assets/{triangle-alert-Uy8rokUh.js → triangle-alert-BGGPY2C2.js} +1 -1
- package/web/dist/assets/{upload-CDdyPPo_.js → upload-B0AQw-mO.js} +1 -1
- package/web/dist/assets/use-desktop-CegyTp3X.js +1 -0
- package/web/dist/assets/use-submit-shortcut-Mle-9uJp.js +1 -0
- package/web/dist/assets/utils-D9GHDNza.js +64 -0
- package/web/dist/assets/workflows-3PCz57Z6.js +11 -0
- package/web/dist/assets/zoomable-image-DTq7s8CZ.js +1 -0
- package/web/dist/index.html +33 -13
- package/scripts/dev.mjs +0 -74
- package/scripts/release-snapshot.mjs +0 -130
- package/scripts/release.mjs +0 -119
- package/web/dist/assets/arrow-left-CnSdp92h.js +0 -1
- package/web/dist/assets/bundle-mjs-BegPhL5c.js +0 -1
- package/web/dist/assets/centered-state-DOsTcJZF.js +0 -43
- package/web/dist/assets/commit-list-BrxBEzRK.js +0 -1
- package/web/dist/assets/compare-variants-Bv2c9ORF.js +0 -1
- package/web/dist/assets/dist-B6XQOhgM.js +0 -1
- package/web/dist/assets/git-toolbar-pIC1ubPM.js +0 -1
- package/web/dist/assets/github-DTTSG0ht.js +0 -1
- package/web/dist/assets/highlighted-body-OFNGDK62-BuFJwunK.js +0 -1
- package/web/dist/assets/image-preview-DEhW0TFz.js +0 -1
- package/web/dist/assets/index-Cijmlz7q.js +0 -30
- package/web/dist/assets/index-DzroxqBG.css +0 -2
- package/web/dist/assets/lib-DPEZDBUN.js +0 -1
- package/web/dist/assets/lib-uHpeUPzK.js +0 -1
- package/web/dist/assets/mermaid-GHXKKRXX-CN2zQue0.js +0 -1
- package/web/dist/assets/open-mercato-toBr6SOa.svg +0 -11
- package/web/dist/assets/project-router-BMx4e8m-.js +0 -1
- package/web/dist/assets/repo-git-BusYfa3t.js +0 -1
- package/web/dist/assets/run-diff-wOJ3odA-.js +0 -3
- package/web/dist/assets/run-header-Cg5incil.js +0 -1
- package/web/dist/assets/skill-empty-hint-DTUSp6Vl.js +0 -1
- package/web/dist/assets/skills-PpP2owbM.js +0 -1
- package/web/dist/assets/tab-link-F3uQrdm2.js +0 -1
- package/web/dist/assets/task-changes-iD9kS79I.js +0 -1
- package/web/dist/assets/task-commits-COkLaUri.js +0 -1
- package/web/dist/assets/task-files-Ckttz7XH.js +0 -2
- package/web/dist/assets/task-thread-CQD91VPt.js +0 -9
- package/web/dist/assets/textarea-Bj_LCreg.js +0 -1
- package/web/dist/assets/use-desktop-DUh0STzq.js +0 -3
- package/web/dist/assets/utils-B8s5qIcK.js +0 -1
- package/web/dist/assets/workflows-BFk8C0co.js +0 -11
- package/web/dist/assets/zoomable-image-PEDOqyLQ.js +0 -1
- /package/web/{open-mercato.svg → dist/open-mercato.svg} +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { realpath, stat } from 'node:fs/promises';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { basename, join, resolve, sep } from 'node:path';
|
|
4
|
+
import { PROJECT_TAGS_MAX, PROJECT_TAG_MAX_LENGTH } from '../contract/index.js';
|
|
5
|
+
import { forgeKindOfRemote, forgeWebRoot } from '../server/forge/index.js';
|
|
4
6
|
import { getRepoInfo } from '../server/git.js';
|
|
5
7
|
import { mergeWriteWorkspaceConfig, loadWorkspaceConfig, } from './config.js';
|
|
6
8
|
/**
|
|
@@ -139,6 +141,35 @@ export async function registerProject(root, source = 'local') {
|
|
|
139
141
|
throw new Error('registerProject: merge-write did not run the mutator');
|
|
140
142
|
return entry;
|
|
141
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* The ONE spelling rule for project tags — applied on every write, never on read.
|
|
146
|
+
*
|
|
147
|
+
* Trimmed, empties dropped, over-long ones truncated, deduped CASE-INSENSITIVELY (the first
|
|
148
|
+
* spelling wins, so `Storefront` typed before `storefront` keeps its capital), capped at
|
|
149
|
+
* `PROJECT_TAGS_MAX`, and sorted so two projects tagged with the same set store and render the
|
|
150
|
+
* same list. Case-insensitive dedupe is what makes tags usable as a grouping key: `API` and `api`
|
|
151
|
+
* grouping into two columns of the same thing is the whole failure this prevents.
|
|
152
|
+
*
|
|
153
|
+
* Returns `undefined` — never `[]` — for an empty result, because the registry stores nothing for
|
|
154
|
+
* an untagged project and `delete entry.tags` is what the writers then do.
|
|
155
|
+
*/
|
|
156
|
+
export function normalizeProjectTags(tags) {
|
|
157
|
+
if (!tags)
|
|
158
|
+
return undefined;
|
|
159
|
+
const bySpelling = new Map();
|
|
160
|
+
for (const raw of tags) {
|
|
161
|
+
const tag = raw.trim().slice(0, PROJECT_TAG_MAX_LENGTH);
|
|
162
|
+
if (!tag)
|
|
163
|
+
continue;
|
|
164
|
+
const key = tag.toLowerCase();
|
|
165
|
+
if (!bySpelling.has(key))
|
|
166
|
+
bySpelling.set(key, tag);
|
|
167
|
+
if (bySpelling.size >= PROJECT_TAGS_MAX)
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
const normalized = [...bySpelling.values()].sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));
|
|
171
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
172
|
+
}
|
|
142
173
|
/** Probe TTL — long enough to coalesce a burst of sidebar renders, short
|
|
143
174
|
* enough that a deleted repo shows as `missing` on the next real look. */
|
|
144
175
|
const PROBE_TTL_MS = 5_000;
|
|
@@ -163,10 +194,18 @@ async function computeProbe(root) {
|
|
|
163
194
|
catch {
|
|
164
195
|
return { status: 'not-git' };
|
|
165
196
|
}
|
|
166
|
-
// Branch
|
|
167
|
-
// unborn HEAD), and a repo without
|
|
197
|
+
// Branch and forge are best-effort garnish: getRepoInfo never throws (null
|
|
198
|
+
// on e.g. an unborn HEAD), and a repo without either is still status ok.
|
|
168
199
|
const info = await getRepoInfo(root);
|
|
169
|
-
|
|
200
|
+
const forge = forgeKindOfRemote(info?.remote);
|
|
201
|
+
// Free: `getRepoInfo` already ran for the branch, and the remote is already parsed for `forge`.
|
|
202
|
+
const repoUrl = forgeWebRoot(info?.remote);
|
|
203
|
+
return {
|
|
204
|
+
status: 'ok',
|
|
205
|
+
...(info?.branch ? { branch: info.branch } : {}),
|
|
206
|
+
...(forge ? { forge } : {}),
|
|
207
|
+
...(repoUrl ? { repoUrl } : {}),
|
|
208
|
+
};
|
|
170
209
|
}
|
|
171
210
|
async function probeRoot(root) {
|
|
172
211
|
const cached = probeCache.get(root);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/workspace/projects.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/workspace/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,14 @@
|
|
|
31
31
|
export interface WorkspaceResourceLimits {
|
|
32
32
|
/** Workspace-wide cap on concurrently *running* agent runs. */
|
|
33
33
|
maxParallel: number;
|
|
34
|
+
/** Durable monitoring sessions that do not consume active-task capacity. */
|
|
35
|
+
maxMonitoringSessions?: number;
|
|
36
|
+
/** Automatic monitoring re-check cadence in minutes. Default ON at
|
|
37
|
+
* `DEFAULT_MONITORING_WAKE_MINUTES`; explicit `null` means stay parked; absent means
|
|
38
|
+
* "this loader predates the key" and reads as the default. */
|
|
39
|
+
monitoringWakeIntervalMinutes?: number | null;
|
|
40
|
+
/** Resume a run stopped by a provider usage limit when that limit resets. Default ON. */
|
|
41
|
+
autoResumeOnUsageLimit?: boolean;
|
|
34
42
|
/** Per-task process-tree memory ceiling in MiB; null = no limit. */
|
|
35
43
|
memoryLimitMb: number | null;
|
|
36
44
|
/**
|
|
@@ -42,6 +50,20 @@ export interface WorkspaceResourceLimits {
|
|
|
42
50
|
*/
|
|
43
51
|
projectLimits?: ReadonlyMap<string, number>;
|
|
44
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* The two kinds of usage-limit hold an account can be under, kept apart because they bind
|
|
55
|
+
* different work (spec 2026-08-03-auto-resume-after-usage-limit):
|
|
56
|
+
*
|
|
57
|
+
* - `deadline` — a run is parked on a reset instant that has not arrived. The window is known to
|
|
58
|
+
* be shut, so this blocks EVERYTHING on that account, resumes included.
|
|
59
|
+
* - `inFlight` — a resume is running right now, re-testing the window. Nothing is proven yet, so
|
|
60
|
+
* this blocks fresh work but NOT other resumes: a resume blocked by a resume is the deadlock
|
|
61
|
+
* that stopped a live workspace dead.
|
|
62
|
+
*/
|
|
63
|
+
export interface AccountHolds {
|
|
64
|
+
deadline: ReadonlySet<string>;
|
|
65
|
+
inFlight: ReadonlySet<string>;
|
|
66
|
+
}
|
|
45
67
|
/** One manager's seam into the shared counter. */
|
|
46
68
|
export interface SemaphoreParticipant {
|
|
47
69
|
/** Slots this manager currently holds. The #347 exemption lives in the
|
|
@@ -56,6 +78,15 @@ export interface SemaphoreParticipant {
|
|
|
56
78
|
* workspace's longest-waiting run instead of whichever manager happens to
|
|
57
79
|
* have registered first. */
|
|
58
80
|
oldestQueuedAt(): number | null;
|
|
81
|
+
/**
|
|
82
|
+
* Agent accounts this participant is holding, by KIND (spec
|
|
83
|
+
* 2026-08-03-auto-resume-after-usage-limit, `RunManager.accountHolds`).
|
|
84
|
+
*
|
|
85
|
+
* Workspace-scoped for the same reason the parallel cap is: a limit closes an ACCOUNT, and one
|
|
86
|
+
* account can be driving tasks in several projects at once. Optional so a stub participant —
|
|
87
|
+
* and any caller that predates the hold — keeps working; absent simply holds nothing.
|
|
88
|
+
*/
|
|
89
|
+
accountHolds?(): AccountHolds;
|
|
59
90
|
}
|
|
60
91
|
export interface WorkspaceSemaphoreOptions {
|
|
61
92
|
/** Snapshot source for `refresh()` — tests inject a stub; production keeps
|
|
@@ -84,8 +115,28 @@ export declare class WorkspaceSemaphore {
|
|
|
84
115
|
busy(): number;
|
|
85
116
|
/** Cached workspace-wide parallel cap. */
|
|
86
117
|
maxParallel(): number;
|
|
118
|
+
maxMonitoringSessions(): number;
|
|
119
|
+
/** Cadence for automatic monitoring re-checks, or null when the operator chose "park
|
|
120
|
+
* until resumed". Deliberately NOT `?? DEFAULT`: `null` is a real user choice and
|
|
121
|
+
* `null ?? 5` would silently override it (#810). Only an ABSENT key — an older `load`
|
|
122
|
+
* stub, a partial `initial` — falls back to the shipped default. */
|
|
123
|
+
monitoringWakeIntervalMinutes(): number | null;
|
|
124
|
+
/** Whether a usage-limit stop schedules its own resume. Absent (an older `load` stub, a config
|
|
125
|
+
* written before the key existed) reads as ON — the shipped default. */
|
|
126
|
+
autoResumeOnUsageLimit(): boolean;
|
|
87
127
|
/** Cached per-task memory ceiling (MiB), or null for no limit. */
|
|
88
128
|
memoryLimitMb(): number | null;
|
|
129
|
+
/**
|
|
130
|
+
* Every agent account held across the WHOLE workspace, by kind — the union of what each manager
|
|
131
|
+
* reports (spec 2026-08-03-auto-resume-after-usage-limit). A `pump()` consults this before
|
|
132
|
+
* starting a queued run, so a limit hit in one project also stops the same account being walked
|
|
133
|
+
* into the wall from another.
|
|
134
|
+
*
|
|
135
|
+
* Asked live rather than cached: the underlying answer is derived from run records that change
|
|
136
|
+
* on every schedule, resume and cancel, and a stale snapshot here would either stall a queue
|
|
137
|
+
* whose window has reopened or leak a stampede through one that has not.
|
|
138
|
+
*/
|
|
139
|
+
accountHolds(): AccountHolds;
|
|
89
140
|
/**
|
|
90
141
|
* A slot came free somewhere in the workspace: pump EVERY manager,
|
|
91
142
|
* longest-waiting-queue first.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { realpathSync } from 'node:fs';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import { loadWorkspaceConfig } from './config.js';
|
|
3
|
+
import { DEFAULT_MONITORING_WAKE_MINUTES, loadWorkspaceConfig } from './config.js';
|
|
4
4
|
/** Realpath-normalize a root the same way the registry does
|
|
5
5
|
* (`workspace/projects.ts` `normalizeRoot`), but synchronously — this answers
|
|
6
6
|
* a manager's hot-path lookup and must not `await`. A path that cannot be
|
|
@@ -13,9 +13,16 @@ function normalizeRootSync(root) {
|
|
|
13
13
|
return resolve(root);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
const DEFAULT_LIMITS = {
|
|
16
|
+
const DEFAULT_LIMITS = {
|
|
17
|
+
maxParallel: 2,
|
|
18
|
+
maxMonitoringSessions: 2,
|
|
19
|
+
monitoringWakeIntervalMinutes: DEFAULT_MONITORING_WAKE_MINUTES,
|
|
20
|
+
autoResumeOnUsageLimit: true,
|
|
21
|
+
memoryLimitMb: null,
|
|
22
|
+
};
|
|
17
23
|
/** Production loader: the `resources` slice of `~/.cezar/config.json`
|
|
18
|
-
* (schema-defaulted, so a missing/corrupt file yields the zero-config
|
|
24
|
+
* (schema-defaulted, so a missing/corrupt file yields the zero-config
|
|
25
|
+
* 2 parallel / 2 monitoring / 5-minute wake / no memory cap),
|
|
19
26
|
* plus the per-project `maxParallel` overrides built into a root→limit map.
|
|
20
27
|
* The registry `root` is already realpath-normalized (`registerProject`), so
|
|
21
28
|
* the keys match `normalizeRootSync`'s output at lookup time. */
|
|
@@ -28,6 +35,9 @@ async function loadResourceLimits() {
|
|
|
28
35
|
}
|
|
29
36
|
return {
|
|
30
37
|
maxParallel: resources.maxParallel,
|
|
38
|
+
maxMonitoringSessions: resources.maxMonitoringSessions,
|
|
39
|
+
monitoringWakeIntervalMinutes: resources.monitoringWakeIntervalMinutes,
|
|
40
|
+
autoResumeOnUsageLimit: resources.autoResumeOnUsageLimit,
|
|
31
41
|
memoryLimitMb: resources.memoryLimitMb,
|
|
32
42
|
projectLimits,
|
|
33
43
|
};
|
|
@@ -63,10 +73,50 @@ export class WorkspaceSemaphore {
|
|
|
63
73
|
maxParallel() {
|
|
64
74
|
return this.limits.maxParallel;
|
|
65
75
|
}
|
|
76
|
+
maxMonitoringSessions() {
|
|
77
|
+
return this.limits.maxMonitoringSessions ?? 2;
|
|
78
|
+
}
|
|
79
|
+
/** Cadence for automatic monitoring re-checks, or null when the operator chose "park
|
|
80
|
+
* until resumed". Deliberately NOT `?? DEFAULT`: `null` is a real user choice and
|
|
81
|
+
* `null ?? 5` would silently override it (#810). Only an ABSENT key — an older `load`
|
|
82
|
+
* stub, a partial `initial` — falls back to the shipped default. */
|
|
83
|
+
monitoringWakeIntervalMinutes() {
|
|
84
|
+
const configured = this.limits.monitoringWakeIntervalMinutes;
|
|
85
|
+
return configured === undefined ? DEFAULT_MONITORING_WAKE_MINUTES : configured;
|
|
86
|
+
}
|
|
87
|
+
/** Whether a usage-limit stop schedules its own resume. Absent (an older `load` stub, a config
|
|
88
|
+
* written before the key existed) reads as ON — the shipped default. */
|
|
89
|
+
autoResumeOnUsageLimit() {
|
|
90
|
+
return this.limits.autoResumeOnUsageLimit ?? true;
|
|
91
|
+
}
|
|
66
92
|
/** Cached per-task memory ceiling (MiB), or null for no limit. */
|
|
67
93
|
memoryLimitMb() {
|
|
68
94
|
return this.limits.memoryLimitMb;
|
|
69
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Every agent account held across the WHOLE workspace, by kind — the union of what each manager
|
|
98
|
+
* reports (spec 2026-08-03-auto-resume-after-usage-limit). A `pump()` consults this before
|
|
99
|
+
* starting a queued run, so a limit hit in one project also stops the same account being walked
|
|
100
|
+
* into the wall from another.
|
|
101
|
+
*
|
|
102
|
+
* Asked live rather than cached: the underlying answer is derived from run records that change
|
|
103
|
+
* on every schedule, resume and cancel, and a stale snapshot here would either stall a queue
|
|
104
|
+
* whose window has reopened or leak a stampede through one that has not.
|
|
105
|
+
*/
|
|
106
|
+
accountHolds() {
|
|
107
|
+
const deadline = new Set();
|
|
108
|
+
const inFlight = new Set();
|
|
109
|
+
for (const participant of this.participants) {
|
|
110
|
+
const holds = participant.accountHolds?.();
|
|
111
|
+
if (!holds)
|
|
112
|
+
continue;
|
|
113
|
+
for (const key of holds.deadline)
|
|
114
|
+
deadline.add(key);
|
|
115
|
+
for (const key of holds.inFlight)
|
|
116
|
+
inFlight.add(key);
|
|
117
|
+
}
|
|
118
|
+
return { deadline, inFlight };
|
|
119
|
+
}
|
|
70
120
|
/**
|
|
71
121
|
* A slot came free somewhere in the workspace: pump EVERY manager,
|
|
72
122
|
* longest-waiting-queue first.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semaphore.js","sourceRoot":"","sources":["../../src/workspace/semaphore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"semaphore.js","sourceRoot":"","sources":["../../src/workspace/semaphore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { WorkspaceUiState } from '../contract/index.js';
|
|
1
2
|
/**
|
|
2
3
|
* `~/.cezar/ui-state.json` — global GUI state, the workspace twin of the
|
|
3
4
|
* per-repo `.ai/cezar/ui-state.json` (spec 2026-07-20-multi-project-workspace,
|
|
@@ -5,12 +6,18 @@
|
|
|
5
6
|
* read and the atomic write; the schema and key cap live at the route boundary
|
|
6
7
|
* (`GET/PUT /api/workspace/ui-state`, step 2.7). The state is an opaque
|
|
7
8
|
* `.passthrough()`-style bag — cross-project prefs (appearance, notifications,
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* curated skills) live here; project-scoped prefs stay in each repo's own file,
|
|
10
|
+
* and prefs that describe the BROWSER rather than the workspace (sidebar
|
|
11
|
+
* collapse, the last visited location) stay in that browser's localStorage.
|
|
10
12
|
*/
|
|
11
13
|
/** Read `~/.cezar/ui-state.json` on demand — never cached, never throws.
|
|
12
|
-
* Missing, unreadable, malformed, or non-object all degrade to `{}`.
|
|
13
|
-
|
|
14
|
+
* Missing, unreadable, malformed, or non-object all degrade to `{}`.
|
|
15
|
+
*
|
|
16
|
+
* Typed by the CONTRACT (`WorkspaceUiState`) for the same reason as its per-repo twin in
|
|
17
|
+
* `src/ui-state.ts`: `GET /api/v1/workspace/ui-state` answers this value verbatim, so a loose
|
|
18
|
+
* record left the route naming no key. The schema is a `z.looseObject`, so unknown prefs keep
|
|
19
|
+
* round-tripping (BACKWARD_COMPATIBILITY.md §3) — the type only adds the known names. */
|
|
20
|
+
export declare function readWorkspaceUiState(path?: string): Promise<WorkspaceUiState>;
|
|
14
21
|
/**
|
|
15
22
|
* Read-modify-write for `~/.cezar/ui-state.json`, written with the same atomic
|
|
16
23
|
* per-writer tmp+rename `0600` pattern (dir `0700`) as
|
|
@@ -19,5 +26,9 @@ export declare function readWorkspaceUiState(): Promise<Record<string, unknown>>
|
|
|
19
26
|
* corrupt file merges from `{}`. The mutator may mutate its argument in place
|
|
20
27
|
* or return a replacement. Throws on write failure (e.g. a read-only home) —
|
|
21
28
|
* degrading is the caller's policy, per house rules.
|
|
29
|
+
*
|
|
30
|
+
* Path resolved once, before the `await`, for the same reason as
|
|
31
|
+
* `mergeWriteWorkspaceConfig`: a `CEZ_HOME` that changes mid-flight must not be
|
|
32
|
+
* able to send the read and the write to two different files.
|
|
22
33
|
*/
|
|
23
|
-
export declare function mergeWriteWorkspaceUiState(mutator: (state:
|
|
34
|
+
export declare function mergeWriteWorkspaceUiState(mutator: (state: WorkspaceUiState) => WorkspaceUiState | void): Promise<WorkspaceUiState>;
|
|
@@ -8,14 +8,20 @@ import { atomicWriteJsonSync } from './config.js';
|
|
|
8
8
|
* read and the atomic write; the schema and key cap live at the route boundary
|
|
9
9
|
* (`GET/PUT /api/workspace/ui-state`, step 2.7). The state is an opaque
|
|
10
10
|
* `.passthrough()`-style bag — cross-project prefs (appearance, notifications,
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* curated skills) live here; project-scoped prefs stay in each repo's own file,
|
|
12
|
+
* and prefs that describe the BROWSER rather than the workspace (sidebar
|
|
13
|
+
* collapse, the last visited location) stay in that browser's localStorage.
|
|
13
14
|
*/
|
|
14
15
|
/** Read `~/.cezar/ui-state.json` on demand — never cached, never throws.
|
|
15
|
-
* Missing, unreadable, malformed, or non-object all degrade to `{}`.
|
|
16
|
-
|
|
16
|
+
* Missing, unreadable, malformed, or non-object all degrade to `{}`.
|
|
17
|
+
*
|
|
18
|
+
* Typed by the CONTRACT (`WorkspaceUiState`) for the same reason as its per-repo twin in
|
|
19
|
+
* `src/ui-state.ts`: `GET /api/v1/workspace/ui-state` answers this value verbatim, so a loose
|
|
20
|
+
* record left the route naming no key. The schema is a `z.looseObject`, so unknown prefs keep
|
|
21
|
+
* round-tripping (BACKWARD_COMPATIBILITY.md §3) — the type only adds the known names. */
|
|
22
|
+
export async function readWorkspaceUiState(path = workspaceUiStatePath()) {
|
|
17
23
|
try {
|
|
18
|
-
const parsed = JSON.parse(await readFile(
|
|
24
|
+
const parsed = JSON.parse(await readFile(path, 'utf8'));
|
|
19
25
|
return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
20
26
|
? parsed
|
|
21
27
|
: {};
|
|
@@ -32,11 +38,16 @@ export async function readWorkspaceUiState() {
|
|
|
32
38
|
* corrupt file merges from `{}`. The mutator may mutate its argument in place
|
|
33
39
|
* or return a replacement. Throws on write failure (e.g. a read-only home) —
|
|
34
40
|
* degrading is the caller's policy, per house rules.
|
|
41
|
+
*
|
|
42
|
+
* Path resolved once, before the `await`, for the same reason as
|
|
43
|
+
* `mergeWriteWorkspaceConfig`: a `CEZ_HOME` that changes mid-flight must not be
|
|
44
|
+
* able to send the read and the write to two different files.
|
|
35
45
|
*/
|
|
36
46
|
export async function mergeWriteWorkspaceUiState(mutator) {
|
|
37
|
-
const
|
|
47
|
+
const path = workspaceUiStatePath();
|
|
48
|
+
const current = await readWorkspaceUiState(path);
|
|
38
49
|
const next = mutator(current) ?? current;
|
|
39
|
-
atomicWriteJsonSync(
|
|
50
|
+
atomicWriteJsonSync(path, next);
|
|
40
51
|
return next;
|
|
41
52
|
}
|
|
42
53
|
//# sourceMappingURL=ui-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-state.js","sourceRoot":"","sources":["../../src/workspace/ui-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ui-state.js","sourceRoot":"","sources":["../../src/workspace/ui-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;GAUG;AAEH;;;;;;0FAM0F;AAC1F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAI,GAAW,oBAAoB,EAAE;IAErC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5E,CAAC,CAAE,MAA2B;YAC9B,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAA6D;IAE7D,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACzC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/cezar",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2-pr710.1256",
|
|
4
4
|
"description": "Local cockpit for running and tracking AI agent tasks in your repo. Uses your logged-in `claude` CLI and `gh` — zero config, zero database.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -9,9 +9,13 @@
|
|
|
9
9
|
"cez": "dist/index.js",
|
|
10
10
|
"cezar-cli": "dist/index.js"
|
|
11
11
|
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": "./dist/index.js",
|
|
14
|
+
"./app-type": "./dist/server/app-type.js",
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
12
17
|
"files": [
|
|
13
18
|
"dist",
|
|
14
|
-
"web/open-mercato.svg",
|
|
15
19
|
"web/dist",
|
|
16
20
|
"scripts",
|
|
17
21
|
"README.md"
|
|
@@ -20,27 +24,22 @@
|
|
|
20
24
|
"node": ">=20"
|
|
21
25
|
},
|
|
22
26
|
"scripts": {
|
|
23
|
-
"
|
|
24
|
-
"build
|
|
27
|
+
"prebuild": "node scripts/sync-readme.mjs",
|
|
28
|
+
"build": "tsc",
|
|
25
29
|
"check:pack": "node scripts/check-pack.mjs",
|
|
26
|
-
"dev": "
|
|
30
|
+
"dev": "tsx src/index.ts",
|
|
27
31
|
"install-as-command": "node scripts/install-as-command.mjs --mode link",
|
|
28
32
|
"install-as-command:global": "node scripts/install-as-command.mjs --mode global",
|
|
29
33
|
"uninstall-as-command": "node scripts/install-as-command.mjs --mode uninstall",
|
|
30
|
-
"dev:server": "tsx src/index.ts",
|
|
31
34
|
"server-install": "tsx src/index.ts server-install",
|
|
32
35
|
"server-deploy": "tsx src/index.ts server-deploy",
|
|
33
36
|
"server-uninstall": "tsx src/index.ts server-uninstall",
|
|
34
|
-
"dev:web": "vite --config web/app/vite.config.ts",
|
|
35
37
|
"test": "vitest run",
|
|
36
38
|
"test:watch": "vitest",
|
|
37
39
|
"test:unit": "node --import tsx --test test/unit/*.test.ts",
|
|
38
40
|
"test:package": "node --import tsx --test test/e2e/*.test.ts",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"typecheck:server": "tsc --noEmit -p tsconfig.test.json",
|
|
42
|
-
"typecheck:web": "tsc --noEmit -p web/app/tsconfig.json",
|
|
43
|
-
"prepublishOnly": "npm run build"
|
|
41
|
+
"typecheck": "tsc --noEmit -p tsconfig.test.json",
|
|
42
|
+
"postbuild": "node scripts/inline-contract.mjs"
|
|
44
43
|
},
|
|
45
44
|
"dependencies": {
|
|
46
45
|
"@clack/prompts": "^0.11.0",
|
|
@@ -49,43 +48,22 @@
|
|
|
49
48
|
"smol-toml": "^1.7.0",
|
|
50
49
|
"ws": "^8.21.1",
|
|
51
50
|
"yaml": "^2.5.0",
|
|
52
|
-
"zod": "^
|
|
51
|
+
"zod": "^4.4.3"
|
|
53
52
|
},
|
|
54
53
|
"devDependencies": {
|
|
55
|
-
"@
|
|
56
|
-
"@
|
|
57
|
-
"@dnd-kit/utilities": "^3.2.2",
|
|
58
|
-
"@tailwindcss/vite": "^4.3.2",
|
|
59
|
-
"@tanstack/react-query": "^5.101.2",
|
|
60
|
-
"@testing-library/react": "^16.3.2",
|
|
54
|
+
"@open-mercato/cezar-api-client": "0.9.2-pr710.1256",
|
|
55
|
+
"@open-mercato/cezar-contract": "0.9.2-pr710.1256",
|
|
61
56
|
"@types/node": "^20.14.0",
|
|
62
|
-
"@types/react": "^19.2.17",
|
|
63
|
-
"@types/react-dom": "^19.2.3",
|
|
64
57
|
"@types/ws": "^8.18.1",
|
|
65
|
-
"
|
|
66
|
-
"class-variance-authority": "^0.7.1",
|
|
67
|
-
"clsx": "^2.1.1",
|
|
68
|
-
"cmdk": "^1.1.1",
|
|
69
|
-
"jsdom": "^29.1.1",
|
|
70
|
-
"lucide-react": "^1.24.0",
|
|
71
|
-
"radix-ui": "^1.6.2",
|
|
72
|
-
"react": "^19.2.7",
|
|
73
|
-
"react-dom": "^19.2.7",
|
|
74
|
-
"react-router": "^7.18.1",
|
|
75
|
-
"shiki": "^4.3.1",
|
|
76
|
-
"streamdown": "^2.5.0",
|
|
77
|
-
"tailwind-merge": "^3.6.0",
|
|
78
|
-
"tailwindcss": "^4.3.2",
|
|
58
|
+
"esbuild": "^0.28.1",
|
|
79
59
|
"tsx": "^4.19.0",
|
|
80
|
-
"tw-animate-css": "^1.4.0",
|
|
81
60
|
"typescript": "^7.0.2",
|
|
82
|
-
"virtua": "^0.49.3",
|
|
83
|
-
"vite": "^8.1.4",
|
|
84
61
|
"vitest": "^4.1.10"
|
|
85
62
|
},
|
|
86
63
|
"repository": {
|
|
87
64
|
"type": "git",
|
|
88
|
-
"url": "https://github.com/open-mercato/cezar"
|
|
65
|
+
"url": "https://github.com/open-mercato/cezar",
|
|
66
|
+
"directory": "packages/cezar"
|
|
89
67
|
},
|
|
90
68
|
"publishConfig": {
|
|
91
69
|
"access": "public"
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundle `@open-mercato/cezar-contract` into `dist` after `tsc`.
|
|
3
|
+
*
|
|
4
|
+
* The contract and the api-client are PRIVATE and ship no build of their own — they are linked as
|
|
5
|
+
* workspace packages and consumed as TypeScript source, which is what every other consumer wants:
|
|
6
|
+
* the cockpit's Vite bundles them, vitest transforms them.
|
|
7
|
+
*
|
|
8
|
+
* This package is the exception, because it is PUBLISHED. `workspace/migrations.ts` imports
|
|
9
|
+
* `workspaceUiStateSchema` — a zod value, not a type — so the installed CLI resolves the contract
|
|
10
|
+
* at runtime, and a tarball naming a package npm has never seen would fail on install. So the
|
|
11
|
+
* build folds it in: esbuild compiles the contract's source to one ESM file under `dist/contract/`,
|
|
12
|
+
* `tsc` emits its declarations beside it, and the emitted references are repointed at both.
|
|
13
|
+
*
|
|
14
|
+
* Nothing is copied at the SOURCE level — the package graph still states the dependency, and this
|
|
15
|
+
* runs only when `dist` actually names it. Delete this the day the contract is published, or the
|
|
16
|
+
* day nothing here imports a contract VALUE.
|
|
17
|
+
*
|
|
18
|
+
* DECLARATIONS ship next to the bundle, and that is not optional. The scan below matches `.d.ts`
|
|
19
|
+
* as well as `.js`, so emitted type imports get repointed too (`dist/ui-state.d.ts` names
|
|
20
|
+
* `WorkspaceUiState`). esbuild emits JavaScript only, so a bundle on its own leaves those
|
|
21
|
+
* declarations naming a module TypeScript cannot resolve — `TS7016`, and the type silently
|
|
22
|
+
* degrades to `any` for anyone consuming the published package. Every tsconfig here sets
|
|
23
|
+
* `skipLibCheck`, so nothing in this repo would have said a word. `tsc --emitDeclarationOnly`
|
|
24
|
+
* mirrors the contract's `src` tree into `dist/contract/`, which is what makes
|
|
25
|
+
* `./contract/index.js` resolve to a real `./contract/index.d.ts`.
|
|
26
|
+
*/
|
|
27
|
+
import { execFileSync } from 'node:child_process';
|
|
28
|
+
import { createRequire } from 'node:module';
|
|
29
|
+
import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
30
|
+
import { dirname, join, relative } from 'node:path';
|
|
31
|
+
import { fileURLToPath } from 'node:url';
|
|
32
|
+
import { build } from 'esbuild';
|
|
33
|
+
|
|
34
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const dist = join(here, '..', 'dist');
|
|
36
|
+
const contractRoot = join(here, '..', '..', 'contract');
|
|
37
|
+
const entry = join(contractRoot, 'src', 'index.ts');
|
|
38
|
+
const outdir = join(dist, 'contract');
|
|
39
|
+
const SPEC = /(['"])@open-mercato\/cezar-contract\1/g;
|
|
40
|
+
|
|
41
|
+
/** Emitted files that name the package — the copy happens only if it is really used. */
|
|
42
|
+
const referrers = [];
|
|
43
|
+
const scan = (dir) => {
|
|
44
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
45
|
+
const p = join(dir, entry.name);
|
|
46
|
+
if (entry.isDirectory()) {
|
|
47
|
+
if (p !== outdir) scan(p);
|
|
48
|
+
} else if (/\.(js|d\.ts|js\.map)$/.test(entry.name)) {
|
|
49
|
+
SPEC.lastIndex = 0;
|
|
50
|
+
if (SPEC.test(readFileSync(p, 'utf8'))) referrers.push(p);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
scan(dist);
|
|
55
|
+
|
|
56
|
+
rmSync(outdir, { recursive: true, force: true });
|
|
57
|
+
if (referrers.length === 0) {
|
|
58
|
+
console.log('inline-contract ok — nothing in dist references the contract, nothing bundled');
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// `zod` stays external: it is a real dependency of this package, so npm resolves it normally and
|
|
63
|
+
// the tarball does not carry a second copy.
|
|
64
|
+
await build({
|
|
65
|
+
entryPoints: [entry],
|
|
66
|
+
outfile: join(outdir, 'index.js'),
|
|
67
|
+
bundle: true,
|
|
68
|
+
format: 'esm',
|
|
69
|
+
platform: 'neutral',
|
|
70
|
+
target: 'es2022',
|
|
71
|
+
external: ['zod'],
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// `tsc` is located through the module graph rather than a guessed `node_modules` path, because
|
|
75
|
+
// `typescript` is a devDependency of THIS package and may sit here or be hoisted to the workspace
|
|
76
|
+
// root. Via the manifest's own `bin` entry: TypeScript 7's `exports` map does not publish
|
|
77
|
+
// `./bin/tsc`, so resolving that subpath directly is ERR_PACKAGE_PATH_NOT_EXPORTED.
|
|
78
|
+
const require_ = createRequire(import.meta.url);
|
|
79
|
+
const tsManifest = require_.resolve('typescript/package.json');
|
|
80
|
+
const tscBin = join(dirname(tsManifest), require_(tsManifest).bin.tsc);
|
|
81
|
+
|
|
82
|
+
// The declarations for the bundle above. `tsc` mirrors `src/**` into `outdir`, so `index.d.ts`
|
|
83
|
+
// lands beside `index.js` and its relative siblings (`./health.js` → `./health.d.ts`) resolve as
|
|
84
|
+
// TypeScript expects. Those siblings have no runtime twin, which is correct: the bundle is
|
|
85
|
+
// self-contained and nothing imports those paths at runtime.
|
|
86
|
+
execFileSync(
|
|
87
|
+
process.execPath,
|
|
88
|
+
[
|
|
89
|
+
tscBin,
|
|
90
|
+
'--project',
|
|
91
|
+
join(contractRoot, 'tsconfig.json'),
|
|
92
|
+
'--emitDeclarationOnly',
|
|
93
|
+
'--declarationMap',
|
|
94
|
+
'false',
|
|
95
|
+
'--sourceMap',
|
|
96
|
+
'false',
|
|
97
|
+
'--outDir',
|
|
98
|
+
outdir,
|
|
99
|
+
],
|
|
100
|
+
{ stdio: 'inherit' },
|
|
101
|
+
);
|
|
102
|
+
if (!existsSync(join(outdir, 'index.d.ts'))) {
|
|
103
|
+
console.error('inline-contract: tsc emitted no index.d.ts — the bundled contract would ship untyped');
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
for (const p of referrers) {
|
|
108
|
+
let rel = relative(dirname(p), join(outdir, 'index.js')).replaceAll('\\', '/');
|
|
109
|
+
if (!rel.startsWith('.')) rel = `./${rel}`;
|
|
110
|
+
writeFileSync(p, readFileSync(p, 'utf8').replace(SPEC, `'${rel}'`), 'utf8');
|
|
111
|
+
}
|
|
112
|
+
console.log(`inline-contract ok — contract bundled with declarations, ${referrers.length} file(s) repointed`);
|