skill-chef 0.3.1 → 0.3.2

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 (183) hide show
  1. package/dist/add/commands.d.ts +15 -0
  2. package/dist/add/commands.d.ts.map +1 -0
  3. package/dist/add/commands.js +22 -0
  4. package/dist/add/commands.js.map +1 -0
  5. package/dist/add/index.d.ts +10 -0
  6. package/dist/add/index.d.ts.map +1 -0
  7. package/dist/add/index.js +10 -0
  8. package/dist/add/index.js.map +1 -0
  9. package/dist/add/routes.d.ts +11 -0
  10. package/dist/add/routes.d.ts.map +1 -0
  11. package/dist/add/routes.js +23 -0
  12. package/dist/add/routes.js.map +1 -0
  13. package/dist/add/run-write.d.ts +37 -0
  14. package/dist/add/run-write.d.ts.map +1 -0
  15. package/dist/add/run-write.js +187 -0
  16. package/dist/add/run-write.js.map +1 -0
  17. package/dist/cli/cmd_read.js +32 -289
  18. package/dist/cli/cmd_read.js.map +1 -1
  19. package/dist/cli/keys.d.ts +2 -1
  20. package/dist/cli/keys.d.ts.map +1 -1
  21. package/dist/cli/keys.js +37 -1
  22. package/dist/cli/keys.js.map +1 -1
  23. package/dist/cook/commands.d.ts +13 -0
  24. package/dist/cook/commands.d.ts.map +1 -0
  25. package/dist/cook/commands.js +21 -0
  26. package/dist/cook/commands.js.map +1 -0
  27. package/dist/cook/index.d.ts +9 -0
  28. package/dist/cook/index.d.ts.map +1 -0
  29. package/dist/cook/index.js +9 -0
  30. package/dist/cook/index.js.map +1 -0
  31. package/dist/cook/routes.d.ts +11 -0
  32. package/dist/cook/routes.d.ts.map +1 -0
  33. package/dist/cook/routes.js +35 -0
  34. package/dist/cook/routes.js.map +1 -0
  35. package/dist/cook/run.d.ts +24 -0
  36. package/dist/cook/run.d.ts.map +1 -0
  37. package/dist/cook/run.js +46 -0
  38. package/dist/cook/run.js.map +1 -0
  39. package/dist/data/commands.d.ts +12 -0
  40. package/dist/data/commands.d.ts.map +1 -0
  41. package/dist/data/commands.js +11 -0
  42. package/dist/data/commands.js.map +1 -0
  43. package/dist/data/index.d.ts +9 -0
  44. package/dist/data/index.d.ts.map +1 -0
  45. package/dist/data/index.js +9 -0
  46. package/dist/data/index.js.map +1 -0
  47. package/dist/data/routes.d.ts +12 -0
  48. package/dist/data/routes.d.ts.map +1 -0
  49. package/dist/data/routes.js +19 -0
  50. package/dist/data/routes.js.map +1 -0
  51. package/dist/data/run-query.d.ts +15 -0
  52. package/dist/data/run-query.d.ts.map +1 -0
  53. package/dist/data/run-query.js +73 -0
  54. package/dist/data/run-query.js.map +1 -0
  55. package/dist/fetch/db.d.ts +11 -31
  56. package/dist/fetch/db.d.ts.map +1 -1
  57. package/dist/fetch/db.js +39 -328
  58. package/dist/fetch/db.js.map +1 -1
  59. package/dist/fetch/index.d.ts +7 -1
  60. package/dist/fetch/index.d.ts.map +1 -1
  61. package/dist/fetch/index.js +9 -1
  62. package/dist/fetch/index.js.map +1 -1
  63. package/dist/fetch/schema.d.ts +7 -0
  64. package/dist/fetch/schema.d.ts.map +1 -0
  65. package/dist/fetch/schema.js +53 -0
  66. package/dist/fetch/schema.js.map +1 -0
  67. package/dist/history/index.d.ts +3 -2
  68. package/dist/history/index.d.ts.map +1 -1
  69. package/dist/history/index.js +3 -2
  70. package/dist/history/index.js.map +1 -1
  71. package/dist/history/run-query.d.ts +13 -0
  72. package/dist/history/run-query.d.ts.map +1 -0
  73. package/dist/history/run-query.js +44 -0
  74. package/dist/history/run-query.js.map +1 -0
  75. package/dist/history/run-record.d.ts +21 -0
  76. package/dist/history/run-record.d.ts.map +1 -0
  77. package/dist/history/run-record.js +71 -0
  78. package/dist/history/run-record.js.map +1 -0
  79. package/dist/relation/commands.d.ts +10 -0
  80. package/dist/relation/commands.d.ts.map +1 -0
  81. package/dist/relation/commands.js +9 -0
  82. package/dist/relation/commands.js.map +1 -0
  83. package/dist/relation/index.d.ts +8 -0
  84. package/dist/relation/index.d.ts.map +1 -0
  85. package/dist/relation/index.js +8 -0
  86. package/dist/relation/index.js.map +1 -0
  87. package/dist/relation/routes.d.ts +10 -0
  88. package/dist/relation/routes.d.ts.map +1 -0
  89. package/dist/relation/routes.js +28 -0
  90. package/dist/relation/routes.js.map +1 -0
  91. package/dist/render/index.d.ts +7 -1
  92. package/dist/render/index.d.ts.map +1 -1
  93. package/dist/render/index.js +9 -1
  94. package/dist/render/index.js.map +1 -1
  95. package/dist/render/views.d.ts +1 -39
  96. package/dist/render/views.d.ts.map +1 -1
  97. package/dist/render/views.js +6 -56
  98. package/dist/render/views.js.map +1 -1
  99. package/dist/search/commands.d.ts +14 -0
  100. package/dist/search/commands.d.ts.map +1 -0
  101. package/dist/search/commands.js +22 -0
  102. package/dist/search/commands.js.map +1 -0
  103. package/dist/search/index.d.ts +9 -0
  104. package/dist/search/index.d.ts.map +1 -0
  105. package/dist/search/index.js +9 -0
  106. package/dist/search/index.js.map +1 -0
  107. package/dist/search/routes.d.ts +11 -0
  108. package/dist/search/routes.d.ts.map +1 -0
  109. package/dist/search/routes.js +59 -0
  110. package/dist/search/routes.js.map +1 -0
  111. package/dist/search/run.d.ts +22 -0
  112. package/dist/search/run.d.ts.map +1 -0
  113. package/dist/search/run.js +105 -0
  114. package/dist/search/run.js.map +1 -0
  115. package/dist/setup/commands.d.ts +10 -0
  116. package/dist/setup/commands.d.ts.map +1 -0
  117. package/dist/setup/commands.js +9 -0
  118. package/dist/setup/commands.js.map +1 -0
  119. package/dist/setup/index.d.ts +8 -0
  120. package/dist/setup/index.d.ts.map +1 -0
  121. package/dist/setup/index.js +8 -0
  122. package/dist/setup/index.js.map +1 -0
  123. package/dist/setup/routes.d.ts +10 -0
  124. package/dist/setup/routes.d.ts.map +1 -0
  125. package/dist/setup/routes.js +16 -0
  126. package/dist/setup/routes.js.map +1 -0
  127. package/dist/shared/command-spec.d.ts +42 -0
  128. package/dist/shared/command-spec.d.ts.map +1 -0
  129. package/dist/shared/command-spec.js +15 -0
  130. package/dist/shared/command-spec.js.map +1 -0
  131. package/dist/shared/slots.d.ts +24 -0
  132. package/dist/shared/slots.d.ts.map +1 -0
  133. package/dist/shared/slots.js +63 -0
  134. package/dist/shared/slots.js.map +1 -0
  135. package/dist/shopping/commands.d.ts +13 -0
  136. package/dist/shopping/commands.d.ts.map +1 -0
  137. package/dist/shopping/commands.js +21 -0
  138. package/dist/shopping/commands.js.map +1 -0
  139. package/dist/shopping/index.d.ts +9 -0
  140. package/dist/shopping/index.d.ts.map +1 -0
  141. package/dist/shopping/index.js +9 -0
  142. package/dist/shopping/index.js.map +1 -0
  143. package/dist/shopping/routes.d.ts +11 -0
  144. package/dist/shopping/routes.d.ts.map +1 -0
  145. package/dist/shopping/routes.js +35 -0
  146. package/dist/shopping/routes.js.map +1 -0
  147. package/dist/shopping/run.d.ts +24 -0
  148. package/dist/shopping/run.d.ts.map +1 -0
  149. package/dist/shopping/run.js +74 -0
  150. package/dist/shopping/run.js.map +1 -0
  151. package/dist/update/commands.d.ts +12 -0
  152. package/dist/update/commands.d.ts.map +1 -0
  153. package/dist/update/commands.js +11 -0
  154. package/dist/update/commands.js.map +1 -0
  155. package/dist/update/index.d.ts +9 -0
  156. package/dist/update/index.d.ts.map +1 -0
  157. package/dist/update/index.js +9 -0
  158. package/dist/update/index.js.map +1 -0
  159. package/dist/update/routes.d.ts +12 -0
  160. package/dist/update/routes.d.ts.map +1 -0
  161. package/dist/update/routes.js +24 -0
  162. package/dist/update/routes.js.map +1 -0
  163. package/dist/update/run-write.d.ts +19 -0
  164. package/dist/update/run-write.d.ts.map +1 -0
  165. package/dist/update/run-write.js +99 -0
  166. package/dist/update/run-write.js.map +1 -0
  167. package/dist/view/commands.d.ts +14 -0
  168. package/dist/view/commands.d.ts.map +1 -0
  169. package/dist/view/commands.js +22 -0
  170. package/dist/view/commands.js.map +1 -0
  171. package/dist/view/index.d.ts +9 -0
  172. package/dist/view/index.d.ts.map +1 -0
  173. package/dist/view/index.js +9 -0
  174. package/dist/view/index.js.map +1 -0
  175. package/dist/view/routes.d.ts +11 -0
  176. package/dist/view/routes.d.ts.map +1 -0
  177. package/dist/view/routes.js +53 -0
  178. package/dist/view/routes.js.map +1 -0
  179. package/dist/view/run.d.ts +13 -0
  180. package/dist/view/run.d.ts.map +1 -0
  181. package/dist/view/run.js +34 -0
  182. package/dist/view/run.js.map +1 -0
  183. package/package.json +3 -3
