@open-mercato/cezar 0.9.2 → 0.10.0-pr892.1298
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 +169 -38
- 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 +8 -0
- package/dist/agent-config/catalog.js +18 -0
- package/dist/agent-config/catalog.js.map +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.js +4 -4
- package/dist/agent-config/service.js.map +1 -1
- package/dist/automations/types.d.ts +4 -0
- package/dist/automations/types.js +2 -1
- package/dist/automations/types.js.map +1 -1
- package/dist/config.d.ts +10 -1
- package/dist/config.js +48 -5
- package/dist/config.js.map +1 -1
- package/dist/contract/agent-config.d.ts +2 -0
- package/dist/contract/agent-profiles.d.ts +347 -0
- package/dist/contract/automations.d.ts +24 -0
- package/dist/contract/events.d.ts +59 -0
- package/dist/contract/github.d.ts +88 -0
- package/dist/contract/health.d.ts +7 -1
- package/dist/contract/index.d.ts +1 -0
- package/dist/contract/index.js +1005 -555
- package/dist/contract/projects.d.ts +33 -5
- package/dist/contract/runs.d.ts +247 -0
- package/dist/contract/skills.d.ts +7 -0
- package/dist/contract/workflows.d.ts +6 -0
- package/dist/contract/workspace.d.ts +137 -2
- 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 +37 -6
- package/dist/core/agent-runner.js +35 -3
- package/dist/core/agent-runner.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.js +10 -5
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/codex-app-server-runner.js +13 -3
- package/dist/core/codex-app-server-runner.js.map +1 -1
- package/dist/core/codex-app-server-transport.js +7 -2
- package/dist/core/codex-app-server-transport.js.map +1 -1
- package/dist/core/model-identity.d.ts +23 -11
- package/dist/core/model-identity.js +41 -24
- package/dist/core/model-identity.js.map +1 -1
- package/dist/core/model-presets.d.ts +8 -2
- package/dist/core/model-presets.js +51 -8
- package/dist/core/model-presets.js.map +1 -1
- package/dist/core/opencode-model-catalog.d.ts +32 -0
- package/dist/core/opencode-model-catalog.js +153 -0
- package/dist/core/opencode-model-catalog.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +2 -0
- package/dist/core/opencode-server-runner.js +42 -11
- package/dist/core/opencode-server-runner.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 +95 -3
- package/dist/core/provider-auth.js +234 -15
- package/dist/core/provider-auth.js.map +1 -1
- package/dist/core/provider-availability.d.ts +1 -1
- package/dist/core/provider-availability.js +2 -1
- package/dist/core/provider-availability.js.map +1 -1
- package/dist/core/runner-factory.js +3 -0
- package/dist/core/runner-factory.js.map +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/ui-events.d.ts +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 +51 -26
- package/dist/git-diff-base.js +163 -37
- package/dist/git-diff-base.js.map +1 -1
- package/dist/git-worktree.d.ts +15 -6
- package/dist/git-worktree.js +10 -3
- package/dist/git-worktree.js.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +53 -5
- package/dist/paths.js +63 -9
- package/dist/paths.js.map +1 -1
- package/dist/planner.js +6 -0
- package/dist/planner.js.map +1 -1
- package/dist/release/snapshot.d.ts +13 -2
- package/dist/release/snapshot.js +25 -1
- package/dist/release/snapshot.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.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/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 +78 -19
- package/dist/runs/store.js +175 -43
- package/dist/runs/store.js.map +1 -1
- package/dist/server/capabilities.d.ts +15 -1
- package/dist/server/capabilities.js +16 -1
- package/dist/server/capabilities.js.map +1 -1
- package/dist/server/forge/github.d.ts +169 -0
- package/dist/server/forge/github.js +511 -0
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/forge/index.d.ts +9 -0
- package/dist/server/forge/index.js +14 -0
- package/dist/server/forge/index.js.map +1 -1
- package/dist/server/git-changes.d.ts +7 -5
- package/dist/server/git-changes.js +15 -10
- package/dist/server/git-changes.js.map +1 -1
- package/dist/server/github.d.ts +2 -2
- 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/provider-action-gate.js +3 -1
- package/dist/server/provider-action-gate.js.map +1 -1
- package/dist/server/server.d.ts +2206 -434
- package/dist/server/server.js +1219 -136
- package/dist/server/server.js.map +1 -1
- package/dist/server-install/engine.js +5 -18
- package/dist/server-install/engine.js.map +1 -1
- package/dist/server-install/steps.js +6 -2
- package/dist/server-install/steps.js.map +1 -1
- package/dist/skills.js +4 -0
- package/dist/skills.js.map +1 -1
- package/dist/workflows/run.d.ts +229 -9
- package/dist/workflows/run.js +877 -147
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +3 -0
- package/dist/workflows/types.js +11 -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 +27 -1
- package/dist/workspace/config.js +83 -2
- package/dist/workspace/config.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 +19 -1
- package/dist/workspace/projects.js +34 -1
- package/dist/workspace/projects.js.map +1 -1
- package/dist/workspace/semaphore.d.ts +46 -1
- package/dist/workspace/semaphore.js +41 -4
- package/dist/workspace/semaphore.js.map +1 -1
- package/dist/workspace/ui-state.d.ts +3 -2
- package/dist/workspace/ui-state.js +3 -2
- package/dist/workspace/ui-state.js.map +1 -1
- package/package.json +3 -3
- package/scripts/mock-claude.mjs +20 -0
- package/scripts/mock-pi-rpc.mjs +83 -0
- package/web/dist/assets/{alert-dialog-ghffK6g9.js → alert-dialog-Byp42_IG.js} +1 -1
- package/web/dist/assets/arrow-down-CGDbDYKD.js +1 -0
- package/web/dist/assets/arrow-left-ESCjr1Hq.js +1 -0
- package/web/dist/assets/centered-state-LfAW-igm.js +43 -0
- package/web/dist/assets/chevron-right-Du-P1IUd.js +1 -0
- package/web/dist/assets/{collapsible-B0JVzd0B.js → collapsible-CBiiqDJM.js} +1 -1
- package/web/dist/assets/{commit-list-wm6DPHNs.js → commit-list-6PPve7PE.js} +1 -1
- package/web/dist/assets/{compare-variants-DbdP4Y5T.js → compare-variants-BDnp6mXJ.js} +1 -1
- package/web/dist/assets/{diff-Bizc96qe.js → diff-_jK0OWpF.js} +2 -2
- package/web/dist/assets/{diff-stat-Dyfg3ltF.js → diff-stat-CIrTu4Ym.js} +1 -1
- package/web/dist/assets/{diff-view-CG8ek6tC.js → diff-view-COA_5IyY.js} +1 -1
- package/web/dist/assets/dropdown-menu-BofYpFFw.js +1 -0
- package/web/dist/assets/editable-title-_J0zFDl-.js +1 -0
- package/web/dist/assets/{ellipsis-vertical-DpGTRqC2.js → ellipsis-vertical-BeMR-l62.js} +1 -1
- package/web/dist/assets/{file-DlUGpUlb.js → file-DY996Pee.js} +1 -1
- package/web/dist/assets/{folder-BAY6Vddy.js → folder-NO3Ec-TY.js} +1 -1
- package/web/dist/assets/git-toolbar-BqJeUWcD.js +1 -0
- package/web/dist/assets/github-C96HPV9E.js +1 -0
- package/web/dist/assets/{image-preview-BWGk5fPX.js → image-preview-D9cCDfKQ.js} +1 -1
- package/web/dist/assets/index-Bx-grqa9.css +2 -0
- package/web/dist/assets/index-DoVvGDfW.js +7 -0
- package/web/dist/assets/{markdown-BGBOGCA_.js → markdown-DDzk11zj.js} +1 -1
- package/web/dist/assets/new-task-form-BNLLgC6P.js +1 -0
- package/web/dist/assets/pill-CVM1EmV4.js +1 -0
- package/web/dist/assets/{project-router-Cx8NPoqn.js → project-router-LRCtP48W.js} +1 -1
- package/web/dist/assets/prompt-templates-DFOvYgtW.js +15 -0
- package/web/dist/assets/{refresh-cw-BoGdAykg.js → refresh-cw-D1ys6QY2.js} +1 -1
- package/web/dist/assets/repo-git-CzUnsgWY.js +1 -0
- package/web/dist/assets/{run-diff-EcOkf3ti.js → run-diff-BlnqwfSS.js} +2 -2
- package/web/dist/assets/run-header-Bn7cN0Z1.js +1 -0
- package/web/dist/assets/{search-x-X3EpVhgs.js → search-x-D6FSpxId.js} +1 -1
- package/web/dist/assets/{skill-empty-hint-CZLALx6l.js → skill-empty-hint-iwpCcqgI.js} +1 -1
- package/web/dist/assets/skills-CezbOaol.js +1 -0
- package/web/dist/assets/{sparkles-Dt4q7pbG.js → sparkles-MrQrgCI9.js} +1 -1
- package/web/dist/assets/{square-terminal-hwBL8XsC.js → square-terminal-TTH64lO7.js} +1 -1
- package/web/dist/assets/tab-link-FYksz037.js +1 -0
- package/web/dist/assets/task-changes-ClWlnzBL.js +1 -0
- package/web/dist/assets/{task-commits-BTTA5k5T.js → task-commits-Crbrl86b.js} +1 -1
- package/web/dist/assets/{task-files-Da8_4C9g.js → task-files-uSCWyD0-.js} +2 -2
- package/web/dist/assets/task-thread-DPmamBA1.js +9 -0
- package/web/dist/assets/{textarea-CUdokhkv.js → textarea-B9Ahj4E4.js} +1 -1
- package/web/dist/assets/thread-loading-BH_ypQoy.js +1 -0
- package/web/dist/assets/{trash-2-DhVIdWv8.js → trash-2-D8S3V3fu.js} +1 -1
- package/web/dist/assets/{triangle-alert-XYT0DGCI.js → triangle-alert-bB7p9n5E.js} +1 -1
- package/web/dist/assets/{upload-BKjN59-1.js → upload-Bd5oRLPV.js} +1 -1
- package/web/dist/assets/{use-desktop-Bf5LS_P4.js → use-desktop-BNvbRBeZ.js} +1 -1
- package/web/dist/assets/{use-submit-shortcut-CzVyoAMd.js → use-submit-shortcut-B-xhu4Bf.js} +1 -1
- package/web/dist/assets/utils-BhpbVMwN.js +64 -0
- package/web/dist/assets/{workflows-o2QU_pvU.js → workflows-RmfbM9Vy.js} +3 -3
- package/web/dist/assets/{zoomable-image-7WyUiaVD.js → zoomable-image-BCW6ZBV0.js} +1 -1
- package/web/dist/index.html +24 -23
- package/web/dist/assets/arrow-down-Cz8qb71e.js +0 -1
- package/web/dist/assets/arrow-left-wcYKQXI_.js +0 -1
- package/web/dist/assets/centered-state-ZtnFHA-n.js +0 -43
- package/web/dist/assets/chevron-right-G4caF2QV.js +0 -1
- package/web/dist/assets/circle-check--KvBxXWp.js +0 -1
- package/web/dist/assets/circle-x-C3EFZ3xf.js +0 -1
- package/web/dist/assets/dropdown-menu-C1Dlf35P.js +0 -1
- package/web/dist/assets/editable-title-5rC_QRBZ.js +0 -1
- package/web/dist/assets/git-pull-request-agOG0iGM.js +0 -1
- package/web/dist/assets/git-toolbar-DGiNMmtY.js +0 -1
- package/web/dist/assets/github-Vp7lxYGQ.js +0 -1
- package/web/dist/assets/index-DSxyJpuK.css +0 -2
- package/web/dist/assets/index-DiawI6RX.js +0 -6
- package/web/dist/assets/new-task-form-BpAw_Dks.js +0 -1
- package/web/dist/assets/pill-Dvs-P0xy.js +0 -1
- package/web/dist/assets/prompt-templates-CSBYBR1I.js +0 -15
- package/web/dist/assets/repo-git-PmX-BNMo.js +0 -1
- package/web/dist/assets/run-header-BGiv6_qX.js +0 -1
- package/web/dist/assets/skills-CC91ouGH.js +0 -1
- package/web/dist/assets/tab-link-DIlR5T07.js +0 -1
- package/web/dist/assets/task-changes-XkHDxzQA.js +0 -1
- package/web/dist/assets/task-thread-DoNXUsHr.js +0 -9
- package/web/dist/assets/thread-loading-B8q8ukXJ.js +0 -1
- package/web/dist/assets/utils-DsLuRXwV.js +0 -64
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-profiles.js","sourceRoot":"","sources":["../../src/workspace/agent-profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,17 +33,28 @@ declare const workspaceProjectSchema: z.ZodObject<{
|
|
|
33
33
|
local: "local";
|
|
34
34
|
}>>;
|
|
35
35
|
maxParallel: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
36
|
+
tags: z.ZodCatch<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
36
37
|
}, z.core.$loose>;
|
|
37
38
|
export type WorkspaceProject = z.infer<typeof workspaceProjectSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* Zero-config cadence, in minutes, for re-checking a run parked with
|
|
41
|
+
* `CEZ:MONITORING` (#810). The single source of truth for that default — the
|
|
42
|
+
* schema below and `WorkspaceSemaphore`'s fallback both read it, so an install
|
|
43
|
+
* with no `~/.cezar/config.json` and a semaphore built without boot wiring
|
|
44
|
+
* agree. `null` (explicit park) is a user choice and is never replaced by it.
|
|
45
|
+
*/
|
|
46
|
+
export declare const DEFAULT_MONITORING_WAKE_MINUTES = 5;
|
|
38
47
|
declare const workspaceConfigSchema: z.ZodObject<{
|
|
39
48
|
schemaVersion: z.ZodCatch<z.ZodDefault<z.ZodNumber>>;
|
|
40
49
|
browseRoot: z.ZodCatch<z.ZodDefault<z.ZodString>>;
|
|
41
50
|
projectsDir: z.ZodCatch<z.ZodDefault<z.ZodString>>;
|
|
42
51
|
skillsAutoUpdate: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
|
|
52
|
+
modelsLocked: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
|
|
43
53
|
resources: z.ZodCatch<z.ZodPrefault<z.ZodObject<{
|
|
44
54
|
maxParallel: z.ZodCatch<z.ZodDefault<z.ZodNumber>>;
|
|
45
55
|
maxMonitoringSessions: z.ZodCatch<z.ZodDefault<z.ZodNumber>>;
|
|
46
56
|
monitoringWakeIntervalMinutes: z.ZodCatch<z.ZodDefault<z.ZodNullable<z.ZodNumber>>>;
|
|
57
|
+
autoResumeOnUsageLimit: z.ZodCatch<z.ZodDefault<z.ZodBoolean>>;
|
|
47
58
|
memoryLimitMb: z.ZodCatch<z.ZodDefault<z.ZodNullable<z.ZodNumber>>>;
|
|
48
59
|
worktreeRetentionDefault: z.ZodCatch<z.ZodDefault<z.ZodNumber>>;
|
|
49
60
|
}, z.core.$loose>>>;
|
|
@@ -51,7 +62,21 @@ declare const workspaceConfigSchema: z.ZodObject<{
|
|
|
51
62
|
autonomous: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
|
|
52
63
|
worktree: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
|
|
53
64
|
}, z.core.$loose>>>;
|
|
54
|
-
disabledProviders: z.ZodPipe<z.ZodCatch<z.ZodDefault<z.ZodArray<z.ZodUnknown>>>, z.ZodTransform<("claude" | "codex" | "opencode")[], unknown[]>>;
|
|
65
|
+
disabledProviders: z.ZodPipe<z.ZodCatch<z.ZodDefault<z.ZodArray<z.ZodUnknown>>>, z.ZodTransform<("claude" | "codex" | "opencode" | "pi")[], unknown[]>>;
|
|
66
|
+
agentDefaults: z.ZodCatch<z.ZodDefault<z.ZodObject<{
|
|
67
|
+
runner: z.ZodCatch<z.ZodOptional<z.ZodEnum<{
|
|
68
|
+
claude: "claude";
|
|
69
|
+
codex: "codex";
|
|
70
|
+
opencode: "opencode";
|
|
71
|
+
pi: "pi";
|
|
72
|
+
}>>>;
|
|
73
|
+
models: z.ZodCatch<z.ZodOptional<z.ZodObject<{
|
|
74
|
+
claude: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
75
|
+
codex: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
76
|
+
opencode: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
77
|
+
pi: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
78
|
+
}, z.core.$loose>>>;
|
|
79
|
+
}, z.core.$loose>>>;
|
|
55
80
|
projects: z.ZodPipe<z.ZodCatch<z.ZodDefault<z.ZodArray<z.ZodUnknown>>>, z.ZodTransform<{
|
|
56
81
|
[x: string]: unknown;
|
|
57
82
|
id: string;
|
|
@@ -61,6 +86,7 @@ declare const workspaceConfigSchema: z.ZodObject<{
|
|
|
61
86
|
lastOpenedAt: string;
|
|
62
87
|
source: "checkout" | "local";
|
|
63
88
|
maxParallel?: number | undefined;
|
|
89
|
+
tags?: string[] | undefined;
|
|
64
90
|
}[], unknown[]>>;
|
|
65
91
|
}, z.core.$loose>;
|
|
66
92
|
export type WorkspaceConfig = z.infer<typeof workspaceConfigSchema>;
|
package/dist/workspace/config.js
CHANGED
|
@@ -3,6 +3,10 @@ import { chmodSync, mkdirSync, renameSync, writeFileSync } from 'node:fs';
|
|
|
3
3
|
import { readFile } from 'node:fs/promises';
|
|
4
4
|
import { dirname } from 'node:path';
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
+
// Contract VALUES, like `workspaceUiStateSchema` in workspace/migrations.ts: the tag bounds this
|
|
7
|
+
// file must not `.catch` away are the same constants the PATCH route validates against, so they
|
|
8
|
+
// are imported rather than repeated.
|
|
9
|
+
import { PROJECT_TAGS_MAX, PROJECT_TAG_MAX_LENGTH } from '../contract/index.js';
|
|
6
10
|
import { PROVIDER_IDS } from '../core/provider-auth.js';
|
|
7
11
|
import { assertCezarHomeWriteIsSandboxed, workspaceConfigPath } from '../paths.js';
|
|
8
12
|
/**
|
|
@@ -45,16 +49,62 @@ const workspaceProjectSchema = z
|
|
|
45
49
|
* value degrades to "inherit" (`.catch(undefined)`) rather than a hard
|
|
46
50
|
* default, and `.passthrough()` preserves the key across cezar round-trips. */
|
|
47
51
|
maxParallel: z.number().int().min(1).max(16).optional().catch(undefined),
|
|
52
|
+
/** Free-form labels grouping connected repositories (`storefront`, `infra`), used by the
|
|
53
|
+
* global Tasks page to filter and group across projects. Absent = untagged; the writers
|
|
54
|
+
* (`PATCH /api/projects/:id`, `cezar projects tag`) delete the key rather than storing `[]`,
|
|
55
|
+
* so an untagged project costs nothing in the file. Bounds mirror the PATCH schema exactly,
|
|
56
|
+
* so a value that route accepts can never be degraded away by the next load's `.catch`. */
|
|
57
|
+
tags: z
|
|
58
|
+
.array(z.string().trim().min(1).max(PROJECT_TAG_MAX_LENGTH))
|
|
59
|
+
.max(PROJECT_TAGS_MAX)
|
|
60
|
+
.optional()
|
|
61
|
+
.catch(undefined),
|
|
48
62
|
})
|
|
49
63
|
.passthrough();
|
|
64
|
+
/**
|
|
65
|
+
* Zero-config cadence, in minutes, for re-checking a run parked with
|
|
66
|
+
* `CEZ:MONITORING` (#810). The single source of truth for that default — the
|
|
67
|
+
* schema below and `WorkspaceSemaphore`'s fallback both read it, so an install
|
|
68
|
+
* with no `~/.cezar/config.json` and a semaphore built without boot wiring
|
|
69
|
+
* agree. `null` (explicit park) is a user choice and is never replaced by it.
|
|
70
|
+
*/
|
|
71
|
+
export const DEFAULT_MONITORING_WAKE_MINUTES = 5;
|
|
50
72
|
const resourcesSchema = z
|
|
51
73
|
.object({
|
|
52
74
|
/** Workspace-wide parallel-task cap (moved from per-repo config.json). */
|
|
53
75
|
maxParallel: z.number().int().min(1).max(16).default(2).catch(2),
|
|
54
76
|
/** Extra durable `CEZ:MONITORING` sessions exempt from the active-task cap. */
|
|
55
77
|
maxMonitoringSessions: z.number().int().min(0).max(16).default(2).catch(2),
|
|
56
|
-
/**
|
|
57
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Cadence for re-checking monitored work; `null` parks at zero model cost until a
|
|
80
|
+
* user (or an external integration) resumes the session.
|
|
81
|
+
*
|
|
82
|
+
* Default-ON at 5 minutes (#810). It shipped as `null` and that made monitoring a
|
|
83
|
+
* dead end: #661 removed the 15-minute idle timer that used to bound a parked
|
|
84
|
+
* monitor, so with no wake timer a `CEZ:MONITORING` run has NO timer at all — and
|
|
85
|
+
* cezar has no other resume path (no process-exit callback, no CI webhook, no
|
|
86
|
+
* sub-agent-completion event). Tasks sat in `monitoring` for hours until a human
|
|
87
|
+
* typed something. Same reasoning as `autoResumeOnUsageLimit` below: it spends
|
|
88
|
+
* nothing while the downstream work is genuinely pending and it finishes the work
|
|
89
|
+
* the user already asked for. `MAX_AUTO_CONTINUES` still caps a forgotten loop, and
|
|
90
|
+
* an explicit `null` (Settings → Resources → "Park until resumed") is preserved.
|
|
91
|
+
*/
|
|
92
|
+
monitoringWakeIntervalMinutes: z
|
|
93
|
+
.number()
|
|
94
|
+
.int()
|
|
95
|
+
.min(1)
|
|
96
|
+
.max(60)
|
|
97
|
+
.nullable()
|
|
98
|
+
.default(DEFAULT_MONITORING_WAKE_MINUTES)
|
|
99
|
+
.catch(DEFAULT_MONITORING_WAKE_MINUTES),
|
|
100
|
+
/**
|
|
101
|
+
* Resume a task the provider's usage limit stopped, once that limit resets
|
|
102
|
+
* (spec 2026-08-03-auto-resume-after-usage-limit). ON by default, which is the one
|
|
103
|
+
* cost-bearing automation in this file that is: it spends nothing while it waits, and it
|
|
104
|
+
* finishes the work the user already asked for rather than starting any of its own. Switching
|
|
105
|
+
* it off leaves the run `failed` with its Continue button, exactly as before the feature.
|
|
106
|
+
*/
|
|
107
|
+
autoResumeOnUsageLimit: z.boolean().default(true).catch(true),
|
|
58
108
|
/** Per-task memory ceiling in MiB; null = no limit (matches the file's
|
|
59
109
|
* literal `"memoryLimitMb": null` in the spec's Data Model). */
|
|
60
110
|
memoryLimitMb: z.number().int().min(0).max(1_048_576).nullable().default(null).catch(null),
|
|
@@ -68,6 +118,32 @@ const composerDefaultsSchema = z
|
|
|
68
118
|
worktree: z.boolean().optional().catch(undefined),
|
|
69
119
|
})
|
|
70
120
|
.passthrough();
|
|
121
|
+
/**
|
|
122
|
+
* What a repo that has said nothing runs (spec 2026-07-29-agent-profiles).
|
|
123
|
+
*
|
|
124
|
+
* The point is not to configure every checkout: a repo's own `.ai/cezar/config.json` still wins
|
|
125
|
+
* key by key, and this is only consulted where that file is SILENT. Which is why every key here is
|
|
126
|
+
* optional with no default — an absent `runner` has to stay distinguishable from one someone chose,
|
|
127
|
+
* or "fall back to the machine default" collapses into "always claude".
|
|
128
|
+
*
|
|
129
|
+
* Personal and per-machine, like everything else in this file. The repo config is the team's; this
|
|
130
|
+
* is yours.
|
|
131
|
+
*/
|
|
132
|
+
const agentDefaultsSchema = z
|
|
133
|
+
.object({
|
|
134
|
+
runner: z.enum(PROVIDER_IDS).optional().catch(undefined),
|
|
135
|
+
models: z
|
|
136
|
+
.object({
|
|
137
|
+
claude: z.string().trim().min(1).max(200).optional().catch(undefined),
|
|
138
|
+
codex: z.string().trim().min(1).max(200).optional().catch(undefined),
|
|
139
|
+
opencode: z.string().trim().min(1).max(200).optional().catch(undefined),
|
|
140
|
+
pi: z.string().trim().min(1).max(200).optional().catch(undefined),
|
|
141
|
+
})
|
|
142
|
+
.passthrough()
|
|
143
|
+
.optional()
|
|
144
|
+
.catch(undefined),
|
|
145
|
+
})
|
|
146
|
+
.passthrough();
|
|
71
147
|
const workspacePathSchema = (envName, fallback) => {
|
|
72
148
|
const defaultValue = () => process.env[envName]?.trim() || fallback;
|
|
73
149
|
return z.string().min(1).max(4096).default(defaultValue).catch(defaultValue);
|
|
@@ -101,6 +177,9 @@ const workspaceConfigSchema = z
|
|
|
101
177
|
/** Optional auto-update override. Absence inherits the environment/default
|
|
102
178
|
* and must stay absent on unrelated merge-writes. */
|
|
103
179
|
skillsAutoUpdate: z.boolean().optional().catch(undefined),
|
|
180
|
+
/** Global opt-in model policy. The native coding-agent model becomes
|
|
181
|
+
* authoritative while runner choice remains available. */
|
|
182
|
+
modelsLocked: z.boolean().optional().catch(undefined),
|
|
104
183
|
// Function-form default/catch: mutators (step 1.3's registerProject) edit
|
|
105
184
|
// these objects in place, so parses must never share one reference.
|
|
106
185
|
resources: resourcesSchema.prefault(() => ({})).catch(() => resourcesSchema.parse({})),
|
|
@@ -108,6 +187,8 @@ const workspaceConfigSchema = z
|
|
|
108
187
|
composerDefaults: composerDefaultsSchema.default(() => ({})).catch(() => ({})),
|
|
109
188
|
/** Host-wide provider preferences; absent means every provider is enabled. */
|
|
110
189
|
disabledProviders: disabledProvidersSchema,
|
|
190
|
+
/** Machine-wide agent/model defaults for repos that set none of their own. */
|
|
191
|
+
agentDefaults: agentDefaultsSchema.default(() => ({})).catch(() => ({})),
|
|
111
192
|
/** Per-entry salvage: a corrupt entry is dropped, the rest of the registry
|
|
112
193
|
* survives (a whole-array `.catch([])` would evict every project over one
|
|
113
194
|
* bad row). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/workspace/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAmB,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEnF;;;;;;;;;;;;;;;GAeG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAEzD;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,kEAAkE;IAClE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC;IACnC;kFAC8E;IAC9E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,uBAAuB,CAAC;IAC3F,4EAA4E;IAC5E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IACpD;;;oFAGgF;IAChF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/workspace/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { stat } from 'node:fs/promises';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { workspaceConfigPath } from '../paths.js';
|
|
4
|
-
import { loadWorkspaceConfig } from './config.js';
|
|
5
|
-
import { listProjects, registerProject, removeProject, shouldRegisterProject } from './projects.js';
|
|
4
|
+
import { loadWorkspaceConfig, mergeWriteWorkspaceConfig } from './config.js';
|
|
5
|
+
import { listProjects, normalizeProjectTags, registerProject, removeProject, shouldRegisterProject, } from './projects.js';
|
|
6
6
|
const defaultIo = {
|
|
7
7
|
log: (line) => console.log(line),
|
|
8
8
|
error: (line) => console.error(line),
|
|
@@ -11,10 +11,13 @@ const USAGE = `usage:
|
|
|
11
11
|
cezar projects [list] list the registered projects
|
|
12
12
|
cezar projects add [<dir>] register a folder (default: --repo, else cwd)
|
|
13
13
|
cezar projects remove <id> drop a registry entry (the repo is untouched)
|
|
14
|
+
cezar projects tag <id> [<tag>…]
|
|
15
|
+
set the grouping tags of a project (none clears them)
|
|
14
16
|
|
|
15
|
-
add/remove are unavailable when CEZ_SINGLE_PROJECT=1`;
|
|
17
|
+
add/remove/tag are unavailable when CEZ_SINGLE_PROJECT=1`;
|
|
16
18
|
const SINGLE_PROJECT_ADD_ERROR = 'single-project mode is enabled; adding projects is disabled';
|
|
17
19
|
const SINGLE_PROJECT_REMOVE_ERROR = 'single-project mode is enabled; removing projects is disabled';
|
|
20
|
+
const SINGLE_PROJECT_EDIT_ERROR = 'single-project mode is enabled; editing projects is disabled';
|
|
18
21
|
/**
|
|
19
22
|
* Run one `projects` subcommand. Returns the process exit code (0 ok, 1 for a
|
|
20
23
|
* usage error, an unknown id, or a folder the registration guards refuse) so
|
|
@@ -40,6 +43,12 @@ export async function runProjectsCommand(args, opts) {
|
|
|
40
43
|
return 1;
|
|
41
44
|
}
|
|
42
45
|
return removeCommand(rest[0], io);
|
|
46
|
+
case 'tag':
|
|
47
|
+
if (singleProject) {
|
|
48
|
+
io.error(SINGLE_PROJECT_EDIT_ERROR);
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
return tagCommand(rest[0], rest.slice(1), io);
|
|
43
52
|
default:
|
|
44
53
|
io.error(`unknown projects subcommand: ${sub}\n`);
|
|
45
54
|
io.error(USAGE);
|
|
@@ -74,7 +83,10 @@ async function listCommand(io, singleProject, bootProjectId) {
|
|
|
74
83
|
io.log('');
|
|
75
84
|
for (const project of projects) {
|
|
76
85
|
const label = statusLabel(project).padEnd(labelWidth);
|
|
77
|
-
|
|
86
|
+
// Tags trail the path rather than taking a column of their own: most projects have none,
|
|
87
|
+
// and a mostly-empty column would cost every row width to say nothing.
|
|
88
|
+
const tags = project.tags?.length ? ` [${project.tags.join(' ')}]` : '';
|
|
89
|
+
io.log(` ${statusMark(project.status)} ${project.id.padEnd(idWidth)} ${label} ${project.root}${tags}`);
|
|
78
90
|
}
|
|
79
91
|
io.log(`\n ${projects.length} project(s) — registry: ${workspaceConfigPath()}\n`);
|
|
80
92
|
return 0;
|
|
@@ -119,4 +131,42 @@ async function removeCommand(id, io) {
|
|
|
119
131
|
io.log(` - ${id} (registry entry only — the repo and its .ai/cezar/ are untouched)`);
|
|
120
132
|
return 0;
|
|
121
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* `cezar projects tag <id> [<tag>…]` — the terminal twin of the Tags cell in
|
|
136
|
+
* Settings → Projects.
|
|
137
|
+
*
|
|
138
|
+
* Replaces the WHOLE list, like the PATCH route does, and for the same reason:
|
|
139
|
+
* the caller always knows the full set, and an add-one/remove-one grammar would
|
|
140
|
+
* be a merge protocol with no one to merge against. No tags at all clears them.
|
|
141
|
+
* Normalization is the shared `normalizeProjectTags`, so a tag typed here and a
|
|
142
|
+
* tag typed in the cockpit are stored identically.
|
|
143
|
+
*/
|
|
144
|
+
async function tagCommand(id, tags, io) {
|
|
145
|
+
if (!id) {
|
|
146
|
+
io.error(USAGE);
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
const normalized = normalizeProjectTags(tags);
|
|
150
|
+
let known = false;
|
|
151
|
+
await mergeWriteWorkspaceConfig((config) => {
|
|
152
|
+
const entry = config.projects.find((project) => project.id === id);
|
|
153
|
+
if (!entry)
|
|
154
|
+
return;
|
|
155
|
+
known = true;
|
|
156
|
+
// Mutated in place so `.passthrough()` keys on the entry survive, and the key
|
|
157
|
+
// is DELETED rather than set to `[]`: an untagged project stores nothing.
|
|
158
|
+
if (normalized === undefined)
|
|
159
|
+
delete entry.tags;
|
|
160
|
+
else
|
|
161
|
+
entry.tags = normalized;
|
|
162
|
+
});
|
|
163
|
+
if (!known) {
|
|
164
|
+
io.error(`unknown project: ${id}`);
|
|
165
|
+
return 1;
|
|
166
|
+
}
|
|
167
|
+
io.log(normalized === undefined
|
|
168
|
+
? ` = ${id} (no tags)`
|
|
169
|
+
: ` = ${id} [${normalized.join(' ')}]`);
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
122
172
|
//# sourceMappingURL=projects-cli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-cli.js","sourceRoot":"","sources":["../../src/workspace/projects-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"projects-cli.js","sourceRoot":"","sources":["../../src/workspace/projects-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,19 @@ export declare function shouldRegisterProject(repoRoot: string): Promise<boolean
|
|
|
49
49
|
* all. Unknown → allocate a slug and append a new entry via merge-write.
|
|
50
50
|
*/
|
|
51
51
|
export declare function registerProject(root: string, source?: 'local' | 'checkout'): Promise<WorkspaceProject>;
|
|
52
|
+
/**
|
|
53
|
+
* The ONE spelling rule for project tags — applied on every write, never on read.
|
|
54
|
+
*
|
|
55
|
+
* Trimmed, empties dropped, over-long ones truncated, deduped CASE-INSENSITIVELY (the first
|
|
56
|
+
* spelling wins, so `Storefront` typed before `storefront` keeps its capital), capped at
|
|
57
|
+
* `PROJECT_TAGS_MAX`, and sorted so two projects tagged with the same set store and render the
|
|
58
|
+
* same list. Case-insensitive dedupe is what makes tags usable as a grouping key: `API` and `api`
|
|
59
|
+
* grouping into two columns of the same thing is the whole failure this prevents.
|
|
60
|
+
*
|
|
61
|
+
* Returns `undefined` — never `[]` — for an empty result, because the registry stores nothing for
|
|
62
|
+
* an untagged project and `delete entry.tags` is what the writers then do.
|
|
63
|
+
*/
|
|
64
|
+
export declare function normalizeProjectTags(tags: readonly string[] | null | undefined): string[] | undefined;
|
|
52
65
|
export type ProjectStatus = 'ok' | 'missing' | 'not-git';
|
|
53
66
|
export interface ProjectListEntry extends WorkspaceProject {
|
|
54
67
|
/** `missing` = root gone/unreadable; `not-git` = exists but no `.git`. */
|
|
@@ -60,6 +73,11 @@ export interface ProjectListEntry extends WorkspaceProject {
|
|
|
60
73
|
* The sidebar gates each project group's GitHub tab on this, instead of on
|
|
61
74
|
* the boot folder's health-level forge answer. */
|
|
62
75
|
forge?: ForgeKind;
|
|
76
|
+
/** The remote's web root (`https://github.com/owner/repo`), rebuilt from the
|
|
77
|
+
* parsed remote so it can never carry credentials. What lets a cross-project
|
|
78
|
+
* surface link a reference the run knows only by NUMBER — the global Tasks
|
|
79
|
+
* page has one row per project and so cannot use any single repo's base. */
|
|
80
|
+
repoUrl?: string;
|
|
63
81
|
}
|
|
64
82
|
/** Test hook: drop cached probes so status changes are visible immediately. */
|
|
65
83
|
export declare function clearProjectProbeCache(): void;
|
|
@@ -70,7 +88,7 @@ export declare function clearProjectProbeCache(): void;
|
|
|
70
88
|
* SAME shape the list route does — one project, one shape, whichever route
|
|
71
89
|
* produced it.
|
|
72
90
|
*/
|
|
73
|
-
export declare function probeProjectStatus(root: string): Promise<Pick<ProjectListEntry, 'status' | 'branch' | 'forge'>>;
|
|
91
|
+
export declare function probeProjectStatus(root: string): Promise<Pick<ProjectListEntry, 'status' | 'branch' | 'forge' | 'repoUrl'>>;
|
|
74
92
|
/**
|
|
75
93
|
* Registry entries in stored order, each with its `status` (+`branch` when
|
|
76
94
|
* available). Probes run concurrently and are TTL-cached per root. A
|
|
@@ -1,7 +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 {
|
|
4
|
+
import { PROJECT_TAGS_MAX, PROJECT_TAG_MAX_LENGTH } from '../contract/index.js';
|
|
5
|
+
import { forgeKindOfRemote, forgeWebRoot } from '../server/forge/index.js';
|
|
5
6
|
import { getRepoInfo } from '../server/git.js';
|
|
6
7
|
import { mergeWriteWorkspaceConfig, loadWorkspaceConfig, } from './config.js';
|
|
7
8
|
/**
|
|
@@ -140,6 +141,35 @@ export async function registerProject(root, source = 'local') {
|
|
|
140
141
|
throw new Error('registerProject: merge-write did not run the mutator');
|
|
141
142
|
return entry;
|
|
142
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
|
+
}
|
|
143
173
|
/** Probe TTL — long enough to coalesce a burst of sidebar renders, short
|
|
144
174
|
* enough that a deleted repo shows as `missing` on the next real look. */
|
|
145
175
|
const PROBE_TTL_MS = 5_000;
|
|
@@ -168,10 +198,13 @@ async function computeProbe(root) {
|
|
|
168
198
|
// on e.g. an unborn HEAD), and a repo without either is still status ok.
|
|
169
199
|
const info = await getRepoInfo(root);
|
|
170
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);
|
|
171
203
|
return {
|
|
172
204
|
status: 'ok',
|
|
173
205
|
...(info?.branch ? { branch: info.branch } : {}),
|
|
174
206
|
...(forge ? { forge } : {}),
|
|
207
|
+
...(repoUrl ? { repoUrl } : {}),
|
|
175
208
|
};
|
|
176
209
|
}
|
|
177
210
|
async function probeRoot(root) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/workspace/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAkB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/workspace/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,8 +33,12 @@ export interface WorkspaceResourceLimits {
|
|
|
33
33
|
maxParallel: number;
|
|
34
34
|
/** Durable monitoring sessions that do not consume active-task capacity. */
|
|
35
35
|
maxMonitoringSessions?: number;
|
|
36
|
-
/**
|
|
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. */
|
|
37
39
|
monitoringWakeIntervalMinutes?: number | null;
|
|
40
|
+
/** Resume a run stopped by a provider usage limit when that limit resets. Default ON. */
|
|
41
|
+
autoResumeOnUsageLimit?: boolean;
|
|
38
42
|
/** Per-task process-tree memory ceiling in MiB; null = no limit. */
|
|
39
43
|
memoryLimitMb: number | null;
|
|
40
44
|
/**
|
|
@@ -46,6 +50,20 @@ export interface WorkspaceResourceLimits {
|
|
|
46
50
|
*/
|
|
47
51
|
projectLimits?: ReadonlyMap<string, number>;
|
|
48
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
|
+
}
|
|
49
67
|
/** One manager's seam into the shared counter. */
|
|
50
68
|
export interface SemaphoreParticipant {
|
|
51
69
|
/** Slots this manager currently holds. The #347 exemption lives in the
|
|
@@ -60,6 +78,15 @@ export interface SemaphoreParticipant {
|
|
|
60
78
|
* workspace's longest-waiting run instead of whichever manager happens to
|
|
61
79
|
* have registered first. */
|
|
62
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;
|
|
63
90
|
}
|
|
64
91
|
export interface WorkspaceSemaphoreOptions {
|
|
65
92
|
/** Snapshot source for `refresh()` — tests inject a stub; production keeps
|
|
@@ -89,9 +116,27 @@ export declare class WorkspaceSemaphore {
|
|
|
89
116
|
/** Cached workspace-wide parallel cap. */
|
|
90
117
|
maxParallel(): number;
|
|
91
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. */
|
|
92
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;
|
|
93
127
|
/** Cached per-task memory ceiling (MiB), or null for no limit. */
|
|
94
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;
|
|
95
140
|
/**
|
|
96
141
|
* A slot came free somewhere in the workspace: pump EVERY manager,
|
|
97
142
|
* longest-waiting-queue first.
|