@rubytech/create-maxy-code 0.1.323 → 0.1.325
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/package.json +1 -1
- package/payload/platform/lib/models/dist/index.d.ts +9 -0
- package/payload/platform/lib/models/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/models/dist/index.js +17 -3
- package/payload/platform/lib/models/dist/index.js.map +1 -1
- package/payload/platform/lib/models/src/index.ts +17 -2
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +2 -2
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +46 -9
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/server/public/assets/AdminLoginScreens-BRuf77z9.js +1 -0
- package/payload/server/public/assets/AdminShell-DNHJCrt1.js +1 -0
- package/payload/server/public/assets/{Checkbox-CezYRnKL.js → Checkbox-C3WNcLH8.js} +1 -1
- package/payload/server/public/assets/OperatorConversations-BQudGb45.css +1 -0
- package/payload/server/public/assets/{OperatorConversations-D6BawEz3.js → OperatorConversations-BqFmHTF1.js} +1 -1
- package/payload/server/public/assets/{admin-BVpCUS4j.js → admin-BhME5PGQ.js} +1 -1
- package/payload/server/public/assets/{browser-ByLzuh0X.js → browser-DW_bivL3.js} +1 -1
- package/payload/server/public/assets/chat-CV7vRNtO.js +1 -0
- package/payload/server/public/assets/{data-Da1oTowD.js → data-4jByS_fv.js} +1 -1
- package/payload/server/public/assets/{graph-iYrodF_0.js → graph-Dr2jWCTw.js} +2 -2
- package/payload/server/public/assets/{graph-labels-DM9u5VTf.js → graph-labels-hGbD_0qZ.js} +1 -1
- package/payload/server/public/assets/{operator-BPplyxq-.js → operator-D7jjhQy9.js} +1 -1
- package/payload/server/public/assets/page-Dd5g92a7.js +30 -0
- package/payload/server/public/assets/{public-wBFC1mQO.js → public-BFTed_RH.js} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/chat.html +5 -5
- package/payload/server/public/data.html +4 -4
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +6 -6
- package/payload/server/public/operator.html +7 -7
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +13 -1
- package/payload/server/public/assets/AdminLoginScreens-BBtA0mi8.js +0 -1
- package/payload/server/public/assets/AdminShell-CZW9x0-A.js +0 -1
- package/payload/server/public/assets/OperatorConversations-Bhyf22Ct.css +0 -1
- package/payload/server/public/assets/chat-DTvzNb92.js +0 -1
- package/payload/server/public/assets/page-oogapuCz.js +0 -30
package/package.json
CHANGED
|
@@ -46,4 +46,13 @@ export type SpawnPermissionMode = (typeof SPAWN_PERMISSION_MODES)[number];
|
|
|
46
46
|
* plus the session-only `auto`/`max` excluded from that subset. */
|
|
47
47
|
export declare const SESSION_EFFORT_LEVELS: readonly ["auto", "low", "medium", "high", "xhigh", "max"];
|
|
48
48
|
export type SessionEffortLevel = (typeof SESSION_EFFORT_LEVELS)[number];
|
|
49
|
+
/** The 5 effort levels the /chat new-session picker may write: the 4 settings.json
|
|
50
|
+
* levels plus the session-only `max`. Distinct from EFFORT_LEVELS (the fork/daemon
|
|
51
|
+
* settings.json subset — `max` is invalid as a settings.json `effortLevel`) and
|
|
52
|
+
* from SESSION_EFFORT_LEVELS (which also carries `auto`, never offered by the
|
|
53
|
+
* picker). A `max` pick reaches the CLI via the `--effort max` argv flag, not the
|
|
54
|
+
* inline `effortLevel` settings key. */
|
|
55
|
+
export declare const NEW_SESSION_EFFORT_LEVELS: readonly ["low", "medium", "high", "xhigh", "max"];
|
|
56
|
+
export type NewSessionEffortLevel = (typeof NEW_SESSION_EFFORT_LEVELS)[number];
|
|
57
|
+
export declare function isNewSessionEffortLevel(value: string): value is NewSessionEffortLevel;
|
|
49
58
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAChD,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAChD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAE9C,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIvD,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;qEAEqE;AACrE,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAItD,CAAC;AAEF;+DAC+D;AAC/D,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;mCAGmC;AACnC,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA4C,CAAC;AAC5F,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;qCAKqC;AACrC,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;wDAIwD;AACxD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAChD,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAChD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAE9C,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIvD,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;qEAEqE;AACrE,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAItD,CAAC;AAEF;+DAC+D;AAC/D,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;mCAGmC;AACnC,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA4C,CAAC;AAC5F,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;qCAKqC;AACrC,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;wDAIwD;AACxD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;AAaD,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,0EAA2E,CAAC;AACzG,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE;AAED,sDAAsD;AACtD,eAAO,MAAM,aAAa,6CAA8C,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEjE;AASD;kFACkF;AAClF,eAAO,MAAM,sBAAsB,qFAA4C,CAAC;AAChF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E;oEACoE;AACpE,eAAO,MAAM,qBAAqB,4DAA6C,CAAC;AAChF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE;;;;;yCAKyC;AACzC,eAAO,MAAM,yBAAyB,oDAAqC,CAAC;AAC5E,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,qBAAqB,CAErF"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Templates, docs, and skills reference these values as strings;
|
|
4
4
|
// all TypeScript consumers import from here.
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SESSION_EFFORT_LEVELS = exports.SPAWN_PERMISSION_MODES = exports.EFFORT_LEVELS = exports.PERMISSION_MODES = exports.SELECTABLE_MODELS = exports.MODEL_DISPLAY_NAMES = exports.MODEL_CONTEXT_WINDOW = exports.HAIKU_MODEL = exports.SONNET_MODEL = exports.OPUS_MODEL = void 0;
|
|
6
|
+
exports.NEW_SESSION_EFFORT_LEVELS = exports.SESSION_EFFORT_LEVELS = exports.SPAWN_PERMISSION_MODES = exports.EFFORT_LEVELS = exports.PERMISSION_MODES = exports.SELECTABLE_MODELS = exports.MODEL_DISPLAY_NAMES = exports.MODEL_CONTEXT_WINDOW = exports.HAIKU_MODEL = exports.SONNET_MODEL = exports.OPUS_MODEL = void 0;
|
|
7
7
|
exports.contextWindow = contextWindow;
|
|
8
8
|
exports.modelDisplayName = modelDisplayName;
|
|
9
9
|
exports.isSelectableModel = isSelectableModel;
|
|
@@ -11,6 +11,7 @@ exports.baseModelId = baseModelId;
|
|
|
11
11
|
exports.canonicalModelId = canonicalModelId;
|
|
12
12
|
exports.isPermissionMode = isPermissionMode;
|
|
13
13
|
exports.isEffortLevel = isEffortLevel;
|
|
14
|
+
exports.isNewSessionEffortLevel = isNewSessionEffortLevel;
|
|
14
15
|
// Opus defaults to the 1M-context variant ([1m] is Claude Code's
|
|
15
16
|
// context-extension suffix, valid in settings.json "model" and agent
|
|
16
17
|
// frontmatter); Sonnet/Haiku stay on the standard 200k window.
|
|
@@ -69,8 +70,11 @@ function canonicalModelId(id) {
|
|
|
69
70
|
// modes and the settings.json effort levels. Single source of truth, imported
|
|
70
71
|
// by the webchat route, the session manager (rc-daemon + fork), the re-seat
|
|
71
72
|
// route, and the two /chat lever components. Friendly labels stay UI-local;
|
|
72
|
-
// only the value sets and their validators live here. `dontAsk`
|
|
73
|
-
//
|
|
73
|
+
// only the value sets and their validators live here. `dontAsk` is excluded from
|
|
74
|
+
// both (no surface offers it); `max` is excluded from the settings.json effort
|
|
75
|
+
// subset because it is invalid as a settings.json `effortLevel` — the new-session
|
|
76
|
+
// picker still offers it, routed via the `--effort max` argv flag (see
|
|
77
|
+
// NEW_SESSION_EFFORT_LEVELS below).
|
|
74
78
|
/** The 5 permission modes the /chat composer and re-seat fork may write. */
|
|
75
79
|
exports.PERMISSION_MODES = ["default", "acceptEdits", "plan", "auto", "bypassPermissions"];
|
|
76
80
|
function isPermissionMode(value) {
|
|
@@ -93,4 +97,14 @@ exports.SPAWN_PERMISSION_MODES = [...exports.PERMISSION_MODES, "dontAsk"];
|
|
|
93
97
|
/** The full effort set persisted in account.json: the 4 settings.json levels
|
|
94
98
|
* plus the session-only `auto`/`max` excluded from that subset. */
|
|
95
99
|
exports.SESSION_EFFORT_LEVELS = ["auto", ...exports.EFFORT_LEVELS, "max"];
|
|
100
|
+
/** The 5 effort levels the /chat new-session picker may write: the 4 settings.json
|
|
101
|
+
* levels plus the session-only `max`. Distinct from EFFORT_LEVELS (the fork/daemon
|
|
102
|
+
* settings.json subset — `max` is invalid as a settings.json `effortLevel`) and
|
|
103
|
+
* from SESSION_EFFORT_LEVELS (which also carries `auto`, never offered by the
|
|
104
|
+
* picker). A `max` pick reaches the CLI via the `--effort max` argv flag, not the
|
|
105
|
+
* inline `effortLevel` settings key. */
|
|
106
|
+
exports.NEW_SESSION_EFFORT_LEVELS = [...exports.EFFORT_LEVELS, "max"];
|
|
107
|
+
function isNewSessionEffortLevel(value) {
|
|
108
|
+
return exports.NEW_SESSION_EFFORT_LEVELS.includes(value);
|
|
109
|
+
}
|
|
96
110
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,iEAAiE;AACjE,6CAA6C;;;AAgB7C,sCAEC;AAaD,4CAEC;AAOD,8CAEC;AAQD,kCAEC;AAOD,4CAEC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,8 +68,11 @@ export function canonicalModelId(id: string): string {
|
|
|
68
68
|
// modes and the settings.json effort levels. Single source of truth, imported
|
|
69
69
|
// by the webchat route, the session manager (rc-daemon + fork), the re-seat
|
|
70
70
|
// route, and the two /chat lever components. Friendly labels stay UI-local;
|
|
71
|
-
// only the value sets and their validators live here. `dontAsk`
|
|
72
|
-
//
|
|
71
|
+
// only the value sets and their validators live here. `dontAsk` is excluded from
|
|
72
|
+
// both (no surface offers it); `max` is excluded from the settings.json effort
|
|
73
|
+
// subset because it is invalid as a settings.json `effortLevel` — the new-session
|
|
74
|
+
// picker still offers it, routed via the `--effort max` argv flag (see
|
|
75
|
+
// NEW_SESSION_EFFORT_LEVELS below).
|
|
73
76
|
|
|
74
77
|
/** The 5 permission modes the /chat composer and re-seat fork may write. */
|
|
75
78
|
export const PERMISSION_MODES = ["default", "acceptEdits", "plan", "auto", "bypassPermissions"] as const;
|
|
@@ -101,3 +104,15 @@ export type SpawnPermissionMode = (typeof SPAWN_PERMISSION_MODES)[number];
|
|
|
101
104
|
* plus the session-only `auto`/`max` excluded from that subset. */
|
|
102
105
|
export const SESSION_EFFORT_LEVELS = ["auto", ...EFFORT_LEVELS, "max"] as const;
|
|
103
106
|
export type SessionEffortLevel = (typeof SESSION_EFFORT_LEVELS)[number];
|
|
107
|
+
|
|
108
|
+
/** The 5 effort levels the /chat new-session picker may write: the 4 settings.json
|
|
109
|
+
* levels plus the session-only `max`. Distinct from EFFORT_LEVELS (the fork/daemon
|
|
110
|
+
* settings.json subset — `max` is invalid as a settings.json `effortLevel`) and
|
|
111
|
+
* from SESSION_EFFORT_LEVELS (which also carries `auto`, never offered by the
|
|
112
|
+
* picker). A `max` pick reaches the CLI via the `--effort max` argv flag, not the
|
|
113
|
+
* inline `effortLevel` settings key. */
|
|
114
|
+
export const NEW_SESSION_EFFORT_LEVELS = [...EFFORT_LEVELS, "max"] as const;
|
|
115
|
+
export type NewSessionEffortLevel = (typeof NEW_SESSION_EFFORT_LEVELS)[number];
|
|
116
|
+
export function isNewSessionEffortLevel(value: string): value is NewSessionEffortLevel {
|
|
117
|
+
return (NEW_SESSION_EFFORT_LEVELS as readonly string[]).includes(value);
|
|
118
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-architecture
|
|
3
3
|
description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
|
|
4
|
-
content-hash: sha256:
|
|
4
|
+
content-hash: sha256:b3f1611fcb4116496aadfdfa39e64fce9061f0611c6d926545f6c6523688fc73
|
|
5
5
|
brand: maxy-code
|
|
6
6
|
product-name: Maxy
|
|
7
7
|
---
|
|
@@ -2326,7 +2326,7 @@ either is a regression.
|
|
|
2326
2326
|
| `/session-rc-spawn` | POST `{ sessionId?, name? }`. Fire-and-forget `claude --remote-control [name] [--session-id <sid>]`. Present `sessionId` resumes; absent starts a fresh session (also used by the sidebar's "New session" button — it no longer opens claude.ai/code directly). Proxies to the manager's `/rc-spawn`, which waits up to **60 s** (raised from 12 s) for the spawned PTY to bind and returns `{ spawnedPid, sessionId, bridgeSessionId, slug, outcome, reason }`. The Sidebar navigates the opened tab to `claude.ai/code/session_<id>` on `outcome=bound`; on `timeout` or `spawn-failed` it shows an error modal (reason + sessionId) and **never** opens a bare claude.ai/code tab. The new process registers itself as its own Remote Control entry in claude.ai/code. | `POST /` |
|
|
2327
2327
|
| `/claude-sessions` | **Spawn surface only**. `POST /` is the Sidebar new-session-with-prompt path, cookie-auth only (the recorder loopback caller was removed; LinkedIn ingest moved to `/rc-spawn`). The former UI-facing handlers (SSE row feed, list, resume, stop, rename, archive, delete, `/:id/meta`, `/:id/input`, `/:id/log`) were removed — the maxy dashboard no longer manages or displays sessions. | `POST /` |
|
|
2328
2328
|
|
|
2329
|
-
**Admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot; the reasoning-effort lever is `account.json.effort` → `settings.json "effortLevel"` (accepted values `low|medium|high|xhigh`; any other value, e.g. legacy `"auto"`, leaves the key unset so claude's own default governs), written by the same read-merge-write at boot. A third inception lever, permission mode, is added: `account.json.adminPermissionMode` → `settings.json "permissions.defaultMode"` (the 5 composer-writable modes `default|acceptEdits|plan|auto|bypassPermissions`; `dontAsk` is out of scope). Unlike model/effort (top-level keys), this lever **deep-merges** the nested `permissions.defaultMode`, owning only that key and preserving sibling `permissions` keys (allow/deny/…) — what the binary and the spawn lifeline actually read. **
|
|
2329
|
+
**Admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot; the reasoning-effort lever is `account.json.effort` → `settings.json "effortLevel"` (accepted values `low|medium|high|xhigh`; any other value, e.g. legacy `"auto"`, leaves the key unset so claude's own default governs), written by the same read-merge-write at boot. A third inception lever, permission mode, is added: `account.json.adminPermissionMode` → `settings.json "permissions.defaultMode"` (the 5 composer-writable modes `default|acceptEdits|plan|auto|bypassPermissions`; `dontAsk` is out of scope). Unlike model/effort (top-level keys), this lever **deep-merges** the nested `permissions.defaultMode`, owning only that key and preserving sibling `permissions` keys (allow/deny/…) — what the binary and the spawn lifeline actually read. **For admin sessions, permission mode is fixed (Bypass) and not operator-chosen, while model and effort ARE operator-chosen at launch** via the composer's `+` new-session popover — a radio model list (Opus / Sonnet / Haiku) plus a 5-stop Faster→Smarter effort slider (Low / Medium / High / Extra / Max, where `max` applies via the `--effort` argv rather than `settings.json`); the popover description lives in `.docs/admin-webchat-native-channel.md`. Absent a pick (and on every resume), the daemon-pinned defaults govern: the `/chat` composer *footer* carries no live re-seat pickers — `rc-daemon.ts` pins settings.json `model`/`effortLevel`/`permissions.defaultMode` to `claude-opus-4-8[1m]` / `medium` / `bypassPermissions` regardless of `account.json` (read by the rc-spawn webchat path), and `pty-spawner.ts` forces the claude.ai/code PTY `--permission-mode` to `bypassPermissions` for `role=admin`. Public sessions are fixed to `claude-sonnet-4-6` (the `/public-spawn` chokepoint + `buildPublicWebchatSpawnRequest`), keeping `dontAsk`. The composer footer instead renders a **read-only** params row (mode · model · effort labels) plus a context-window usage figure (`pct% · ~used/~window`), all sourced from the session pointer; the full path is in `.docs/admin-webchat-native-channel.md`. The composer cannot re-seat a session, so the "no transcript" 400 on a brand-new chat is unreachable; the `/api/admin/session-reseat` + `/api/webchat/settings` routes and the dashboard re-seat form stay as off-composer surfaces. When the live session runs in `default` ("Ask permissions") mode, a tool the agent attempts that needs approval surfaces an Allow/Deny card in the composer (tool, description, argument preview); a click sends the verdict over Claude Code's channel permission relay and the tool runs or is refused — webchat is the only interactive ask surface (WhatsApp stays text-only; Telegram has no agent channel). Beyond the composer, the maxy admin UI keeps a single "New session" link (`https://claude.ai/code`, opens in a new tab) and no separate session list, viewer, controls, or model/mode picker. The daemon supervisor lives at [`platform/services/claude-session-manager/src/rc-daemon.ts`](../../../services/claude-session-manager/src/rc-daemon.ts). The `/session-defaults` route and `SpawnPreference` node were deleted with the picker. `/new-session-failure`, `/new-session-submit`, and `/claude-capabilities` are now orphaned (consumed only by the deleted NewSessionModal) — see [`.tasks/501`](../../../.tasks/) for their removal.
|
|
2330
2330
|
|
|
2331
2331
|
**Row title resolution.** Both the sidebar (`/sidebar-sessions`) and the manager's own row payload resolve a row's title in the same order: operator rename → Claude Code `ai-title` → first non-CLI user message → 8-char sessionId prefix. The operator-rename tier is the on-disk `<accountDir>/session-titles.json` (the manager's `UserTitleStore`), keyed by the CC sessionId — the sidebar reads that same file, so a write to the store lights up both surfaces with one write.
|
|
2332
2332
|
|
|
@@ -61,7 +61,7 @@ either is a regression.
|
|
|
61
61
|
| `/session-rc-spawn` | POST `{ sessionId?, name? }`. Fire-and-forget `claude --remote-control [name] [--session-id <sid>]`. Present `sessionId` resumes; absent starts a fresh session (also used by the sidebar's "New session" button — it no longer opens claude.ai/code directly). Proxies to the manager's `/rc-spawn`, which waits up to **60 s** (raised from 12 s) for the spawned PTY to bind and returns `{ spawnedPid, sessionId, bridgeSessionId, slug, outcome, reason }`. The Sidebar navigates the opened tab to `claude.ai/code/session_<id>` on `outcome=bound`; on `timeout` or `spawn-failed` it shows an error modal (reason + sessionId) and **never** opens a bare claude.ai/code tab. The new process registers itself as its own Remote Control entry in claude.ai/code. | `POST /` |
|
|
62
62
|
| `/claude-sessions` | **Spawn surface only**. `POST /` is the Sidebar new-session-with-prompt path, cookie-auth only (the recorder loopback caller was removed; LinkedIn ingest moved to `/rc-spawn`). The former UI-facing handlers (SSE row feed, list, resume, stop, rename, archive, delete, `/:id/meta`, `/:id/input`, `/:id/log`) were removed — the maxy dashboard no longer manages or displays sessions. | `POST /` |
|
|
63
63
|
|
|
64
|
-
**Admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot; the reasoning-effort lever is `account.json.effort` → `settings.json "effortLevel"` (accepted values `low|medium|high|xhigh`; any other value, e.g. legacy `"auto"`, leaves the key unset so claude's own default governs), written by the same read-merge-write at boot. A third inception lever, permission mode, is added: `account.json.adminPermissionMode` → `settings.json "permissions.defaultMode"` (the 5 composer-writable modes `default|acceptEdits|plan|auto|bypassPermissions`; `dontAsk` is out of scope). Unlike model/effort (top-level keys), this lever **deep-merges** the nested `permissions.defaultMode`, owning only that key and preserving sibling `permissions` keys (allow/deny/…) — what the binary and the spawn lifeline actually read. **
|
|
64
|
+
**Admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot; the reasoning-effort lever is `account.json.effort` → `settings.json "effortLevel"` (accepted values `low|medium|high|xhigh`; any other value, e.g. legacy `"auto"`, leaves the key unset so claude's own default governs), written by the same read-merge-write at boot. A third inception lever, permission mode, is added: `account.json.adminPermissionMode` → `settings.json "permissions.defaultMode"` (the 5 composer-writable modes `default|acceptEdits|plan|auto|bypassPermissions`; `dontAsk` is out of scope). Unlike model/effort (top-level keys), this lever **deep-merges** the nested `permissions.defaultMode`, owning only that key and preserving sibling `permissions` keys (allow/deny/…) — what the binary and the spawn lifeline actually read. **For admin sessions, permission mode is fixed (Bypass) and not operator-chosen, while model and effort ARE operator-chosen at launch** via the composer's `+` new-session popover — a radio model list (Opus / Sonnet / Haiku) plus a 5-stop Faster→Smarter effort slider (Low / Medium / High / Extra / Max, where `max` applies via the `--effort` argv rather than `settings.json`); the popover description lives in `.docs/admin-webchat-native-channel.md`. Absent a pick (and on every resume), the daemon-pinned defaults govern: the `/chat` composer *footer* carries no live re-seat pickers — `rc-daemon.ts` pins settings.json `model`/`effortLevel`/`permissions.defaultMode` to `claude-opus-4-8[1m]` / `medium` / `bypassPermissions` regardless of `account.json` (read by the rc-spawn webchat path), and `pty-spawner.ts` forces the claude.ai/code PTY `--permission-mode` to `bypassPermissions` for `role=admin`. Public sessions are fixed to `claude-sonnet-4-6` (the `/public-spawn` chokepoint + `buildPublicWebchatSpawnRequest`), keeping `dontAsk`. The composer footer instead renders a **read-only** params row (mode · model · effort labels) plus a context-window usage figure (`pct% · ~used/~window`), all sourced from the session pointer; the full path is in `.docs/admin-webchat-native-channel.md`. The composer cannot re-seat a session, so the "no transcript" 400 on a brand-new chat is unreachable; the `/api/admin/session-reseat` + `/api/webchat/settings` routes and the dashboard re-seat form stay as off-composer surfaces. When the live session runs in `default` ("Ask permissions") mode, a tool the agent attempts that needs approval surfaces an Allow/Deny card in the composer (tool, description, argument preview); a click sends the verdict over Claude Code's channel permission relay and the tool runs or is refused — webchat is the only interactive ask surface (WhatsApp stays text-only; Telegram has no agent channel). Beyond the composer, the maxy admin UI keeps a single "New session" link (`https://claude.ai/code`, opens in a new tab) and no separate session list, viewer, controls, or model/mode picker. The daemon supervisor lives at [`platform/services/claude-session-manager/src/rc-daemon.ts`](../../../services/claude-session-manager/src/rc-daemon.ts). The `/session-defaults` route and `SpawnPreference` node were deleted with the picker. `/new-session-failure`, `/new-session-submit`, and `/claude-capabilities` are now orphaned (consumed only by the deleted NewSessionModal) — see [`.tasks/501`](../../../.tasks/) for their removal.
|
|
65
65
|
|
|
66
66
|
**Row title resolution.** Both the sidebar (`/sidebar-sessions`) and the manager's own row payload resolve a row's title in the same order: operator rename → Claude Code `ai-title` → first non-CLI user message → 8-char sessionId prefix. The operator-rename tier is the on-disk `<accountDir>/session-titles.json` (the manager's `UserTitleStore`), keyed by the CC sessionId — the sidebar reads that same file, so a write to the store lights up both surfaces with one write.
|
|
67
67
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAa3B,OAAO,EAiBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAsBzB,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgFhE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAgHD,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpG;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAER;AAkCD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5F;AAwJD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAa3B,OAAO,EAiBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAsBzB,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgFhE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAgHD,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpG;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAER;AAkCD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5F;AAwJD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAy4EpD"}
|
|
@@ -30,7 +30,7 @@ import { mergeTarget, isMultiTarget, targetKinds } from './channel-targets.js';
|
|
|
30
30
|
import { randomUUID } from 'node:crypto';
|
|
31
31
|
import { execFileSync } from 'node:child_process';
|
|
32
32
|
import { buildRcChildEnv, reapplyAdminLevers } from './rc-daemon.js';
|
|
33
|
-
import { isEffortLevel, isPermissionMode, SONNET_MODEL } from '../../../lib/models/dist/index.js';
|
|
33
|
+
import { isEffortLevel, isNewSessionEffortLevel, isPermissionMode, SONNET_MODEL } from '../../../lib/models/dist/index.js';
|
|
34
34
|
import { spawnClaudeSession, stopSession, writeInputToPty, isLive, onPtyExit, livePtyCount, liveSessionIds, getPtyTrackerForTests, livePidForSession, classifyLiveness, priorExitedCountForSession, PERMISSION_MODES, openFdCount, registerRcSpawnPty, } from './pty-spawner.js';
|
|
35
35
|
import { writeScopeRecord, removeScopeRecord } from './scope-record.js';
|
|
36
36
|
import { writeReseatMarker, resolveReseatChain, clearReseatMarker } from './reseat-ledger.js';
|
|
@@ -1805,6 +1805,13 @@ export function buildHttpApp(deps) {
|
|
|
1805
1805
|
// absent (the fork keeps the settings-resolved mode / the harness default effort).
|
|
1806
1806
|
const reseatPermissionMode = typeof body.permissionMode === 'string' ? (isPermissionMode(body.permissionMode) ? body.permissionMode : null) : undefined;
|
|
1807
1807
|
const reseatEffort = typeof body.effort === 'string' ? (isEffortLevel(body.effort) ? body.effort : null) : undefined;
|
|
1808
|
+
// Task 970 — the fresh new-session picker admits a 5th level, `max`, that the
|
|
1809
|
+
// fork path never offers. Parsed against the wider allowlist; `max` is routed
|
|
1810
|
+
// to the `--effort` argv below (it is session-only — invalid as a settings.json
|
|
1811
|
+
// `effortLevel`), the 4 lower levels ride the inline `effortLevel`. null when
|
|
1812
|
+
// present-but-invalid (a silent drop to the settings default — the fresh path
|
|
1813
|
+
// is not a hard-reject path, unlike the fork's reseatEffort 400 above).
|
|
1814
|
+
const freshEffort = typeof body.effort === 'string' ? (isNewSessionEffortLevel(body.effort) ? body.effort : null) : undefined;
|
|
1808
1815
|
// Task 626 — per-visitor slice ringfence for the public session-end review
|
|
1809
1816
|
// rc session. Shape-gated identically to /public-spawn so a body-controlled
|
|
1810
1817
|
// value cannot reach the child env. Absent on channel-admin / LinkedIn.
|
|
@@ -2034,6 +2041,12 @@ export function buildHttpApp(deps) {
|
|
|
2034
2041
|
// `--resume` is the continue-this-conversation flag.
|
|
2035
2042
|
const existingJsonlPath = sessionId ? findExistingJsonlForSessionId(deps.claudeConfigDir, sessionId) : null;
|
|
2036
2043
|
const mode = existingJsonlPath ? 'resume' : 'fresh';
|
|
2044
|
+
// Task 969 — the new-session picker's model/effort apply only to a genuinely
|
|
2045
|
+
// fresh ADMIN spawn (the /chat popover posts role:'admin'). Gating on the
|
|
2046
|
+
// admin role as well as freshness keeps any other fresh spawn (LinkedIn
|
|
2047
|
+
// ingest, public, specialist, channel cold-start) on the settings defaults
|
|
2048
|
+
// even if a future caller were to put model/effort on its body.
|
|
2049
|
+
const freshAdminLevers = mode === 'fresh' && rcRole === 'admin';
|
|
2037
2050
|
const argv = ['--remote-control'];
|
|
2038
2051
|
// Task 945 — `name` is the row's display label, never a prompt. It must NOT
|
|
2039
2052
|
// be pushed as a positional: the CLI treats a bare positional as the initial
|
|
@@ -2059,6 +2072,12 @@ export function buildHttpApp(deps) {
|
|
|
2059
2072
|
}
|
|
2060
2073
|
else if (sessionId) {
|
|
2061
2074
|
argv.push(mode === 'resume' ? '--resume' : '--session-id', sessionId);
|
|
2075
|
+
// Task 969 — a fresh new-session spawn (the /chat new-session popover)
|
|
2076
|
+
// carries the picked model as the canonical --model flag. A resume keeps
|
|
2077
|
+
// the model its JSONL already ran under, and an absent/invalid model
|
|
2078
|
+
// (reseatModel null) leaves the settings.json default model in force.
|
|
2079
|
+
if (freshAdminLevers && reseatModel)
|
|
2080
|
+
argv.push('--model', reseatModel);
|
|
2062
2081
|
}
|
|
2063
2082
|
// Task 592 — per-spawn bypass-permissions waiver. The brand settings.json
|
|
2064
2083
|
// carries `defaultMode: bypassPermissions` (Task 583); without this flag
|
|
@@ -2067,13 +2086,24 @@ export function buildHttpApp(deps) {
|
|
|
2067
2086
|
// waived so the disclaimer is suppressed whatever mode the session resolves
|
|
2068
2087
|
// to. Per Task 574 doctrine the waiver is per-spawn (never written into
|
|
2069
2088
|
// settings.json / .claude.json, which would permanently waive it).
|
|
2070
|
-
// Task 928
|
|
2071
|
-
// settings (never the shared settings.json — that would
|
|
2072
|
-
// spawn's effort fleet-wide)
|
|
2073
|
-
//
|
|
2089
|
+
// Task 928 (fork) / Task 969/970 (fresh new-session) — the picked effort rides
|
|
2090
|
+
// the per-spawn inline settings (never the shared settings.json — that would
|
|
2091
|
+
// change every later spawn's effort fleet-wide), EXCEPT the fresh-path `max`
|
|
2092
|
+
// pick: `max` is session-only and invalid as a settings.json `effortLevel`
|
|
2093
|
+
// (the binary silently ignores it), so it must reach the CLI via the
|
|
2094
|
+
// `--effort max` argv flag. A fork keeps its 4-level effort on the inline path
|
|
2095
|
+
// (max is never offered there); a resume keeps its settings-resolved effort.
|
|
2074
2096
|
const inlineSettings = { skipDangerousModePermissionPrompt: true, skipAutoPermissionPrompt: true };
|
|
2075
|
-
if (forkFromSessionId !== null
|
|
2076
|
-
|
|
2097
|
+
if (forkFromSessionId !== null) {
|
|
2098
|
+
if (reseatEffort)
|
|
2099
|
+
inlineSettings.effortLevel = reseatEffort;
|
|
2100
|
+
}
|
|
2101
|
+
else if (freshAdminLevers && freshEffort) {
|
|
2102
|
+
if (freshEffort === 'max')
|
|
2103
|
+
argv.push('--effort', 'max');
|
|
2104
|
+
else
|
|
2105
|
+
inlineSettings.effortLevel = freshEffort;
|
|
2106
|
+
}
|
|
2077
2107
|
argv.push('--settings', JSON.stringify(inlineSettings));
|
|
2078
2108
|
// Task 677 P2 — admin WhatsApp native channel. When the caller supplies
|
|
2079
2109
|
// waChannel, register the per-sender channel server in its own --mcp-config
|
|
@@ -2279,8 +2309,15 @@ export function buildHttpApp(deps) {
|
|
|
2279
2309
|
// settings.json (pinned to Opus/medium by the rc-daemon); a fork rides its
|
|
2280
2310
|
// picked values. Surfaced on the lifeline so the admin-param audit can assert
|
|
2281
2311
|
// model=claude-opus-4-8[1m] effort=medium without reconstructing the argv.
|
|
2282
|
-
|
|
2283
|
-
|
|
2312
|
+
// Task 969 — a fresh new-session spawn carrying picked levers runs under
|
|
2313
|
+
// them too (not just a fork), so the sidecar + lifeline + the /chat params
|
|
2314
|
+
// row report the model/effort the session actually launched on.
|
|
2315
|
+
const effectiveRcModel = (forkFromSessionId !== null || freshAdminLevers) && reseatModel ? reseatModel : resolveSettingsModel(deps.claudeConfigDir);
|
|
2316
|
+
// Task 970 — the fork path reports its 4-level effort; the fresh path reports
|
|
2317
|
+
// its 5-level pick (incl. `max`). Falls back to the settings-resolved effort
|
|
2318
|
+
// when neither path carries one (absent on a fork, invalid/absent on a fresh).
|
|
2319
|
+
const pickedRcEffort = forkFromSessionId !== null ? reseatEffort : freshAdminLevers ? freshEffort : undefined;
|
|
2320
|
+
const effectiveRcEffort = pickedRcEffort ?? resolveSettingsEffort(deps.claudeConfigDir);
|
|
2284
2321
|
// Step 2 — the exact claude argv (the inner command). The systemd-run
|
|
2285
2322
|
// wrap is composed by the spawnPty adapter; logging the inner argv
|
|
2286
2323
|
// here is enough for an operator to reproduce by hand. The wrapped
|