@@ -0,0 +1,15 @@
1
+ /** 录入能力的命令声明(权威源:一条命令的事实只住这里)。
2
+ *
3
+ * 本能力即 HELP 一级分组「录入」。`chef.recipe.write` 的事实住这儿——它是写命令的默认面:
4
+ * 缺省 op 即 `add`,且 6 张录入卡对 4 张修改卡,代表唤醒词取 `录入食谱`。
5
+ * 修改域(`src/update/`)的 `修改食谱`/`废弃食谱` 路由到同一 key 时,走本能力门引用 key 名,
6
+ * 不另立第二份声明(铁律二:同一件事只有一个定义地)。
7
+ * 处理函数仍在老分派层(`src/cli/cmd_read.ts`),本票只立声明不搬实现——行为不变,
8
+ * 实现下沉时按 op 切分(add 系归本域、update 系归修改域,见落位对账文档)。
9
+ *
10
+ * 标题与代表唤醒词取 HELP 现成说法,示例照 `packages/skill-chef/SKILL.md` 同命令行照抄。
11
+ */
12
+ import type { CommandSpec } from '../shared/command-spec.js';
13
+ /** 录入能力的声明表:恰好导出一个声明数组(生成器只认这一个)。写命令不写 `shape`(一律回执形)。 */
14
+ export declare const ADD_COMMANDS: readonly CommandSpec[];
15
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/add/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,0DAA0D;AAC1D,eAAO,MAAM,YAAY,EAAE,SAAS,WAAW,EAQ9C,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** 录入能力的命令声明(权威源:一条命令的事实只住这里)。
2
+ *
3
+ * 本能力即 HELP 一级分组「录入」。`chef.recipe.write` 的事实住这儿——它是写命令的默认面:
4
+ * 缺省 op 即 `add`,且 6 张录入卡对 4 张修改卡,代表唤醒词取 `录入食谱`。
5
+ * 修改域(`src/update/`)的 `修改食谱`/`废弃食谱` 路由到同一 key 时,走本能力门引用 key 名,
6
+ * 不另立第二份声明(铁律二:同一件事只有一个定义地)。
7
+ * 处理函数仍在老分派层(`src/cli/cmd_read.ts`),本票只立声明不搬实现——行为不变,
8
+ * 实现下沉时按 op 切分(add 系归本域、update 系归修改域,见落位对账文档)。
9
+ *
10
+ * 标题与代表唤醒词取 HELP 现成说法,示例照 `packages/skill-chef/SKILL.md` 同命令行照抄。
11
+ */
12
+ /** 录入能力的声明表:恰好导出一个声明数组(生成器只认这一个)。写命令不写 `shape`(一律回执形)。 */
13
+ export const ADD_COMMANDS = [
14
+ {
15
+ kind: 'write',
16
+ key: 'chef.recipe.write',
17
+ title: '录入食谱',
18
+ wakeWord: '录入食谱',
19
+ example: 'chef-cmd-read chef.recipe.write --params \'{"op":"add","name":"宫保虾球"}\'',
20
+ },
21
+ ];
22
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/add/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,0DAA0D;AAC1D,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD;QACE,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,mBAAmB;QACxB,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,yEAAyE;KACnF;CACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** 录入能力门:能力对外只经这里(结构纪律铁律一、铁律五)。
2
+ *
3
+ * 对外两件:命令声明表与路由声明表。处理函数与取数实现不在这里,
4
+ * 本票只立声明;外边要用录入能力的东西,只经这两个名字。
5
+ * 修改域引用 `chef.recipe.write` 时走这里(key 名的引用口,不另立声明)。
6
+ */
7
+ export { ADD_COMMANDS } from './commands.js';
8
+ export { ADD_ROUTES } from './routes.js';
9
+ export { addIngredient, addRecipe, addStep, runRecipeWriteAdd } from './run-write.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/add/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** 录入能力门:能力对外只经这里(结构纪律铁律一、铁律五)。
2
+ *
3
+ * 对外两件:命令声明表与路由声明表。处理函数与取数实现不在这里,
4
+ * 本票只立声明;外边要用录入能力的东西,只经这两个名字。
5
+ * 修改域引用 `chef.recipe.write` 时走这里(key 名的引用口,不另立声明)。
6
+ */
7
+ export { ADD_COMMANDS } from './commands.js';
8
+ export { ADD_ROUTES } from './routes.js';
9
+ export { addIngredient, addRecipe, addStep, runRecipeWriteAdd } from './run-write.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/add/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** 录入能力的路由声明(唤醒词命中哪条命令,声明面唯一一处)。
2
+ *
3
+ * 两行对应 `src/policy/wakewords.ts` 里归录入的两句唤醒词:录入食谱/加菜都进 `chef.recipe.write`
4
+ *(`preset: { op: 'add' }`)。`order` 取唤醒词表 1-based 下标(20、23),只保证跨域可比;
5
+ * 全表级顺序由场景表定,本文件不另立顺序。
6
+ * 命令行写法照 `packages/skill-chef/SKILL.md` 同命令示例(空库可跑的那一行)。
7
+ */
8
+ import type { RouteDecl } from '../shared/command-spec.js';
9
+ /** 录入能力的路由声明表:恰好导出一个声明数组。 */
10
+ export declare const ADD_ROUTES: readonly RouteDecl[];
11
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/add/routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,6BAA6B;AAC7B,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAa1C,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** 录入能力的路由声明(唤醒词命中哪条命令,声明面唯一一处)。
2
+ *
3
+ * 两行对应 `src/policy/wakewords.ts` 里归录入的两句唤醒词:录入食谱/加菜都进 `chef.recipe.write`
4
+ *(`preset: { op: 'add' }`)。`order` 取唤醒词表 1-based 下标(20、23),只保证跨域可比;
5
+ * 全表级顺序由场景表定,本文件不另立顺序。
6
+ * 命令行写法照 `packages/skill-chef/SKILL.md` 同命令示例(空库可跑的那一行)。
7
+ */
8
+ /** 录入能力的路由声明表:恰好导出一个声明数组。 */
9
+ export const ADD_ROUTES = [
10
+ {
11
+ order: 20,
12
+ wakeWord: '录入食谱',
13
+ key: 'chef.recipe.write',
14
+ cli: 'chef-cmd-read chef.recipe.write --params \'{"op":"add","name":"宫保虾球"}\'',
15
+ },
16
+ {
17
+ order: 23,
18
+ wakeWord: '加菜',
19
+ key: 'chef.recipe.write',
20
+ cli: 'chef-cmd-read chef.recipe.write --params \'{"op":"add","name":"宫保虾球"}\'',
21
+ },
22
+ ];
23
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/add/routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C;QACE,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,mBAAmB;QACxB,GAAG,EAAE,yEAAyE;KAC/E;IACD;QACE,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,mBAAmB;QACxB,GAAG,EAAE,yEAAyE;KAC/E;CACF,CAAC"}
@@ -0,0 +1,37 @@
1
+ /** 录入能力的写处理(`chef.recipe.write` 的 add 系三 op)。
2
+ *
3
+ * 老分派层(`src/cli/cmd_read.ts`)`chef.recipe.write` 分支中 `add/add-ingredient/add-step`
4
+ * 三路逐字节下沉:只改 import 出处,判定与装配一字不动。`update/discard/deprecate`
5
+ * 三路住修改域(`src/update/run-write.ts`);op 路由由入口注册表按 `parseWriteOpCompat`
6
+ * 同集合切分(非法 op 入口已拦,落不到这里)。
7
+ */
8
+ import type { ChefDb, IngredientRow, RecipeRow, StepRow } from '../fetch/db.js';
9
+ /** 跑 `chef.recipe.write` 的 add 系:`add`(含 ingredients/steps 内嵌同存)/`add-ingredient`/`add-step`。
10
+ *
11
+ * `op` 由入口注册表经 `parseWriteOpCompat` 算好下传(非法 op 入口已拦,落不到这里),
12
+ * 本函数只做本域三路分支(`add/add-ingredient/add-step`),不重算路由键。
13
+ */
14
+ export declare function runRecipeWriteAdd(handle: ChefDb, params: Record<string, unknown>, op: string): unknown;
15
+ /** 新增菜谱(主表;菜名去空格后精确判重)。原 `src/fetch/db.ts`,本域独占。 */
16
+ export declare function addRecipe(h: ChefDb, input: Record<string, unknown>): RecipeRow;
17
+ /** 加食材(用量必填:老库 quantity NOT NULL,缺值直接拦)。原 `src/fetch/db.ts`,本域独占。 */
18
+ export declare function addIngredient(h: ChefDb, recipeId: string, input: {
19
+ name: string;
20
+ category?: string;
21
+ quantity?: number | null;
22
+ unit?: string;
23
+ quantity_text?: string;
24
+ is_optional?: number | boolean;
25
+ substitute?: string;
26
+ }): IngredientRow;
27
+ export declare function addIngredient(h: ChefDb, params: Record<string, unknown>): IngredientRow;
28
+ /** 加步骤(时长必填:老库 duration_minutes NOT NULL,缺值直接拦)。原 `src/fetch/db.ts`,本域独占。 */
29
+ export declare function addStep(h: ChefDb, recipeId: string, input: {
30
+ action: string;
31
+ heat_level?: string;
32
+ duration_minutes?: number | null;
33
+ temperature?: string;
34
+ expected_result?: string;
35
+ }): StepRow;
36
+ export declare function addStep(h: ChefDb, params: Record<string, unknown>): StepRow;
37
+ //# sourceMappingURL=run-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-write.d.ts","sourceRoot":"","sources":["../../src/add/run-write.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAMhF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAkEtG;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAsB9E;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAAC;AAC5O,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC;AA8BzF,6EAA6E;AAC7E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;AAChM,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC"}
@@ -0,0 +1,187 @@
1
+ /** 录入能力的写处理(`chef.recipe.write` 的 add 系三 op)。
2
+ *
3
+ * 老分派层(`src/cli/cmd_read.ts`)`chef.recipe.write` 分支中 `add/add-ingredient/add-step`
4
+ * 三路逐字节下沉:只改 import 出处,判定与装配一字不动。`update/discard/deprecate`
5
+ * 三路住修改域(`src/update/run-write.ts`);op 路由由入口注册表按 `parseWriteOpCompat`
6
+ * 同集合切分(非法 op 入口已拦,落不到这里)。
7
+ */
8
+ import { randomUUID } from 'node:crypto';
9
+ import { ChefFetchError, ChefPolicyError } from '../fetch/errors.js';
10
+ import { canonicalRecipeName, mustRecipe, now, qGet, qRun, toIngredient, toStep } from '../fetch/db.js';
11
+ import { needName, validateCategory } from '../policy/index.js';
12
+ import { buildRecipeReceipt } from '../render/index.js';
13
+ import { pickNum, pickStr, resolveRecipeId } from '../shared/slots.js';
14
+ /** 跑 `chef.recipe.write` 的 add 系:`add`(含 ingredients/steps 内嵌同存)/`add-ingredient`/`add-step`。
15
+ *
16
+ * `op` 由入口注册表经 `parseWriteOpCompat` 算好下传(非法 op 入口已拦,落不到这里),
17
+ * 本函数只做本域三路分支(`add/add-ingredient/add-step`),不重算路由键。
18
+ */
19
+ export function runRecipeWriteAdd(handle, params, op) {
20
+ if (op === 'add') {
21
+ const name = needName(params);
22
+ const input = { name };
23
+ for (const k of ['difficulty', 'status', 'description', 'photo_url', 'source', 'source_url']) {
24
+ const s = pickStr(params, k);
25
+ if (s !== undefined)
26
+ input[k] = s;
27
+ }
28
+ for (const k of ['servings', 'total_time_minutes']) {
29
+ const n = pickNum(params, k);
30
+ if (n !== undefined)
31
+ input[k] = n;
32
+ }
33
+ const r = addRecipe(handle, input);
34
+ // 兼容测试内嵌写法:params.ingredients/params.steps 数组随菜同存(与 add-ingredient/add-step 同语义,category 走 validateCategory 归一)。
35
+ if (Array.isArray(params.ingredients)) {
36
+ for (const g of params.ingredients) {
37
+ if (g && typeof g === 'object') {
38
+ const gg = { ...g };
39
+ if (typeof gg.category === 'string' && gg.category.trim())
40
+ gg.category = validateCategory(gg.category);
41
+ addIngredient(handle, r.id, gg);
42
+ }
43
+ }
44
+ }
45
+ if (Array.isArray(params.steps)) {
46
+ for (const s of params.steps) {
47
+ if (s && typeof s === 'object')
48
+ addStep(handle, r.id, s);
49
+ }
50
+ }
51
+ return buildRecipeReceipt('已新增菜谱:' + r.name + '(id=' + r.id + ')');
52
+ }
53
+ if (op === 'add-ingredient') {
54
+ const recipeId = resolveRecipeId(handle, params);
55
+ const name = needName(params);
56
+ const input = { name };
57
+ const cat = pickStr(params, 'category');
58
+ if (cat !== undefined)
59
+ input.category = validateCategory(cat);
60
+ if (params.quantity !== undefined) {
61
+ const n = pickNum(params, 'quantity');
62
+ input.quantity = n === undefined ? null : n;
63
+ }
64
+ for (const k of ['unit', 'quantity_text', 'substitute']) {
65
+ const s = pickStr(params, k);
66
+ if (s !== undefined)
67
+ input[k] = s;
68
+ }
69
+ if (params.is_optional !== undefined)
70
+ input.is_optional = params.is_optional === true || params.is_optional === 1 ? 1 : 0;
71
+ const g = addIngredient(handle, recipeId, input);
72
+ return buildRecipeReceipt('已加食材:' + g.name + '(菜 id=' + recipeId + ')');
73
+ }
74
+ if (op === 'add-step') {
75
+ const recipeId = resolveRecipeId(handle, params);
76
+ const action = params.action;
77
+ if (typeof action !== 'string' || !action.trim())
78
+ throw new ChefPolicyError('POLICY_MISSING_SLOT', 'add-step 须给 action(做法)');
79
+ const input = { action: action.trim() };
80
+ for (const k of ['heat_level', 'temperature', 'expected_result']) {
81
+ const s = pickStr(params, k);
82
+ if (s !== undefined)
83
+ input[k] = s;
84
+ }
85
+ if (params.duration_minutes !== undefined) {
86
+ const n = pickNum(params, 'duration_minutes');
87
+ input.duration_minutes = n === undefined ? null : n;
88
+ }
89
+ const s = addStep(handle, recipeId, input);
90
+ return buildRecipeReceipt('已加步骤' + s.sequence + ':' + s.action);
91
+ }
92
+ // 不可达:入口注册表已用 `parseWriteOpCompat` 同集合拦过非法 op(原分支尾的 fail 同语义,归口径错 exit 2)。
93
+ throw new ChefPolicyError('POLICY_BAD_INPUT', 'recipe.write 只接受 op=add/update/discard/add-ingredient/add-step');
94
+ }
95
+ /** 新增菜谱(主表;菜名去空格后精确判重)。原 `src/fetch/db.ts`,本域独占。 */
96
+ export function addRecipe(h, input) {
97
+ const name = canonicalRecipeName(input?.name);
98
+ if (!name)
99
+ throw new ChefFetchError('CHEF_BAD_QUERY', '加菜须给菜名 name');
100
+ const dup = qGet(h, 'SELECT COUNT(*) AS c FROM recipes WHERE name = ?', [name]);
101
+ if (dup && Number(dup.c) > 0)
102
+ throw new ChefFetchError('CHEF_RECIPE_CORRUPT', '菜名已存在:“' + name + '”');
103
+ const id = randomUUID();
104
+ const ts = now();
105
+ const p = input;
106
+ const servings = p.servings === undefined || p.servings === '' ? 2 : Number(p.servings);
107
+ const totalTime = (p.total_time_minutes === undefined || p.total_time_minutes === '') ? (p.total_time === undefined || p.total_time === '' ? 30 : Number(p.total_time)) : Number(p.total_time_minutes);
108
+ try {
109
+ qRun(h, 'INSERT INTO recipes (id, name, description, difficulty, servings, total_time_minutes, status, photo_url, source, source_url, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
110
+ id, name,
111
+ String(p.description ?? ''), String(p.difficulty ?? ''), servings,
112
+ totalTime, String(p.status ?? '未做'),
113
+ String(p.photo_url ?? ''), String(p.source ?? ''), String(p.source_url ?? ''), ts, ts,
114
+ ]);
115
+ }
116
+ catch (e) {
117
+ if (e instanceof ChefFetchError)
118
+ throw e;
119
+ throw new ChefFetchError('CHEF_DB_UNREADABLE', '加菜写盘失败:' + name, { cause: e });
120
+ }
121
+ return mustRecipe(h, id);
122
+ }
123
+ export function addIngredient(h, recipeIdOrParams, input) {
124
+ const params = typeof recipeIdOrParams === 'string' ? { ...(input ?? {}), recipe_id: recipeIdOrParams } : recipeIdOrParams;
125
+ const recipeId = String(params.recipe_id ?? params.recipeId ?? '');
126
+ if (!recipeId)
127
+ throw new ChefFetchError('CHEF_BAD_QUERY', '加食材须给 recipe_id');
128
+ mustRecipe(h, recipeId);
129
+ const name = typeof params?.name === 'string' ? String(params.name).trim() : '';
130
+ if (!name)
131
+ throw new ChefFetchError('CHEF_BAD_QUERY', '食材须给名 name');
132
+ const maxRow = qGet(h, 'SELECT MAX(sequence) AS m FROM ingredients WHERE recipe_id = ?', [recipeId]);
133
+ const seq = (maxRow?.m ?? 0) + 1;
134
+ const id = randomUUID();
135
+ const qtyRaw = params.quantity;
136
+ const qtyNum = qtyRaw === undefined || qtyRaw === null || qtyRaw === '' ? null : Number(qtyRaw);
137
+ // 818 定案(甲):老库 quantity REAL NOT NULL,本次不改 schema,缺值不插 NULL,直接拦下让 AI 问用户补齐。
138
+ if (qtyNum === null || Number.isNaN(qtyNum))
139
+ throw new ChefFetchError('CHEF_BAD_QUERY', '食材须给数字用量 quantity(老库 NOT NULL;适量请同时给估计数+quantity_text)');
140
+ const qty = qtyNum;
141
+ const isOptRaw = params.is_optional;
142
+ const isOpt = isOptRaw === true || isOptRaw === 1 || isOptRaw === '1' ? 1 : 0;
143
+ try {
144
+ qRun(h, 'INSERT INTO ingredients (id, recipe_id, sequence, name, category, quantity, unit, quantity_text, is_optional, substitute) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
145
+ id, recipeId, seq, name, String(params.category ?? ''), qty, String(params.unit ?? ''), String(params.quantity_text ?? ''), isOpt, String(params.substitute ?? ''),
146
+ ]);
147
+ }
148
+ catch (e) {
149
+ throw new ChefFetchError('CHEF_DB_UNREADABLE', '食材写盘失败:' + name, { cause: e });
150
+ }
151
+ const row = qGet(h, 'SELECT * FROM ingredients WHERE id = ?', [id]);
152
+ if (!row)
153
+ throw new ChefFetchError('CHEF_RECIPE_CORRUPT', '食材写后读回失败:' + name);
154
+ return toIngredient(row);
155
+ }
156
+ export function addStep(h, recipeIdOrParams, input) {
157
+ const params = typeof recipeIdOrParams === 'string' ? { ...(input ?? {}), recipe_id: recipeIdOrParams } : recipeIdOrParams;
158
+ const recipeId = String(params.recipe_id ?? params.recipeId ?? '');
159
+ if (!recipeId)
160
+ throw new ChefFetchError('CHEF_BAD_QUERY', '加步骤须给 recipe_id');
161
+ mustRecipe(h, recipeId);
162
+ const action = typeof params?.action === 'string' ? String(params.action).trim() : '';
163
+ if (!action)
164
+ throw new ChefFetchError('CHEF_BAD_QUERY', '步骤须给操作 action');
165
+ const maxRow = qGet(h, 'SELECT MAX(sequence) AS m FROM cooking_steps WHERE recipe_id = ?', [recipeId]);
166
+ const seq = (maxRow?.m ?? 0) + 1;
167
+ const id = randomUUID();
168
+ const durRaw = params.duration_minutes;
169
+ const durNum = durRaw === undefined || durRaw === null || durRaw === '' ? null : Number(durRaw);
170
+ // 818 定案(甲):老库 duration_minutes INTEGER NOT NULL,本次不改 schema,缺值不插 NULL,直接拦下让 AI 问用户补齐。
171
+ if (durNum === null || Number.isNaN(durNum))
172
+ throw new ChefFetchError('CHEF_BAD_QUERY', '步骤须给数字时长 duration_minutes(老库 NOT NULL;缺时长请问用户补齐)');
173
+ const dur = durNum;
174
+ try {
175
+ qRun(h, 'INSERT INTO cooking_steps (id, recipe_id, sequence, action, duration_minutes, heat_level, temperature, expected_result) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [
176
+ id, recipeId, seq, action, dur, String(params.heat_level ?? ''), String(params.temperature ?? ''), String(params.expected_result ?? ''),
177
+ ]);
178
+ }
179
+ catch (e) {
180
+ throw new ChefFetchError('CHEF_DB_UNREADABLE', '步骤写盘失败', { cause: e });
181
+ }
182
+ const row = qGet(h, 'SELECT * FROM cooking_steps WHERE id = ?', [id]);
183
+ if (!row)
184
+ throw new ChefFetchError('CHEF_RECIPE_CORRUPT', '步骤写后读回失败');
185
+ return toStep(row);
186
+ }
187
+ //# sourceMappingURL=run-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-write.js","sourceRoot":"","sources":["../../src/add/run-write.ts"],"names":[],"mappings":"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"}