wicked-crew 0.16.11 → 0.16.13

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 (341) hide show
  1. package/README.md +28 -8
  2. package/dist/api/artifact-outline.d.ts +64 -0
  3. package/dist/api/artifact-outline.d.ts.map +1 -0
  4. package/dist/api/artifact-outline.js +254 -0
  5. package/dist/api/artifact-outline.js.map +1 -0
  6. package/dist/api/beneath.d.ts +76 -0
  7. package/dist/api/beneath.d.ts.map +1 -0
  8. package/dist/api/beneath.js +214 -0
  9. package/dist/api/beneath.js.map +1 -0
  10. package/dist/api/capture.d.ts +2 -2
  11. package/dist/api/chat-citations.d.ts +25 -1
  12. package/dist/api/chat-citations.d.ts.map +1 -1
  13. package/dist/api/chat-citations.js +186 -61
  14. package/dist/api/chat-citations.js.map +1 -1
  15. package/dist/api/chat-context.d.ts +236 -0
  16. package/dist/api/chat-context.d.ts.map +1 -0
  17. package/dist/api/chat-context.js +808 -0
  18. package/dist/api/chat-context.js.map +1 -0
  19. package/dist/api/chat-history.d.ts +20 -0
  20. package/dist/api/chat-history.d.ts.map +1 -1
  21. package/dist/api/chat-history.js +46 -1
  22. package/dist/api/chat-history.js.map +1 -1
  23. package/dist/api/chat-proposals.d.ts +534 -0
  24. package/dist/api/chat-proposals.d.ts.map +1 -0
  25. package/dist/api/chat-proposals.js +1562 -0
  26. package/dist/api/chat-proposals.js.map +1 -0
  27. package/dist/api/chat-scope.d.ts +41 -0
  28. package/dist/api/chat-scope.d.ts.map +1 -1
  29. package/dist/api/chat-scope.js +87 -15
  30. package/dist/api/chat-scope.js.map +1 -1
  31. package/dist/api/chat-transcripts.d.ts +27 -2
  32. package/dist/api/chat-transcripts.d.ts.map +1 -1
  33. package/dist/api/chat-transcripts.js +105 -4
  34. package/dist/api/chat-transcripts.js.map +1 -1
  35. package/dist/api/diagnostics.d.ts +15 -0
  36. package/dist/api/diagnostics.d.ts.map +1 -1
  37. package/dist/api/diagnostics.js +56 -0
  38. package/dist/api/diagnostics.js.map +1 -1
  39. package/dist/api/elicitation-cache.d.ts +13 -0
  40. package/dist/api/elicitation-cache.d.ts.map +1 -1
  41. package/dist/api/elicitation-cache.js +12 -0
  42. package/dist/api/elicitation-cache.js.map +1 -1
  43. package/dist/api/eval-sample.d.ts +12 -12
  44. package/dist/api/frame-guard.d.ts +62 -0
  45. package/dist/api/frame-guard.d.ts.map +1 -0
  46. package/dist/api/frame-guard.js +97 -0
  47. package/dist/api/frame-guard.js.map +1 -0
  48. package/dist/api/governance-steering.d.ts +4 -4
  49. package/dist/api/multiscope.d.ts +3 -0
  50. package/dist/api/multiscope.d.ts.map +1 -1
  51. package/dist/api/multiscope.js +13 -0
  52. package/dist/api/multiscope.js.map +1 -1
  53. package/dist/api/needs.d.ts +6 -0
  54. package/dist/api/needs.d.ts.map +1 -1
  55. package/dist/api/needs.js +31 -4
  56. package/dist/api/needs.js.map +1 -1
  57. package/dist/api/product.d.ts.map +1 -1
  58. package/dist/api/product.js +13 -2
  59. package/dist/api/product.js.map +1 -1
  60. package/dist/api/project-aggregates.d.ts +6 -6
  61. package/dist/api/project-aggregates.d.ts.map +1 -1
  62. package/dist/api/project-aggregates.js +16 -24
  63. package/dist/api/project-aggregates.js.map +1 -1
  64. package/dist/api/requirements.d.ts +261 -6
  65. package/dist/api/requirements.d.ts.map +1 -1
  66. package/dist/api/requirements.js +344 -64
  67. package/dist/api/requirements.js.map +1 -1
  68. package/dist/api/routes.d.ts +156 -4
  69. package/dist/api/routes.d.ts.map +1 -1
  70. package/dist/api/routes.js +851 -78
  71. package/dist/api/routes.js.map +1 -1
  72. package/dist/api/run-brief.d.ts +78 -0
  73. package/dist/api/run-brief.d.ts.map +1 -0
  74. package/dist/api/run-brief.js +318 -0
  75. package/dist/api/run-brief.js.map +1 -0
  76. package/dist/api/run-files.d.ts.map +1 -1
  77. package/dist/api/run-files.js +5 -1
  78. package/dist/api/run-files.js.map +1 -1
  79. package/dist/api/run-timing-index.d.ts +27 -0
  80. package/dist/api/run-timing-index.d.ts.map +1 -1
  81. package/dist/api/run-timing-index.js +65 -0
  82. package/dist/api/run-timing-index.js.map +1 -1
  83. package/dist/api/seat-images.d.ts +102 -0
  84. package/dist/api/seat-images.d.ts.map +1 -0
  85. package/dist/api/seat-images.js +333 -0
  86. package/dist/api/seat-images.js.map +1 -0
  87. package/dist/api/server.d.ts +3 -0
  88. package/dist/api/server.d.ts.map +1 -1
  89. package/dist/api/server.js +265 -2
  90. package/dist/api/server.js.map +1 -1
  91. package/dist/api/steering-landing.d.ts +48 -1
  92. package/dist/api/steering-landing.d.ts.map +1 -1
  93. package/dist/api/steering-landing.js +116 -42
  94. package/dist/api/steering-landing.js.map +1 -1
  95. package/dist/api/system-snapshot.d.ts +51 -2
  96. package/dist/api/system-snapshot.d.ts.map +1 -1
  97. package/dist/api/system-snapshot.js +151 -15
  98. package/dist/api/system-snapshot.js.map +1 -1
  99. package/dist/api/testing.d.ts +4 -4
  100. package/dist/api/testing.js +2 -2
  101. package/dist/api/testing.js.map +1 -1
  102. package/dist/apps/spec.d.ts +3009 -0
  103. package/dist/apps/spec.d.ts.map +1 -0
  104. package/dist/apps/spec.js +870 -0
  105. package/dist/apps/spec.js.map +1 -0
  106. package/dist/campaigns/routes.js +1 -1
  107. package/dist/campaigns/routes.js.map +1 -1
  108. package/dist/cli/index.js +3 -3
  109. package/dist/cli/index.js.map +1 -1
  110. package/dist/core/adapter.d.ts +12 -0
  111. package/dist/core/adapter.d.ts.map +1 -1
  112. package/dist/core/adapter.js +36 -1
  113. package/dist/core/adapter.js.map +1 -1
  114. package/dist/core/deliver-text.d.ts.map +1 -1
  115. package/dist/core/deliver-text.js +22 -10
  116. package/dist/core/deliver-text.js.map +1 -1
  117. package/dist/core/estate-mcp-client.d.ts +7 -1
  118. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  119. package/dist/core/estate-mcp-client.js +10 -2
  120. package/dist/core/estate-mcp-client.js.map +1 -1
  121. package/dist/core/exec.d.ts +12 -0
  122. package/dist/core/exec.d.ts.map +1 -1
  123. package/dist/core/exec.js +23 -0
  124. package/dist/core/exec.js.map +1 -1
  125. package/dist/core/reassign-refusal.d.ts.map +1 -1
  126. package/dist/core/reassign-refusal.js +23 -3
  127. package/dist/core/reassign-refusal.js.map +1 -1
  128. package/dist/core/repoPaths.d.ts +32 -7
  129. package/dist/core/repoPaths.d.ts.map +1 -1
  130. package/dist/core/repoPaths.js +56 -9
  131. package/dist/core/repoPaths.js.map +1 -1
  132. package/dist/core/requirements-graph-setting.d.ts +32 -0
  133. package/dist/core/requirements-graph-setting.d.ts.map +1 -0
  134. package/dist/core/requirements-graph-setting.js +84 -0
  135. package/dist/core/requirements-graph-setting.js.map +1 -0
  136. package/dist/core/run-boot-resume.d.ts +4 -1
  137. package/dist/core/run-boot-resume.d.ts.map +1 -1
  138. package/dist/core/run-boot-resume.js +6 -1
  139. package/dist/core/run-boot-resume.js.map +1 -1
  140. package/dist/core/run-identity.d.ts.map +1 -1
  141. package/dist/core/run-identity.js +6 -0
  142. package/dist/core/run-identity.js.map +1 -1
  143. package/dist/core/types.d.ts +14 -0
  144. package/dist/core/types.d.ts.map +1 -1
  145. package/dist/core/types.js.map +1 -1
  146. package/dist/decisions/chat-recorder.d.ts +14 -3
  147. package/dist/decisions/chat-recorder.d.ts.map +1 -1
  148. package/dist/decisions/chat-recorder.js +54 -9
  149. package/dist/decisions/chat-recorder.js.map +1 -1
  150. package/dist/editors/csp.d.ts +24 -4
  151. package/dist/editors/csp.d.ts.map +1 -1
  152. package/dist/editors/csp.js +35 -8
  153. package/dist/editors/csp.js.map +1 -1
  154. package/dist/editors/registry.d.ts +46 -21
  155. package/dist/editors/registry.d.ts.map +1 -1
  156. package/dist/editors/registry.js +13 -2
  157. package/dist/editors/registry.js.map +1 -1
  158. package/dist/editors/routes.d.ts +4 -1
  159. package/dist/editors/routes.d.ts.map +1 -1
  160. package/dist/editors/routes.js +30 -3
  161. package/dist/editors/routes.js.map +1 -1
  162. package/dist/editors/visuals.d.ts +51 -0
  163. package/dist/editors/visuals.d.ts.map +1 -0
  164. package/dist/editors/visuals.js +164 -0
  165. package/dist/editors/visuals.js.map +1 -0
  166. package/dist/editors/webrtc-guard.d.ts +94 -0
  167. package/dist/editors/webrtc-guard.d.ts.map +1 -0
  168. package/dist/editors/webrtc-guard.js +506 -0
  169. package/dist/editors/webrtc-guard.js.map +1 -0
  170. package/dist/inspect/reading.d.ts +110 -0
  171. package/dist/inspect/reading.d.ts.map +1 -0
  172. package/dist/inspect/reading.js +325 -0
  173. package/dist/inspect/reading.js.map +1 -0
  174. package/dist/inspect/routes.d.ts +14 -0
  175. package/dist/inspect/routes.d.ts.map +1 -0
  176. package/dist/inspect/routes.js +44 -0
  177. package/dist/inspect/routes.js.map +1 -0
  178. package/dist/inspect/service.d.ts +161 -0
  179. package/dist/inspect/service.d.ts.map +1 -0
  180. package/dist/inspect/service.js +466 -0
  181. package/dist/inspect/service.js.map +1 -0
  182. package/dist/interactive/bridge-pool.d.ts +11 -2
  183. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  184. package/dist/interactive/bridge-pool.js +10 -1
  185. package/dist/interactive/bridge-pool.js.map +1 -1
  186. package/dist/interactive/doc-binding.d.ts +156 -0
  187. package/dist/interactive/doc-binding.d.ts.map +1 -0
  188. package/dist/interactive/doc-binding.js +277 -0
  189. package/dist/interactive/doc-binding.js.map +1 -0
  190. package/dist/interactive/doc-delete-routes.d.ts +3 -0
  191. package/dist/interactive/doc-delete-routes.d.ts.map +1 -1
  192. package/dist/interactive/doc-delete-routes.js +4 -0
  193. package/dist/interactive/doc-delete-routes.js.map +1 -1
  194. package/dist/interactive/draft-events.d.ts +89 -3
  195. package/dist/interactive/draft-events.d.ts.map +1 -1
  196. package/dist/interactive/draft-events.js +441 -30
  197. package/dist/interactive/draft-events.js.map +1 -1
  198. package/dist/interactive/draft-skill.d.ts +7 -0
  199. package/dist/interactive/draft-skill.d.ts.map +1 -1
  200. package/dist/interactive/draft-skill.js +10 -3
  201. package/dist/interactive/draft-skill.js.map +1 -1
  202. package/dist/interactive/edit-events.d.ts +2 -0
  203. package/dist/interactive/edit-events.d.ts.map +1 -1
  204. package/dist/interactive/edit-events.js +11 -0
  205. package/dist/interactive/edit-events.js.map +1 -1
  206. package/dist/interactive/proposal-create.d.ts +143 -0
  207. package/dist/interactive/proposal-create.d.ts.map +1 -0
  208. package/dist/interactive/proposal-create.js +318 -0
  209. package/dist/interactive/proposal-create.js.map +1 -0
  210. package/dist/interactive/proxy-routes.d.ts +60 -3
  211. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  212. package/dist/interactive/proxy-routes.js +217 -3
  213. package/dist/interactive/proxy-routes.js.map +1 -1
  214. package/dist/interactive/source-packet.d.ts +126 -0
  215. package/dist/interactive/source-packet.d.ts.map +1 -0
  216. package/dist/interactive/source-packet.js +482 -0
  217. package/dist/interactive/source-packet.js.map +1 -0
  218. package/dist/learnings/estate.d.ts +16 -0
  219. package/dist/learnings/estate.d.ts.map +1 -0
  220. package/dist/learnings/estate.js +68 -0
  221. package/dist/learnings/estate.js.map +1 -0
  222. package/dist/learnings/extract.d.ts +56 -0
  223. package/dist/learnings/extract.d.ts.map +1 -0
  224. package/dist/learnings/extract.js +252 -0
  225. package/dist/learnings/extract.js.map +1 -0
  226. package/dist/learnings/recall.d.ts +43 -0
  227. package/dist/learnings/recall.d.ts.map +1 -0
  228. package/dist/learnings/recall.js +104 -0
  229. package/dist/learnings/recall.js.map +1 -0
  230. package/dist/learnings/service.d.ts +183 -0
  231. package/dist/learnings/service.d.ts.map +1 -0
  232. package/dist/learnings/service.js +571 -0
  233. package/dist/learnings/service.js.map +1 -0
  234. package/dist/mcp/ask-server.d.ts.map +1 -1
  235. package/dist/mcp/ask-server.js +37 -4
  236. package/dist/mcp/ask-server.js.map +1 -1
  237. package/dist/mcp/broker.d.ts +12 -1
  238. package/dist/mcp/broker.d.ts.map +1 -1
  239. package/dist/mcp/broker.js +24 -5
  240. package/dist/mcp/broker.js.map +1 -1
  241. package/dist/mcp/invoke.d.ts +26 -2
  242. package/dist/mcp/invoke.d.ts.map +1 -1
  243. package/dist/mcp/invoke.js +51 -5
  244. package/dist/mcp/invoke.js.map +1 -1
  245. package/dist/persona/routes.d.ts +92 -0
  246. package/dist/persona/routes.d.ts.map +1 -0
  247. package/dist/persona/routes.js +69 -0
  248. package/dist/persona/routes.js.map +1 -0
  249. package/dist/persona/store.d.ts +104 -0
  250. package/dist/persona/store.d.ts.map +1 -0
  251. package/dist/persona/store.js +176 -0
  252. package/dist/persona/store.js.map +1 -0
  253. package/dist/persona/voice.d.ts +4 -0
  254. package/dist/persona/voice.d.ts.map +1 -0
  255. package/dist/persona/voice.js +58 -0
  256. package/dist/persona/voice.js.map +1 -0
  257. package/dist/projects/routes.d.ts +2 -2
  258. package/dist/setup/known.d.ts +56 -0
  259. package/dist/setup/known.d.ts.map +1 -0
  260. package/dist/setup/known.js +159 -0
  261. package/dist/setup/known.js.map +1 -0
  262. package/dist/setup/routes.d.ts +13 -0
  263. package/dist/setup/routes.d.ts.map +1 -0
  264. package/dist/setup/routes.js +20 -0
  265. package/dist/setup/routes.js.map +1 -0
  266. package/dist/standing-orders/history.d.ts +2 -0
  267. package/dist/standing-orders/history.d.ts.map +1 -1
  268. package/dist/standing-orders/history.js +1 -0
  269. package/dist/standing-orders/history.js.map +1 -1
  270. package/dist/studio/assets/WickedSans-Regular-fb698rcD.woff2 +0 -0
  271. package/dist/studio/assets/WickedSans-SemiBold-CD53n1AC.woff2 +0 -0
  272. package/dist/studio/assets/WickedScript-Regular-CY5juO6I.woff2 +0 -0
  273. package/dist/studio/assets/WickedSerif-Regular-mdPEjaVZ.woff2 +0 -0
  274. package/dist/studio/assets/index-BUZ_-Syk.css +32 -0
  275. package/dist/studio/assets/index-u4O_7N-b.js +986 -0
  276. package/dist/studio/editors/wicked-deck/editor.json +6 -1
  277. package/dist/studio/editors/wicked-deck/icon.svg +1 -0
  278. package/dist/studio/editors/wicked-deck/index.html +1 -1
  279. package/dist/studio/editors/wicked-doc/editor.json +6 -1
  280. package/dist/studio/editors/wicked-doc/icon.svg +1 -0
  281. package/dist/studio/editors/wicked-doc/index.html +1 -1
  282. package/dist/studio/editors/wicked-insights/editor.json +6 -1
  283. package/dist/studio/editors/wicked-insights/icon.svg +1 -0
  284. package/dist/studio/editors/wicked-insights/index.html +1 -1
  285. package/dist/studio/editors/wicked-page/editor.json +6 -1
  286. package/dist/studio/editors/wicked-page/icon.svg +1 -0
  287. package/dist/studio/editors/wicked-page/index.html +1 -1
  288. package/dist/studio/editors/wicked-video/editor.json +6 -1
  289. package/dist/studio/editors/wicked-video/icon.svg +1 -0
  290. package/dist/studio/editors/wicked-video/index.html +1 -1
  291. package/dist/studio/index.html +2 -2
  292. package/dist/studio/testid-inventory.json +5155 -2707
  293. package/dist/voice/dashboard.d.ts +376 -0
  294. package/dist/voice/dashboard.d.ts.map +1 -0
  295. package/dist/voice/dashboard.js +92 -0
  296. package/dist/voice/dashboard.js.map +1 -0
  297. package/dist/voice/inject-input.d.ts +51 -0
  298. package/dist/voice/inject-input.d.ts.map +1 -0
  299. package/dist/voice/inject-input.js +126 -0
  300. package/dist/voice/inject-input.js.map +1 -0
  301. package/dist/voice/routes.d.ts +41 -0
  302. package/dist/voice/routes.d.ts.map +1 -0
  303. package/dist/voice/routes.js +116 -0
  304. package/dist/voice/routes.js.map +1 -0
  305. package/dist/voice/service.d.ts +177 -0
  306. package/dist/voice/service.d.ts.map +1 -0
  307. package/dist/voice/service.js +400 -0
  308. package/dist/voice/service.js.map +1 -0
  309. package/dist/workflow-catalog/build.d.ts +35 -0
  310. package/dist/workflow-catalog/build.d.ts.map +1 -0
  311. package/dist/workflow-catalog/build.js +229 -0
  312. package/dist/workflow-catalog/build.js.map +1 -0
  313. package/dist/workflow-catalog/catalog-data.d.ts +36 -0
  314. package/dist/workflow-catalog/catalog-data.d.ts.map +1 -0
  315. package/dist/workflow-catalog/catalog-data.js +430 -0
  316. package/dist/workflow-catalog/catalog-data.js.map +1 -0
  317. package/dist/working-doc/event-lines.d.ts +76 -0
  318. package/dist/working-doc/event-lines.d.ts.map +1 -0
  319. package/dist/working-doc/event-lines.js +247 -0
  320. package/dist/working-doc/event-lines.js.map +1 -0
  321. package/dist/working-doc/routes.d.ts +1 -1
  322. package/dist/working-doc/routes.d.ts.map +1 -1
  323. package/dist/working-doc/routes.js +2 -1
  324. package/dist/working-doc/routes.js.map +1 -1
  325. package/dist/working-doc/sections.d.ts +3 -1
  326. package/dist/working-doc/sections.d.ts.map +1 -1
  327. package/dist/working-doc/sections.js +4 -2
  328. package/dist/working-doc/sections.js.map +1 -1
  329. package/dist/working-doc/service.d.ts +66 -1
  330. package/dist/working-doc/service.d.ts.map +1 -1
  331. package/dist/working-doc/service.js +298 -22
  332. package/dist/working-doc/service.js.map +1 -1
  333. package/dist/working-doc/store.d.ts +8 -2
  334. package/dist/working-doc/store.d.ts.map +1 -1
  335. package/dist/working-doc/store.js.map +1 -1
  336. package/endpoint-manifest.json +205 -2
  337. package/package.json +5 -4
  338. package/workflows/distill-learnings.json +27 -0
  339. package/workflows/inspect-unit.json +27 -0
  340. package/dist/studio/assets/index-B-f_VEL2.css +0 -32
  341. package/dist/studio/assets/index-DhkxIK-0.js +0 -845
