agentplane 0.3.12 → 0.3.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/assets/RUNNER.md +1 -1
  2. package/assets/agents/ORCHESTRATOR.json +1 -1
  3. package/assets/codex-plugin/assets/header.png +0 -0
  4. package/assets/codex-plugin/assets/icon.svg +1 -0
  5. package/assets/codex-plugin/assets/logo.svg +1 -0
  6. package/assets/codex-plugin/skills/agentplane/SKILL.md +35 -0
  7. package/assets/policy/governance.md +4 -2
  8. package/assets/policy/incidents.md +3 -20
  9. package/assets/policy/workflow.release.md +5 -2
  10. package/dist/.build-manifest.json +203 -113
  11. package/dist/cli/exit-codes.d.ts.map +1 -1
  12. package/dist/cli/exit-codes.js +1 -0
  13. package/dist/cli/reason-codes.d.ts +1 -1
  14. package/dist/cli/reason-codes.d.ts.map +1 -1
  15. package/dist/cli/reason-codes.js +12 -0
  16. package/dist/cli/run-cli/command-catalog/core.d.ts +1 -1
  17. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -1
  18. package/dist/cli/run-cli/command-catalog/core.js +16 -0
  19. package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
  20. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
  21. package/dist/cli/run-cli/command-catalog/project.js +21 -3
  22. package/dist/cli/run-cli/command-catalog.d.ts +1 -1
  23. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  24. package/dist/cli/run-cli/commands/codex.d.ts +14 -0
  25. package/dist/cli/run-cli/commands/codex.d.ts.map +1 -0
  26. package/dist/cli/run-cli/commands/codex.js +100 -0
  27. package/dist/cli/run-cli/commands/core.d.ts +1 -0
  28. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  29. package/dist/cli/run-cli/commands/core.js +1 -0
  30. package/dist/cli/run-cli/commands/init/recipes.d.ts +9 -1
  31. package/dist/cli/run-cli/commands/init/recipes.d.ts.map +1 -1
  32. package/dist/cli/run-cli/commands/init/recipes.js +32 -22
  33. package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
  34. package/dist/cli/run-cli/commands/init.js +26 -21
  35. package/dist/cli/run-cli/error-guidance.js +20 -0
  36. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  37. package/dist/cli/run-cli.test-helpers.js +22 -19
  38. package/dist/commands/codex/plugin-install.d.ts +26 -0
  39. package/dist/commands/codex/plugin-install.d.ts.map +1 -0
  40. package/dist/commands/codex/plugin-install.js +209 -0
  41. package/dist/commands/pr/integrate/cmd.d.ts.map +1 -1
  42. package/dist/commands/pr/integrate/cmd.js +81 -5
  43. package/dist/commands/pr/integrate/internal/prepare.d.ts.map +1 -1
  44. package/dist/commands/pr/integrate/internal/prepare.js +38 -7
  45. package/dist/commands/pr/internal/auto-commit.d.ts.map +1 -1
  46. package/dist/commands/pr/internal/auto-commit.js +11 -6
  47. package/dist/commands/pr/internal/sync.d.ts.map +1 -1
  48. package/dist/commands/pr/internal/sync.js +5 -1
  49. package/dist/commands/pr/open.d.ts.map +1 -1
  50. package/dist/commands/pr/open.js +46 -8
  51. package/dist/commands/recipes/active.command.d.ts +7 -0
  52. package/dist/commands/recipes/active.command.d.ts.map +1 -0
  53. package/dist/commands/recipes/active.command.js +12 -0
  54. package/dist/commands/recipes/add.command.d.ts +8 -0
  55. package/dist/commands/recipes/add.command.d.ts.map +1 -0
  56. package/dist/commands/recipes/add.command.js +33 -0
  57. package/dist/commands/recipes/detach.command.d.ts +7 -0
  58. package/dist/commands/recipes/detach.command.d.ts.map +1 -0
  59. package/dist/commands/recipes/detach.command.js +19 -0
  60. package/dist/commands/recipes/disable.command.d.ts +7 -0
  61. package/dist/commands/recipes/disable.command.d.ts.map +1 -0
  62. package/dist/commands/recipes/disable.command.js +10 -0
  63. package/dist/commands/recipes/enable.command.d.ts +7 -0
  64. package/dist/commands/recipes/enable.command.d.ts.map +1 -0
  65. package/dist/commands/recipes/enable.command.js +10 -0
  66. package/dist/commands/recipes/explain-active.command.d.ts +5 -0
  67. package/dist/commands/recipes/explain-active.command.d.ts.map +1 -0
  68. package/dist/commands/recipes/explain-active.command.js +11 -0
  69. package/dist/commands/recipes/explain.command.d.ts.map +1 -1
  70. package/dist/commands/recipes/explain.command.js +4 -2
  71. package/dist/commands/recipes/impl/apply.d.ts.map +1 -1
  72. package/dist/commands/recipes/impl/apply.js +33 -14
  73. package/dist/commands/recipes/impl/commands/active.d.ts +6 -0
  74. package/dist/commands/recipes/impl/commands/active.d.ts.map +1 -0
  75. package/dist/commands/recipes/impl/commands/active.js +46 -0
  76. package/dist/commands/recipes/impl/commands/add.d.ts +7 -0
  77. package/dist/commands/recipes/impl/commands/add.d.ts.map +1 -0
  78. package/dist/commands/recipes/impl/commands/add.js +100 -0
  79. package/dist/commands/recipes/impl/commands/detach.d.ts +6 -0
  80. package/dist/commands/recipes/impl/commands/detach.d.ts.map +1 -0
  81. package/dist/commands/recipes/impl/commands/detach.js +85 -0
  82. package/dist/commands/recipes/impl/commands/disable.d.ts +6 -0
  83. package/dist/commands/recipes/impl/commands/disable.d.ts.map +1 -0
  84. package/dist/commands/recipes/impl/commands/disable.js +21 -0
  85. package/dist/commands/recipes/impl/commands/enable.d.ts +6 -0
  86. package/dist/commands/recipes/impl/commands/enable.d.ts.map +1 -0
  87. package/dist/commands/recipes/impl/commands/enable.js +39 -0
  88. package/dist/commands/recipes/impl/commands/explain-active.d.ts +5 -0
  89. package/dist/commands/recipes/impl/commands/explain-active.d.ts.map +1 -0
  90. package/dist/commands/recipes/impl/commands/explain-active.js +20 -0
  91. package/dist/commands/recipes/impl/commands/explain.d.ts.map +1 -1
  92. package/dist/commands/recipes/impl/commands/explain.js +40 -3
  93. package/dist/commands/recipes/impl/commands/info.d.ts.map +1 -1
  94. package/dist/commands/recipes/impl/commands/info.js +21 -8
  95. package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
  96. package/dist/commands/recipes/impl/commands/install.js +32 -29
  97. package/dist/commands/recipes/impl/commands/list.d.ts.map +1 -1
  98. package/dist/commands/recipes/impl/commands/list.js +11 -11
  99. package/dist/commands/recipes/impl/commands/remove.d.ts.map +1 -1
  100. package/dist/commands/recipes/impl/commands/remove.js +5 -0
  101. package/dist/commands/recipes/impl/commands/update.d.ts +7 -0
  102. package/dist/commands/recipes/impl/commands/update.d.ts.map +1 -0
  103. package/dist/commands/recipes/impl/commands/update.js +93 -0
  104. package/dist/commands/recipes/impl/commands.d.ts +7 -0
  105. package/dist/commands/recipes/impl/commands.d.ts.map +1 -1
  106. package/dist/commands/recipes/impl/commands.js +7 -0
  107. package/dist/commands/recipes/impl/constants.d.ts +1 -14
  108. package/dist/commands/recipes/impl/constants.d.ts.map +1 -1
  109. package/dist/commands/recipes/impl/constants.js +1 -18
  110. package/dist/commands/recipes/impl/manifest.d.ts +2 -2
  111. package/dist/commands/recipes/impl/manifest.d.ts.map +1 -1
  112. package/dist/commands/recipes/impl/manifest.js +4 -226
  113. package/dist/commands/recipes/impl/overlay-project.d.ts +32 -0
  114. package/dist/commands/recipes/impl/overlay-project.d.ts.map +1 -0
  115. package/dist/commands/recipes/impl/overlay-project.js +282 -0
  116. package/dist/commands/recipes/impl/paths.d.ts +20 -2
  117. package/dist/commands/recipes/impl/paths.d.ts.map +1 -1
  118. package/dist/commands/recipes/impl/paths.js +23 -5
  119. package/dist/commands/recipes/impl/project-installed-recipes.d.ts +2 -4
  120. package/dist/commands/recipes/impl/project-installed-recipes.d.ts.map +1 -1
  121. package/dist/commands/recipes/impl/project-installed-recipes.js +30 -74
  122. package/dist/commands/recipes/impl/project-recipe-state.d.ts +18 -0
  123. package/dist/commands/recipes/impl/project-recipe-state.d.ts.map +1 -0
  124. package/dist/commands/recipes/impl/project-recipe-state.js +94 -0
  125. package/dist/commands/recipes/impl/project-registry.d.ts +20 -0
  126. package/dist/commands/recipes/impl/project-registry.d.ts.map +1 -0
  127. package/dist/commands/recipes/impl/project-registry.js +104 -0
  128. package/dist/commands/recipes/impl/resolver.d.ts.map +1 -1
  129. package/dist/commands/recipes/impl/resolver.js +5 -3
  130. package/dist/commands/recipes/impl/types.d.ts +1 -240
  131. package/dist/commands/recipes/impl/types.d.ts.map +1 -1
  132. package/dist/commands/recipes/info.command.js +2 -2
  133. package/dist/commands/recipes/install.spec.js +4 -4
  134. package/dist/commands/recipes/list.command.js +4 -4
  135. package/dist/commands/recipes/remove.command.js +2 -2
  136. package/dist/commands/recipes/update.command.d.ts +8 -0
  137. package/dist/commands/recipes/update.command.d.ts.map +1 -0
  138. package/dist/commands/recipes/update.command.js +35 -0
  139. package/dist/commands/recipes.d.ts +7 -4
  140. package/dist/commands/recipes.d.ts.map +1 -1
  141. package/dist/commands/recipes.js +6 -3
  142. package/dist/commands/recipes.test-helpers.d.ts +3 -3
  143. package/dist/commands/recipes.test-helpers.d.ts.map +1 -1
  144. package/dist/commands/recipes.test-helpers.js +105 -15
  145. package/dist/commands/scenario/execute.command.js +4 -4
  146. package/dist/commands/scenario/impl/commands.js +4 -4
  147. package/dist/commands/scenario/info.command.js +4 -4
  148. package/dist/commands/scenario/list.command.js +3 -3
  149. package/dist/commands/scenario/run.command.js +5 -5
  150. package/dist/commands/scenario/scenario.command.js +7 -7
  151. package/dist/commands/shared/task-handoff.d.ts +2 -1
  152. package/dist/commands/shared/task-handoff.d.ts.map +1 -1
  153. package/dist/commands/shared/task-handoff.js +15 -0
  154. package/dist/commands/task/handoff-show.command.d.ts.map +1 -1
  155. package/dist/commands/task/handoff-show.command.js +24 -0
  156. package/dist/runner/context/base-prompts.d.ts +2 -1
  157. package/dist/runner/context/base-prompts.d.ts.map +1 -1
  158. package/dist/runner/context/base-prompts.js +109 -13
  159. package/dist/runner/context/recipe-context.d.ts.map +1 -1
  160. package/dist/runner/context/recipe-context.js +40 -8
  161. package/dist/runner/types.d.ts +4 -0
  162. package/dist/runner/types.d.ts.map +1 -1
  163. package/dist/runner/usecases/task-run.d.ts.map +1 -1
  164. package/dist/runner/usecases/task-run.js +2 -1
  165. package/dist/runtime/behavior/resolve.d.ts +2 -1
  166. package/dist/runtime/behavior/resolve.d.ts.map +1 -1
  167. package/dist/runtime/behavior/resolve.js +25 -5
  168. package/dist/runtime/behavior/types.d.ts +1 -0
  169. package/dist/runtime/behavior/types.d.ts.map +1 -1
  170. package/dist/runtime/capabilities/recipe.d.ts +2 -1
  171. package/dist/runtime/capabilities/recipe.d.ts.map +1 -1
  172. package/dist/runtime/capabilities/recipe.js +88 -28
  173. package/dist/shared/errors.d.ts +1 -1
  174. package/dist/shared/errors.d.ts.map +1 -1
  175. package/dist/shared/runtime-source.d.ts.map +1 -1
  176. package/dist/shared/runtime-source.js +8 -3
  177. package/package.json +3 -2
  178. package/dist/cli/recipes-bundled.d.ts +0 -10
  179. package/dist/cli/recipes-bundled.d.ts.map +0 -1
  180. package/dist/cli/recipes-bundled.js +0 -36
