@rubytech/create-maxy-code 0.1.324 → 0.1.326

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.
Files changed (43) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/models/dist/index.d.ts +9 -0
  3. package/payload/platform/lib/models/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/models/dist/index.js +17 -3
  5. package/payload/platform/lib/models/dist/index.js.map +1 -1
  6. package/payload/platform/lib/models/src/index.ts +17 -2
  7. package/payload/platform/plugins/admin/skills/deck-pages/SKILL.md +13 -7
  8. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +2 -2
  9. package/payload/platform/plugins/admin/skills/professional-document/SKILL.md +9 -3
  10. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  11. package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +2 -0
  12. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  13. package/payload/platform/services/claude-session-manager/dist/http-server.js +30 -10
  14. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  15. package/payload/platform/templates/specialists/agents/content-producer.md +1 -1
  16. package/payload/premium-plugins/management-consulting/.claude-plugin/plugin.json +1 -1
  17. package/payload/premium-plugins/management-consulting/PLUGIN.md +3 -2
  18. package/payload/premium-plugins/management-consulting/skills/pitch-deck/SKILL.md +142 -0
  19. package/payload/server/public/assets/{AdminLoginScreens-BaNHSvDG.js → AdminLoginScreens-DNsCEyvZ.js} +1 -1
  20. package/payload/server/public/assets/AdminShell-DqyjA9x-.js +1 -0
  21. package/payload/server/public/assets/{Checkbox-BoljWa0z.js → Checkbox-C3WNcLH8.js} +1 -1
  22. package/payload/server/public/assets/{OperatorConversations-DL9372pQ.css → OperatorConversations-BQudGb45.css} +1 -1
  23. package/payload/server/public/assets/{admin-DgGttnBt.js → admin-3jmCp4G3.js} +1 -1
  24. package/payload/server/public/assets/{browser-BLoa93fm.js → browser-DarU3c-V.js} +1 -1
  25. package/payload/server/public/assets/chat-CG-r6QZ2.js +1 -0
  26. package/payload/server/public/assets/{data-BK_ggj-z.js → data-4jByS_fv.js} +1 -1
  27. package/payload/server/public/assets/{graph-iNIIHeRn.js → graph-CylZ1wV1.js} +1 -1
  28. package/payload/server/public/assets/{graph-labels-IeLlsqB1.js → graph-labels-hGbD_0qZ.js} +1 -1
  29. package/payload/server/public/assets/{operator-plsrZHSk.js → operator-DgGt6Hc0.js} +1 -1
  30. package/payload/server/public/assets/page-Dl3SpCO3.js +30 -0
  31. package/payload/server/public/assets/{public-CuMZDmDF.js → public-8hwaomIS.js} +1 -1
  32. package/payload/server/public/browser.html +4 -4
  33. package/payload/server/public/chat.html +5 -5
  34. package/payload/server/public/data.html +4 -4
  35. package/payload/server/public/graph.html +6 -6
  36. package/payload/server/public/index.html +6 -6
  37. package/payload/server/public/operator.html +7 -7
  38. package/payload/server/public/public.html +5 -5
  39. package/payload/server/server.js +5 -1
  40. package/payload/server/public/assets/AdminShell-6Iq4co_0.js +0 -1
  41. package/payload/server/public/assets/chat-BJ4229vV.js +0 -1
  42. package/payload/server/public/assets/page-BOQHw8Fa.js +0 -30
  43. /package/payload/server/public/assets/{OperatorConversations-yKFxglvV.js → OperatorConversations-BqFmHTF1.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.324",
3
+ "version": "0.1.326",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -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;AAUD,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"}
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` and `max` are
73
- // deliberately excluded neither is offered by these surfaces.
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;AAaD,4CAEC;AAKD,sCAEC;AAjFD,iEAAiE;AACjE,qEAAqE;AACrE,+DAA+D;AAClD,QAAA,UAAU,GAAG,qBAAqB,CAAC;AACnC,QAAA,YAAY,GAAG,mBAAmB,CAAC;AACnC,QAAA,WAAW,GAAG,kBAAkB,CAAC;AAEjC,QAAA,oBAAoB,GAA2B;IAC1D,CAAC,kBAAU,CAAC,EAAE,SAAS;IACvB,CAAC,oBAAY,CAAC,EAAE,OAAO;IACvB,CAAC,mBAAW,CAAC,EAAE,OAAO;CACvB,CAAC;AAEF,wEAAwE;AACxE,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,4BAAoB,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC;AAChD,CAAC;AAED;;qEAEqE;AACxD,QAAA,mBAAmB,GAA2B;IACzD,CAAC,kBAAU,CAAC,EAAE,uBAAuB;IACrC,CAAC,oBAAY,CAAC,EAAE,YAAY;IAC5B,CAAC,mBAAW,CAAC,EAAE,WAAW;CAC3B,CAAC;AAEF;+DAC+D;AAC/D,SAAgB,gBAAgB,CAAC,EAAU;IACzC,OAAO,2BAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED;;;mCAGmC;AACtB,QAAA,iBAAiB,GAAsB,CAAC,kBAAU,EAAE,oBAAY,EAAE,mBAAW,CAAC,CAAC;AAC5F,SAAgB,iBAAiB,CAAC,EAAU;IAC1C,OAAO,yBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;;;;qCAKqC;AACrC,SAAgB,WAAW,CAAC,EAAU;IACpC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;;wDAIwD;AACxD,SAAgB,gBAAgB,CAAC,EAAU;IACzC,OAAO,yBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,gEAAgE;AAEhE,4EAA4E;AAC/D,QAAA,gBAAgB,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAU,CAAC;AAEzG,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,OAAQ,wBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,sDAAsD;AACzC,QAAA,aAAa,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEzE,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAQ,qBAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,gFAAgF;AAChF,iFAAiF;AACjF,0EAA0E;AAC1E,gFAAgF;AAChF,6EAA6E;AAC7E,iFAAiF;AAEjF;kFACkF;AACrE,QAAA,sBAAsB,GAAG,CAAC,GAAG,wBAAgB,EAAE,SAAS,CAAU,CAAC;AAGhF;oEACoE;AACvD,QAAA,qBAAqB,GAAG,CAAC,MAAM,EAAE,GAAG,qBAAa,EAAE,KAAK,CAAU,CAAC"}
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;AAgBD,4CAEC;AAKD,sCAEC;AA2BD,0DAEC;AAjHD,iEAAiE;AACjE,qEAAqE;AACrE,+DAA+D;AAClD,QAAA,UAAU,GAAG,qBAAqB,CAAC;AACnC,QAAA,YAAY,GAAG,mBAAmB,CAAC;AACnC,QAAA,WAAW,GAAG,kBAAkB,CAAC;AAEjC,QAAA,oBAAoB,GAA2B;IAC1D,CAAC,kBAAU,CAAC,EAAE,SAAS;IACvB,CAAC,oBAAY,CAAC,EAAE,OAAO;IACvB,CAAC,mBAAW,CAAC,EAAE,OAAO;CACvB,CAAC;AAEF,wEAAwE;AACxE,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,4BAAoB,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC;AAChD,CAAC;AAED;;qEAEqE;AACxD,QAAA,mBAAmB,GAA2B;IACzD,CAAC,kBAAU,CAAC,EAAE,uBAAuB;IACrC,CAAC,oBAAY,CAAC,EAAE,YAAY;IAC5B,CAAC,mBAAW,CAAC,EAAE,WAAW;CAC3B,CAAC;AAEF;+DAC+D;AAC/D,SAAgB,gBAAgB,CAAC,EAAU;IACzC,OAAO,2BAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED;;;mCAGmC;AACtB,QAAA,iBAAiB,GAAsB,CAAC,kBAAU,EAAE,oBAAY,EAAE,mBAAW,CAAC,CAAC;AAC5F,SAAgB,iBAAiB,CAAC,EAAU;IAC1C,OAAO,yBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;;;;qCAKqC;AACrC,SAAgB,WAAW,CAAC,EAAU;IACpC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;;wDAIwD;AACxD,SAAgB,gBAAgB,CAAC,EAAU;IACzC,OAAO,yBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,iFAAiF;AACjF,+EAA+E;AAC/E,kFAAkF;AAClF,uEAAuE;AACvE,oCAAoC;AAEpC,4EAA4E;AAC/D,QAAA,gBAAgB,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAU,CAAC;AAEzG,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,OAAQ,wBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,sDAAsD;AACzC,QAAA,aAAa,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEzE,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAQ,qBAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,gFAAgF;AAChF,iFAAiF;AACjF,0EAA0E;AAC1E,gFAAgF;AAChF,6EAA6E;AAC7E,iFAAiF;AAEjF;kFACkF;AACrE,QAAA,sBAAsB,GAAG,CAAC,GAAG,wBAAgB,EAAE,SAAS,CAAU,CAAC;AAGhF;oEACoE;AACvD,QAAA,qBAAqB,GAAG,CAAC,MAAM,EAAE,GAAG,qBAAa,EAAE,KAAK,CAAU,CAAC;AAGhF;;;;;yCAKyC;AAC5B,QAAA,yBAAyB,GAAG,CAAC,GAAG,qBAAa,EAAE,KAAK,CAAU,CAAC;AAE5E,SAAgB,uBAAuB,CAAC,KAAa;IACnD,OAAQ,iCAA+C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC"}
@@ -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` and `max` are
72
- // deliberately excluded neither is offered by these surfaces.
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,20 +1,26 @@
1
1
  ---
2
2
  name: deck-pages
3
3
  description: >
4
- Constraints for producing presentation deck pages as HTML slide sequences that
4
+ The slide-deck format spec and generic renderer: HTML slide sequences that
5
5
  download as pixel-perfect PDFs via client-side html2canvas + jsPDF rendering.
6
- Use when creating or modifying any slide deck, pitch deck, presentation, or
7
- multi-slide document intended for PDF download. Also use when the output is a
8
- set of fixed-dimension landscape pages viewed on screen and exported as a PDF.
9
- Trigger phrases: "deck", "pitch deck", "slides", "presentation", "slide deck",
10
- "investor deck", "deck PDF", "download deck", or any request to create a
11
- multi-page slide-based document with a PDF download button.
6
+ Use for the slide format mechanics, for a deck the operator already wrote or
7
+ supplies as HTML, or when the output is a set of fixed-dimension landscape
8
+ pages viewed on screen and exported as a PDF. Trigger phrases: "slides",
9
+ "slide deck", "deck PDF", "download deck", "save this as a deck", or any
10
+ request to turn supplied slide content into a multi-page PDF with a download
11
+ button. Composition of consulting decks (a new-business or credentials pitch,
12
+ a client findings or recommendation deck, a thought-leadership deck) is owned
13
+ by `management-consulting:pitch-deck`; founder fundraise decks by
14
+ `venture-studio:investor-data-room`. This skill carries the format, not the
15
+ consulting method.
12
16
  ---
13
17
 
14
18
  # Deck Pages — Slide-Based PDF Documents
15
19
 
16
20
  Invoked by the admin agent directly.
17
21
 
22
+ This skill is the slide format spec and generic renderer. When the deck is a consulting deliverable (a new-business or credentials pitch, a client findings or recommendation deck, or a thought-leadership deck), its method and house-voice gate are owned by `management-consulting:pitch-deck`, which composes the content and then renders it. Founder fundraise decks are owned by `venture-studio:investor-data-room`. Use this skill for the format mechanics and for decks the operator already wrote or supplies as HTML.
23
+
18
24
  Constraints for producing HTML slide decks that render correctly on screen and export as pixel-perfect PDFs via client-side `html2canvas-pro` + `jsPDF`. Every rule exists because violating it caused a visible rendering problem in exported decks.
19
25
 
20
26
  ## How this differs from A4 print documents
@@ -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:479e04a1e25ace04e44415db3c536ed28faac7ee30b9171524d38b7a667716d1
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. **These levers are fixed, not operator-chosen, for admin sessions:** the `/chat` composer carries no mode/model/effort 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.
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
 
@@ -14,8 +14,12 @@ description: >
14
14
  (prospectus / term sheet / business plan / data room) route to
15
15
  `venture-studio:investor-data-room`; property brochures route to
16
16
  `real-agent:property-brochure`; pre-valuation packs route to
17
- `real-agent:property-preval`; slide decks route to `admin:deck-pages` (format
18
- spec) and `venture-studio:investor-data-room` (composer). Does NOT trigger on
17
+ `real-agent:property-preval`; consulting decks (new-business or credentials
18
+ pitch, client findings or recommendation deck, thought-leadership deck) route
19
+ to `management-consulting:pitch-deck`; founder fundraise decks route to
20
+ `venture-studio:investor-data-room`; generic slide decks the operator already
21
+ wrote or supplies as HTML route to `admin:deck-pages` (format spec). Does NOT
22
+ trigger on
19
23
  format-only phrasings ("PDF", "one-pager", "A4", "brochure", "executive
20
24
  document", "market analysis") — those are owned by `admin:a4-print-documents`.
21
25
  ---
@@ -35,7 +39,9 @@ These checks run in order against the operator brief. The first match wins and s
35
39
  | prospectus, term sheet, data room, business plan, investor, fundraise, raise, round, SEIS, EIS, cap table | `venture-studio:investor-data-room` | Owns the UK seed-raise pack end-to-end (16-section plan, prospectus, term sheet, FCA self-cert appendices). |
36
40
  | property brochure, property listing brochure | `real-agent:property-brochure` | Owns the estate-agent brochure pipeline (brand → property → A4 PDF). |
37
41
  | pre-valuation, preval, valuation pitch, pre-appraisal | `real-agent:property-preval` | Owns the 5-page pre-valuation pitch pack. |
38
- | deck, slides, slide deck, presentation, pitch deck | `admin:deck-pages` (format spec) and `venture-studio:investor-data-room` (composer) | Slide format and full-pitch composition are not A4 documents. |
42
+ | consulting deck, credentials pitch, capabilities deck, client findings deck, recommendation deck, steering-committee deck, board strategy deck, thought-leadership deck | `management-consulting:pitch-deck` | Owns the consulting deck method and the house-voice gate across all three modes. |
43
+ | founder pitch deck, investor deck, fundraise deck | `venture-studio:investor-data-room` | Owns the founder fundraise pitch. |
44
+ | deck, slides, slide deck, presentation (generic, operator-supplied, or save-this-HTML) | `admin:deck-pages` | Slide format spec and generic renderer; not an A4 document and not a consulting composer. |
39
45
  | noun is "plan" and none of the fundraise tokens above match | **Ask the operator** before proceeding: "Is this a fundraise plan (business plan for investors) or an operating / strategic / marketing / transition plan?" If fundraise → refuse, redirect to `venture-studio:investor-data-room`. If non-fundraise → proceed. | The word "plan" splits cleanly between the two composers; the precision doctrine requires asking rather than guessing. |
40
46
 
41
47
  Emit `[professional-document] refuse reason=<owned-by-other-composer> redirect=<skill-name>` on any refusal. Emit `[professional-document] plan-disambiguation asked` when the plan gate fires and `[professional-document] plan-disambiguation answered=<fundraise|non-fundraise>` once the operator answers.
@@ -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. **These levers are fixed, not operator-chosen, for admin sessions:** the `/chat` composer carries no mode/model/effort 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.
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
 
@@ -40,6 +40,8 @@ Based on the user's description, select the right storytelling format. Read the
40
40
 
41
41
  These files are in the same directory as this SKILL.md. Read them from here.
42
42
 
43
+ **Consulting decks arrive composed.** When the brief is a consulting deliverable (a new-business or credentials pitch, a client findings or recommendation deck, or a thought-leadership deck), `management-consulting:pitch-deck` has already chosen the structure and composed the content in the operator's house voice (its findings mode uses the McKinsey SCR engine in `STORYTELLING-mbb.md`). Render that brief through the component library below; do not re-select a storytelling format or re-write the prose.
44
+
43
45
  **Default:** If unclear, use the six-beat TED Talk structure from `STORYTELLING.md`. It adapts to most formats.
44
46
 
45
47
  ## Step 2. Draft the outline
@@ -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,CAu3EpD"}
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.
@@ -2079,15 +2086,24 @@ export function buildHttpApp(deps) {
2079
2086
  // waived so the disclaimer is suppressed whatever mode the session resolves
2080
2087
  // to. Per Task 574 doctrine the waiver is per-spawn (never written into
2081
2088
  // settings.json / .claude.json, which would permanently waive it).
2082
- // Task 928 (fork) / Task 969 (fresh new-session) — the picked effort rides
2083
- // the SAME per-spawn inline settings (never the shared settings.json — that
2084
- // would change every later spawn's effort fleet-wide). Set on a fork with a
2085
- // valid effort, or on a fresh new-session spawn carrying a picked effort; a
2086
- // resume keeps its settings-resolved effort, and an absent effort leaves it
2087
- // unset (the harness default).
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.
2088
2096
  const inlineSettings = { skipDangerousModePermissionPrompt: true, skipAutoPermissionPrompt: true };
2089
- if ((forkFromSessionId !== null || freshAdminLevers) && reseatEffort)
2090
- inlineSettings.effortLevel = reseatEffort;
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
+ }
2091
2107
  argv.push('--settings', JSON.stringify(inlineSettings));
2092
2108
  // Task 677 P2 — admin WhatsApp native channel. When the caller supplies
2093
2109
  // waChannel, register the per-sender channel server in its own --mcp-config
@@ -2297,7 +2313,11 @@ export function buildHttpApp(deps) {
2297
2313
  // them too (not just a fork), so the sidecar + lifeline + the /chat params
2298
2314
  // row report the model/effort the session actually launched on.
2299
2315
  const effectiveRcModel = (forkFromSessionId !== null || freshAdminLevers) && reseatModel ? reseatModel : resolveSettingsModel(deps.claudeConfigDir);
2300
- const effectiveRcEffort = (forkFromSessionId !== null || freshAdminLevers) && reseatEffort ? reseatEffort : resolveSettingsEffort(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);
2301
2321
  // Step 2 — the exact claude argv (the inner command). The systemd-run
2302
2322
  // wrap is composed by the spawnPty adapter; logging the inner argv
2303
2323
  // here is enough for an operator to reproduce by hand. The wrapped