@@ -0,0 +1,92 @@
1
+ /**
2
+ * `/api/v1/persona` (program DES-LEARN §3.3): read and save the orchestrator's personality — the
3
+ * person's own (`scope=user`) and a project's override (`scope=project:<id>`). Reads are anyone's;
4
+ * a save or a removal is a PERSON's (the watch routes' human-operator predicate), audited.
5
+ */
6
+ import type { FastifyInstance } from 'fastify';
7
+ import { z } from 'zod';
8
+ import type { CoreAdapter } from '../core/adapter.js';
9
+ import type { AuditLog } from '../api/audit.js';
10
+ import { type PersonaStore } from './store.js';
11
+ export declare const PersonaPutSchema: z.ZodObject<{
12
+ scope: z.ZodString;
13
+ persona: z.ZodObject<{
14
+ name: z.ZodString;
15
+ colour: z.ZodString;
16
+ dials: z.ZodObject<{
17
+ length: z.ZodNumber;
18
+ warmth: z.ZodNumber;
19
+ pushback: z.ZodNumber;
20
+ initiative: z.ZodNumber;
21
+ }, "strict", z.ZodTypeAny, {
22
+ length: number;
23
+ warmth: number;
24
+ pushback: number;
25
+ initiative: number;
26
+ }, {
27
+ length: number;
28
+ warmth: number;
29
+ pushback: number;
30
+ initiative: number;
31
+ }>;
32
+ habits: z.ZodArray<z.ZodEnum<["says-unchecked", "tables", "cites", "names"]>, "many">;
33
+ notes: z.ZodOptional<z.ZodString>;
34
+ }, "strict", z.ZodTypeAny, {
35
+ name: string;
36
+ colour: string;
37
+ dials: {
38
+ length: number;
39
+ warmth: number;
40
+ pushback: number;
41
+ initiative: number;
42
+ };
43
+ habits: ("names" | "says-unchecked" | "tables" | "cites")[];
44
+ notes?: string | undefined;
45
+ }, {
46
+ name: string;
47
+ colour: string;
48
+ dials: {
49
+ length: number;
50
+ warmth: number;
51
+ pushback: number;
52
+ initiative: number;
53
+ };
54
+ habits: ("names" | "says-unchecked" | "tables" | "cites")[];
55
+ notes?: string | undefined;
56
+ }>;
57
+ }, "strict", z.ZodTypeAny, {
58
+ scope: string;
59
+ persona: {
60
+ name: string;
61
+ colour: string;
62
+ dials: {
63
+ length: number;
64
+ warmth: number;
65
+ pushback: number;
66
+ initiative: number;
67
+ };
68
+ habits: ("names" | "says-unchecked" | "tables" | "cites")[];
69
+ notes?: string | undefined;
70
+ };
71
+ }, {
72
+ scope: string;
73
+ persona: {
74
+ name: string;
75
+ colour: string;
76
+ dials: {
77
+ length: number;
78
+ warmth: number;
79
+ pushback: number;
80
+ initiative: number;
81
+ };
82
+ habits: ("names" | "says-unchecked" | "tables" | "cites")[];
83
+ notes?: string | undefined;
84
+ };
85
+ }>;
86
+ export interface PersonaRouteDeps {
87
+ store: PersonaStore;
88
+ adapter: Pick<CoreAdapter, 'projectGet'>;
89
+ audit: AuditLog;
90
+ }
91
+ export declare function registerPersonaRoutes(app: FastifyInstance, deps: PersonaRouteDeps): void;
92
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/persona/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK7F,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAwF,CAAC;AAEtH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACzC,KAAK,EAAE,QAAQ,CAAC;CACjB;AAKD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CA+DxF"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * `/api/v1/persona` (program DES-LEARN §3.3): read and save the orchestrator's personality — the
3
+ * person's own (`scope=user`) and a project's override (`scope=project:<id>`). Reads are anyone's;
4
+ * a save or a removal is a PERSON's (the watch routes' human-operator predicate), audited.
5
+ */
6
+ import { z } from 'zod';
7
+ import { API_PREFIX } from '../api/api-prefix.js';
8
+ import { LOCAL_ACTOR } from '../api/auth.js';
9
+ import { isHumanOperator } from '../api/watch-routes.js';
10
+ import { parseScope, PersonaInputSchema } from './store.js';
11
+ import { voiceBlock } from './voice.js';
12
+ const V = API_PREFIX;
13
+ export const PersonaPutSchema = z.object({ scope: z.string().min(1).max(200), persona: PersonaInputSchema }).strict();
14
+ const voices = (m) => Object.fromEntries(Object.entries(m).map(([k, p]) => [k, voiceBlock(p)]));
15
+ export function registerPersonaRoutes(app, deps) {
16
+ const actorOf = (req) => req.actor ?? LOCAL_ACTOR;
17
+ const refuse = (reply) => reply.code(403).send({ error: 'Only a person can change a personality (a worker or system actor cannot)' });
18
+ const projectKnown = async (scope) => !scope.startsWith('project:') || (await deps.adapter.projectGet(scope.slice('project:'.length))) !== null;
19
+ app.get(`${V}/persona`, { config: { manifest: { responseType: 'PersonaResponse', statusCodes: [200] } } }, async () => {
20
+ const user = deps.store.userPersona();
21
+ const projects = deps.store.overrides();
22
+ return { user, projects, voice: { user: user === null ? null : voiceBlock(user), projects: voices(projects) } };
23
+ });
24
+ app.put(`${V}/persona`, { config: { manifest: { requestType: 'PersonaPutBody', responseType: 'PersonaSaved', statusCodes: [200, 400, 403, 404, 500] } } }, async (req, reply) => {
25
+ const actor = actorOf(req);
26
+ if (!isHumanOperator(actor))
27
+ return refuse(reply);
28
+ const parsed = PersonaPutSchema.safeParse(req.body);
29
+ if (!parsed.success) {
30
+ return reply.code(400).send({ error: parsed.error.issues.map((i) => `${i.path.join('.') || 'body'}: ${i.message}`).join('; ') });
31
+ }
32
+ const scope = parseScope(parsed.data.scope);
33
+ if (scope === null)
34
+ return reply.code(400).send({ error: 'scope is "user" or "project:<id>"' });
35
+ if (!(await projectKnown(scope)))
36
+ return reply.code(404).send({ error: `no project '${scope.slice('project:'.length)}'` });
37
+ let persona;
38
+ try {
39
+ persona = deps.store.save(scope, parsed.data.persona);
40
+ }
41
+ catch (err) {
42
+ return reply.code(500).send({ error: `the personality could not be saved: ${err instanceof Error ? err.message : String(err)}` });
43
+ }
44
+ deps.audit.record('persona.saved', actor, { detail: { scope, version: persona.version } });
45
+ return { scope, persona, voice: voiceBlock(persona) };
46
+ });
47
+ app.delete(`${V}/persona`, { config: { manifest: { responseType: 'PersonaRemoved', statusCodes: [200, 400, 403, 404, 500] } } }, async (req, reply) => {
48
+ const actor = actorOf(req);
49
+ if (!isHumanOperator(actor))
50
+ return refuse(reply);
51
+ const raw = req.query.scope;
52
+ const scope = parseScope(Array.isArray(raw) ? raw[0] : raw);
53
+ if (scope === null || scope === 'user') {
54
+ return reply.code(400).send({ error: 'only a project override can be removed: scope=project:<id>' });
55
+ }
56
+ let removed;
57
+ try {
58
+ removed = deps.store.remove(scope.slice('project:'.length));
59
+ }
60
+ catch (err) {
61
+ return reply.code(500).send({ error: `the override could not be removed: ${err instanceof Error ? err.message : String(err)}` });
62
+ }
63
+ if (!removed)
64
+ return reply.code(404).send({ error: `${scope} has no override` });
65
+ deps.audit.record('persona.removed', actor, { detail: { scope } });
66
+ return { removed: true, scope };
67
+ });
68
+ }
69
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/persona/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAmC,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,GAAG,UAAU,CAAC;AAErB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAQtH,MAAM,MAAM,GAAG,CAAC,CAA0B,EAA0B,EAAE,CACpE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CAAC,GAAoB,EAAE,IAAsB;IAChF,MAAM,OAAO,GAAG,CAAC,GAAsB,EAAS,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC;IAC5E,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAgB,EAAE,CACnD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0EAA0E,EAAE,CAAC,CAAC;IAC9G,MAAM,YAAY,GAAG,KAAK,EAAE,KAAa,EAAoB,EAAE,CAC7D,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAE5G,GAAG,CAAC,GAAG,CACL,GAAG,CAAC,UAAU,EACd,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EACjF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;IAClH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,GAAG,CAAC,UAAU,EACd,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EACjI,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnI,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3H,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uCAAuC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACpI,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3F,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CACR,GAAG,CAAC,UAAU,EACd,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EACpG,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,GAAG,GAAI,GAAG,CAAC,KAAuC,CAAC,KAAK,CAAC;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4DAA4D,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACnI,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,kBAAkB,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * THE ORCHESTRATOR'S PERSONALITY (program DES-LEARN §3.3): how the agent that talks to the person
3
+ * speaks — one record for the person (`user`), and an optional override per project, started as a
4
+ * copy of theirs. A personality changes tone only: it is never read by a gate, a review, QE or a
5
+ * rule check, and nothing here can widen what a seat may do.
6
+ *
7
+ * Persisted as ONE file, `<state home>/daemon-persona.json`, under the registered `daemon-` prefix
8
+ * (as `editors/registry.ts` keeps `daemon-editors.json`): a new top-level entry outside that prefix
9
+ * is one core's worker fence refuses. Written atomically (temp file + rename), read once at boot.
10
+ */
11
+ import { z } from 'zod';
12
+ export declare const PERSONA_STATE_FILENAME = "daemon-persona.json";
13
+ /** The four dials: 0 = the left word, 2 = the right word. */
14
+ export declare const PERSONA_DIALS: readonly ["length", "warmth", "pushback", "initiative"];
15
+ export type PersonaDialName = (typeof PERSONA_DIALS)[number];
16
+ /** The habits a person can tick. */
17
+ export declare const PERSONA_HABITS: readonly ["says-unchecked", "tables", "cites", "names"];
18
+ export type PersonaHabit = (typeof PERSONA_HABITS)[number];
19
+ /** What a person sends (`PUT /persona`): the server adds `version` and `updatedAt`. */
20
+ export declare const PersonaInputSchema: z.ZodObject<{
21
+ name: z.ZodString;
22
+ colour: z.ZodString;
23
+ dials: z.ZodObject<{
24
+ length: z.ZodNumber;
25
+ warmth: z.ZodNumber;
26
+ pushback: z.ZodNumber;
27
+ initiative: z.ZodNumber;
28
+ }, "strict", z.ZodTypeAny, {
29
+ length: number;
30
+ warmth: number;
31
+ pushback: number;
32
+ initiative: number;
33
+ }, {
34
+ length: number;
35
+ warmth: number;
36
+ pushback: number;
37
+ initiative: number;
38
+ }>;
39
+ habits: z.ZodArray<z.ZodEnum<["says-unchecked", "tables", "cites", "names"]>, "many">;
40
+ notes: z.ZodOptional<z.ZodString>;
41
+ }, "strict", z.ZodTypeAny, {
42
+ name: string;
43
+ colour: string;
44
+ dials: {
45
+ length: number;
46
+ warmth: number;
47
+ pushback: number;
48
+ initiative: number;
49
+ };
50
+ habits: ("names" | "says-unchecked" | "tables" | "cites")[];
51
+ notes?: string | undefined;
52
+ }, {
53
+ name: string;
54
+ colour: string;
55
+ dials: {
56
+ length: number;
57
+ warmth: number;
58
+ pushback: number;
59
+ initiative: number;
60
+ };
61
+ habits: ("names" | "says-unchecked" | "tables" | "cites")[];
62
+ notes?: string | undefined;
63
+ }>;
64
+ export type PersonaInput = z.infer<typeof PersonaInputSchema>;
65
+ export interface Persona extends PersonaInput {
66
+ /** Starts at 1, one more on every save of this scope. */
67
+ version: number;
68
+ /** Unix ms of the save. */
69
+ updatedAt: number;
70
+ }
71
+ /** `user`, or `project:<id>` (an override for one project). */
72
+ export type PersonaScope = 'user' | `project:${string}`;
73
+ /** The scope a query or body names, or null when it is not one. */
74
+ export declare function parseScope(raw: unknown): PersonaScope | null;
75
+ export declare class PersonaStore {
76
+ private readonly file;
77
+ private user;
78
+ private readonly projects;
79
+ private readonly log;
80
+ constructor(opts?: {
81
+ stateHome?: string;
82
+ log?: (m: string) => void;
83
+ });
84
+ /** Where the record lives (diagnostics / tests). */
85
+ get path(): string;
86
+ private load;
87
+ private write;
88
+ /** The person's own personality, or null before one is saved. */
89
+ userPersona(): Persona | null;
90
+ /** Every project override, by project id. */
91
+ overrides(): Record<string, Persona>;
92
+ /** The personality a talk in `projectId` uses: the project's override, else the person's, else none. */
93
+ effective(projectId: string | null): {
94
+ persona: Persona;
95
+ scope: PersonaScope;
96
+ } | null;
97
+ /** Save one scope; the version is one more than that scope's last. Throws when the write fails
98
+ * (the in-memory record is rolled back, so a failed save never reads as saved). */
99
+ save(scope: PersonaScope, input: PersonaInput, now?: number): Persona;
100
+ /** Remove a project's override (the person's own is never removed here). True when there was one. */
101
+ remove(projectId: string): boolean;
102
+ private put;
103
+ }
104
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/persona/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,6DAA6D;AAC7D,eAAO,MAAM,aAAa,yDAA0D,CAAC;AACrF,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,oCAAoC;AACpC,eAAO,MAAM,cAAc,yDAA0D,CAAC;AACtF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAI3D,uFAAuF;AACvF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,OAAQ,SAAQ,YAAY;IAC3C,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,MAAM,EAAE,CAAC;AAIxD,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAK5D;AAaD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAE9B,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAO;IAMxE,oDAAoD;IACpD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,IAAI;IA+BZ,OAAO,CAAC,KAAK;IAUb,iEAAiE;IACjE,WAAW,IAAI,OAAO,GAAG,IAAI;IAI7B,6CAA6C;IAC7C,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIpC,wGAAwG;IACxG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI;IAQrF;wFACoF;IACpF,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO;IAoBjF,qGAAqG;IACrG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAalC,OAAO,CAAC,GAAG;CASZ"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * THE ORCHESTRATOR'S PERSONALITY (program DES-LEARN §3.3): how the agent that talks to the person
3
+ * speaks — one record for the person (`user`), and an optional override per project, started as a
4
+ * copy of theirs. A personality changes tone only: it is never read by a gate, a review, QE or a
5
+ * rule check, and nothing here can widen what a seat may do.
6
+ *
7
+ * Persisted as ONE file, `<state home>/daemon-persona.json`, under the registered `daemon-` prefix
8
+ * (as `editors/registry.ts` keeps `daemon-editors.json`): a new top-level entry outside that prefix
9
+ * is one core's worker fence refuses. Written atomically (temp file + rename), read once at boot.
10
+ */
11
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { z } from 'zod';
14
+ import { crewStateHome } from '../projects/state-home.js';
15
+ export const PERSONA_STATE_FILENAME = 'daemon-persona.json';
16
+ /** The four dials: 0 = the left word, 2 = the right word. */
17
+ export const PERSONA_DIALS = ['length', 'warmth', 'pushback', 'initiative'];
18
+ /** The habits a person can tick. */
19
+ export const PERSONA_HABITS = ['says-unchecked', 'tables', 'cites', 'names'];
20
+ const Dial = z.number().int().min(0).max(2);
21
+ /** What a person sends (`PUT /persona`): the server adds `version` and `updatedAt`. */
22
+ export const PersonaInputSchema = z
23
+ .object({
24
+ // One line of plain text: a line break or control character could open a section of its own in the
25
+ // chat statement the voice block rides (codex + agy on #1236).
26
+ name: z.string().trim().min(1).max(40).regex(/^[^\p{Cc}\p{Zl}\p{Zp}]+$/u, 'name is one line of text'),
27
+ colour: z.string().regex(/^#[0-9a-fA-F]{6}$/u, 'colour is a #rrggbb hex'),
28
+ dials: z.object({ length: Dial, warmth: Dial, pushback: Dial, initiative: Dial }).strict(),
29
+ habits: z.array(z.enum(PERSONA_HABITS)).max(PERSONA_HABITS.length),
30
+ notes: z.string().trim().max(500).optional(),
31
+ })
32
+ .strict();
33
+ const PROJECT_ID = /^[A-Za-z0-9._-]{1,128}$/u;
34
+ /** The scope a query or body names, or null when it is not one. */
35
+ export function parseScope(raw) {
36
+ if (raw === 'user')
37
+ return 'user';
38
+ if (typeof raw !== 'string' || !raw.startsWith('project:'))
39
+ return null;
40
+ const id = raw.slice('project:'.length);
41
+ return PROJECT_ID.test(id) ? `project:${id}` : null;
42
+ }
43
+ const StoredSchema = PersonaInputSchema.extend({
44
+ version: z.number().int().min(1),
45
+ updatedAt: z.number().int().min(0),
46
+ }).strict();
47
+ export class PersonaStore {
48
+ file;
49
+ user = null;
50
+ projects = new Map();
51
+ log;
52
+ constructor(opts = {}) {
53
+ this.file = join(opts.stateHome ?? crewStateHome(), PERSONA_STATE_FILENAME);
54
+ this.log = opts.log ?? (() => undefined);
55
+ this.load();
56
+ }
57
+ /** Where the record lives (diagnostics / tests). */
58
+ get path() {
59
+ return this.file;
60
+ }
61
+ load() {
62
+ let text;
63
+ try {
64
+ text = readFileSync(this.file, 'utf8');
65
+ }
66
+ catch (err) {
67
+ if (err.code !== 'ENOENT')
68
+ this.log(`[persona] ${PERSONA_STATE_FILENAME} unreadable: ${String(err)}`);
69
+ return;
70
+ }
71
+ let raw;
72
+ try {
73
+ raw = JSON.parse(text);
74
+ }
75
+ catch {
76
+ this.log(`[persona] ${PERSONA_STATE_FILENAME} is not JSON; starting with no personality`);
77
+ return;
78
+ }
79
+ const o = (raw ?? {});
80
+ const user = StoredSchema.safeParse(o['user']);
81
+ if (o['user'] !== undefined) {
82
+ if (user.success)
83
+ this.user = user.data;
84
+ else
85
+ this.log(`[persona] the user personality in ${PERSONA_STATE_FILENAME} is malformed; ignored`);
86
+ }
87
+ const projects = o['projects'];
88
+ if (projects !== null && typeof projects === 'object' && !Array.isArray(projects)) {
89
+ for (const [id, p] of Object.entries(projects)) {
90
+ const parsed = StoredSchema.safeParse(p);
91
+ if (PROJECT_ID.test(id) && parsed.success)
92
+ this.projects.set(id, parsed.data);
93
+ else
94
+ this.log(`[persona] project ${id}'s personality in ${PERSONA_STATE_FILENAME} is malformed; ignored`);
95
+ }
96
+ }
97
+ }
98
+ write() {
99
+ const state = { v: 1 };
100
+ if (this.user !== null)
101
+ state.user = this.user;
102
+ if (this.projects.size > 0)
103
+ state.projects = Object.fromEntries([...this.projects].sort(([a], [b]) => a.localeCompare(b)));
104
+ mkdirSync(join(this.file, '..'), { recursive: true });
105
+ const tmp = `${this.file}.${process.pid}.tmp`;
106
+ writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
107
+ renameSync(tmp, this.file);
108
+ }
109
+ /** The person's own personality, or null before one is saved. */
110
+ userPersona() {
111
+ return this.user;
112
+ }
113
+ /** Every project override, by project id. */
114
+ overrides() {
115
+ return Object.fromEntries(this.projects);
116
+ }
117
+ /** The personality a talk in `projectId` uses: the project's override, else the person's, else none. */
118
+ effective(projectId) {
119
+ if (projectId !== null) {
120
+ const p = this.projects.get(projectId);
121
+ if (p !== undefined)
122
+ return { persona: p, scope: `project:${projectId}` };
123
+ }
124
+ return this.user === null ? null : { persona: this.user, scope: 'user' };
125
+ }
126
+ /** Save one scope; the version is one more than that scope's last. Throws when the write fails
127
+ * (the in-memory record is rolled back, so a failed save never reads as saved). */
128
+ save(scope, input, now = Date.now()) {
129
+ const prev = scope === 'user' ? this.user : this.projects.get(scope.slice('project:'.length)) ?? null;
130
+ const next = {
131
+ ...input,
132
+ habits: [...new Set(input.habits)],
133
+ ...(input.notes !== undefined && input.notes !== '' ? { notes: input.notes } : { notes: undefined }),
134
+ version: (prev?.version ?? 0) + 1,
135
+ updatedAt: now,
136
+ };
137
+ if (next.notes === undefined)
138
+ delete next.notes;
139
+ this.put(scope, next);
140
+ try {
141
+ this.write();
142
+ }
143
+ catch (err) {
144
+ this.put(scope, prev);
145
+ throw err;
146
+ }
147
+ return next;
148
+ }
149
+ /** Remove a project's override (the person's own is never removed here). True when there was one. */
150
+ remove(projectId) {
151
+ const prev = this.projects.get(projectId);
152
+ if (prev === undefined)
153
+ return false;
154
+ this.projects.delete(projectId);
155
+ try {
156
+ this.write();
157
+ }
158
+ catch (err) {
159
+ this.projects.set(projectId, prev);
160
+ throw err;
161
+ }
162
+ return true;
163
+ }
164
+ put(scope, p) {
165
+ if (scope === 'user') {
166
+ this.user = p;
167
+ return;
168
+ }
169
+ const id = scope.slice('project:'.length);
170
+ if (p === null)
171
+ this.projects.delete(id);
172
+ else
173
+ this.projects.set(id, p);
174
+ }
175
+ }
176
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/persona/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Persona } from './store.js';
2
+ /** The voice block for one personality (markdown, a `## Voice` section). */
3
+ export declare function voiceBlock(p: Persona): string;
4
+ //# sourceMappingURL=voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/persona/voice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,YAAY,CAAC;AAqCxD,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAsB7C"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The VOICE BLOCK (program DES-LEARN §3.3): the short section a personality adds to what the agent
3
+ * that talks to the person is told (every chat's scope statement, the system chat's included). One
4
+ * template, so what `GET /persona` shows as `voice` is exactly what a seat reads.
5
+ *
6
+ * The first line after the heading is the invariant, said to the seat in so many words: tone only.
7
+ */
8
+ const LENGTH = [
9
+ 'Keep it short: lead with the answer, in at most three sentences unless asked for more.',
10
+ 'Say enough to be clear, and no more.',
11
+ 'Be thorough: give the steps and the reasoning behind them.',
12
+ ];
13
+ const WARMTH = [
14
+ 'Plain and direct: no pleasantries, no exclamation marks.',
15
+ 'Friendly and calm.',
16
+ 'Warm and encouraging.',
17
+ ];
18
+ const PUSHBACK = [
19
+ 'Go along with what is asked; raise a concern only when it blocks the work.',
20
+ 'Name a concern when you see one, briefly.',
21
+ 'Challenge: when you disagree, say so plainly and why, and say what you would do instead.',
22
+ ];
23
+ const INITIATIVE = [
24
+ 'Ask before you start anything.',
25
+ 'Propose the next step and ask whether to take it.',
26
+ 'When the next step is obvious and allowed, take it and say that you did.',
27
+ ];
28
+ const HABITS = {
29
+ 'says-unchecked': 'Say what you did not check.',
30
+ tables: 'Use a table when you compare options.',
31
+ cites: 'Cite the file and line for a claim about code.',
32
+ names: 'Address the person by name when you know it.',
33
+ };
34
+ /** The voice block for one personality (markdown, a `## Voice` section). */
35
+ export function voiceBlock(p) {
36
+ // The schema refuses a multi-line name; a record that predates it is still flattened here.
37
+ const name = p.name.replace(/\s+/gu, ' ').trim();
38
+ const lines = [
39
+ '## Voice',
40
+ '',
41
+ 'This section changes how you talk to the person, never what you may do: rules, gates, reviews and QE',
42
+ 'are exactly as they are without it.',
43
+ '',
44
+ `- Your name with the person is "${name}".`,
45
+ '',
46
+ `- ${LENGTH[p.dials.length]}`,
47
+ `- ${WARMTH[p.dials.warmth]}`,
48
+ `- ${PUSHBACK[p.dials.pushback]}`,
49
+ `- ${INITIATIVE[p.dials.initiative]}`,
50
+ ...p.habits.map((h) => `- ${HABITS[h]}`),
51
+ ];
52
+ if (p.notes !== undefined && p.notes.trim() !== '') {
53
+ // The person's own words, quoted as a note about tone: one line, so it cannot open a new section.
54
+ lines.push(`- The person adds, about how to talk to them: "${p.notes.replace(/\s+/gu, ' ').trim()}"`);
55
+ }
56
+ return `${lines.join('\n')}\n`;
57
+ }
58
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/persona/voice.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,MAAM,MAAM,GAAG;IACb,wFAAwF;IACxF,sCAAsC;IACtC,4DAA4D;CACpD,CAAC;AACX,MAAM,MAAM,GAAG;IACb,0DAA0D;IAC1D,oBAAoB;IACpB,uBAAuB;CACf,CAAC;AACX,MAAM,QAAQ,GAAG;IACf,4EAA4E;IAC5E,2CAA2C;IAC3C,0FAA0F;CAClF,CAAC;AACX,MAAM,UAAU,GAAG;IACjB,gCAAgC;IAChC,mDAAmD;IACnD,0EAA0E;CAClE,CAAC;AACX,MAAM,MAAM,GAAiC;IAC3C,gBAAgB,EAAE,6BAA6B;IAC/C,MAAM,EAAE,uCAAuC;IAC/C,KAAK,EAAE,gDAAgD;IACvD,KAAK,EAAE,8CAA8C;CACtD,CAAC;AAEF,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,2FAA2F;IAC3F,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG;QACZ,UAAU;QACV,EAAE;QACF,sGAAsG;QACtG,qCAAqC;QACrC,EAAE;QACF,mCAAmC,IAAI,IAAI;QAC3C,EAAE;QACF,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QAC7B,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QAC7B,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACjC,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;QACrC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC;IACF,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,kGAAkG;QAClG,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -55,14 +55,14 @@ export declare const UpdateProjectSchema: z.ZodObject<{
55
55
  /** crew#552 — override `onboardingAutoCapture` for this project; null clears it. Crew-side. */
56
56
  autoCapture: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
57
57
  }, "strict", z.ZodTypeAny, {
58
- status?: "active" | "archived" | undefined;
59
58
  name?: string | undefined;
59
+ status?: "active" | "archived" | undefined;
60
60
  description?: string | undefined;
61
61
  autoCapture?: boolean | null | undefined;
62
62
  interactiveRoot?: string | null | undefined;
63
63
  }, {
64
- status?: "active" | "archived" | undefined;
65
64
  name?: string | undefined;
65
+ status?: "active" | "archived" | undefined;
66
66
  description?: string | undefined;
67
67
  autoCapture?: boolean | null | undefined;
68
68
  interactiveRoot?: string | null | undefined;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * WHAT STUDIO ALREADY KNOWS (program DES-LEARN §4, first run): the facts the first-run flow shows
3
+ * before it asks anything — the git identity, the languages of the registered repositories, and the
4
+ * repositories found near them that are not registered yet. Read-only and bounded: every git call
5
+ * has a timeout and an output cap, the folder scan is one level deep under a closed list of roots,
6
+ * and a fact that cannot be read is `null` / empty, never a guess.
7
+ */
8
+ import type { RepoEntry } from 'wicked-crew-api-types';
9
+ export interface KnownLanguage {
10
+ name: string;
11
+ files: number;
12
+ /** Share of the counted source files, 0..1. */
13
+ share: number;
14
+ }
15
+ export interface NearbyRepo {
16
+ name: string;
17
+ path: string;
18
+ }
19
+ export interface SetupKnown {
20
+ git: {
21
+ name: string | null;
22
+ email: string | null;
23
+ } | null;
24
+ languages: KnownLanguage[];
25
+ /** Files counted across the registered repositories (source files only). */
26
+ filesCounted: number;
27
+ nearby: NearbyRepo[];
28
+ }
29
+ /** At most this many languages are named; the rest is "other". */
30
+ export declare const MAX_LANGUAGES = 6;
31
+ /** At most this many nearby repositories are offered. */
32
+ export declare const MAX_NEARBY = 24;
33
+ /** The folders a first run looks in, under the home directory (one level deep). */
34
+ export declare const NEARBY_ROOTS: readonly ["code", "src", "Projects", "projects", "dev", "git", "repos", "workspace", "work"];
35
+ /** The global git identity (the user's ~/.gitconfig, or GIT_CONFIG_GLOBAL when the environment names one). */
36
+ export declare function gitIdentity(home?: string): Promise<SetupKnown['git']>;
37
+ /** Count tracked source files by language in each repository (`git ls-files`, bounded). */
38
+ export declare function languagesOf(repos: readonly Pick<RepoEntry, 'root_path'>[]): Promise<{
39
+ languages: KnownLanguage[];
40
+ files: number;
41
+ }>;
42
+ /** At most this many folder entries are looked at across every root, and the scan stops after this long:
43
+ * the response cap alone would not bound the work (codex on #1236). */
44
+ export declare const NEARBY_MAX_ENTRIES = 2000;
45
+ export declare const NEARBY_DEADLINE_MS = 1500;
46
+ /**
47
+ * Git checkouts one level under the closed roots (the home's usual code folders, and the folders the
48
+ * registered repositories sit in), minus the registered ones. Every path is compared CANONICALLY
49
+ * (`realpath`): a root or a child that resolves outside the home, or to the home itself, is skipped, so a
50
+ * symlink can never widen the scan. Hidden folders are skipped; a root that cannot be listed is skipped.
51
+ * Bounded by {@link NEARBY_MAX_ENTRIES} entries and {@link NEARBY_DEADLINE_MS}; sorted by name, at most
52
+ * {@link MAX_NEARBY}.
53
+ */
54
+ export declare function nearbyRepos(registered: readonly Pick<RepoEntry, 'root_path'>[], home?: string, now?: () => number): Promise<NearbyRepo[]>;
55
+ export declare function setupKnown(repos: readonly RepoEntry[], home?: string): Promise<SetupKnown>;
56
+ //# sourceMappingURL=known.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known.d.ts","sourceRoot":"","sources":["../../src/setup/known.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAeD,kEAAkE;AAClE,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,yDAAyD;AACzD,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,mFAAmF;AACnF,eAAO,MAAM,YAAY,8FAA+F,CAAC;AAqBzH,8GAA8G;AAC9G,wBAAsB,WAAW,CAAC,IAAI,GAAE,MAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAGtF;AAED,2FAA2F;AAC3F,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBxI;AAED;wEACwE;AACxE,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAoBvC;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,SAAS,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EACnD,IAAI,GAAE,MAAkB,EACxB,GAAG,GAAE,MAAM,MAAiB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAmCvB;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAG3G"}