@andrew.ng/symbion 0.1.0

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 (417) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/apps/daemon/dist/boot/menu.d.ts +11 -0
  4. package/apps/daemon/dist/boot/menu.d.ts.map +1 -0
  5. package/apps/daemon/dist/boot/menu.js +32 -0
  6. package/apps/daemon/dist/boot/menu.js.map +1 -0
  7. package/apps/daemon/dist/fs/folderPick.d.ts +13 -0
  8. package/apps/daemon/dist/fs/folderPick.d.ts.map +1 -0
  9. package/apps/daemon/dist/fs/folderPick.js +4 -0
  10. package/apps/daemon/dist/fs/folderPick.js.map +1 -0
  11. package/apps/daemon/dist/fs/listDir.d.ts +13 -0
  12. package/apps/daemon/dist/fs/listDir.d.ts.map +1 -0
  13. package/apps/daemon/dist/fs/listDir.js +121 -0
  14. package/apps/daemon/dist/fs/listDir.js.map +1 -0
  15. package/apps/daemon/dist/fs/readTargetFiles.d.ts +20 -0
  16. package/apps/daemon/dist/fs/readTargetFiles.d.ts.map +1 -0
  17. package/apps/daemon/dist/fs/readTargetFiles.js +76 -0
  18. package/apps/daemon/dist/fs/readTargetFiles.js.map +1 -0
  19. package/apps/daemon/dist/fs/writeFiles.d.ts +32 -0
  20. package/apps/daemon/dist/fs/writeFiles.d.ts.map +1 -0
  21. package/apps/daemon/dist/fs/writeFiles.js +93 -0
  22. package/apps/daemon/dist/fs/writeFiles.js.map +1 -0
  23. package/apps/daemon/dist/git/status.d.ts +11 -0
  24. package/apps/daemon/dist/git/status.d.ts.map +1 -0
  25. package/apps/daemon/dist/git/status.js +30 -0
  26. package/apps/daemon/dist/git/status.js.map +1 -0
  27. package/apps/daemon/dist/index.d.ts +2 -0
  28. package/apps/daemon/dist/index.d.ts.map +1 -0
  29. package/apps/daemon/dist/index.js +69 -0
  30. package/apps/daemon/dist/index.js.map +1 -0
  31. package/apps/daemon/dist/llm/anthropicProvider.d.ts +26 -0
  32. package/apps/daemon/dist/llm/anthropicProvider.d.ts.map +1 -0
  33. package/apps/daemon/dist/llm/anthropicProvider.js +90 -0
  34. package/apps/daemon/dist/llm/anthropicProvider.js.map +1 -0
  35. package/apps/daemon/dist/llm/geminiProvider.d.ts +25 -0
  36. package/apps/daemon/dist/llm/geminiProvider.d.ts.map +1 -0
  37. package/apps/daemon/dist/llm/geminiProvider.js +89 -0
  38. package/apps/daemon/dist/llm/geminiProvider.js.map +1 -0
  39. package/apps/daemon/dist/llm/installInstructions.d.ts +40 -0
  40. package/apps/daemon/dist/llm/installInstructions.d.ts.map +1 -0
  41. package/apps/daemon/dist/llm/installInstructions.js +80 -0
  42. package/apps/daemon/dist/llm/installInstructions.js.map +1 -0
  43. package/apps/daemon/dist/llm/ollamaProvider.d.ts +55 -0
  44. package/apps/daemon/dist/llm/ollamaProvider.d.ts.map +1 -0
  45. package/apps/daemon/dist/llm/ollamaProvider.js +213 -0
  46. package/apps/daemon/dist/llm/ollamaProvider.js.map +1 -0
  47. package/apps/daemon/dist/llm/openaiProvider.d.ts +25 -0
  48. package/apps/daemon/dist/llm/openaiProvider.d.ts.map +1 -0
  49. package/apps/daemon/dist/llm/openaiProvider.js +90 -0
  50. package/apps/daemon/dist/llm/openaiProvider.js.map +1 -0
  51. package/apps/daemon/dist/llm/providerStatus.d.ts +60 -0
  52. package/apps/daemon/dist/llm/providerStatus.d.ts.map +1 -0
  53. package/apps/daemon/dist/llm/providerStatus.js +88 -0
  54. package/apps/daemon/dist/llm/providerStatus.js.map +1 -0
  55. package/apps/daemon/dist/llm/registry.d.ts +14 -0
  56. package/apps/daemon/dist/llm/registry.d.ts.map +1 -0
  57. package/apps/daemon/dist/llm/registry.js +35 -0
  58. package/apps/daemon/dist/llm/registry.js.map +1 -0
  59. package/apps/daemon/dist/llm/remoteProvider.d.ts +25 -0
  60. package/apps/daemon/dist/llm/remoteProvider.d.ts.map +1 -0
  61. package/apps/daemon/dist/llm/remoteProvider.js +88 -0
  62. package/apps/daemon/dist/llm/remoteProvider.js.map +1 -0
  63. package/apps/daemon/dist/llm/secrets.d.ts +55 -0
  64. package/apps/daemon/dist/llm/secrets.d.ts.map +1 -0
  65. package/apps/daemon/dist/llm/secrets.js +167 -0
  66. package/apps/daemon/dist/llm/secrets.js.map +1 -0
  67. package/apps/daemon/dist/llm/types.d.ts +50 -0
  68. package/apps/daemon/dist/llm/types.d.ts.map +1 -0
  69. package/apps/daemon/dist/llm/types.js +16 -0
  70. package/apps/daemon/dist/llm/types.js.map +1 -0
  71. package/apps/daemon/dist/net/findOpenPort.d.ts +26 -0
  72. package/apps/daemon/dist/net/findOpenPort.d.ts.map +1 -0
  73. package/apps/daemon/dist/net/findOpenPort.js +37 -0
  74. package/apps/daemon/dist/net/findOpenPort.js.map +1 -0
  75. package/apps/daemon/dist/rpc/contract.d.ts +10 -0
  76. package/apps/daemon/dist/rpc/contract.d.ts.map +1 -0
  77. package/apps/daemon/dist/rpc/contract.js +2 -0
  78. package/apps/daemon/dist/rpc/contract.js.map +1 -0
  79. package/apps/daemon/dist/rpc/guard.d.ts +18 -0
  80. package/apps/daemon/dist/rpc/guard.d.ts.map +1 -0
  81. package/apps/daemon/dist/rpc/guard.js +75 -0
  82. package/apps/daemon/dist/rpc/guard.js.map +1 -0
  83. package/apps/daemon/dist/rpc/handlers.d.ts +118 -0
  84. package/apps/daemon/dist/rpc/handlers.d.ts.map +1 -0
  85. package/apps/daemon/dist/rpc/handlers.js +694 -0
  86. package/apps/daemon/dist/rpc/handlers.js.map +1 -0
  87. package/apps/daemon/dist/rpc/pathStyle.d.ts +27 -0
  88. package/apps/daemon/dist/rpc/pathStyle.d.ts.map +1 -0
  89. package/apps/daemon/dist/rpc/pathStyle.js +43 -0
  90. package/apps/daemon/dist/rpc/pathStyle.js.map +1 -0
  91. package/apps/daemon/dist/rpc/rpcError.d.ts +13 -0
  92. package/apps/daemon/dist/rpc/rpcError.d.ts.map +1 -0
  93. package/apps/daemon/dist/rpc/rpcError.js +16 -0
  94. package/apps/daemon/dist/rpc/rpcError.js.map +1 -0
  95. package/apps/daemon/dist/server.d.ts +18 -0
  96. package/apps/daemon/dist/server.d.ts.map +1 -0
  97. package/apps/daemon/dist/server.js +208 -0
  98. package/apps/daemon/dist/server.js.map +1 -0
  99. package/apps/daemon/dist/store/publishLog.d.ts +6 -0
  100. package/apps/daemon/dist/store/publishLog.d.ts.map +1 -0
  101. package/apps/daemon/dist/store/publishLog.js +27 -0
  102. package/apps/daemon/dist/store/publishLog.js.map +1 -0
  103. package/apps/daemon/dist/store/store.d.ts +35 -0
  104. package/apps/daemon/dist/store/store.d.ts.map +1 -0
  105. package/apps/daemon/dist/store/store.js +129 -0
  106. package/apps/daemon/dist/store/store.js.map +1 -0
  107. package/apps/daemon/dist/templates/githubFetch.d.ts +49 -0
  108. package/apps/daemon/dist/templates/githubFetch.d.ts.map +1 -0
  109. package/apps/daemon/dist/templates/githubFetch.js +168 -0
  110. package/apps/daemon/dist/templates/githubFetch.js.map +1 -0
  111. package/apps/web/out/404.html +1 -0
  112. package/apps/web/out/_next/static/IIw50lkv8jQuwHOBZJifS/_buildManifest.js +1 -0
  113. package/apps/web/out/_next/static/IIw50lkv8jQuwHOBZJifS/_ssgManifest.js +1 -0
  114. package/apps/web/out/_next/static/chunks/1dd3208c-6a745fea7bd2124a.js +1 -0
  115. package/apps/web/out/_next/static/chunks/426-deb95a16531d3b4b.js +25 -0
  116. package/apps/web/out/_next/static/chunks/528-6e64508688610bfe.js +2 -0
  117. package/apps/web/out/_next/static/chunks/656-fd1628581ad77b01.js +1 -0
  118. package/apps/web/out/_next/static/chunks/777-d587bc7cc0fc6be8.js +1 -0
  119. package/apps/web/out/_next/static/chunks/990-f2445c68c17fa077.js +1 -0
  120. package/apps/web/out/_next/static/chunks/app/_not-found/page-e0d77774c4eb9aef.js +1 -0
  121. package/apps/web/out/_next/static/chunks/app/layout-e5023aba6634ce53.js +1 -0
  122. package/apps/web/out/_next/static/chunks/app/page-a545c902535ac2e3.js +1 -0
  123. package/apps/web/out/_next/static/chunks/app/settings/page-a68ed4ae2ccb8840.js +1 -0
  124. package/apps/web/out/_next/static/chunks/app/templates/page-e5f0cefb905e5b72.js +1 -0
  125. package/apps/web/out/_next/static/chunks/baeaa4ff-28d2e32e4dd119b9.js +1 -0
  126. package/apps/web/out/_next/static/chunks/eb0351e1-329719bc902eaf71.js +1 -0
  127. package/apps/web/out/_next/static/chunks/framework-3664cab31236a9fa.js +1 -0
  128. package/apps/web/out/_next/static/chunks/main-app-d515c42ecb17b8e8.js +1 -0
  129. package/apps/web/out/_next/static/chunks/main-ff24788874d4ec1b.js +1 -0
  130. package/apps/web/out/_next/static/chunks/pages/_app-10a93ab5b7c32eb3.js +1 -0
  131. package/apps/web/out/_next/static/chunks/pages/_error-2d792b2a41857be4.js +1 -0
  132. package/apps/web/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  133. package/apps/web/out/_next/static/chunks/webpack-ae7ee8fe97fdceba.js +1 -0
  134. package/apps/web/out/_next/static/css/0a42edcfc2beb916.css +3 -0
  135. package/apps/web/out/_next/static/css/a275cc2b185e04f8.css +1 -0
  136. package/apps/web/out/_next/static/media/011e180705008d6f-s.woff2 +0 -0
  137. package/apps/web/out/_next/static/media/20535187d867b7b9-s.woff2 +0 -0
  138. package/apps/web/out/_next/static/media/26d4368bf94c0ec4-s.p.woff2 +0 -0
  139. package/apps/web/out/_next/static/media/2801417b65625cf5-s.woff2 +0 -0
  140. package/apps/web/out/_next/static/media/28793f5c5e3d822d-s.woff2 +0 -0
  141. package/apps/web/out/_next/static/media/5356a6a4f2c8c8d8-s.woff2 +0 -0
  142. package/apps/web/out/_next/static/media/58f386aa6b1a2a92-s.woff2 +0 -0
  143. package/apps/web/out/_next/static/media/73cb51aac9c97f90-s.woff2 +0 -0
  144. package/apps/web/out/_next/static/media/7b19b489dc6743ba-s.woff2 +0 -0
  145. package/apps/web/out/_next/static/media/7ba5fb2a8c88521c-s.woff2 +0 -0
  146. package/apps/web/out/_next/static/media/92eeb95d069020cc-s.woff2 +0 -0
  147. package/apps/web/out/_next/static/media/98e207f02528a563-s.p.woff2 +0 -0
  148. package/apps/web/out/_next/static/media/99dcf268bda04fe5-s.woff2 +0 -0
  149. package/apps/web/out/_next/static/media/b3bf17a9041d9433-s.woff2 +0 -0
  150. package/apps/web/out/_next/static/media/c9c3823090ec8b55-s.woff2 +0 -0
  151. package/apps/web/out/_next/static/media/d26bbd13d6b70f89-s.woff2 +0 -0
  152. package/apps/web/out/_next/static/media/d29838c109ef09b4-s.woff2 +0 -0
  153. package/apps/web/out/_next/static/media/d3ebbfd689654d3a-s.p.woff2 +0 -0
  154. package/apps/web/out/_next/static/media/db96af6b531dc71f-s.p.woff2 +0 -0
  155. package/apps/web/out/_next/static/media/e40af3453d7c920a-s.woff2 +0 -0
  156. package/apps/web/out/_next/static/media/ef4d5661765d0e49-s.woff2 +0 -0
  157. package/apps/web/out/index.html +1 -0
  158. package/apps/web/out/index.txt +6 -0
  159. package/apps/web/out/settings.html +1 -0
  160. package/apps/web/out/settings.txt +6 -0
  161. package/apps/web/out/templates.html +1 -0
  162. package/apps/web/out/templates.txt +6 -0
  163. package/bin/symbion.mjs +41 -0
  164. package/node_modules/@symbion/core/dist/adapters/claude.d.ts +3 -0
  165. package/node_modules/@symbion/core/dist/adapters/claude.d.ts.map +1 -0
  166. package/node_modules/@symbion/core/dist/adapters/claude.js +43 -0
  167. package/node_modules/@symbion/core/dist/adapters/claude.js.map +1 -0
  168. package/node_modules/@symbion/core/dist/adapters/codex.d.ts +3 -0
  169. package/node_modules/@symbion/core/dist/adapters/codex.d.ts.map +1 -0
  170. package/node_modules/@symbion/core/dist/adapters/codex.js +58 -0
  171. package/node_modules/@symbion/core/dist/adapters/codex.js.map +1 -0
  172. package/node_modules/@symbion/core/dist/adapters/registry.d.ts +5 -0
  173. package/node_modules/@symbion/core/dist/adapters/registry.d.ts.map +1 -0
  174. package/node_modules/@symbion/core/dist/adapters/registry.js +14 -0
  175. package/node_modules/@symbion/core/dist/adapters/registry.js.map +1 -0
  176. package/node_modules/@symbion/core/dist/adapters/types.d.ts +34 -0
  177. package/node_modules/@symbion/core/dist/adapters/types.d.ts.map +1 -0
  178. package/node_modules/@symbion/core/dist/adapters/types.js +2 -0
  179. package/node_modules/@symbion/core/dist/adapters/types.js.map +1 -0
  180. package/node_modules/@symbion/core/dist/diff/conflict.d.ts +19 -0
  181. package/node_modules/@symbion/core/dist/diff/conflict.d.ts.map +1 -0
  182. package/node_modules/@symbion/core/dist/diff/conflict.js +20 -0
  183. package/node_modules/@symbion/core/dist/diff/conflict.js.map +1 -0
  184. package/node_modules/@symbion/core/dist/diff/diff.d.ts +44 -0
  185. package/node_modules/@symbion/core/dist/diff/diff.d.ts.map +1 -0
  186. package/node_modules/@symbion/core/dist/diff/diff.js +124 -0
  187. package/node_modules/@symbion/core/dist/diff/diff.js.map +1 -0
  188. package/node_modules/@symbion/core/dist/generate/bodyPrompt.d.ts +27 -0
  189. package/node_modules/@symbion/core/dist/generate/bodyPrompt.d.ts.map +1 -0
  190. package/node_modules/@symbion/core/dist/generate/bodyPrompt.js +55 -0
  191. package/node_modules/@symbion/core/dist/generate/bodyPrompt.js.map +1 -0
  192. package/node_modules/@symbion/core/dist/generate/description.d.ts +18 -0
  193. package/node_modules/@symbion/core/dist/generate/description.d.ts.map +1 -0
  194. package/node_modules/@symbion/core/dist/generate/description.js +164 -0
  195. package/node_modules/@symbion/core/dist/generate/description.js.map +1 -0
  196. package/node_modules/@symbion/core/dist/index.d.ts +23 -0
  197. package/node_modules/@symbion/core/dist/index.d.ts.map +1 -0
  198. package/node_modules/@symbion/core/dist/index.js +24 -0
  199. package/node_modules/@symbion/core/dist/index.js.map +1 -0
  200. package/node_modules/@symbion/core/dist/ir/refs.d.ts +11 -0
  201. package/node_modules/@symbion/core/dist/ir/refs.d.ts.map +1 -0
  202. package/node_modules/@symbion/core/dist/ir/refs.js +25 -0
  203. package/node_modules/@symbion/core/dist/ir/refs.js.map +1 -0
  204. package/node_modules/@symbion/core/dist/ir/types.d.ts +107 -0
  205. package/node_modules/@symbion/core/dist/ir/types.d.ts.map +1 -0
  206. package/node_modules/@symbion/core/dist/ir/types.js +19 -0
  207. package/node_modules/@symbion/core/dist/ir/types.js.map +1 -0
  208. package/node_modules/@symbion/core/dist/ir/validate.d.ts +13 -0
  209. package/node_modules/@symbion/core/dist/ir/validate.d.ts.map +1 -0
  210. package/node_modules/@symbion/core/dist/ir/validate.js +114 -0
  211. package/node_modules/@symbion/core/dist/ir/validate.js.map +1 -0
  212. package/node_modules/@symbion/core/dist/parse/scan.d.ts +47 -0
  213. package/node_modules/@symbion/core/dist/parse/scan.d.ts.map +1 -0
  214. package/node_modules/@symbion/core/dist/parse/scan.js +109 -0
  215. package/node_modules/@symbion/core/dist/parse/scan.js.map +1 -0
  216. package/node_modules/@symbion/core/dist/render/frontmatter.d.ts +29 -0
  217. package/node_modules/@symbion/core/dist/render/frontmatter.d.ts.map +1 -0
  218. package/node_modules/@symbion/core/dist/render/frontmatter.js +99 -0
  219. package/node_modules/@symbion/core/dist/render/frontmatter.js.map +1 -0
  220. package/node_modules/@symbion/core/dist/render/marker.d.ts +30 -0
  221. package/node_modules/@symbion/core/dist/render/marker.d.ts.map +1 -0
  222. package/node_modules/@symbion/core/dist/render/marker.js +48 -0
  223. package/node_modules/@symbion/core/dist/render/marker.js.map +1 -0
  224. package/node_modules/@symbion/core/dist/render/render.d.ts +12 -0
  225. package/node_modules/@symbion/core/dist/render/render.d.ts.map +1 -0
  226. package/node_modules/@symbion/core/dist/render/render.js +10 -0
  227. package/node_modules/@symbion/core/dist/render/render.js.map +1 -0
  228. package/node_modules/@symbion/core/dist/runcommand/render.d.ts +13 -0
  229. package/node_modules/@symbion/core/dist/runcommand/render.d.ts.map +1 -0
  230. package/node_modules/@symbion/core/dist/runcommand/render.js +19 -0
  231. package/node_modules/@symbion/core/dist/runcommand/render.js.map +1 -0
  232. package/node_modules/@symbion/core/dist/templates/authorSource.d.ts +55 -0
  233. package/node_modules/@symbion/core/dist/templates/authorSource.d.ts.map +1 -0
  234. package/node_modules/@symbion/core/dist/templates/authorSource.js +24 -0
  235. package/node_modules/@symbion/core/dist/templates/authorSource.js.map +1 -0
  236. package/node_modules/@symbion/core/dist/templates/matchAuthorFolders.d.ts +28 -0
  237. package/node_modules/@symbion/core/dist/templates/matchAuthorFolders.d.ts.map +1 -0
  238. package/node_modules/@symbion/core/dist/templates/matchAuthorFolders.js +54 -0
  239. package/node_modules/@symbion/core/dist/templates/matchAuthorFolders.js.map +1 -0
  240. package/node_modules/@symbion/core/dist/templates/parseTemplate.d.ts +42 -0
  241. package/node_modules/@symbion/core/dist/templates/parseTemplate.d.ts.map +1 -0
  242. package/node_modules/@symbion/core/dist/templates/parseTemplate.js +56 -0
  243. package/node_modules/@symbion/core/dist/templates/parseTemplate.js.map +1 -0
  244. package/node_modules/@symbion/core/dist/templates/templateListItem.d.ts +39 -0
  245. package/node_modules/@symbion/core/dist/templates/templateListItem.d.ts.map +1 -0
  246. package/node_modules/@symbion/core/dist/templates/templateListItem.js +2 -0
  247. package/node_modules/@symbion/core/dist/templates/templateListItem.js.map +1 -0
  248. package/node_modules/@symbion/core/dist/util/sha256.d.ts +9 -0
  249. package/node_modules/@symbion/core/dist/util/sha256.d.ts.map +1 -0
  250. package/node_modules/@symbion/core/dist/util/sha256.js +91 -0
  251. package/node_modules/@symbion/core/dist/util/sha256.js.map +1 -0
  252. package/node_modules/@symbion/core/dist/version/semver.d.ts +18 -0
  253. package/node_modules/@symbion/core/dist/version/semver.d.ts.map +1 -0
  254. package/node_modules/@symbion/core/dist/version/semver.js +53 -0
  255. package/node_modules/@symbion/core/dist/version/semver.js.map +1 -0
  256. package/node_modules/@symbion/core/package.json +14 -0
  257. package/node_modules/@symbion/rpc-types/dist/index.d.ts +444 -0
  258. package/node_modules/@symbion/rpc-types/dist/index.d.ts.map +1 -0
  259. package/node_modules/@symbion/rpc-types/dist/index.js +2 -0
  260. package/node_modules/@symbion/rpc-types/dist/index.js.map +1 -0
  261. package/node_modules/@symbion/rpc-types/package.json +11 -0
  262. package/node_modules/yaml/dist/cli.d.ts +8 -0
  263. package/node_modules/yaml/dist/cli.mjs +201 -0
  264. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  265. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  266. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  267. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  268. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  269. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  270. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  271. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  272. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  273. package/node_modules/yaml/dist/compose/composer.js +224 -0
  274. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  275. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  276. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  277. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  278. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  279. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  280. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  281. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  282. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  283. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  284. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  285. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  286. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  287. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  288. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  289. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  290. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  291. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  292. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  293. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  294. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  295. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  296. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  297. package/node_modules/yaml/dist/doc/Document.js +337 -0
  298. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  299. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  300. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  301. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  302. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  303. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  304. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  305. package/node_modules/yaml/dist/doc/directives.js +178 -0
  306. package/node_modules/yaml/dist/errors.d.ts +21 -0
  307. package/node_modules/yaml/dist/errors.js +62 -0
  308. package/node_modules/yaml/dist/index.d.ts +25 -0
  309. package/node_modules/yaml/dist/index.js +50 -0
  310. package/node_modules/yaml/dist/log.d.ts +3 -0
  311. package/node_modules/yaml/dist/log.js +19 -0
  312. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  313. package/node_modules/yaml/dist/nodes/Alias.js +118 -0
  314. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  315. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  316. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  317. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  318. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  319. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  320. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  321. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  322. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  323. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  324. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  325. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  326. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  327. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  328. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  329. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  330. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  331. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  332. package/node_modules/yaml/dist/options.d.ts +350 -0
  333. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  334. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  335. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  336. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  337. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  338. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  339. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  340. package/node_modules/yaml/dist/parse/cst.js +112 -0
  341. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  342. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  343. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  344. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  345. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  346. package/node_modules/yaml/dist/parse/parser.js +980 -0
  347. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  348. package/node_modules/yaml/dist/public-api.js +107 -0
  349. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  350. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  351. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  352. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  353. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  354. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  355. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  356. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  357. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  358. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  359. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  360. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  361. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  362. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  363. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  364. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  365. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  366. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  367. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  368. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  369. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  370. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  371. package/node_modules/yaml/dist/schema/tags.js +99 -0
  372. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  373. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  374. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  375. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  376. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  377. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  378. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  379. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  380. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  381. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  382. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  383. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  384. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  385. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  386. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  387. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  388. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  389. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  390. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  391. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  392. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  393. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  394. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  395. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  396. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  397. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  398. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  399. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  400. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  401. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  402. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  403. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  404. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  405. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  406. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  407. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  408. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  409. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  410. package/node_modules/yaml/dist/test-events.js +134 -0
  411. package/node_modules/yaml/dist/util.d.ts +16 -0
  412. package/node_modules/yaml/dist/util.js +28 -0
  413. package/node_modules/yaml/dist/visit.d.ts +102 -0
  414. package/node_modules/yaml/dist/visit.js +236 -0
  415. package/node_modules/yaml/package.json +20 -0
  416. package/node_modules/yaml/util.js +2 -0
  417. package/package.json +39 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * buildBodyGenerationPrompt — pure string assembly, no fs/net/Node imports.