@@ -0,0 +1,85 @@
1
+ import { cp, rm } from "node:fs/promises";
2
+ import { loadConfig, resolveProject } from "@agentplaneorg/core";
3
+ import { mapCoreError } from "../../../../cli/error-map.js";
4
+ import { exitCodeForError } from "../../../../cli/exit-codes.js";
5
+ import { CliError } from "../../../../shared/errors.js";
6
+ import { ensureActionApproved } from "../../../shared/approval-requirements.js";
7
+ import { readInstalledRecipesFile } from "../installed-recipes.js";
8
+ import { normalizeRecipeTags } from "../normalize.js";
9
+ import { readActiveRecipeIds, refreshProjectOverlayArtifacts } from "../overlay-project.js";
10
+ import { hashRecipeTree, inspectProjectRecipe } from "../project-recipe-state.js";
11
+ import { upsertProjectRecipeRegistryEntry } from "../project-registry.js";
12
+ import { resolveInstalledRecipesPath, resolveProjectVendoredRecipeDir } from "../paths.js";
13
+ export async function cmdRecipeDetachParsed(opts) {
14
+ try {
15
+ const project = await resolveProject({
16
+ cwd: opts.cwd,
17
+ rootOverride: opts.rootOverride ?? null,
18
+ });
19
+ const loaded = await loadConfig(project.agentplaneDir);
20
+ const inspection = await inspectProjectRecipe({ project, recipeId: opts.id });
21
+ if (inspection.entry.materialization !== "link") {
22
+ throw new CliError({
23
+ exitCode: exitCodeForError("E_USAGE"),
24
+ code: "E_USAGE",
25
+ message: `Recipe ${inspection.entry.id} is already materialized as copy.`,
26
+ });
27
+ }
28
+ if (!inspection.cache_present || !inspection.current_source_sha256) {
29
+ throw new CliError({
30
+ exitCode: exitCodeForError("E_IO"),
31
+ code: "E_IO",
32
+ message: `Cached source is missing for ${inspection.entry.id}@${inspection.entry.version}. Re-install it before detaching.`,
33
+ });
34
+ }
35
+ if (inspection.state === "modified") {
36
+ throw new CliError({
37
+ exitCode: exitCodeForError("E_USAGE"),
38
+ code: "E_USAGE",
39
+ message: `Recipe ${inspection.entry.id} is no longer a clean project link. Restore it with agentplane recipes update ${inspection.entry.id} --force before detaching.`,
40
+ });
41
+ }
42
+ const cache = await readInstalledRecipesFile(resolveInstalledRecipesPath());
43
+ const activeIds = await readActiveRecipeIds(project);
44
+ const cached = cache.recipes.find((entry) => entry.id === inspection.entry.id && entry.version === inspection.entry.version);
45
+ if (!cached) {
46
+ throw new CliError({
47
+ exitCode: exitCodeForError("E_IO"),
48
+ code: "E_IO",
49
+ message: `Recipe not found in global cache: ${inspection.entry.id}@${inspection.entry.version}`,
50
+ });
51
+ }
52
+ await ensureActionApproved({
53
+ action: "dangerous_fs",
54
+ config: loaded.config,
55
+ yes: false,
56
+ reason: `recipes detach ${inspection.entry.id}@${inspection.entry.version}`,
57
+ });
58
+ const targetDir = resolveProjectVendoredRecipeDir(project, inspection.entry.id);
59
+ await rm(targetDir, { recursive: true, force: true });
60
+ await cp(inspection.source_dir, targetDir, { recursive: true });
61
+ await upsertProjectRecipeRegistryEntry({
62
+ project,
63
+ entry: {
64
+ id: inspection.entry.id,
65
+ version: inspection.entry.version,
66
+ path: inspection.entry.project_path,
67
+ active: activeIds.includes(inspection.entry.id),
68
+ materialization: "copy",
69
+ source_ref: inspection.entry.source_ref,
70
+ source_sha256: inspection.current_source_sha256,
71
+ vendored_sha256: await hashRecipeTree(targetDir),
72
+ installed_at: inspection.entry.installed_at,
73
+ tags: normalizeRecipeTags(cached.tags ?? cached.manifest.tags ?? []),
74
+ },
75
+ });
76
+ await refreshProjectOverlayArtifacts(project);
77
+ process.stdout.write(`Detached recipe ${inspection.entry.id}@${inspection.entry.version} into a project-local copy.\n`);
78
+ return 0;
79
+ }
80
+ catch (err) {
81
+ if (err instanceof CliError)
82
+ throw err;
83
+ throw mapCoreError(err, { command: "recipes detach", root: opts.rootOverride ?? null });
84
+ }
85
+ }
@@ -0,0 +1,6 @@
1
+ export declare function cmdRecipeDisableParsed(opts: {
2
+ cwd: string;
3
+ rootOverride?: string;
4
+ id: string;
5
+ }): Promise<number>;
6
+ //# sourceMappingURL=disable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/disable.ts"],"names":[],"mappings":"AAOA,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CAclB"}
@@ -0,0 +1,21 @@
1
+ import { resolveProject } from "@agentplaneorg/core";
2
+ import { mapCoreError } from "../../../../cli/error-map.js";
3
+ import { CliError } from "../../../../shared/errors.js";
4
+ import { refreshProjectOverlayArtifacts, setRecipeActive } from "../overlay-project.js";
5
+ export async function cmdRecipeDisableParsed(opts) {
6
+ try {
7
+ const project = await resolveProject({
8
+ cwd: opts.cwd,
9
+ rootOverride: opts.rootOverride ?? null,
10
+ });
11
+ await setRecipeActive({ project, recipeId: opts.id, active: false });
12
+ const { bundle } = await refreshProjectOverlayArtifacts(project);
13
+ process.stdout.write(`Disabled overlay ${opts.id} (${bundle.active.length} active)\n`);
14
+ return 0;
15
+ }
16
+ catch (err) {
17
+ if (err instanceof CliError)
18
+ throw err;
19
+ throw mapCoreError(err, { command: "recipes disable", root: opts.rootOverride ?? null });
20
+ }
21
+ }
@@ -0,0 +1,6 @@
1
+ export declare function cmdRecipeEnableParsed(opts: {
2
+ cwd: string;
3
+ rootOverride?: string;
4
+ id: string;
5
+ }): Promise<number>;
6
+ //# sourceMappingURL=enable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/enable.ts"],"names":[],"mappings":"AASA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BlB"}
@@ -0,0 +1,39 @@
1
+ import { resolveProject } from "@agentplaneorg/core";
2
+ import { mapCoreError } from "../../../../cli/error-map.js";
3
+ import { exitCodeForError } from "../../../../cli/exit-codes.js";
4
+ import { CliError } from "../../../../shared/errors.js";
5
+ import { refreshProjectOverlayArtifacts, setRecipeActive } from "../overlay-project.js";
6
+ import { readProjectInstalledRecipes } from "../project-installed-recipes.js";
7
+ export async function cmdRecipeEnableParsed(opts) {
8
+ try {
9
+ const project = await resolveProject({
10
+ cwd: opts.cwd,
11
+ rootOverride: opts.rootOverride ?? null,
12
+ });
13
+ const installed = await readProjectInstalledRecipes(project);
14
+ const entry = installed.recipes.find((recipe) => recipe.id === opts.id);
15
+ if (!entry) {
16
+ throw new CliError({
17
+ exitCode: exitCodeForError("E_IO"),
18
+ code: "E_IO",
19
+ message: `Recipe not installed: ${opts.id}`,
20
+ });
21
+ }
22
+ if (entry.manifest.kind !== "project_overlay") {
23
+ throw new CliError({
24
+ exitCode: 3,
25
+ code: "E_VALIDATION",
26
+ message: `Recipe ${opts.id} is not a project overlay`,
27
+ });
28
+ }
29
+ await setRecipeActive({ project, recipeId: opts.id, active: true });
30
+ const { bundle } = await refreshProjectOverlayArtifacts(project);
31
+ process.stdout.write(`Enabled overlay ${opts.id} (${bundle.active.length} active)\n`);
32
+ return 0;
33
+ }
34
+ catch (err) {
35
+ if (err instanceof CliError)
36
+ throw err;
37
+ throw mapCoreError(err, { command: "recipes enable", root: opts.rootOverride ?? null });
38
+ }
39
+ }
@@ -0,0 +1,5 @@
1
+ export declare function cmdRecipeExplainActiveParsed(opts: {
2
+ cwd: string;
3
+ rootOverride?: string;
4
+ }): Promise<number>;
5
+ //# sourceMappingURL=explain-active.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain-active.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/explain-active.ts"],"names":[],"mappings":"AAOA,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAalB"}
@@ -0,0 +1,20 @@
1
+ import { resolveProject } from "@agentplaneorg/core";
2
+ import { mapCoreError } from "../../../../cli/error-map.js";
3
+ import { CliError } from "../../../../shared/errors.js";
4
+ import { readProjectOverlayBundle } from "../overlay-project.js";
5
+ export async function cmdRecipeExplainActiveParsed(opts) {
6
+ try {
7
+ const project = await resolveProject({
8
+ cwd: opts.cwd,
9
+ rootOverride: opts.rootOverride ?? null,
10
+ });
11
+ const bundle = await readProjectOverlayBundle(project);
12
+ process.stdout.write(`${JSON.stringify(bundle ?? null, null, 2)}\n`);
13
+ return 0;
14
+ }
15
+ catch (err) {
16
+ if (err instanceof CliError)
17
+ throw err;
18
+ throw mapCoreError(err, { command: "recipes explain-active", root: opts.rootOverride ?? null });
19
+ }
20
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/explain.ts"],"names":[],"mappings":"AAWA,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CAqIlB"}
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/explain.ts"],"names":[],"mappings":"AAeA,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CA4KlB"}
@@ -1,10 +1,13 @@
1
+ import path from "node:path";
1
2
  import { resolveProject } from "@agentplaneorg/core";
2
3
  import { mapCoreError } from "../../../../cli/error-map.js";
3
4
  import { exitCodeForError } from "../../../../cli/exit-codes.js";
4
5
  import { CliError } from "../../../../shared/errors.js";
5
6
  import { formatJsonBlock } from "../format.js";
7
+ import { readActiveRecipeIds } from "../overlay-project.js";
6
8
  import { readProjectInstalledRecipes } from "../project-installed-recipes.js";
7
- import { resolveProjectInstalledRecipeDir } from "../paths.js";
9
+ import { inspectProjectRecipe } from "../project-recipe-state.js";
10
+ import { resolveProjectRecipesDir, resolveProjectInstalledRecipeDir } from "../paths.js";
8
11
  import { collectRecipeScenarioDetails } from "../scenario.js";
9
12
  export async function cmdRecipeExplainParsed(opts) {
10
13
  try {
@@ -12,7 +15,10 @@ export async function cmdRecipeExplainParsed(opts) {
12
15
  cwd: opts.cwd,
13
16
  rootOverride: opts.rootOverride ?? null,
14
17
  });
15
- const installed = await readProjectInstalledRecipes(resolved);
18
+ const [installed, activeIds] = await Promise.all([
19
+ readProjectInstalledRecipes(resolved),
20
+ readActiveRecipeIds(resolved),
21
+ ]);
16
22
  const entry = installed.recipes.find((recipe) => recipe.id === opts.id);
17
23
  if (!entry) {
18
24
  throw new CliError({
@@ -21,10 +27,22 @@ export async function cmdRecipeExplainParsed(opts) {
21
27
  message: `Recipe not installed: ${opts.id}`,
22
28
  });
23
29
  }
30
+ const inspection = await inspectProjectRecipe({ project: resolved, recipeId: opts.id });
24
31
  const manifest = entry.manifest;
25
- const recipeDir = resolveProjectInstalledRecipeDir(resolved, entry.id);
32
+ const recipeDir = entry.project_path
33
+ ? path.join(resolveProjectRecipesDir(resolved), entry.project_path)
34
+ : resolveProjectInstalledRecipeDir(resolved, entry.id);
26
35
  const scenarioDetails = await collectRecipeScenarioDetails(recipeDir, manifest);
27
36
  process.stdout.write(`Recipe: ${manifest.id}@${manifest.version}\n`);
37
+ process.stdout.write(`Kind: ${manifest.kind}\n`);
38
+ process.stdout.write(`Schema: ${manifest.schema_version}\n`);
39
+ process.stdout.write(`Active: ${activeIds.includes(entry.id) ? "yes" : "no"}\n`);
40
+ process.stdout.write(`Materialization: ${entry.materialization}\n`);
41
+ process.stdout.write(`State: ${inspection.state}\n`);
42
+ process.stdout.write(`Source ref: ${entry.source_ref}\n`);
43
+ process.stdout.write(`Cache source: ${inspection.cache_present ? "present" : "missing"}\n`);
44
+ process.stdout.write(`Source sha256: ${entry.source_sha256}\n`);
45
+ process.stdout.write(`Vendored sha256: ${inspection.current_vendored_sha256}\n`);
28
46
  process.stdout.write(`Name: ${manifest.name}\n`);
29
47
  process.stdout.write(`Summary: ${manifest.summary}\n`);
30
48
  process.stdout.write(`Description: ${manifest.description}\n`);
@@ -57,6 +75,25 @@ export async function cmdRecipeExplainParsed(opts) {
57
75
  process.stdout.write(` - ${tool.id} - ${tool.summary}\n`);
58
76
  }
59
77
  }
78
+ const prompts = manifest.prompts ?? [];
79
+ const validators = manifest.validators ?? [];
80
+ if (prompts.length > 0) {
81
+ process.stdout.write("Overlay prompts:\n");
82
+ for (const prompt of prompts) {
83
+ process.stdout.write(` - ${prompt.id} [surface=${prompt.surface}, strength=${prompt.strength ?? "default"}, file=${prompt.file}]\n`);
84
+ }
85
+ }
86
+ if (validators.length > 0) {
87
+ process.stdout.write("Overlay validators:\n");
88
+ for (const validator of validators) {
89
+ process.stdout.write(` - ${validator.id} [kind=${validator.kind}, phase=${validator.phase}]\n`);
90
+ }
91
+ }
92
+ if (manifest.templates && Object.keys(manifest.templates).length > 0) {
93
+ const payload = formatJsonBlock(manifest.templates, " ");
94
+ if (payload)
95
+ process.stdout.write(`Templates:\n${payload}\n`);
96
+ }
60
97
  if (scenarioDetails.length > 0) {
61
98
  process.stdout.write("Scenarios:\n");
62
99
  for (const scenario of scenarioDetails) {
@@ -1 +1 @@
1
- {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/info.ts"],"names":[],"mappings":"AASA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CAkElB"}
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/info.ts"],"names":[],"mappings":"AAQA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CAmFlB"}
@@ -1,26 +1,25 @@
1
- import { resolveProject } from "@agentplaneorg/core";
2
1
  import { mapCoreError } from "../../../../cli/error-map.js";
3
2
  import { exitCodeForError } from "../../../../cli/exit-codes.js";
4
3
  import { CliError } from "../../../../shared/errors.js";
5
4
  import { formatJsonBlock } from "../format.js";
6
- import { readProjectInstalledRecipes } from "../project-installed-recipes.js";
5
+ import { readInstalledRecipesFile } from "../installed-recipes.js";
6
+ import { resolveInstalledRecipesPath } from "../paths.js";
7
7
  export async function cmdRecipeInfoParsed(opts) {
8
8
  try {
9
- const resolved = await resolveProject({
10
- cwd: opts.cwd,
11
- rootOverride: opts.rootOverride ?? null,
12
- });
13
- const installed = await readProjectInstalledRecipes(resolved);
9
+ const installed = await readInstalledRecipesFile(resolveInstalledRecipesPath());
14
10
  const entry = installed.recipes.find((recipe) => recipe.id === opts.id);
15
11
  if (!entry) {
16
12
  throw new CliError({
17
13
  exitCode: exitCodeForError("E_IO"),
18
14
  code: "E_IO",
19
- message: `Recipe not installed: ${opts.id}`,
15
+ message: `Recipe not cached: ${opts.id}`,
20
16
  });
21
17
  }
22
18
  const manifest = entry.manifest;
23
19
  process.stdout.write(`Recipe: ${manifest.id}@${manifest.version}\n`);
20
+ process.stdout.write(`Kind: ${manifest.kind}\n`);
21
+ process.stdout.write(`Schema: ${manifest.schema_version}\n`);
22
+ process.stdout.write("Cached: yes\n");
24
23
  process.stdout.write(`Name: ${manifest.name}\n`);
25
24
  process.stdout.write(`Summary: ${manifest.summary}\n`);
26
25
  process.stdout.write(`Description: ${manifest.description}\n`);
@@ -36,6 +35,8 @@ export async function cmdRecipeInfoParsed(opts) {
36
35
  const agents = manifest.agents ?? [];
37
36
  const tools = manifest.tools ?? [];
38
37
  const scenarios = manifest.scenarios ?? [];
38
+ const prompts = manifest.prompts ?? [];
39
+ const validators = manifest.validators ?? [];
39
40
  if (skills.length > 0) {
40
41
  process.stdout.write("Skills:\n");
41
42
  for (const skill of skills) {
@@ -55,6 +56,18 @@ export async function cmdRecipeInfoParsed(opts) {
55
56
  process.stdout.write(` - ${tool.id} - ${tool.summary}\n`);
56
57
  }
57
58
  }
59
+ if (prompts.length > 0) {
60
+ process.stdout.write("Prompts:\n");
61
+ for (const prompt of prompts) {
62
+ process.stdout.write(` - ${prompt.id} [surface=${prompt.surface}, strength=${prompt.strength ?? "default"}]\n`);
63
+ }
64
+ }
65
+ if (validators.length > 0) {
66
+ process.stdout.write("Validators:\n");
67
+ for (const validator of validators) {
68
+ process.stdout.write(` - ${validator.id} [kind=${validator.kind}, phase=${validator.phase}]\n`);
69
+ }
70
+ }
58
71
  if (scenarios.length > 0) {
59
72
  process.stdout.write("Scenarios:\n");
60
73
  for (const scenario of scenarios) {
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/install.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAM3E,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,CA4NlB"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/install.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAM3E,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,CAgOlB"}
@@ -14,25 +14,30 @@ import { ensureNetworkApproved } from "../../../shared/network-approval.js";
14
14
  import { resolvePathFallback } from "../../../shared/path.js";
15
15
  import { moveRecipeDir, validateRecipeAssets } from "../apply.js";
16
16
  import { resolveRecipeRoot } from "../archive.js";
17
- import { DEFAULT_RECIPES_INDEX_URL, RECIPE_RUNS_DIR_NAME } from "../constants.js";
17
+ import { DEFAULT_RECIPES_INDEX_URL } from "../constants.js";
18
18
  import { loadRecipesRemoteIndex, willFetchRemoteRecipesIndex } from "../index.js";
19
+ import { readInstalledRecipesFile, writeInstalledRecipesFile } from "../installed-recipes.js";
19
20
  import { readRecipeManifest } from "../manifest.js";
20
21
  import { normalizeRecipeTags } from "../normalize.js";
21
- import { writeRecipeInstallMetadata } from "../project-installed-recipes.js";
22
- import { resolveProjectInstalledRecipeDir, resolveProjectRecipeInstallMetaPath, resolveProjectRecipesDir, resolveRecipesIndexCachePath, } from "../paths.js";
22
+ import { resolveGlobalRecipesDir, resolveInstalledRecipeDir, resolveInstalledRecipesPath, resolveRecipesIndexCachePath, } from "../paths.js";
23
23
  function isHttpUrl(value) {
24
24
  return value.startsWith("http://") || value.startsWith("https://");
25
25
  }
26
26
  export async function cmdRecipeInstall(opts) {
27
27
  void opts.onConflict;
28
28
  try {
29
- const project = await resolveProject({
30
- cwd: opts.cwd,
31
- rootOverride: opts.rootOverride ?? null,
32
- });
33
29
  let config = defaultConfig();
34
- const loaded = await loadConfig(project.agentplaneDir);
35
- config = loaded.config;
30
+ try {
31
+ const project = await resolveProject({
32
+ cwd: opts.cwd,
33
+ rootOverride: opts.rootOverride ?? null,
34
+ });
35
+ const loaded = await loadConfig(project.agentplaneDir);
36
+ config = loaded.config;
37
+ }
38
+ catch {
39
+ config = defaultConfig();
40
+ }
36
41
  let networkApproved = false;
37
42
  const ensureApproved = async (reason) => {
38
43
  if (networkApproved)
@@ -175,7 +180,10 @@ export async function cmdRecipeInstall(opts) {
175
180
  const resolvedTags = manifest.tags && manifest.tags.length > 0 ? manifest.tags : normalizeRecipeTags(indexTags);
176
181
  const manifestWithTags = resolvedTags.length > 0 ? { ...manifest, tags: resolvedTags } : manifest;
177
182
  await validateRecipeAssets({ manifest: manifestWithTags, recipeDir: recipeRoot });
178
- const installDir = resolveProjectInstalledRecipeDir(project, manifestWithTags.id);
183
+ const installDir = resolveInstalledRecipeDir({
184
+ id: manifestWithTags.id,
185
+ version: manifestWithTags.version,
186
+ });
179
187
  const installKind = await getPathKind(installDir);
180
188
  if (installKind && installKind !== "dir") {
181
189
  throw new CliError({
@@ -184,40 +192,35 @@ export async function cmdRecipeInstall(opts) {
184
192
  message: `Recipe install path is not a directory: ${installDir}`,
185
193
  });
186
194
  }
187
- const hadExisting = Boolean(installKind);
188
- const existingRunsDir = path.join(installDir, RECIPE_RUNS_DIR_NAME);
189
- const preservedRunsDir = path.join(tempRoot, RECIPE_RUNS_DIR_NAME);
190
195
  if (installKind) {
191
- if ((await getPathKind(existingRunsDir)) === "dir") {
192
- await cp(existingRunsDir, preservedRunsDir, { recursive: true });
193
- }
194
196
  await rm(installDir, { recursive: true, force: true });
195
197
  }
196
- await mkdir(resolveProjectRecipesDir(project), { recursive: true });
198
+ await mkdir(resolveGlobalRecipesDir(), { recursive: true });
197
199
  await moveRecipeDir({ from: recipeRoot, to: installDir });
198
200
  try {
199
- if ((await getPathKind(preservedRunsDir)) === "dir") {
200
- await cp(preservedRunsDir, path.join(installDir, RECIPE_RUNS_DIR_NAME), {
201
- recursive: true,
202
- });
203
- }
204
- await writeRecipeInstallMetadata(resolveProjectRecipeInstallMetaPath(project, manifestWithTags.id), {
205
- schema_version: 1,
201
+ const installed = await readInstalledRecipesFile(resolveInstalledRecipesPath());
202
+ const entry = {
206
203
  id: manifestWithTags.id,
207
204
  version: manifestWithTags.version,
208
205
  source: sourceLabel,
209
206
  installed_at: new Date().toISOString(),
210
207
  tags: resolvedTags,
211
- install_mode: "project-local",
208
+ manifest: manifestWithTags,
209
+ };
210
+ await writeInstalledRecipesFile(resolveInstalledRecipesPath(), {
211
+ schema_version: 1,
212
+ updated_at: installed.updated_at,
213
+ recipes: [
214
+ ...installed.recipes.filter((installedEntry) => !(installedEntry.id === entry.id && installedEntry.version === entry.version)),
215
+ entry,
216
+ ],
212
217
  });
213
218
  }
214
219
  catch (err) {
215
- if (!hadExisting) {
216
- await rm(installDir, { recursive: true, force: true });
217
- }
220
+ await rm(installDir, { recursive: true, force: true });
218
221
  throw err;
219
222
  }
220
- process.stdout.write(`Installed recipe ${manifestWithTags.id}@${manifestWithTags.version}\n`);
223
+ process.stdout.write(`Installed recipe ${manifestWithTags.id}@${manifestWithTags.version} to global cache\n`);
221
224
  return 0;
222
225
  }
223
226
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/list.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,eAAe,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDlB"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/list.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,eAAe,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDlB"}
@@ -1,16 +1,12 @@
1
- import { resolveProject } from "@agentplaneorg/core";
2
1
  import { mapCoreError } from "../../../../cli/error-map.js";
3
2
  import { emptyStateMessage } from "../../../../cli/output.js";
4
3
  import { CliError } from "../../../../shared/errors.js";
5
- import { readProjectInstalledRecipes } from "../project-installed-recipes.js";
4
+ import { readInstalledRecipesFile } from "../installed-recipes.js";
5
+ import { resolveInstalledRecipesPath } from "../paths.js";
6
6
  export async function cmdRecipeListParsed(opts) {
7
7
  const flags = opts.flags;
8
8
  try {
9
- const resolved = await resolveProject({
10
- cwd: opts.cwd,
11
- rootOverride: opts.rootOverride ?? null,
12
- });
13
- const installed = await readProjectInstalledRecipes(resolved);
9
+ const installed = await readInstalledRecipesFile(resolveInstalledRecipesPath());
14
10
  let recipes = installed.recipes;
15
11
  if (flags.tag) {
16
12
  const needle = flags.tag.toLowerCase();
@@ -18,18 +14,22 @@ export async function cmdRecipeListParsed(opts) {
18
14
  }
19
15
  if (recipes.length === 0) {
20
16
  if (flags.tag) {
21
- process.stdout.write(`${emptyStateMessage(`installed recipes for tag ${flags.tag}`)}\n`);
17
+ process.stdout.write(`${emptyStateMessage(`cached recipes for tag ${flags.tag}`)}\n`);
22
18
  return 0;
23
19
  }
24
- process.stdout.write(`${emptyStateMessage("installed recipes", "Use `agentplane recipes list-remote` or `agentplane recipes install <id>`.")}\n`);
20
+ process.stdout.write(`${emptyStateMessage("cached recipes", "Use `agentplane recipes list-remote` or `agentplane recipes install <id>`.")}\n`);
25
21
  return 0;
26
22
  }
27
23
  if (flags.full) {
28
- process.stdout.write(`${JSON.stringify({ schema_version: 1, updated_at: installed.updated_at, recipes }, null, 2)}\n`);
24
+ process.stdout.write(`${JSON.stringify({
25
+ schema_version: 1,
26
+ updated_at: installed.updated_at,
27
+ recipes,
28
+ }, null, 2)}\n`);
29
29
  return 0;
30
30
  }
31
31
  for (const entry of recipes) {
32
- process.stdout.write(`${entry.id}@${entry.version} - ${entry.manifest.summary || "No summary"}\n`);
32
+ process.stdout.write(`${entry.id}@${entry.version} [${entry.manifest.kind}] - ${entry.manifest.summary || "No summary"}\n`);
33
33
  }
34
34
  return 0;
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/remove.ts"],"names":[],"mappings":"AAaA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BlB"}
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/remove.ts"],"names":[],"mappings":"AAeA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CAkClB"}
@@ -5,7 +5,9 @@ import { exitCodeForError } from "../../../../cli/exit-codes.js";
5
5
  import { successMessage } from "../../../../cli/output.js";
6
6
  import { CliError } from "../../../../shared/errors.js";
7
7
  import { ensureActionApproved } from "../../../shared/approval-requirements.js";
8
+ import { refreshProjectOverlayArtifacts, setRecipeActive } from "../overlay-project.js";
8
9
  import { readProjectInstalledRecipes } from "../project-installed-recipes.js";
10
+ import { removeProjectRecipeRegistryEntry } from "../project-registry.js";
9
11
  import { resolveProjectInstalledRecipeDir } from "../paths.js";
10
12
  export async function cmdRecipeRemoveParsed(opts) {
11
13
  try {
@@ -31,6 +33,9 @@ export async function cmdRecipeRemoveParsed(opts) {
31
33
  reason: `recipes remove ${entry.id}@${entry.version}`,
32
34
  });
33
35
  await rm(recipeDir, { recursive: true, force: true });
36
+ await setRecipeActive({ project: resolved, recipeId: entry.id, active: false });
37
+ await removeProjectRecipeRegistryEntry({ project: resolved, recipeId: entry.id });
38
+ await refreshProjectOverlayArtifacts(resolved);
34
39
  process.stdout.write(`${successMessage("removed recipe", `${entry.id}@${entry.version}`)}\n`);
35
40
  return 0;
36
41
  }
@@ -0,0 +1,7 @@
1
+ export declare function cmdRecipeUpdateParsed(opts: {
2
+ cwd: string;
3
+ rootOverride?: string;
4
+ id: string;
5
+ force: boolean;
6
+ }): Promise<number>;
7
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/update.ts"],"names":[],"mappings":"AAwBA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFlB"}