@refrainai/cli 0.4.1

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 (69) hide show
  1. package/dist/ai-model-FM6GWCID.js +37 -0
  2. package/dist/ai-model-FM6GWCID.js.map +1 -0
  3. package/dist/chunk-2BVDAJZT.js +236 -0
  4. package/dist/chunk-2BVDAJZT.js.map +1 -0
  5. package/dist/chunk-2H7UOFLK.js +11 -0
  6. package/dist/chunk-2H7UOFLK.js.map +1 -0
  7. package/dist/chunk-7UCVPKD4.js +902 -0
  8. package/dist/chunk-7UCVPKD4.js.map +1 -0
  9. package/dist/chunk-AG3CFMYU.js +36 -0
  10. package/dist/chunk-AG3CFMYU.js.map +1 -0
  11. package/dist/chunk-CLYJHKPY.js +1131 -0
  12. package/dist/chunk-CLYJHKPY.js.map +1 -0
  13. package/dist/chunk-D5SI2PHK.js +74 -0
  14. package/dist/chunk-D5SI2PHK.js.map +1 -0
  15. package/dist/chunk-DJVUITRB.js +9084 -0
  16. package/dist/chunk-DJVUITRB.js.map +1 -0
  17. package/dist/chunk-H47NWH7N.js +4427 -0
  18. package/dist/chunk-H47NWH7N.js.map +1 -0
  19. package/dist/chunk-HQDXLWAY.js +109 -0
  20. package/dist/chunk-HQDXLWAY.js.map +1 -0
  21. package/dist/chunk-IGFCYKHC.js +1974 -0
  22. package/dist/chunk-IGFCYKHC.js.map +1 -0
  23. package/dist/chunk-RT664YIO.js +245 -0
  24. package/dist/chunk-RT664YIO.js.map +1 -0
  25. package/dist/chunk-RYIJPYM3.js +164 -0
  26. package/dist/chunk-RYIJPYM3.js.map +1 -0
  27. package/dist/chunk-TDSM3UXI.js +40 -0
  28. package/dist/chunk-TDSM3UXI.js.map +1 -0
  29. package/dist/chunk-UGPXCQY3.js +778 -0
  30. package/dist/chunk-UGPXCQY3.js.map +1 -0
  31. package/dist/chunk-VPK2MQAZ.js +589 -0
  32. package/dist/chunk-VPK2MQAZ.js.map +1 -0
  33. package/dist/chunk-WEYR56ZN.js +953 -0
  34. package/dist/chunk-WEYR56ZN.js.map +1 -0
  35. package/dist/chunk-XMFCXPYU.js +275 -0
  36. package/dist/chunk-XMFCXPYU.js.map +1 -0
  37. package/dist/chunk-Z33FCOTZ.js +251 -0
  38. package/dist/chunk-Z33FCOTZ.js.map +1 -0
  39. package/dist/cli.js +59 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/compose-MTSIJY5D.js +547 -0
  42. package/dist/compose-MTSIJY5D.js.map +1 -0
  43. package/dist/config-ZSUNCFXR.js +9 -0
  44. package/dist/config-ZSUNCFXR.js.map +1 -0
  45. package/dist/fix-runbook-ZSBOTLC2.js +294 -0
  46. package/dist/fix-runbook-ZSBOTLC2.js.map +1 -0
  47. package/dist/google-sheets-DRWIVEVC.js +482 -0
  48. package/dist/google-sheets-DRWIVEVC.js.map +1 -0
  49. package/dist/registry-LZLYTNDJ.js +17 -0
  50. package/dist/registry-LZLYTNDJ.js.map +1 -0
  51. package/dist/runbook-data-helpers-KRR2SH76.js +16 -0
  52. package/dist/runbook-data-helpers-KRR2SH76.js.map +1 -0
  53. package/dist/runbook-executor-K7T6RJWJ.js +1480 -0
  54. package/dist/runbook-executor-K7T6RJWJ.js.map +1 -0
  55. package/dist/runbook-generator-MPXJBQ5N.js +800 -0
  56. package/dist/runbook-generator-MPXJBQ5N.js.map +1 -0
  57. package/dist/runbook-schema-3T6TP3JJ.js +35 -0
  58. package/dist/runbook-schema-3T6TP3JJ.js.map +1 -0
  59. package/dist/runbook-store-G5GUOWRR.js +11 -0
  60. package/dist/runbook-store-G5GUOWRR.js.map +1 -0
  61. package/dist/schema-5G6UQSPT.js +91 -0
  62. package/dist/schema-5G6UQSPT.js.map +1 -0
  63. package/dist/server-AG3LXQBI.js +8778 -0
  64. package/dist/server-AG3LXQBI.js.map +1 -0
  65. package/dist/tenant-ai-config-QPFEJUVJ.js +14 -0
  66. package/dist/tenant-ai-config-QPFEJUVJ.js.map +1 -0
  67. package/dist/yaml-patcher-VGUS2JGH.js +15 -0
  68. package/dist/yaml-patcher-VGUS2JGH.js.map +1 -0
  69. package/package.json +37 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/schemas/runbook-schema.ts","../../../src/schemas/element-selector.ts"],"sourcesContent":["/**\n * runbook-schema — refrain の runbook YAML 用 Zod スキーマ\n *\n * contracts の ElementSelectorSchema を再利用しつつ、\n * refrain 固有の構造(variables, captures, loop 等)を定義。\n */\n\nimport { z } from \"zod\";\nimport { ElementSelectorSchema } from \"./element-selector\";\n\n// ── Selector ──\n// contracts の ElementSelectorSchema は tagName が必須。\n// YAML では tagName がないケースがあるため default(\"unknown\") に変更。\n// deterministic-resolver が使う text フィールドを追加。\nexport const SelectorSchema = ElementSelectorSchema.extend({\n tagName: z.string().default(\"unknown\"),\n text: z.string().optional(),\n});\n\n// ── Enums ──\nexport const ActionTypeSchema = z.enum([\n \"click\",\n \"input\",\n \"select\",\n \"navigate\",\n \"scroll\",\n \"wait\",\n \"hover\",\n \"extract\",\n \"download\",\n \"export\",\n \"memory\",\n \"key\",\n]);\n\nexport const RiskLevelSchema = z.enum([\"low\", \"medium\", \"high\"]);\n\nexport const VariableSourceSchema = z.enum([\n \"prompt\",\n \"fixed\",\n \"context\",\n \"env\",\n \"expression\",\n \"data\",\n]);\n\nexport const CaptureStrategySchema = z.enum([\n \"snapshot\",\n \"url\",\n \"ai\",\n \"expression\",\n \"evaluate\",\n]);\n\n// ── StepCapture ──\nexport const StepCaptureSchema = z\n .object({\n name: z.string().min(1),\n strategy: CaptureStrategySchema,\n description: z.string().optional(),\n required: z.boolean().default(false),\n pattern: z.string().optional(),\n group: z.number().int().nonnegative().optional(),\n prompt: z.string().optional(),\n expression: z.string().optional(),\n })\n .refine(\n (c) => {\n if (!c.pattern) return true;\n try {\n new RegExp(c.pattern);\n return true;\n } catch {\n return false;\n }\n },\n { message: \"Invalid regex pattern in capture\" },\n );\n\n// ── LoopDefinition ──\nexport const LoopDefinitionSchema = z\n .object({\n /** while 型ループの条件式 */\n condition: z.string().min(1).optional(),\n /** forEach: 反復対象のテンプレート変数(JSON配列)または \"collection:name\" */\n forEach: z.string().min(1).optional(),\n /** forEach 時の各アイテム変数名 */\n itemVariable: z.string().optional(),\n /** forEach 時のインデックス変数名 */\n indexVariable: z.string().optional(),\n maxIterations: z.number().int().positive().optional(),\n counterVariable: z.string().optional(),\n })\n .refine(\n (l) => {\n // condition と forEach は排他(どちらか一方が必須)\n const hasCondition = !!l.condition;\n const hasForEach = !!l.forEach;\n return (hasCondition || hasForEach) && !(hasCondition && hasForEach);\n },\n { message: \"loop must have exactly one of 'condition' or 'forEach'\" },\n );\n\n// ── VariableDefinition ──\nexport const VariableDefinitionSchema = z.object({\n source: VariableSourceSchema,\n description: z.string().optional(),\n required: z.boolean().default(true),\n sensitive: z.boolean().default(false),\n value: z.string().optional(),\n expression: z.string().optional(),\n envKey: z.string().optional(),\n});\n\n// ── StepAction ──\nexport const StepActionSchema = z.object({\n type: ActionTypeSchema,\n selector: SelectorSchema.optional(),\n value: z.string().optional(),\n optionText: z.string().optional(),\n url: z.string().optional(),\n /** extract アクション用: ページ内で実行する JavaScript */\n script: z.string().optional(),\n /** key アクション用: 押下するキーボードキー(Playwright 形式、例: \"Enter\", \"Tab\", \"ArrowDown\") */\n keys: z.string().optional(),\n /** download アクション用: 保存先パス */\n downloadPath: z.string().optional(),\n /** export アクション用: 出力対象コレクション名 */\n exportCollection: z.string().optional(),\n /** export アクション用: 出力フォーマット */\n exportFormat: z.enum([\"csv\", \"json\"]).optional(),\n /** export アクション用: 出力先パス */\n exportPath: z.string().optional(),\n});\n\n// ── DataSourceConfig ──\nexport const DataSourceConfigSchema = z.object({\n mapping: z.record(z.string(), z.string()),\n});\n\n// ── AggregateOperation ──\nexport const AggregateOperationSchema = z.enum([\n \"sum\",\n \"count\",\n \"concat\",\n \"min\",\n \"max\",\n \"avg\",\n \"unique_count\",\n]);\n\n// ── MemoryOperation ──\nexport const MemoryOperationSchema = z.object({\n /** append: 蓄積, aggregate: 集計 */\n type: z.enum([\"append\", \"aggregate\"]),\n /** 対象コレクション名 */\n collection: z.string(),\n /** append 時: capture 名(RuntimeStore のキー) */\n source: z.string().optional(),\n /** aggregate 時: 集計対象フィールド名 */\n field: z.string().optional(),\n /** aggregate 時: 集計操作 */\n operation: AggregateOperationSchema.optional(),\n /** aggregate 時: 結果を格納する変数名 */\n outputVariable: z.string().optional(),\n});\n\n// ── BranchDefinition(条件分岐) ──\n\nexport interface BranchCaseShape {\n match: string;\n steps: ParsedStepShape[];\n}\n\nexport interface BranchDefinitionShape {\n value: string;\n cases: BranchCaseShape[];\n default?: { steps: ParsedStepShape[] };\n}\n\n// ── ParsedStep(再帰型: loop の substeps, branches の分岐) ──\nexport interface ParsedStepShape {\n ordinal: number;\n description: string;\n action: z.infer<typeof StepActionSchema>;\n url: string;\n riskLevel: z.infer<typeof RiskLevelSchema>;\n requiresConfirmation: boolean;\n captures?: z.infer<typeof StepCaptureSchema>[];\n condition?: string;\n loop?: z.infer<typeof LoopDefinitionSchema>;\n steps?: ParsedStepShape[];\n /** 条件分岐 */\n branches?: BranchDefinitionShape;\n /** メモリ操作(蓄積・集計) */\n memoryOperations?: z.infer<typeof MemoryOperationSchema>[];\n}\n\nconst BranchCaseSchema: z.ZodType<BranchCaseShape> = z.lazy(() =>\n z.object({\n match: z.string(),\n steps: z.array(ParsedStepSchema).min(1),\n }),\n);\n\nconst BranchDefinitionSchema: z.ZodType<BranchDefinitionShape> = z.lazy(() =>\n z.object({\n value: z.string().min(1),\n cases: z.array(BranchCaseSchema).min(1),\n default: z.object({ steps: z.array(ParsedStepSchema).min(1) }).optional(),\n }),\n);\n\nexport const ParsedStepSchema: z.ZodType<ParsedStepShape> = z.lazy(() =>\n z\n .object({\n ordinal: z.number().int().nonnegative(),\n description: z.string(),\n action: StepActionSchema,\n url: z.string(),\n riskLevel: RiskLevelSchema,\n requiresConfirmation: z.boolean(),\n captures: z.array(StepCaptureSchema).optional(),\n condition: z.string().optional(),\n loop: LoopDefinitionSchema.optional(),\n steps: z.array(ParsedStepSchema).optional(),\n branches: BranchDefinitionSchema.optional(),\n memoryOperations: z.array(MemoryOperationSchema).optional(),\n })\n .refine(\n (s) => !(s.loop && s.branches),\n { message: \"step cannot have both 'loop' and 'branches'\" },\n ),\n);\n\n// ── ParsedRunbook(ドキュメント全体) ──\nexport const ParsedRunbookSchema = z.object({\n title: z.string(),\n naturalLanguageSummary: z.string().optional(),\n settings: z.object({\n baseUrl: z.string(),\n defaultTimeout: z.number().default(10000),\n pauseBetweenSteps: z.number().default(500),\n stopOnError: z.boolean().default(true),\n }),\n metadata: z.object({\n startUrl: z.string().min(1),\n goal: z.string(),\n goalAchieved: z.boolean(),\n totalSteps: z.number().int().nonnegative(),\n generatedAt: z.string(),\n skills: z.array(z.string()).optional(),\n }),\n steps: z.array(ParsedStepSchema).min(1),\n notes: z.string().optional(),\n context: z.string().default(\"\"),\n variables: z.record(z.string(), VariableDefinitionSchema).optional(),\n dataSource: DataSourceConfigSchema.optional(),\n});\n","/**\n * ElementSelectorSchema — 要素特定用セレクタ(優先度順フォールバック)\n *\n * @refrainai/contracts/runbook からインライン化。\n */\n\nimport { z } from \"zod\";\n\nexport const ElementSelectorSchema = z.object({\n /** id属性(最も信頼性が高い) */\n id: z.string().optional(),\n /** aria-label(アクセシビリティラベル) */\n ariaLabel: z.string().optional(),\n /** data-testid(テスト用ID) */\n dataTestId: z.string().optional(),\n /** その他のdata-*属性 */\n dataAttributes: z.record(z.string(), z.string()).optional(),\n /** CSSセレクタ */\n cssSelector: z.string().optional(),\n /** XPathセレクタ */\n xPath: z.string().optional(),\n /** label[for]のテキスト */\n labelText: z.string().optional(),\n /** 要素のinnerText */\n innerText: z.string().max(200).optional(),\n /** placeholder属性 */\n placeholder: z.string().optional(),\n /** name属性 */\n name: z.string().optional(),\n /** 位置ベースのフォールバック(最終手段) */\n rect: z\n .object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n })\n .optional(),\n /** タグ名(必須) */\n tagName: z.string(),\n /** role属性 */\n role: z.string().optional(),\n /** input要素のtype属性 */\n inputType: z.string().optional(),\n});\n\nexport type ElementSelector = z.infer<typeof ElementSelectorSchema>;\n"],"mappings":"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","names":["z","z"]}
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ extractVariableNames
4
+ } from "./chunk-D5SI2PHK.js";
5
+ import {
6
+ log
7
+ } from "./chunk-7UCVPKD4.js";
8
+ import {
9
+ getModel,
10
+ trackedGenerateText
11
+ } from "./chunk-UGPXCQY3.js";
12
+ import {
13
+ ParsedRunbookSchema
14
+ } from "./chunk-RT664YIO.js";
15
+
16
+ // src/fix-runbook/yaml-patcher.ts
17
+ import { parse } from "yaml";
18
+ var cliLogger = {
19
+ step: (msg) => log.step(msg),
20
+ info: (msg) => log.info(msg)
21
+ };
22
+ var noopLogger = {
23
+ step: () => {
24
+ },
25
+ info: () => {
26
+ }
27
+ };
28
+ async function generatePatchCore(originalYaml, suggestion, logger = noopLogger) {
29
+ logger.step(`Step #${suggestion.stepOrdinal} \u306E\u30D1\u30C3\u30C1\u3092\u751F\u6210\u4E2D...`);
30
+ try {
31
+ const { system, userPrompt } = buildPatchMessages(originalYaml, suggestion);
32
+ const { text } = await trackedGenerateText("review", {
33
+ model: getModel("review"),
34
+ messages: [
35
+ {
36
+ role: "system",
37
+ content: system,
38
+ providerOptions: {
39
+ anthropic: { cacheControl: { type: "ephemeral" } }
40
+ }
41
+ },
42
+ { role: "user", content: userPrompt }
43
+ ],
44
+ temperature: 0
45
+ });
46
+ const patchedYaml = extractYamlFromResponse(text);
47
+ if (!patchedYaml) {
48
+ logger.info("\u30D1\u30C3\u30C1\u751F\u6210\u5931\u6557");
49
+ return {
50
+ success: false,
51
+ patchedYaml: originalYaml,
52
+ error: "AI \u30EC\u30B9\u30DD\u30F3\u30B9\u304B\u3089 YAML \u3092\u62BD\u51FA\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F"
53
+ };
54
+ }
55
+ const validationError = validateYaml(patchedYaml);
56
+ if (validationError) {
57
+ logger.info("\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u5931\u6557");
58
+ return {
59
+ success: false,
60
+ patchedYaml: originalYaml,
61
+ error: `\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u30A8\u30E9\u30FC: ${validationError}`
62
+ };
63
+ }
64
+ const originalRefs = extractVariableNames(originalYaml);
65
+ const patchedRefs = extractVariableNames(patchedYaml);
66
+ const lostRefs = originalRefs.filter((r) => !patchedRefs.includes(r));
67
+ if (lostRefs.length > 0) {
68
+ logger.info(`\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u5909\u6570\u304C\u5931\u308F\u308C\u307E\u3057\u305F: ${lostRefs.join(", ")}`);
69
+ return {
70
+ success: false,
71
+ patchedYaml: originalYaml,
72
+ error: `\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u5909\u6570\u304C\u5931\u308F\u308C\u307E\u3057\u305F: ${lostRefs.join(", ")}`
73
+ };
74
+ }
75
+ logger.info("\u30D1\u30C3\u30C1\u751F\u6210\u5B8C\u4E86");
76
+ return { success: true, patchedYaml };
77
+ } catch (error) {
78
+ logger.info("\u30D1\u30C3\u30C1\u751F\u6210\u5931\u6557");
79
+ return {
80
+ success: false,
81
+ patchedYaml: originalYaml,
82
+ error: error instanceof Error ? error.message : String(error)
83
+ };
84
+ }
85
+ }
86
+ async function generatePatch(originalYaml, suggestion) {
87
+ return generatePatchCore(originalYaml, suggestion, cliLogger);
88
+ }
89
+ var PATCH_SYSTEM_PROMPT = [
90
+ "\u3042\u306A\u305F\u306F runbook YAML \u306E\u30D1\u30C3\u30C1\u751F\u6210\u30C4\u30FC\u30EB\u3067\u3059\u3002",
91
+ "\u4EE5\u4E0B\u306E\u4FEE\u6B63\u63D0\u6848\u306B\u57FA\u3065\u3044\u3066\u3001YAML \u3092\u4FEE\u6B63\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
92
+ "",
93
+ "## \u30EB\u30FC\u30EB",
94
+ "- \u4FEE\u6B63\u5BFE\u8C61\u30B9\u30C6\u30C3\u30D7\u4EE5\u5916\u306F\u4E00\u5207\u5909\u66F4\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044",
95
+ "- YAML \u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\uFF08\u30A4\u30F3\u30C7\u30F3\u30C8\u3001\u5F15\u7528\u7B26\u30B9\u30BF\u30A4\u30EB\u3001\u30B3\u30E1\u30F3\u30C8\u4F4D\u7F6E\uFF09\u3092\u3067\u304D\u308B\u9650\u308A\u7DAD\u6301\u3057\u3066\u304F\u3060\u3055\u3044",
96
+ "- \u4FEE\u6B63\u306F\u6700\u5C0F\u9650\u306B\u3057\u3066\u304F\u3060\u3055\u3044",
97
+ "- {{varName}} \u5F62\u5F0F\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u5909\u6570\u306F\u7D76\u5BFE\u306B\u5909\u66F4\u30FB\u524A\u9664\u30FB\u30A8\u30B9\u30B1\u30FC\u30D7\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002\u3053\u308C\u3089\u306F\u5B9F\u884C\u6642\u306B\u52D5\u7684\u306B\u5C55\u958B\u3055\u308C\u308B\u5909\u6570\u53C2\u7167\u3067\u3059",
98
+ "- \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u5909\u6570\u3092\u30EA\u30C6\u30E9\u30EB\u5024\uFF08\u4F8B: test@example.com\uFF09\u306B\u7F6E\u304D\u63DB\u3048\u306A\u3044\u3067\u304F\u3060\u3055\u3044",
99
+ "- \u51FA\u529B\u306F YAML \u306E\u307F\uFF08```yaml ... ``` \u3067\u56F2\u3093\u3067\u304F\u3060\u3055\u3044\uFF09",
100
+ "- \u8AAC\u660E\u3084\u30B3\u30E1\u30F3\u30C8\u306F\u4E0D\u8981\u3067\u3059"
101
+ ].join("\n");
102
+ function buildPatchMessages(originalYaml, suggestion) {
103
+ const parts = [
104
+ "## \u4FEE\u6B63\u5BFE\u8C61",
105
+ `- \u30B9\u30C6\u30C3\u30D7\u756A\u53F7: ${suggestion.stepOrdinal}`,
106
+ `- \u8AAC\u660E: ${suggestion.description}`,
107
+ `- \u30A8\u30E9\u30FC: ${suggestion.error}`
108
+ ];
109
+ if (suggestion.category) {
110
+ parts.push(`- \u30A8\u30E9\u30FC\u5206\u985E: ${suggestion.category}`);
111
+ }
112
+ if (suggestion.recoveryHint) {
113
+ parts.push(`- \u63A8\u5968\u5BFE\u5FDC: ${suggestion.recoveryHint}`);
114
+ }
115
+ if (suggestion.yamlFix) {
116
+ parts.push(`- \u4FEE\u6B63\u63D0\u6848: ${suggestion.yamlFix}`);
117
+ }
118
+ if (suggestion.currentSelector) {
119
+ parts.push(`- \u73FE\u5728\u306E\u30BB\u30EC\u30AF\u30BF: ${suggestion.currentSelector}`);
120
+ }
121
+ if (suggestion.lastSnapshotPreview) {
122
+ parts.push("");
123
+ parts.push("## \u6700\u7D42\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\uFF08\u30DA\u30FC\u30B8\u306E\u73FE\u5728\u306E\u72B6\u614B\uFF09");
124
+ parts.push("```");
125
+ parts.push(suggestion.lastSnapshotPreview);
126
+ parts.push("```");
127
+ }
128
+ parts.push("");
129
+ parts.push("## \u73FE\u5728\u306E YAML");
130
+ parts.push("```yaml");
131
+ parts.push(originalYaml);
132
+ parts.push("```");
133
+ return { system: PATCH_SYSTEM_PROMPT, userPrompt: parts.join("\n") };
134
+ }
135
+ function extractYamlFromResponse(response) {
136
+ const yamlMatch = response.match(/```ya?ml\n([\s\S]*?)```/);
137
+ if (yamlMatch) return yamlMatch[1].trim();
138
+ const codeMatch = response.match(/```\n([\s\S]*?)```/);
139
+ if (codeMatch) return codeMatch[1].trim();
140
+ try {
141
+ parse(response);
142
+ return response.trim();
143
+ } catch {
144
+ return null;
145
+ }
146
+ }
147
+ function validateYaml(yamlContent) {
148
+ try {
149
+ const doc = parse(yamlContent);
150
+ ParsedRunbookSchema.parse(doc);
151
+ return null;
152
+ } catch (error) {
153
+ if (error instanceof Error) {
154
+ return error.message.slice(0, 200);
155
+ }
156
+ return String(error);
157
+ }
158
+ }
159
+
160
+ export {
161
+ generatePatchCore,
162
+ generatePatch
163
+ };
164
+ //# sourceMappingURL=chunk-RYIJPYM3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fix-runbook/yaml-patcher.ts"],"sourcesContent":["/**\n * yaml-patcher — AI を使って runbook YAML を修正する\n *\n * 修正提案と現在の YAML を AI に渡し、パッチ済み YAML を生成する。\n * yaml パッケージの Document API でパースしバリデーションを行う。\n */\n\nimport { parse, stringify } from \"yaml\";\nimport { getModel, trackedGenerateText } from \"../harness/ai-model\";\nimport { ParsedRunbookSchema } from \"../schemas/runbook-schema\";\nimport { extractVariableNames } from \"../context/template-resolver\";\nimport { log } from \"../cli/prompts\";\nimport type { ExtractedSuggestion } from \"./report-parser\";\n\nexport interface PatchResult {\n success: boolean;\n patchedYaml: string;\n error?: string;\n}\n\n/** ロガーインターフェース(CLI / サーバーで差し替え可能) */\nexport interface PatchLogger {\n step(msg: string): void;\n info(msg: string): void;\n}\n\nconst cliLogger: PatchLogger = {\n step: (msg) => log.step(msg),\n info: (msg) => log.info(msg),\n};\n\nconst noopLogger: PatchLogger = {\n step: () => {},\n info: () => {},\n};\n\n/**\n * AI を使って YAML を修正する(コア関数)。\n * ロガーを引数で受け取り、CLI / サーバーの両方で使用可能。\n */\nexport async function generatePatchCore(\n originalYaml: string,\n suggestion: ExtractedSuggestion,\n logger: PatchLogger = noopLogger,\n): Promise<PatchResult> {\n logger.step(`Step #${suggestion.stepOrdinal} のパッチを生成中...`);\n\n try {\n const { system, userPrompt } = buildPatchMessages(originalYaml, suggestion);\n\n const { text } = await trackedGenerateText(\"review\", {\n model: getModel(\"review\"),\n messages: [\n {\n role: \"system\",\n content: system,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n { role: \"user\", content: userPrompt },\n ],\n temperature: 0,\n });\n\n // AI のレスポンスから YAML 部分を抽出\n const patchedYaml = extractYamlFromResponse(text);\n if (!patchedYaml) {\n logger.info(\"パッチ生成失敗\");\n return {\n success: false,\n patchedYaml: originalYaml,\n error: \"AI レスポンスから YAML を抽出できませんでした\",\n };\n }\n\n // バリデーション\n const validationError = validateYaml(patchedYaml);\n if (validationError) {\n logger.info(\"バリデーション失敗\");\n return {\n success: false,\n patchedYaml: originalYaml,\n error: `バリデーションエラー: ${validationError}`,\n };\n }\n\n // テンプレート変数の保全チェック\n const originalRefs = extractVariableNames(originalYaml);\n const patchedRefs = extractVariableNames(patchedYaml);\n const lostRefs = originalRefs.filter((r) => !patchedRefs.includes(r));\n if (lostRefs.length > 0) {\n logger.info(`テンプレート変数が失われました: ${lostRefs.join(\", \")}`);\n return {\n success: false,\n patchedYaml: originalYaml,\n error: `テンプレート変数が失われました: ${lostRefs.join(\", \")}`,\n };\n }\n\n logger.info(\"パッチ生成完了\");\n return { success: true, patchedYaml };\n } catch (error) {\n logger.info(\"パッチ生成失敗\");\n return {\n success: false,\n patchedYaml: originalYaml,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * AI を使って YAML を修正する(CLI 互換ラッパー)。\n * 修正後の YAML が ParsedRunbookSchema でバリデーションを通ることを確認。\n */\nexport async function generatePatch(\n originalYaml: string,\n suggestion: ExtractedSuggestion,\n): Promise<PatchResult> {\n return generatePatchCore(originalYaml, suggestion, cliLogger);\n}\n\n/** 静的な YAML パッチ用システムプロンプト(キャッシュ対象) */\nconst PATCH_SYSTEM_PROMPT = [\n \"あなたは runbook YAML のパッチ生成ツールです。\",\n \"以下の修正提案に基づいて、YAML を修正してください。\",\n \"\",\n \"## ルール\",\n \"- 修正対象ステップ以外は一切変更しないでください\",\n \"- YAML のフォーマット(インデント、引用符スタイル、コメント位置)をできる限り維持してください\",\n \"- 修正は最小限にしてください\",\n \"- {{varName}} 形式のテンプレート変数は絶対に変更・削除・エスケープしないでください。これらは実行時に動的に展開される変数参照です\",\n \"- テンプレート変数をリテラル値(例: test@example.com)に置き換えないでください\",\n \"- 出力は YAML のみ(```yaml ... ``` で囲んでください)\",\n \"- 説明やコメントは不要です\",\n].join(\"\\n\");\n\nfunction buildPatchMessages(originalYaml: string, suggestion: ExtractedSuggestion): { system: string; userPrompt: string } {\n const parts: string[] = [\n \"## 修正対象\",\n `- ステップ番号: ${suggestion.stepOrdinal}`,\n `- 説明: ${suggestion.description}`,\n `- エラー: ${suggestion.error}`,\n ];\n\n if (suggestion.category) {\n parts.push(`- エラー分類: ${suggestion.category}`);\n }\n if (suggestion.recoveryHint) {\n parts.push(`- 推奨対応: ${suggestion.recoveryHint}`);\n }\n if (suggestion.yamlFix) {\n parts.push(`- 修正提案: ${suggestion.yamlFix}`);\n }\n if (suggestion.currentSelector) {\n parts.push(`- 現在のセレクタ: ${suggestion.currentSelector}`);\n }\n if (suggestion.lastSnapshotPreview) {\n parts.push(\"\");\n parts.push(\"## 最終スナップショット(ページの現在の状態)\");\n parts.push(\"```\");\n parts.push(suggestion.lastSnapshotPreview);\n parts.push(\"```\");\n }\n\n parts.push(\"\");\n parts.push(\"## 現在の YAML\");\n parts.push(\"```yaml\");\n parts.push(originalYaml);\n parts.push(\"```\");\n\n return { system: PATCH_SYSTEM_PROMPT, userPrompt: parts.join(\"\\n\") };\n}\n\n/**\n * AI レスポンスから YAML コードブロックを抽出する。\n */\nfunction extractYamlFromResponse(response: string): string | null {\n // ```yaml ... ``` パターン\n const yamlMatch = response.match(/```ya?ml\\n([\\s\\S]*?)```/);\n if (yamlMatch) return yamlMatch[1].trim();\n\n // ``` ... ``` パターン(言語指定なし)\n const codeMatch = response.match(/```\\n([\\s\\S]*?)```/);\n if (codeMatch) return codeMatch[1].trim();\n\n // コードブロックなし — レスポンス全体が YAML の可能性\n try {\n parse(response);\n return response.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * パッチ済み YAML が有効な runbook かバリデーションする。\n */\nfunction validateYaml(yamlContent: string): string | null {\n try {\n const doc = parse(yamlContent);\n ParsedRunbookSchema.parse(doc);\n return null;\n } catch (error) {\n if (error instanceof Error) {\n return error.message.slice(0, 200);\n }\n return String(error);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/server/config.ts
4
+ function loadServerConfig() {
5
+ return {
6
+ port: parseIntEnv("PORT") ?? 3001,
7
+ databaseUrl: process.env.DATABASE_URL ?? "postgresql://refrain:refrain_dev@localhost:5433/refrain_dev",
8
+ redisUrl: process.env.REDIS_URL ?? "redis://localhost:6379",
9
+ corsOrigin: process.env.CORS_ORIGIN ?? "http://localhost:3000",
10
+ nodeEnv: process.env.NODE_ENV ?? "development",
11
+ betterAuthSecret: process.env.BETTER_AUTH_SECRET ?? "dev-secret-change-in-production",
12
+ betterAuthUrl: process.env.BETTER_AUTH_URL ?? process.env.CORS_ORIGIN ?? "http://localhost:3000",
13
+ githubClientId: process.env.GITHUB_CLIENT_ID,
14
+ githubClientSecret: process.env.GITHUB_CLIENT_SECRET,
15
+ googleClientId: process.env.GOOGLE_CLIENT_ID,
16
+ googleClientSecret: process.env.GOOGLE_CLIENT_SECRET,
17
+ microsoftClientId: process.env.MICROSOFT_CLIENT_ID,
18
+ microsoftClientSecret: process.env.MICROSOFT_CLIENT_SECRET,
19
+ inngestEventKey: process.env.INNGEST_EVENT_KEY,
20
+ inngestSigningKey: process.env.INNGEST_SIGNING_KEY,
21
+ resendApiKey: process.env.RESEND_API_KEY,
22
+ sendgridApiKey: process.env.SENDGRID_API_KEY,
23
+ emailProvider: process.env.EMAIL_PROVIDER ?? "resend",
24
+ emailFrom: process.env.EMAIL_FROM ?? "Refrain <noreply@therefrain.ai>",
25
+ encryptionKey: process.env.ENCRYPTION_KEY ?? // 開発用デフォルト(本番では必ず ENCRYPTION_KEY を設定すること)
26
+ "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
27
+ gcsBucket: process.env.GCS_ARTIFACTS_BUCKET
28
+ };
29
+ }
30
+ function parseIntEnv(key) {
31
+ const v = process.env[key];
32
+ if (!v) return void 0;
33
+ const n = Number.parseInt(v, 10);
34
+ return Number.isNaN(n) ? void 0 : n;
35
+ }
36
+
37
+ export {
38
+ loadServerConfig
39
+ };
40
+ //# sourceMappingURL=chunk-TDSM3UXI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/config.ts"],"sourcesContent":["export interface ServerConfig {\n port: number;\n databaseUrl: string;\n redisUrl: string;\n corsOrigin: string;\n nodeEnv: \"development\" | \"production\" | \"test\";\n betterAuthSecret: string;\n betterAuthUrl: string;\n githubClientId?: string;\n githubClientSecret?: string;\n googleClientId?: string;\n googleClientSecret?: string;\n microsoftClientId?: string;\n microsoftClientSecret?: string;\n inngestEventKey?: string;\n inngestSigningKey?: string;\n resendApiKey?: string;\n sendgridApiKey?: string;\n emailProvider: \"sendgrid\" | \"resend\";\n emailFrom: string;\n encryptionKey: string;\n gcsBucket?: string;\n}\n\nexport function loadServerConfig(): ServerConfig {\n return {\n port: parseIntEnv(\"PORT\") ?? 3001,\n databaseUrl:\n process.env.DATABASE_URL ??\n \"postgresql://refrain:refrain_dev@localhost:5433/refrain_dev\",\n redisUrl: process.env.REDIS_URL ?? \"redis://localhost:6379\",\n corsOrigin: process.env.CORS_ORIGIN ?? \"http://localhost:3000\",\n nodeEnv: (process.env.NODE_ENV ?? \"development\") as ServerConfig[\"nodeEnv\"],\n betterAuthSecret:\n process.env.BETTER_AUTH_SECRET ?? \"dev-secret-change-in-production\",\n betterAuthUrl: process.env.BETTER_AUTH_URL ?? process.env.CORS_ORIGIN ?? \"http://localhost:3000\",\n githubClientId: process.env.GITHUB_CLIENT_ID,\n githubClientSecret: process.env.GITHUB_CLIENT_SECRET,\n googleClientId: process.env.GOOGLE_CLIENT_ID,\n googleClientSecret: process.env.GOOGLE_CLIENT_SECRET,\n microsoftClientId: process.env.MICROSOFT_CLIENT_ID,\n microsoftClientSecret: process.env.MICROSOFT_CLIENT_SECRET,\n inngestEventKey: process.env.INNGEST_EVENT_KEY,\n inngestSigningKey: process.env.INNGEST_SIGNING_KEY,\n resendApiKey: process.env.RESEND_API_KEY,\n sendgridApiKey: process.env.SENDGRID_API_KEY,\n emailProvider:\n (process.env.EMAIL_PROVIDER as \"sendgrid\" | \"resend\" | undefined) ??\n \"resend\",\n emailFrom:\n process.env.EMAIL_FROM ?? \"Refrain <noreply@therefrain.ai>\",\n encryptionKey:\n process.env.ENCRYPTION_KEY ??\n // 開発用デフォルト(本番では必ず ENCRYPTION_KEY を設定すること)\n \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n gcsBucket: process.env.GCS_ARTIFACTS_BUCKET,\n };\n}\n\nfunction parseIntEnv(key: string): number | undefined {\n const v = process.env[key];\n if (!v) return undefined;\n const n = Number.parseInt(v, 10);\n return Number.isNaN(n) ? undefined : n;\n}\n"],"mappings":";;;AAwBO,SAAS,mBAAiC;AAC/C,SAAO;AAAA,IACL,MAAM,YAAY,MAAM,KAAK;AAAA,IAC7B,aACE,QAAQ,IAAI,gBACZ;AAAA,IACF,UAAU,QAAQ,IAAI,aAAa;AAAA,IACnC,YAAY,QAAQ,IAAI,eAAe;AAAA,IACvC,SAAU,QAAQ,IAAI,YAAY;AAAA,IAClC,kBACE,QAAQ,IAAI,sBAAsB;AAAA,IACpC,eAAe,QAAQ,IAAI,mBAAmB,QAAQ,IAAI,eAAe;AAAA,IACzE,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,oBAAoB,QAAQ,IAAI;AAAA,IAChC,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,oBAAoB,QAAQ,IAAI;AAAA,IAChC,mBAAmB,QAAQ,IAAI;AAAA,IAC/B,uBAAuB,QAAQ,IAAI;AAAA,IACnC,iBAAiB,QAAQ,IAAI;AAAA,IAC7B,mBAAmB,QAAQ,IAAI;AAAA,IAC/B,cAAc,QAAQ,IAAI;AAAA,IAC1B,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,eACG,QAAQ,IAAI,kBACb;AAAA,IACF,WACE,QAAQ,IAAI,cAAc;AAAA,IAC5B,eACE,QAAQ,IAAI;AAAA,IAEZ;AAAA,IACF,WAAW,QAAQ,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,YAAY,KAAiC;AACpD,QAAM,IAAI,QAAQ,IAAI,GAAG;AACzB,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,OAAO,SAAS,GAAG,EAAE;AAC/B,SAAO,OAAO,MAAM,CAAC,IAAI,SAAY;AACvC;","names":[]}