3
+ * Builds the system+user prompt sent to a real LLM provider (apps/daemon's
4
+ * `generateBody` RPC handler) to draft "Nội dung" (the body/system-prompt
5
+ * field) for an agent or command artifact. See docs/loops/auto-generate-body-STATE.md
6
+ * §10.1 for the architecture rationale.
7
+ *
8
+ * This module must stay pure: it only assembles strings from its input and
9
+ * never touches the network or filesystem. The daemon is the only place the
10
+ * actual model-inference call is made.
11
+ */
12
+ const NONE_PLACEHOLDER = "(chưa có)";
13
+ /** Render a labeled context line, falling back to an explicit "(chưa có)" placeholder
14
+ * when the value is empty/whitespace-only — never leaves a dangling "Label: " with
15
+ * nothing after it (EC-1 requirement: degrade gracefully on empty fields). */
16
+ function contextLine(label, value) {
17
+ const trimmed = (value ?? "").trim();
18
+ return `${label}: ${trimmed === "" ? NONE_PLACEHOLDER : trimmed}`;
19
+ }
20
+ /**
21
+ * buildBodyGenerationPrompt — deterministic, pure. Same input (deep-equal) always
22
+ * produces the same `{ system, user }` output. Never throws for any well-formed
23
+ * BodyPromptInput, including the all-empty-except-kind degenerate case (EC-1).
24
+ */
25
+ export function buildBodyGenerationPrompt(input) {
26
+ const kind = input?.kind === "command" ? "command" : "agent";
27
+ const name = typeof input?.name === "string" ? input.name : "";
28
+ const description = typeof input?.description === "string" ? input.description : "";
29
+ const existingBody = typeof input?.existingBody === "string" ? input.existingBody : "";
30
+ const system = kind === "agent"
31
+ ? "Bạn là một trợ lý chuyên viết system prompt cho các AI sub-agent trong một hệ thống " +
32
+ "autoworkflow (Symbion). Nhiệm vụ của bạn là soạn nội dung (system prompt) hoàn chỉnh, " +
33
+ "rõ ràng, có thể dùng ngay cho một sub-agent, dựa trên tên và mô tả ngắn được cung cấp. " +
34
+ "Chỉ trả về nội dung system prompt dưới dạng markdown thuần — không thêm lời dẫn, không " +
35
+ "thêm giải thích, không bọc trong code block."
36
+ : "Bạn là một trợ lý chuyên viết nội dung cho các slash command (lệnh) trong một hệ thống " +
37
+ "autoworkflow (Symbion). Nhiệm vụ của bạn là soạn nội dung điều phối (orchestration body) " +
38
+ "hoàn chỉnh, rõ ràng, có thể dùng ngay cho một slash command, dựa trên tên lệnh và mô tả " +
39
+ "ngắn được cung cấp. Chỉ trả về nội dung lệnh dưới dạng markdown thuần — không thêm lời " +
40
+ "dẫn, không thêm giải thích, không bọc trong code block.";
41
+ const kindLabel = kind === "agent" ? "Loại: agent (sub-agent)" : "Loại: command (slash command)";
42
+ const userLines = [
43
+ kindLabel,
44
+ contextLine("Tên", name),
45
+ contextLine("Mô tả ngắn", description),
46
+ contextLine("Nội dung hiện tại (nếu có, hãy cải thiện/mở rộng thay vì viết lại hoàn toàn khác)", existingBody),
47
+ "",
48
+ kind === "agent"
49
+ ? "Hãy soạn một system prompt đầy đủ cho sub-agent này."
50
+ : "Hãy soạn nội dung điều phối đầy đủ cho slash command này.",
51
+ ];
52
+ const user = userLines.join("\n");
53
+ return { system, user };
54
+ }
55
+ //# sourceMappingURL=bodyPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bodyPrompt.js","sourceRoot":"","sources":["../../src/generate/bodyPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAErC;;8EAE8E;AAC9E,SAAS,WAAW,CAAC,KAAa,EAAE,KAAa;IAC/C,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,GAAG,KAAK,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAsB;IAC9D,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,OAAO,KAAK,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,YAAY,GAAG,OAAO,KAAK,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvF,MAAM,MAAM,GACV,IAAI,KAAK,OAAO;QACd,CAAC,CAAC,sFAAsF;YACtF,wFAAwF;YACxF,yFAAyF;YACzF,yFAAyF;YACzF,8CAA8C;QAChD,CAAC,CAAC,yFAAyF;YACzF,2FAA2F;YAC3F,0FAA0F;YAC1F,yFAAyF;YACzF,yDAAyD,CAAC;IAEhE,MAAM,SAAS,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,+BAA+B,CAAC;IAEjG,MAAM,SAAS,GAAG;QAChB,SAAS;QACT,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;QACxB,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC;QACtC,WAAW,CAAC,mFAAmF,EAAE,YAAY,CAAC;QAC9G,EAAE;QACF,IAAI,KAAK,OAAO;YACd,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,2DAA2D;KAChE,CAAC;IAEF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { CustomField } from "../ir/types.js";
2
+ export interface GenerateDescriptionInput {
3
+ kind: "agent" | "command";
4
+ name: string;
5
+ body: string;
6
+ /** agent only; ignored/absent for command per Q5 lock (STATE §9). */
7
+ tools?: string[];
8
+ /** optional, present if non-empty. */
9
+ customFields?: CustomField[];
10
+ }
11
+ /**
12
+ * generateDescription — pure, deterministic, local heuristic. No fs/net/Node imports.
13
+ * Same input (deep-equal) -> always the same output string. Never throws for any
14
+ * well-formed GenerateDescriptionInput (Q6 lock: always produces *something*).
15
+ * Output is already normalized: single line, trimmed, length-capped, YAML-safe.
16
+ */
17
+ export declare function generateDescription(input: GenerateDescriptionInput): string;
18
+ //# sourceMappingURL=description.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../src/generate/description.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAC9B;AAwHD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAgD3E"}
@@ -0,0 +1,164 @@
1
+ const BODY_CLAUSE_CAP = 160;
2
+ const FINAL_CAP = 200;
3
+ const FALLBACK = "Mô tả tự động.";
4
+ /** Strip a leading markdown heading marker, e.g. "## Foo" -> "Foo". */
5
+ function stripHeading(line) {
6
+ return line.replace(/^#{1,6}\s+/, "");
7
+ }
8
+ /**
9
+ * Strip a leading "You are..."/"Bạn là..." instruction-style preamble, once,
10
+ * case-insensitively, only at the very start of the line. Returns whether a
11
+ * strip occurred (so the caller can lowercase the new first character).
12
+ */
13
+ function stripYouArePrefix(line) {
14
+ const re = /^(you are|bạn là)\s+/i;
15
+ if (re.test(line)) {
16
+ return { text: line.replace(re, ""), stripped: true };
17
+ }
18
+ return { text: line, stripped: false };
19
+ }
20
+ /** Cap a fragment at the first sentence boundary within `cap` chars, else hard-cap at a whitespace boundary. */
21
+ function capFragment(text, cap) {
22
+ const sentenceMatch = new RegExp(`^[^.!?\\n]{1,${cap}}[.!?]`).exec(text);
23
+ if (sentenceMatch) {
24
+ return sentenceMatch[0];
25
+ }
26
+ if (text.length <= cap) {
27
+ return text;
28
+ }
29
+ const slice = text.slice(0, cap);
30
+ const lastSpace = slice.lastIndexOf(" ");
31
+ if (lastSpace > 0) {
32
+ return slice.slice(0, lastSpace);
33
+ }
34
+ return slice;
35
+ }
36
+ /** Step 1 — derive a "body clause" from `body`. Returns undefined if body is empty. */
37
+ function deriveBodyClause(body) {
38
+ const trimmed = body.trim();
39
+ if (trimmed === "")
40
+ return undefined;
41
+ const lines = trimmed.split(/\r?\n/);
42
+ const firstLine = lines.find((l) => l.trim() !== "");
43
+ if (firstLine === undefined)
44
+ return undefined;
45
+ let line = firstLine.trim();
46
+ line = stripHeading(line);
47
+ const { text } = stripYouArePrefix(line);
48
+ line = text;
49
+ let fragment = capFragment(line, BODY_CLAUSE_CAP);
50
+ // Lowercase the first character so the clause reads naturally mid-sentence
51
+ // when spliced into the "Agent that ..."/"Command that ..." templates
52
+ // (e.g. "...to review code changes" not "...to Review code changes").
53
+ if (fragment.length > 0) {
54
+ fragment = fragment.charAt(0).toLowerCase() + fragment.slice(1);
55
+ }
56
+ // Strip trailing period(s)/sentence punctuation — re-added once at final assembly.
57
+ fragment = fragment.replace(/[.!?]+$/, "");
58
+ fragment = fragment.trim();
59
+ return fragment === "" ? undefined : fragment;
60
+ }
61
+ /** Step 2 — derive a "tools clause" (agent only). */
62
+ function deriveToolsClause(kind, tools) {
63
+ if (kind !== "agent")
64
+ return undefined;
65
+ if (!tools || tools.length === 0)
66
+ return undefined;
67
+ return tools.join(", ");
68
+ }
69
+ /** Cap used for the `model` custom-field value so the "(model: ...)" parenthetical
70
+ * spliced into the assembled string is always short and complete (never truncated
71
+ * mid-parenthetical by the final 200-char hard cap). */
72
+ const MODEL_VALUE_CAP = 40;
73
+ /** Step 3 — derive a "custom fields clause" — only surfaces a `model` field, if present. */
74
+ function deriveCustomFieldsClause(customFields) {
75
+ if (!customFields || customFields.length === 0)
76
+ return undefined;
77
+ const modelField = customFields.find((f) => f.key?.trim().toLowerCase() === "model" && (f.value?.trim() ?? "") !== "");
78
+ if (!modelField)
79
+ return undefined;
80
+ const value = (modelField.value ?? "").trim();
81
+ if (value === "")
82
+ return undefined;
83
+ return capFragment(value, MODEL_VALUE_CAP);
84
+ }
85
+ /** Step 5 — final normalization pass: collapse whitespace/newlines, strip control chars, cap length. */
86
+ function normalize(input) {
87
+ let str = input;
88
+ str = str.replace(/\s*\n\s*/g, " ");
89
+ str = str.replace(/[ \t]{2,}/g, " ");
90
+ str = str.replace(/[\x00-\x09\x0B-\x1F\x7F]/g, "");
91
+ str = str.trim();
92
+ if (str.length > FINAL_CAP) {
93
+ const slice = str.slice(0, FINAL_CAP);
94
+ const lastSpace = slice.lastIndexOf(" ");
95
+ let cut = lastSpace > 0 ? slice.slice(0, lastSpace) : slice;
96
+ cut = cut.trimEnd();
97
+ if (!cut.endsWith(".")) {
98
+ cut = `${cut}.`;
99
+ }
100
+ str = cut;
101
+ }
102
+ if (str === "") {
103
+ return FALLBACK;
104
+ }
105
+ return str;
106
+ }
107
+ /**
108
+ * generateDescription — pure, deterministic, local heuristic. No fs/net/Node imports.
109
+ * Same input (deep-equal) -> always the same output string. Never throws for any
110
+ * well-formed GenerateDescriptionInput (Q6 lock: always produces *something*).
111
+ * Output is already normalized: single line, trimmed, length-capped, YAML-safe.
112
+ */
113
+ export function generateDescription(input) {
114
+ const kind = input?.kind === "command" ? "command" : "agent";
115
+ const name = typeof input?.name === "string" ? input.name.trim() : "";
116
+ const body = typeof input?.body === "string" ? input.body : "";
117
+ const tools = Array.isArray(input?.tools) ? input.tools : undefined;
118
+ const customFields = Array.isArray(input?.customFields) ? input.customFields : undefined;
119
+ const bodyClause = deriveBodyClause(body);
120
+ const toolsClause = deriveToolsClause(kind, tools);
121
+ const customFieldsClause = deriveCustomFieldsClause(customFields);
122
+ let assembled;
123
+ if (kind === "agent") {
124
+ if (toolsClause !== undefined && bodyClause !== undefined) {
125
+ assembled = `Agent that uses ${toolsClause} to ${bodyClause}.`;
126
+ }
127
+ else if (toolsClause !== undefined) {
128
+ assembled = `Agent that uses ${toolsClause}.`;
129
+ }
130
+ else if (bodyClause !== undefined) {
131
+ assembled = `Agent that ${bodyClause}.`;
132
+ }
133
+ else if (name !== "") {
134
+ assembled = `Mô tả cho ${name}.`;
135
+ }
136
+ else {
137
+ assembled = FALLBACK;
138
+ }
139
+ if (customFieldsClause !== undefined) {
140
+ // Splice the parenthetical in before the trailing period. The clause itself
141
+ // is already bounded (MODEL_VALUE_CAP) so this parenthetical is always short
142
+ // and complete; if the combined string is still over the final cap for some
143
+ // unlikely combination, drop the parenthetical entirely below rather than let
144
+ // normalize() truncate through it (never produce a syntactically broken `(...)`).
145
+ const withClause = assembled.endsWith(".")
146
+ ? `${assembled.slice(0, -1)} (model: ${customFieldsClause}).`
147
+ : `${assembled} (model: ${customFieldsClause}).`;
148
+ assembled = withClause.length > FINAL_CAP ? assembled : withClause;
149
+ }
150
+ }
151
+ else {
152
+ if (bodyClause !== undefined) {
153
+ assembled = `Command that ${bodyClause}.`;
154
+ }
155
+ else if (name !== "") {
156
+ assembled = `Mô tả cho /${name}.`;
157
+ }
158
+ else {
159
+ assembled = FALLBACK;
160
+ }
161
+ }
162
+ return normalize(assembled);
163
+ }
164
+ //# sourceMappingURL=description.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"description.js","sourceRoot":"","sources":["../../src/generate/description.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export * from "./ir/types.js";
2
+ export * from "./ir/validate.js";
3
+ export * from "./ir/refs.js";
4
+ export * from "./adapters/types.js";
5
+ export { claudeAdapter } from "./adapters/claude.js";
6
+ export { codexAdapter } from "./adapters/codex.js";
7
+ export { ADAPTERS, getAdapter } from "./adapters/registry.js";
8
+ export * from "./render/frontmatter.js";
9
+ export * from "./render/marker.js";
10
+ export * from "./render/render.js";
11
+ export * from "./parse/scan.js";
12
+ export * from "./templates/parseTemplate.js";
13
+ export * from "./templates/authorSource.js";
14
+ export * from "./templates/matchAuthorFolders.js";
15
+ export * from "./templates/templateListItem.js";
16
+ export * from "./diff/diff.js";
17
+ export * from "./diff/conflict.js";
18
+ export * from "./version/semver.js";
19
+ export * from "./runcommand/render.js";
20
+ export * from "./generate/description.js";
21
+ export * from "./generate/bodyPrompt.js";
22
+ export { sha256Hex } from "./util/sha256.js";
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAE7B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE9D,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iBAAiB,CAAC;AAEhC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAEhD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,24 @@
1
+ // Public barrel — the only surface @symbion/daemon (and web, via type-only imports) should import.
2
+ export * from "./ir/types.js";
3
+ export * from "./ir/validate.js";
4
+ export * from "./ir/refs.js";
5
+ export * from "./adapters/types.js";
6
+ export { claudeAdapter } from "./adapters/claude.js";
7
+ export { codexAdapter } from "./adapters/codex.js";
8
+ export { ADAPTERS, getAdapter } from "./adapters/registry.js";
9
+ export * from "./render/frontmatter.js";
10
+ export * from "./render/marker.js";
11
+ export * from "./render/render.js";
12
+ export * from "./parse/scan.js";
13
+ export * from "./templates/parseTemplate.js";
14
+ export * from "./templates/authorSource.js";
15
+ export * from "./templates/matchAuthorFolders.js";
16
+ export * from "./templates/templateListItem.js";
17
+ export * from "./diff/diff.js";
18
+ export * from "./diff/conflict.js";
19
+ export * from "./version/semver.js";
20
+ export * from "./runcommand/render.js";
21
+ export * from "./generate/description.js";
22
+ export * from "./generate/bodyPrompt.js";
23
+ export { sha256Hex } from "./util/sha256.js";
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAE7B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE9D,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iBAAiB,CAAC;AAEhC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAEhD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * extractAgentMentions — derive dependency-graph edges from a command body.
3
+ * A mention is `@agentname` or a bare reference to a known agent name token.
4
+ * Pure function: no field is persisted on the IR for this — it's recomputed (STATE §8 #8).
5
+ */
6
+ /**
7
+ * Extract `@name`-style agent mentions from a command/agent body.
8
+ * Returns deduped names in first-seen order.
9
+ */
10
+ export declare function extractAgentMentions(body: string): string[];
11
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/ir/refs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY3D"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * extractAgentMentions — derive dependency-graph edges from a command body.
3
+ * A mention is `@agentname` or a bare reference to a known agent name token.
4
+ * Pure function: no field is persisted on the IR for this — it's recomputed (STATE §8 #8).
5
+ */
6
+ const MENTION_RE = /@([a-zA-Z0-9_-]+)/g;
7
+ /**
8
+ * Extract `@name`-style agent mentions from a command/agent body.
9
+ * Returns deduped names in first-seen order.
10
+ */
11
+ export function extractAgentMentions(body) {
12
+ const seen = new Set();
13
+ const out = [];
14
+ for (const match of body.matchAll(MENTION_RE)) {
15
+ const name = match[1];
16
+ if (!name)
17
+ continue;
18
+ if (!seen.has(name)) {
19
+ seen.add(name);
20
+ out.push(name);
21
+ }
22
+ }
23
+ return out;
24
+ }
25
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/ir/refs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Canonical IR — the single source of truth for an authored agent/command.
3
+ * Pure data types only. No fs/net/Node imports anywhere in this file.
4
+ */
5
+ export type ArtifactKind = "agent" | "command";
6
+ export type TargetId = "claude" | "codex";
7
+ /**
8
+ * Ordered key/value pair for "Nâng cao" (advanced) custom fields.
9
+ * Modeled as an array (not Record) to guarantee byte-stable, order-preserving
10
+ * render across save/reload cycles (STATE §2.1 note + §8 assumption #1).
11
+ */
12
+ export interface CustomField {
13
+ key: string;
14
+ value: string;
15
+ }
16
+ export interface ArtifactMeta {
17
+ /** version stamped at last publish, or "draft" if never published. */
18
+ version: string;
19
+ status: "draft" | "published" | "conflict";
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ sourceTemplateId?: string;
23
+ /** content hash recorded at last successful publish, per target. */
24
+ publishedHashes?: Partial<Record<TargetId, string>>;
25
+ }
26
+ export interface CanonicalArtifact {
27
+ /** stable internal id (uuid) — survives renames; used in the managed marker. */
28
+ id: string;
29
+ kind: ArtifactKind;
30
+ /** logical name. Agent -> .claude/agents/<name>.md ; Command -> /<name> + .claude/commands/<name>.md */
31
+ name: string;
32
+ /** maps to frontmatter `description:` for BOTH kinds. Required. */
33
+ description: string;
34
+ /** AGENT ONLY -> frontmatter `tools:` (CSV). undefined/empty for commands. */
35
+ tools?: string[];
36
+ /** COMMAND ONLY -> UI hint that body uses $ARGUMENTS. Does not render to frontmatter. */
37
+ usesArguments?: boolean;
38
+ /** the markdown system prompt / orchestration body (everything after frontmatter). */
39
+ body: string;
40
+ /** "Nâng cao" passthrough, ordered. Rendered verbatim + "(custom)" tag in UI. */
41
+ customFields?: CustomField[];
42
+ meta: ArtifactMeta;
43
+ }
44
+ export interface ProjectSettings {
45
+ defaultTargets: TargetId[];
46
+ /** "warn" = cảnh báo & hỏi ; "never-overwrite" = không bao giờ đè */
47
+ conflictPolicy: "warn" | "never-overwrite";
48
+ backupBeforeWrite: boolean;
49
+ requireCleanGit: boolean;
50
+ markerTemplate: string;
51
+ }
52
+ export declare const DEFAULT_PROJECT_SETTINGS: ProjectSettings;
53
+ export interface ProjectStore {
54
+ schemaVersion: 1;
55
+ id: string;
56
+ name: string;
57
+ path: string;
58
+ createdAt: string;
59
+ artifacts: CanonicalArtifact[];
60
+ settings: ProjectSettings;
61
+ }
62
+ export interface GlobalConfig {
63
+ schemaVersion: 1;
64
+ port: number;
65
+ theme: "system" | "light" | "dark";
66
+ lastProjectId?: string;
67
+ builderDefaultTab: "form" | "markdown";
68
+ /** registry of known projects, so the sidebar can list projects across repos. */
69
+ projects: Array<{
70
+ id: string;
71
+ name: string;
72
+ path: string;
73
+ }>;
74
+ }
75
+ export declare const DEFAULT_GLOBAL_CONFIG: GlobalConfig;
76
+ export interface PublishResult {
77
+ target: TargetId;
78
+ relPath: string;
79
+ action: "created" | "updated" | "skipped-conflict" | "skipped-same" | "error";
80
+ artifactId?: string;
81
+ contentHash?: string;
82
+ error?: string;
83
+ }
84
+ export interface PublishLogEntry {
85
+ version: string;
86
+ timestamp: string;
87
+ targets: TargetId[];
88
+ results: PublishResult[];
89
+ backupDir: string;
90
+ }
91
+ export interface BackupRecord {
92
+ version: string;
93
+ timestamp: string;
94
+ files: Array<{
95
+ relPath: string;
96
+ existedBefore: boolean;
97
+ backupRelPath: string;
98
+ }>;
99
+ }
100
+ export interface LintIssue {
101
+ level: "error" | "warning";
102
+ code: string;
103
+ message: string;
104
+ artifactId?: string;
105
+ field?: string;
106
+ }
107
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ir/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Canonical IR — the single source of truth for an authored agent/command.
3
+ * Pure data types only. No fs/net/Node imports anywhere in this file.
4
+ */
5
+ export const DEFAULT_PROJECT_SETTINGS = {
6
+ defaultTargets: ["claude"],
7
+ conflictPolicy: "warn",
8
+ backupBeforeWrite: true,
9
+ requireCleanGit: false,
10
+ markerTemplate: "managed-by: symbion",
11
+ };
12
+ export const DEFAULT_GLOBAL_CONFIG = {
13
+ schemaVersion: 1,
14
+ port: 12802,
15
+ theme: "system",
16
+ builderDefaultTab: "form",
17
+ projects: [],
18
+ };
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ir/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4DH,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,cAAc,EAAE,CAAC,QAAQ,CAAC;IAC1B,cAAc,EAAE,MAAM;IACtB,iBAAiB,EAAE,IAAI;IACvB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,qBAAqB;CACtC,CAAC;AAsBF,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,aAAa,EAAE,CAAC;IAChB,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,QAAQ;IACf,iBAAiB,EAAE,MAAM;IACzB,QAAQ,EAAE,EAAE;CACb,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CanonicalArtifact, LintIssue } from "./types.js";
2
+ export interface ValidateOptions {
3
+ /** all artifacts in the project, used for duplicate-name + missing-mention checks. */
4
+ allArtifacts: CanonicalArtifact[];
5
+ }
6
+ /**
7
+ * validateArtifact — pure lint pass over a single artifact in the context of its siblings.
8
+ * Errors block Save; warnings are surfaced but allowed (forward-compat, E6/E7).
9
+ */
10
+ export declare function validateArtifact(artifact: CanonicalArtifact, opts: ValidateOptions): LintIssue[];
11
+ /** Convenience: validate every artifact in a project, returning a flat issue list. */
12
+ export declare function validateAllArtifacts(artifacts: CanonicalArtifact[]): LintIssue[];
13
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/ir/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAoB/D,MAAM,WAAW,eAAe;IAC9B,sFAAsF;IACtF,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,eAAe,GACpB,SAAS,EAAE,CA+Fb;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,SAAS,EAAE,CAMhF"}
@@ -0,0 +1,114 @@
1
+ import { extractAgentMentions } from "./refs.js";
2
+ /** A filename-safe name: lower/upper alnum, dash, underscore — no path separators or spaces. */
3
+ const FILENAME_SAFE_RE = /^[A-Za-z0-9_-]+$/;
4
+ const KNOWN_TOOLS = new Set([
5
+ "Read",
6
+ "Write",
7
+ "Edit",
8
+ "Grep",
9
+ "Glob",
10
+ "Bash",
11
+ "WebFetch",
12
+ "WebSearch",
13
+ "Task",
14
+ "NotebookEdit",
15
+ "TodoWrite",
16
+ ]);
17
+ /**
18
+ * validateArtifact — pure lint pass over a single artifact in the context of its siblings.
19
+ * Errors block Save; warnings are surfaced but allowed (forward-compat, E6/E7).
20
+ */
21
+ export function validateArtifact(artifact, opts) {
22
+ const issues = [];
23
+ const id = artifact.id;
24
+ if (!artifact.name || artifact.name.trim().length === 0) {
25
+ issues.push({
26
+ level: "error",
27
+ code: "name-required",
28
+ message: "name là bắt buộc.",
29
+ artifactId: id,
30
+ field: "name",
31
+ });
32
+ }
33
+ else if (!FILENAME_SAFE_RE.test(artifact.name)) {
34
+ issues.push({
35
+ level: "error",
36
+ code: "name-unsafe",
37
+ message: `name "${artifact.name}" chứa ký tự không hợp lệ cho tên file.`,
38
+ artifactId: id,
39
+ field: "name",
40
+ });
41
+ }
42
+ if (!artifact.description || artifact.description.trim().length === 0) {
43
+ issues.push({
44
+ level: "error",
45
+ code: "description-required",
46
+ message: "description là bắt buộc.",
47
+ artifactId: id,
48
+ field: "description",
49
+ });
50
+ }
51
+ // Duplicate name (same kind) across the project.
52
+ if (artifact.name) {
53
+ const dup = opts.allArtifacts.some((other) => other.id !== artifact.id &&
54
+ other.kind === artifact.kind &&
55
+ other.name === artifact.name);
56
+ if (dup) {
57
+ issues.push({
58
+ level: "error",
59
+ code: "name-duplicate",
60
+ message: `Đã có ${artifact.kind} khác tên "${artifact.name}".`,
61
+ artifactId: id,
62
+ field: "name",
63
+ });
64
+ }
65
+ }
66
+ if (artifact.kind === "agent") {
67
+ for (const tool of artifact.tools ?? []) {
68
+ if (!KNOWN_TOOLS.has(tool)) {
69
+ issues.push({
70
+ level: "warning",
71
+ code: "tool-unknown",
72
+ message: `Tool "${tool}" không nằm trong danh sách biết trước (vẫn cho phép).`,
73
+ artifactId: id,
74
+ field: "tools",
75
+ });
76
+ }
77
+ }
78
+ }
79
+ if (artifact.kind === "command") {
80
+ const mentionsArguments = artifact.body.includes("$ARGUMENTS");
81
+ if (artifact.usesArguments && !mentionsArguments) {
82
+ issues.push({
83
+ level: "warning",
84
+ code: "arguments-missing",
85
+ message: "usesArguments được đánh dấu nhưng body không chứa $ARGUMENTS.",
86
+ artifactId: id,
87
+ field: "body",
88
+ });
89
+ }
90
+ const mentions = extractAgentMentions(artifact.body);
91
+ const agentNames = new Set(opts.allArtifacts.filter((a) => a.kind === "agent").map((a) => a.name));
92
+ for (const mention of mentions) {
93
+ if (!agentNames.has(mention)) {
94
+ issues.push({
95
+ level: "warning",
96
+ code: "mention-missing-agent",
97
+ message: `@${mention} không tồn tại trong dự án (không tồn tại).`,
98
+ artifactId: id,
99
+ field: "body",
100
+ });
101
+ }
102
+ }
103
+ }
104
+ return issues;
105
+ }
106
+ /** Convenience: validate every artifact in a project, returning a flat issue list. */
107
+ export function validateAllArtifacts(artifacts) {
108
+ const out = [];
109
+ for (const artifact of artifacts) {
110
+ out.push(...validateArtifact(artifact, { allArtifacts: artifacts }));
111
+ }
112
+ return out;
113
+ }
114
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/ir/validate.ts"],"names":[],"mappings":"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"}