otacon 0.1.1 → 0.1.3

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 (128) hide show
  1. package/README.md +101 -64
  2. package/dist/cli/browser.js +55 -0
  3. package/dist/cli/browser.js.map +1 -0
  4. package/dist/cli/client.js +11 -0
  5. package/dist/cli/client.js.map +1 -1
  6. package/dist/cli/commands/clean.js +3 -2
  7. package/dist/cli/commands/clean.js.map +1 -1
  8. package/dist/cli/commands/config.js +62 -0
  9. package/dist/cli/commands/config.js.map +1 -0
  10. package/dist/cli/commands/doctor.js +41 -21
  11. package/dist/cli/commands/doctor.js.map +1 -1
  12. package/dist/cli/commands/install.js +53 -30
  13. package/dist/cli/commands/install.js.map +1 -1
  14. package/dist/cli/commands/open.js +14 -14
  15. package/dist/cli/commands/open.js.map +1 -1
  16. package/dist/cli/commands/start.js +8 -22
  17. package/dist/cli/commands/start.js.map +1 -1
  18. package/dist/cli/commands/update.js +76 -0
  19. package/dist/cli/commands/update.js.map +1 -0
  20. package/dist/cli/install/assets.js +35 -43
  21. package/dist/cli/install/assets.js.map +1 -1
  22. package/dist/cli/install/locations.js +15 -25
  23. package/dist/cli/install/locations.js.map +1 -1
  24. package/dist/cli/main.js +10 -1
  25. package/dist/cli/main.js.map +1 -1
  26. package/dist/cli/update.js +195 -0
  27. package/dist/cli/update.js.map +1 -0
  28. package/dist/daemon/app.js +281 -54
  29. package/dist/daemon/app.js.map +1 -1
  30. package/dist/daemon/approve.js +49 -11
  31. package/dist/daemon/approve.js.map +1 -1
  32. package/dist/daemon/store.js +39 -2
  33. package/dist/daemon/store.js.map +1 -1
  34. package/dist/daemon/threads.js +11 -0
  35. package/dist/daemon/threads.js.map +1 -1
  36. package/dist/daemon/ui.js +9 -1
  37. package/dist/daemon/ui.js.map +1 -1
  38. package/dist/shared/config.js +301 -45
  39. package/dist/shared/config.js.map +1 -1
  40. package/dist/shared/paths.js +41 -5
  41. package/dist/shared/paths.js.map +1 -1
  42. package/dist/shared/types.js +6 -2
  43. package/dist/shared/types.js.map +1 -1
  44. package/dist/shared/version.js +1 -1
  45. package/dist/ui/assets/{arc-HhPfdCPZ.js → arc-Cp3sPd_U.js} +1 -1
  46. package/dist/ui/assets/architecture-7EHR7CIX-BbwstElO.js +1 -0
  47. package/dist/ui/assets/{architectureDiagram-3BPJPVTR-D2PIxGOb.js → architectureDiagram-3BPJPVTR-C4F3heWP.js} +1 -1
  48. package/dist/ui/assets/{blockDiagram-GPEHLZMM-DQ3Dn17h.js → blockDiagram-GPEHLZMM-DmJoG8ky.js} +1 -1
  49. package/dist/ui/assets/{c4Diagram-AAUBKEIU-DxITrQgS.js → c4Diagram-AAUBKEIU-BDEf52Jp.js} +1 -1
  50. package/dist/ui/assets/channel-BMK3JFRf.js +1 -0
  51. package/dist/ui/assets/{chunk-2J33WTMH-Du1JoPx5.js → chunk-2J33WTMH-Dh_UFriv.js} +1 -1
  52. package/dist/ui/assets/{chunk-3OPIFGDE-Dn7x2Yqf.js → chunk-3OPIFGDE-c66RlAN8.js} +1 -1
  53. package/dist/ui/assets/{chunk-4BX2VUAB-DVnrE-4n.js → chunk-4BX2VUAB-CrGJaCCg.js} +1 -1
  54. package/dist/ui/assets/{chunk-55IACEB6-BAhFAimA.js → chunk-55IACEB6-BvwqEeyq.js} +1 -1
  55. package/dist/ui/assets/{chunk-5ZQYHXKU-0hEZptem.js → chunk-5ZQYHXKU-BfF2IfQe.js} +1 -1
  56. package/dist/ui/assets/{chunk-727SXJPM-C1FN_cI3.js → chunk-727SXJPM-DOEUwc9I.js} +1 -1
  57. package/dist/ui/assets/{chunk-AQP2D5EJ-A656OBd4.js → chunk-AQP2D5EJ-CVf2xV2Z.js} +1 -1
  58. package/dist/ui/assets/{chunk-BSJP7CBP-D8oMbjm8.js → chunk-BSJP7CBP-D_EbTWTC.js} +1 -1
  59. package/dist/ui/assets/{chunk-CSCIHK7Q-DjIL8GLi.js → chunk-CSCIHK7Q-CkxTSMAM.js} +1 -1
  60. package/dist/ui/assets/{chunk-FMBD7UC4-Otblfqvz.js → chunk-FMBD7UC4-DVShhFc7.js} +1 -1
  61. package/dist/ui/assets/{chunk-KSCS5N6A-BOjTvm3H.js → chunk-KSCS5N6A-DnHEEYpq.js} +1 -1
  62. package/dist/ui/assets/{chunk-L5ZTLDWV-CaTLaw6L.js → chunk-L5ZTLDWV-B_gjyajS.js} +1 -1
  63. package/dist/ui/assets/{chunk-LZXEDZCA-Dq5p7qrD.js → chunk-LZXEDZCA-Bsf7basG.js} +2 -2
  64. package/dist/ui/assets/{chunk-ND2GUHAM-jZ_NNnWi.js → chunk-ND2GUHAM-DGepGb8_.js} +1 -1
  65. package/dist/ui/assets/{chunk-NZK2D7GU-U_7l_sCh.js → chunk-NZK2D7GU-BJIlh-gB.js} +1 -1
  66. package/dist/ui/assets/{chunk-O5CBEL6O-MewqqNB7.js → chunk-O5CBEL6O-cdVbOOCs.js} +1 -1
  67. package/dist/ui/assets/chunk-QZHKN3VN-DLNUTn7U.js +1 -0
  68. package/dist/ui/assets/chunk-WU5MYG2G-ipH3YPcA.js +1 -0
  69. package/dist/ui/assets/{chunk-XPW4576I-D5ArxNEF.js → chunk-XPW4576I-DPW39hNO.js} +1 -1
  70. package/dist/ui/assets/classDiagram-4FO5ZUOK-CvIMLlSD.js +1 -0
  71. package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-CvIMLlSD.js +1 -0
  72. package/dist/ui/assets/{cose-bilkent-S5V4N54A-PFXzf7WV.js → cose-bilkent-S5V4N54A-DmMsC6om.js} +1 -1
  73. package/dist/ui/assets/{dagre-BM42HDAG-xrCfjZuZ.js → dagre-BM42HDAG-BmVr7T7Z.js} +1 -1
  74. package/dist/ui/assets/{diagram-2AECGRRQ-BFf-cyKY.js → diagram-2AECGRRQ-e0VnXEyj.js} +1 -1
  75. package/dist/ui/assets/{diagram-5GNKFQAL-kNPV4NfV.js → diagram-5GNKFQAL-SCJGYE6m.js} +1 -1
  76. package/dist/ui/assets/{diagram-KO2AKTUF-ByC1IUwG.js → diagram-KO2AKTUF-DDUZO1Mj.js} +1 -1
  77. package/dist/ui/assets/{diagram-LMA3HP47-DZIJMPK0.js → diagram-LMA3HP47-5x1ypf6a.js} +1 -1
  78. package/dist/ui/assets/{diagram-OG6HWLK6-CSDED9A-.js → diagram-OG6HWLK6-3nDhrQ20.js} +1 -1
  79. package/dist/ui/assets/{dist-YwjsDswi.js → dist-NEinnePC.js} +1 -1
  80. package/dist/ui/assets/{erDiagram-TEJ5UH35-yuzvjE6J.js → erDiagram-TEJ5UH35-BNvwSDNZ.js} +1 -1
  81. package/dist/ui/assets/eventmodeling-FCH6USID-BeFWDbla.js +1 -0
  82. package/dist/ui/assets/{flowDiagram-I6XJVG4X-ApPtVyYM.js → flowDiagram-I6XJVG4X-Bt_wDUhb.js} +1 -1
  83. package/dist/ui/assets/{ganttDiagram-6RSMTGT7-BeMLXtAr.js → ganttDiagram-6RSMTGT7-DVcJ0rNX.js} +1 -1
  84. package/dist/ui/assets/{gitGraph-WXDBUCRP-JmTTBa7j.js → gitGraph-WXDBUCRP-CO_SyAgP.js} +1 -1
  85. package/dist/ui/assets/{gitGraphDiagram-PVQCEYII-Cjjnjs71.js → gitGraphDiagram-PVQCEYII-oDyO3lWI.js} +1 -1
  86. package/dist/ui/assets/index-CJJIQ0dr.css +1 -0
  87. package/dist/ui/assets/index-Dh5CsH24.js +11 -0
  88. package/dist/ui/assets/{info-J43DQDTF-8vZ3gome.js → info-J43DQDTF-Bn17NS7h.js} +1 -1
  89. package/dist/ui/assets/{infoDiagram-5YYISTIA-CnMk1cA-.js → infoDiagram-5YYISTIA-HG1opLLT.js} +1 -1
  90. package/dist/ui/assets/{ishikawaDiagram-YF4QCWOH-Bl8z6huD.js → ishikawaDiagram-YF4QCWOH-Di_yQwi8.js} +1 -1
  91. package/dist/ui/assets/{journeyDiagram-JHISSGLW-DYIVfMpS.js → journeyDiagram-JHISSGLW-DZtHvLeE.js} +1 -1
  92. package/dist/ui/assets/{kanban-definition-UN3LZRKU-BnR0ZzOz.js → kanban-definition-UN3LZRKU-B_RCx3Km.js} +1 -1
  93. package/dist/ui/assets/{line-DcBdQit6.js → line-DenX-zXQ.js} +1 -1
  94. package/dist/ui/assets/{linear-HKjRHFAO.js → linear-dly_ngoq.js} +1 -1
  95. package/dist/ui/assets/{mermaid-parser.core-DkYXrPlA.js → mermaid-parser.core-CRmtm0s9.js} +2 -2
  96. package/dist/ui/assets/{mermaid.core-BmkfCI3b.js → mermaid.core-C_3KVfpx.js} +3 -3
  97. package/dist/ui/assets/{mindmap-definition-RKZ34NQL-sIAd4nDi.js → mindmap-definition-RKZ34NQL-wdzSyYO6.js} +1 -1
  98. package/dist/ui/assets/{packet-YPE3B663-BxbxcfXN.js → packet-YPE3B663-tUyFmR11.js} +1 -1
  99. package/dist/ui/assets/{pie-LRSECV5Y-BJxazjNs.js → pie-LRSECV5Y-Cel48VVp.js} +1 -1
  100. package/dist/ui/assets/{pieDiagram-4H26LBE5-BiOhc9GR.js → pieDiagram-4H26LBE5-B55ypWtu.js} +1 -1
  101. package/dist/ui/assets/{plan-view-CH6NzUDb.js → plan-view-CMoo3_gE.js} +3 -3
  102. package/dist/ui/assets/{quadrantDiagram-W4KKPZXB-CVyHbWgo.js → quadrantDiagram-W4KKPZXB-9WcKQV0a.js} +1 -1
  103. package/dist/ui/assets/{radar-GUYGQ44K-D9ohbnbV.js → radar-GUYGQ44K-w5pk53Vr.js} +1 -1
  104. package/dist/ui/assets/{requirementDiagram-4Y6WPE33-Ba24_hqc.js → requirementDiagram-4Y6WPE33-CzE82fXz.js} +1 -1
  105. package/dist/ui/assets/{sankeyDiagram-5OEKKPKP-CxD4wiPL.js → sankeyDiagram-5OEKKPKP-DSGO39je.js} +1 -1
  106. package/dist/ui/assets/{sequenceDiagram-3UESZ5HK-7qA7lD61.js → sequenceDiagram-3UESZ5HK-BKSDDr0S.js} +1 -1
  107. package/dist/ui/assets/{src-IM8AE8MK.js → src-JXBGgRt-.js} +1 -1
  108. package/dist/ui/assets/{stateDiagram-AJRCARHV-DNElRCuH.js → stateDiagram-AJRCARHV-DZHYA9aj.js} +1 -1
  109. package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-DnAfDlvZ.js +1 -0
  110. package/dist/ui/assets/{timeline-definition-PNZ67QCA-ChYC4Grd.js → timeline-definition-PNZ67QCA-WqJFw7aE.js} +1 -1
  111. package/dist/ui/assets/{treeView-BLDUP644-Il0KnMi_.js → treeView-BLDUP644-DoIQYMiz.js} +1 -1
  112. package/dist/ui/assets/{treemap-LRROVOQU-CIiKcdRo.js → treemap-LRROVOQU-BA9si_Mo.js} +1 -1
  113. package/dist/ui/assets/{vennDiagram-CIIHVFJN-Ulhkum9i.js → vennDiagram-CIIHVFJN-BvWRUfFr.js} +1 -1
  114. package/dist/ui/assets/{wardley-L42UT6IY-BNd4ljz7.js → wardley-L42UT6IY-Cf9PU44t.js} +1 -1
  115. package/dist/ui/assets/{wardleyDiagram-YWT4CUSO-BicXxh84.js → wardleyDiagram-YWT4CUSO-CGuxl7AU.js} +1 -1
  116. package/dist/ui/assets/{xychartDiagram-2RQKCTM6-Duf-m_th.js → xychartDiagram-2RQKCTM6-CNteNXpe.js} +1 -1
  117. package/dist/ui/index.html +2 -2
  118. package/package.json +1 -1
  119. package/dist/ui/assets/architecture-7EHR7CIX-BPLblcyi.js +0 -1
  120. package/dist/ui/assets/channel-ipcU8ZNI.js +0 -1
  121. package/dist/ui/assets/chunk-QZHKN3VN-DzGPH44B.js +0 -1
  122. package/dist/ui/assets/chunk-WU5MYG2G-DyEIVjoo.js +0 -1
  123. package/dist/ui/assets/classDiagram-4FO5ZUOK-Byg2Hl9D.js +0 -1
  124. package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-Byg2Hl9D.js +0 -1
  125. package/dist/ui/assets/eventmodeling-FCH6USID-CZR4eNG-.js +0 -1
  126. package/dist/ui/assets/index-BFQVRcSI.js +0 -11
  127. package/dist/ui/assets/index-Bj_kTrwP.css +0 -1
  128. package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-D6qTYpY3.js +0 -1
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
- import { globalConfigPath, repoConfigPath } from "./paths.js";
2
+ import { globalConfigPath, repoConfigPath, repoLocalConfigPath } from "./paths.js";
3
3
  export const DEFAULT_CONFIG = {
4
4
  budgets: {
5
5
  summaryLines: 5,
@@ -20,7 +20,219 @@ export const DEFAULT_CONFIG = {
20
20
  noteMaxChars: 200,
21
21
  },
22
22
  notifications: { desktop: true },
23
+ worktree: { dir: "~/.otacon/worktrees" },
24
+ plans: { dir: ".otacon/plans" },
25
+ update: { auto: true },
23
26
  };
27
+ /**
28
+ * One entry per leaf config key. The guard test asserts this enumerates exactly
29
+ * the leaves of DEFAULT_CONFIG, so config can never grow without a schema entry.
30
+ */
31
+ export const CONFIG_SCHEMA = [
32
+ // budgets — read-path line caps (DESIGN.md §4, §5)
33
+ {
34
+ section: "budgets",
35
+ key: "summaryLines",
36
+ label: "Summary lines",
37
+ description: "Max lines in a plan's summary block.",
38
+ type: "int",
39
+ default: DEFAULT_CONFIG.budgets.summaryLines,
40
+ min: 1,
41
+ },
42
+ {
43
+ section: "budgets",
44
+ key: "contractLines",
45
+ label: "Contract lines",
46
+ description: "Max lines in the optional ## Contract section.",
47
+ type: "int",
48
+ default: DEFAULT_CONFIG.budgets.contractLines,
49
+ min: 1,
50
+ },
51
+ {
52
+ section: "budgets",
53
+ key: "impactLines",
54
+ label: "Impact lines",
55
+ description: "Max lines in the optional ## Impact (blast-radius) section.",
56
+ type: "int",
57
+ default: DEFAULT_CONFIG.budgets.impactLines,
58
+ min: 1,
59
+ },
60
+ {
61
+ section: "budgets",
62
+ key: "decisionEntryLines",
63
+ label: "Decision entry lines",
64
+ description: "Max lines per decision-record entry.",
65
+ type: "int",
66
+ default: DEFAULT_CONFIG.budgets.decisionEntryLines,
67
+ min: 1,
68
+ },
69
+ {
70
+ section: "budgets",
71
+ key: "phaseGoalLines",
72
+ label: "Phase goal lines",
73
+ description: "Max lines in a phase's goal block.",
74
+ type: "int",
75
+ default: DEFAULT_CONFIG.budgets.phaseGoalLines,
76
+ min: 1,
77
+ },
78
+ {
79
+ section: "budgets",
80
+ key: "phaseVerificationLines",
81
+ label: "Phase verification lines",
82
+ description: "Max lines in a phase's verification block.",
83
+ type: "int",
84
+ default: DEFAULT_CONFIG.budgets.phaseVerificationLines,
85
+ min: 1,
86
+ },
87
+ {
88
+ section: "budgets",
89
+ key: "gwtMaxScenarios",
90
+ label: "Max GWT scenarios",
91
+ description: "Max Given/When/Then scenarios in one phase's gwt block.",
92
+ type: "int",
93
+ default: DEFAULT_CONFIG.budgets.gwtMaxScenarios,
94
+ min: 1,
95
+ },
96
+ {
97
+ section: "budgets",
98
+ key: "risksMaxItems",
99
+ label: "Max risk items",
100
+ description: "Max entries in the risks list.",
101
+ type: "int",
102
+ default: DEFAULT_CONFIG.budgets.risksMaxItems,
103
+ min: 1,
104
+ },
105
+ {
106
+ section: "budgets",
107
+ key: "riskEntryLines",
108
+ label: "Risk entry lines",
109
+ description: "Max lines per risk entry.",
110
+ type: "int",
111
+ default: DEFAULT_CONFIG.budgets.riskEntryLines,
112
+ min: 1,
113
+ },
114
+ {
115
+ section: "budgets",
116
+ key: "maxFencesPerReadSection",
117
+ label: "Max fences per section",
118
+ description: "Max fenced blocks in one read-path section.",
119
+ type: "int",
120
+ default: DEFAULT_CONFIG.budgets.maxFencesPerReadSection,
121
+ min: 1,
122
+ },
123
+ {
124
+ section: "budgets",
125
+ key: "maxVisualsPerReadSection",
126
+ label: "Max visuals per section",
127
+ description: "Max markdown-native visuals (callouts, matrices) per read-path section.",
128
+ type: "int",
129
+ default: DEFAULT_CONFIG.budgets.maxVisualsPerReadSection,
130
+ min: 1,
131
+ },
132
+ {
133
+ section: "budgets",
134
+ key: "detailsSoftCapLines",
135
+ label: "Details soft cap",
136
+ description: "Soft cap on raw lines inside a details block.",
137
+ type: "int",
138
+ default: DEFAULT_CONFIG.budgets.detailsSoftCapLines,
139
+ min: 1,
140
+ },
141
+ // activity — live feed tuning (DESIGN.md §6, §15)
142
+ {
143
+ section: "activity",
144
+ key: "cap",
145
+ label: "Activity feed cap",
146
+ description: "How many newest progress notes the feed keeps.",
147
+ type: "int",
148
+ default: DEFAULT_CONFIG.activity.cap,
149
+ min: 1,
150
+ },
151
+ {
152
+ section: "activity",
153
+ key: "noteMaxChars",
154
+ label: "Note max characters",
155
+ description: "Server-side trim length for an over-long progress note.",
156
+ type: "int",
157
+ default: DEFAULT_CONFIG.activity.noteMaxChars,
158
+ min: 1,
159
+ },
160
+ // notifications — attention banners (DESIGN.md §6)
161
+ {
162
+ section: "notifications",
163
+ key: "desktop",
164
+ label: "Desktop notifications",
165
+ description: "Native macOS banner when a session needs your attention.",
166
+ type: "bool",
167
+ default: DEFAULT_CONFIG.notifications.desktop,
168
+ },
169
+ // worktree — Approve & Implement build location (DESIGN.md §12)
170
+ {
171
+ section: "worktree",
172
+ key: "dir",
173
+ label: "Worktree directory",
174
+ description: "Base dir for Approve & Implement build worktrees (default ~/.otacon/worktrees, outside the repo).",
175
+ type: "path",
176
+ default: DEFAULT_CONFIG.worktree.dir,
177
+ },
178
+ // plans — where Save writes the approved plan's project copy (DESIGN.md §12)
179
+ {
180
+ section: "plans",
181
+ key: "dir",
182
+ label: "Plans directory",
183
+ description: "Where Save writes the approved plan copy in the project (repo-relative).",
184
+ type: "path",
185
+ default: DEFAULT_CONFIG.plans.dir,
186
+ },
187
+ // update — auto-update at otacon start (DESIGN.md §16)
188
+ {
189
+ section: "update",
190
+ key: "auto",
191
+ label: "Auto-update on start",
192
+ description: "Self-update to the latest published version at otacon start (off pins the installed version).",
193
+ type: "bool",
194
+ default: DEFAULT_CONFIG.update.auto,
195
+ },
196
+ ];
197
+ /**
198
+ * Validate one raw value against a field's type rule, shared by loadConfig's
199
+ * overlay and the config API validator:
200
+ * int → finite number, > 0 (and >= field.min if set)
201
+ * bool → boolean
202
+ * path → non-empty string (trimmed)
203
+ */
204
+ export function coerceFieldValue(field, raw) {
205
+ switch (field.type) {
206
+ case "int": {
207
+ if (typeof raw !== "number" || !Number.isFinite(raw))
208
+ return { ok: false };
209
+ if (raw <= 0)
210
+ return { ok: false };
211
+ if (field.min !== undefined && raw < field.min)
212
+ return { ok: false };
213
+ return { ok: true, value: raw };
214
+ }
215
+ case "bool": {
216
+ if (typeof raw !== "boolean")
217
+ return { ok: false };
218
+ return { ok: true, value: raw };
219
+ }
220
+ case "path": {
221
+ if (typeof raw !== "string")
222
+ return { ok: false };
223
+ const trimmed = raw.trim();
224
+ if (trimmed.length === 0)
225
+ return { ok: false };
226
+ return { ok: true, value: trimmed };
227
+ }
228
+ }
229
+ }
230
+ const SCHEMA_BY_SECTION = new Map();
231
+ for (const field of CONFIG_SCHEMA) {
232
+ const list = SCHEMA_BY_SECTION.get(field.section) ?? [];
233
+ list.push(field);
234
+ SCHEMA_BY_SECTION.set(field.section, list);
235
+ }
24
236
  function readJsonFile(path) {
25
237
  try {
26
238
  return JSON.parse(readFileSync(path, "utf8"));
@@ -30,64 +242,108 @@ function readJsonFile(path) {
30
242
  }
31
243
  }
32
244
  /**
33
- * Overlay one config file's `<section>` (all positive-number keys); invalid
34
- * values are ignored with a notice. Both `budgets` and `activity` are flat
35
- * maps of positive numbers, so they share this merge.
245
+ * Walk every schema field that `raw` provides (a nested `{ section: { key } }`
246
+ * object), coercing each against its type rule. `onResult` fires once per
247
+ * provided known key with the field, its section, and the coercion result —
248
+ * the single iteration shared by the file overlay, the API validator, and the
249
+ * scope reader. A non-object `raw` (or section) is treated as "provides
250
+ * nothing".
36
251
  */
37
- function mergeSection(base, raw, section, source) {
252
+ function walkProvidedFields(raw, onResult) {
38
253
  if (typeof raw !== "object" || raw === null)
39
- return base;
40
- const obj = raw[section];
41
- if (typeof obj !== "object" || obj === null)
42
- return base;
43
- const merged = { ...base };
44
- for (const key of Object.keys(base)) {
45
- const value = obj[key];
46
- if (typeof value === "number" && Number.isFinite(value) && value > 0) {
47
- merged[key] = value;
48
- }
49
- else if (value !== undefined) {
50
- process.stderr.write(`otacon: ignoring invalid ${section}.${String(key)} in ${source}\n`);
254
+ return;
255
+ const root = raw;
256
+ for (const [section, fields] of SCHEMA_BY_SECTION) {
257
+ const obj = root[section];
258
+ if (typeof obj !== "object" || obj === null)
259
+ continue;
260
+ const sectionObj = obj;
261
+ for (const field of fields) {
262
+ if (!(field.key in sectionObj))
263
+ continue;
264
+ onResult(section, field, coerceFieldValue(field, sectionObj[field.key]));
51
265
  }
52
266
  }
53
- return merged;
54
267
  }
55
- /** Overlay one config file's notifications; a non-boolean is ignored with a notice. */
56
- function mergeNotifications(base, raw, source) {
57
- if (typeof raw !== "object" || raw === null)
58
- return base;
59
- const notifications = raw.notifications;
60
- if (typeof notifications !== "object" || notifications === null)
61
- return base;
62
- const merged = { ...base };
63
- for (const key of Object.keys(base)) {
64
- const value = notifications[key];
65
- if (typeof value === "boolean") {
66
- merged[key] = value;
268
+ /**
269
+ * Overlay one config file onto `base`, schema-driven: for every known field,
270
+ * a provided value that passes `coerceFieldValue` wins; an invalid provided
271
+ * value is ignored with a notice (same wording/behavior as before). Unknown
272
+ * keys are silently ignored.
273
+ */
274
+ function overlayConfig(base, raw, source) {
275
+ const merged = {
276
+ budgets: { ...base.budgets },
277
+ activity: { ...base.activity },
278
+ notifications: { ...base.notifications },
279
+ worktree: { ...base.worktree },
280
+ plans: { ...base.plans },
281
+ update: { ...base.update },
282
+ };
283
+ const mergedSections = merged;
284
+ walkProvidedFields(raw, (section, field, result) => {
285
+ if (result.ok) {
286
+ // section always names a key of OtaconConfig (it came from CONFIG_SCHEMA),
287
+ // so the merged section object is always present.
288
+ mergedSections[section][field.key] = result.value;
67
289
  }
68
- else if (value !== undefined) {
69
- process.stderr.write(`otacon: ignoring invalid notifications.${key} in ${source}\n`);
290
+ else {
291
+ process.stderr.write(`otacon: ignoring invalid ${section}.${field.key} in ${source}\n`);
70
292
  }
71
- }
293
+ });
72
294
  return merged;
73
295
  }
74
296
  /**
75
- * defaults ← $OTACON_HOME/config.json ← <repo>/otacon.config.json.
76
- * Loaded fresh on every use so tuning takes effect immediately. Each file is
77
- * overlaid section by section (budgets, activity, notifications).
297
+ * defaults ← user (`$OTACON_HOME/config.json`)project
298
+ * (`<repo>/.otacon/config.json`, team-shared) project.local
299
+ * (`<repo>/.otacon/config.local.json`, personal). Closest wins. Loaded fresh
300
+ * on every use so tuning takes effect immediately. Each file is overlaid field
301
+ * by field against CONFIG_SCHEMA (budgets, activity, notifications, worktree,
302
+ * plans, update).
78
303
  */
79
304
  export function loadConfig(repoRoot) {
80
- const overlay = (source, into) => {
81
- const raw = readJsonFile(source);
82
- return {
83
- budgets: mergeSection(into.budgets, raw, "budgets", source),
84
- activity: mergeSection(into.activity, raw, "activity", source),
85
- notifications: mergeNotifications(into.notifications, raw, source),
86
- };
87
- };
305
+ const overlay = (source, into) => overlayConfig(into, readJsonFile(source), source);
88
306
  let config = overlay(globalConfigPath(), DEFAULT_CONFIG);
89
- if (repoRoot)
307
+ if (repoRoot) {
90
308
  config = overlay(repoConfigPath(repoRoot), config);
309
+ config = overlay(repoLocalConfigPath(repoRoot), config);
310
+ }
91
311
  return config;
92
312
  }
313
+ /**
314
+ * Read+parse a scope JSON file and return ONLY schema-known keys whose values
315
+ * pass `coerceFieldValue` (sparse; missing/garbage file → `{}`). This is what
316
+ * GET shows as a scope's current values.
317
+ */
318
+ export function readScopeValues(path) {
319
+ const out = {};
320
+ walkProvidedFields(readJsonFile(path), (section, field, result) => {
321
+ if (result.ok)
322
+ (out[section] ??= {})[field.key] = result.value;
323
+ });
324
+ return out;
325
+ }
326
+ /**
327
+ * Validate a nested `{ section: { key: value } }` partial against the schema:
328
+ * unknown sections/keys are ignored, each known provided key is coerced; on
329
+ * failure a field error is recorded. Returns the sanitized sparse `values`
330
+ * (only valid, provided keys). This is what POST validates + persists.
331
+ */
332
+ export function validateScopeInput(input) {
333
+ const values = {};
334
+ const errors = [];
335
+ walkProvidedFields(input, (section, field, result) => {
336
+ if (result.ok) {
337
+ (values[section] ??= {})[field.key] = result.value;
338
+ }
339
+ else {
340
+ errors.push({
341
+ section,
342
+ key: field.key,
343
+ message: `invalid value for ${section}.${field.key}`,
344
+ });
345
+ }
346
+ });
347
+ return { values: values, errors };
348
+ }
93
349
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"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"}
@@ -19,8 +19,48 @@ export function daemonLogPath() {
19
19
  export function globalConfigPath() {
20
20
  return join(otaconHome(), "config.json");
21
21
  }
22
+ /**
23
+ * The auto-update check cache (`<OTACON_HOME>/update-check.json`, DESIGN.md
24
+ * §16): records `checkedAt` so `otacon start` throttles the registry fetch to
25
+ * once per hour instead of paying a round-trip on every start.
26
+ */
27
+ export function updateCachePath() {
28
+ return join(otaconHome(), "update-check.json");
29
+ }
30
+ /**
31
+ * The canonical home plan archive root (`<OTACON_HOME>/sessions`, DESIGN.md
32
+ * §12): every approved plan lands here keyed by its session id, regardless of
33
+ * the repo. This store is permanent — `otacon clean` never touches it — so a
34
+ * plan is always recoverable even after its repo working state is archived.
35
+ */
36
+ export function homeSessionsDir() {
37
+ return join(otaconHome(), "sessions");
38
+ }
39
+ /**
40
+ * One session's home archive dir (`<OTACON_HOME>/sessions/<id>`). The session
41
+ * id is a globally-unique hash, so this never collides across repos — mirroring
42
+ * the repo-local `.otacon/<id>/` layout. The approved plan lands here as
43
+ * `<date>-<slug>.md`.
44
+ */
45
+ export function homeSessionDir(id) {
46
+ return join(homeSessionsDir(), id);
47
+ }
48
+ /**
49
+ * The team-shared project config (`<repo>/.otacon/config.json`), mirroring
50
+ * Claude Code's `settings.json`. It overrides the global (user) config for this
51
+ * repo and is in turn overridden by the local override below.
52
+ */
22
53
  export function repoConfigPath(repoRoot) {
23
- return join(repoRoot, "otacon.config.json");
54
+ return join(otaconDir(repoRoot), "config.json");
55
+ }
56
+ /**
57
+ * The personal, per-developer project override
58
+ * (`<repo>/.otacon/config.local.json`), mirroring Claude Code's
59
+ * `settings.local.json`. The Settings UI writes it for a one-off override that
60
+ * wins over both the user and the team project config.
61
+ */
62
+ export function repoLocalConfigPath(repoRoot) {
63
+ return join(otaconDir(repoRoot), "config.local.json");
24
64
  }
25
65
  export function otaconDir(repoRoot) {
26
66
  return join(repoRoot, ".otacon");
@@ -49,10 +89,6 @@ export function transcriptPath(repoRoot, id) {
49
89
  export function activityPath(repoRoot, id) {
50
90
  return join(sessionDir(repoRoot, id), "activity.json");
51
91
  }
52
- /** Where approved plan artifacts land (DESIGN.md §12). */
53
- export function plansDir(repoRoot) {
54
- return join(repoRoot, "docs", "plans");
55
- }
56
92
  export function revisionPath(repoRoot, id, n) {
57
93
  return join(sessionDir(repoRoot, id), `r${n}.md`);
58
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,8EAA8E;AAC9E,6EAA6E;AAC7E,wCAAwC;AAExC,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,EAAU;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,EAAU;IACnD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,EAAU;IAC3D,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,EAAU;IACrD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,EAAU;IACtD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,EAAU;IACzD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAC3D,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,EAAU;IACvD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;AACzD,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,EAAU,EAAE,CAAS;IAClE,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,EAAU,EAAE,CAAS;IAC1E,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC/D,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,EAAU,EAAE,CAAS;IAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export const SESSION_STATUSES = [
4
4
  "draft",
5
5
  "in_review",
6
6
  "revising",
7
+ "finalizing",
7
8
  "approved",
8
9
  "implementing",
9
10
  "implemented",
@@ -14,8 +15,11 @@ export const SESSION_STATUSES = [
14
15
  * every mutating verb refuses (app.ts `sessionEnded`), and the CLI's pointer
15
16
  * rules stop resolving it implicitly. `implementing` is deliberately NOT here:
16
17
  * it re-opens progress/ask/wait/answer while the agent builds the approved plan.
17
- * The single source of truth the app guard and the CLI resolver both derive
18
- * from this, so they can never disagree about what "over" means.
18
+ * `finalizing` is likewise NOT here: a send-to-agent approve (comment & approve)
19
+ * defers the finalize while the agent folds the open comments in, so its next
20
+ * `submit` must still mutate the session. The single source of truth — the app
21
+ * guard and the CLI resolver both derive from this, so they can never disagree
22
+ * about what "over" means.
19
23
  */
20
24
  export const TERMINAL_STATUSES = [
21
25
  "approved",
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,0DAA0D;AAe1D,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,OAAO;IACP,WAAW;IACX,UAAU;IACV,UAAU;IACV,cAAc;IACd,aAAa;IACb,kBAAkB;CACnB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACzD,UAAU;IACV,aAAa;IACb,kBAAkB;CACnB,CAAC;AAkMF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,0DAA0D;AAgB1D,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,OAAO;IACP,WAAW;IACX,UAAU;IACV,YAAY;IACZ,UAAU;IACV,cAAc;IACd,aAAa;IACb,kBAAkB;CACnB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACzD,UAAU;IACV,aAAa;IACb,kBAAkB;CACnB,CAAC;AA0MF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // Generated from package.json by scripts/gen-version.ts — do NOT hand-edit.
2
2
  // version.test.ts guards that this equals package.json's version. Bump the
3
3
  // version in package.json, then run `bun run gen:version` to regenerate.
4
- export const VERSION = "0.1.1";
4
+ export const VERSION = "0.1.3";
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-YwjsDswi.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
1
+ import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-NEinnePC.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -0,0 +1 @@
1
+ import"./chunk-NNHCCRGN-DlpIbxXb.js";import{x as e}from"./mermaid-parser.core-CRmtm0s9.js";export{e as createArchitectureServices};