{"version":3,"file":"ultraplan.d.ts","sourceRoot":"","sources":["../../src/core/ultraplan.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,6BAA6B,sBAAsB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,gBAAgB,CAAC;IAC9B,YAAY,EAAE,SAAS,CAAC;IACxB,cAAc,EAAE,WAAW,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,uBAAuB,GAAG,mBAAmB,GAAG,MAAM,CAAC;CAC/D;AAqDD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CA0BvF;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAA2B,GAAG,iBAAiB,CAqBpH;AASD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,uBAAuB,CAqB9F;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAyB3E;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAMzF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,KAAK,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E,GAAG,MAAM,CA0CT;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,WAAW,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,KAAK,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E,GAAG,MAAM,CAiDT","sourcesContent":["export const SESSION_ULTRAPLAN_CUSTOM_TYPE = \"session_ultraplan\";\n\nexport interface UltraplanPhase {\n\ttitle: string;\n\tsteps: string[];\n}\n\nexport interface UltraplanArtifact {\n\tversion: 1;\n\tplannerMode: \"local_subagent\";\n\tplannerAgent: \"planner\";\n\texecutionState: \"plan_only\";\n\tobjective: string;\n\tassumptions: string[];\n\tconstraints: string[];\n\tphases: UltraplanPhase[];\n\trisks: string[];\n\trecommendedExecutionOrder: string[];\n\tactionableNextSteps: string[];\n\tcreatedAt: string;\n}\n\nexport interface UltraplanRunResult {\n\tartifact: UltraplanArtifact;\n\tdisplayText: string;\n\trawPlannerOutput: string;\n}\n\nexport interface UltraplanApplySelection {\n\tsteps: string[];\n\tsource: \"actionable_next_steps\" | \"first_phase_steps\" | \"none\";\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\treturn value.map((entry) => normalizeString(entry)).filter((entry): entry is string => entry !== undefined);\n}\n\nfunction normalizePhases(value: unknown): UltraplanPhase[] {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\n\treturn value\n\t\t.map((entry) => {\n\t\t\tif (typeof entry !== \"object\" || entry === null) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst candidate = entry as Record<string, unknown>;\n\t\t\tconst title = normalizeString(candidate.title);\n\t\t\tconst steps = normalizeStringArray(candidate.steps);\n\t\t\tif (!title || steps.length === 0) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn { title, steps } satisfies UltraplanPhase;\n\t\t})\n\t\t.filter((entry): entry is UltraplanPhase => entry !== undefined);\n}\n\nfunction extractJsonCandidate(text: string): string {\n\tconst fencedMatch = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/u);\n\tif (fencedMatch?.[1]) {\n\t\treturn fencedMatch[1].trim();\n\t}\n\n\tconst firstBrace = text.indexOf(\"{\");\n\tconst lastBrace = text.lastIndexOf(\"}\");\n\tif (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {\n\t\treturn text.slice(firstBrace, lastBrace + 1);\n\t}\n\n\treturn text.trim();\n}\n\nexport function parseUltraplanArtifactData(data: unknown): UltraplanArtifact | undefined {\n\tif (typeof data !== \"object\" || data === null) {\n\t\treturn undefined;\n\t}\n\n\tconst candidate = data as Record<string, unknown>;\n\tconst objective = normalizeString(candidate.objective);\n\tconst phases = normalizePhases(candidate.phases);\n\tif (!objective || phases.length === 0) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tversion: 1,\n\t\tplannerMode: \"local_subagent\",\n\t\tplannerAgent: \"planner\",\n\t\texecutionState: \"plan_only\",\n\t\tobjective,\n\t\tassumptions: normalizeStringArray(candidate.assumptions),\n\t\tconstraints: normalizeStringArray(candidate.constraints),\n\t\tphases,\n\t\trisks: normalizeStringArray(candidate.risks),\n\t\trecommendedExecutionOrder: normalizeStringArray(candidate.recommendedExecutionOrder),\n\t\tactionableNextSteps: normalizeStringArray(candidate.actionableNextSteps),\n\t\tcreatedAt: normalizeString(candidate.createdAt) ?? new Date().toISOString(),\n\t};\n}\n\nexport function parseUltraplanArtifactFromText(text: string, createdAt = new Date().toISOString()): UltraplanArtifact {\n\tconst jsonCandidate = extractJsonCandidate(text);\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(jsonCandidate);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Planner returned invalid Ultraplan JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n\n\tconst artifact = parseUltraplanArtifactData({\n\t\t...(typeof parsed === \"object\" && parsed !== null ? parsed : {}),\n\t\tcreatedAt,\n\t});\n\tif (!artifact) {\n\t\tthrow new Error(\n\t\t\t\"Planner returned an invalid Ultraplan artifact. Expected objective, phases, and structured planning sections.\",\n\t\t);\n\t}\n\treturn artifact;\n}\n\nfunction formatSection(title: string, items: string[]): string {\n\tif (items.length === 0) {\n\t\treturn `${title}\\n- (none)`;\n\t}\n\treturn `${title}\\n${items.map((item) => `- ${item}`).join(\"\\n\")}`;\n}\n\nexport function selectUltraplanApplySteps(artifact: UltraplanArtifact): UltraplanApplySelection {\n\tconst actionableNextSteps = Array.from(new Set(artifact.actionableNextSteps));\n\tif (actionableNextSteps.length > 0) {\n\t\treturn {\n\t\t\tsteps: actionableNextSteps,\n\t\t\tsource: \"actionable_next_steps\",\n\t\t};\n\t}\n\n\tconst firstPhaseSteps = Array.from(new Set(artifact.phases[0]?.steps ?? []));\n\tif (firstPhaseSteps.length > 0) {\n\t\treturn {\n\t\t\tsteps: firstPhaseSteps,\n\t\t\tsource: \"first_phase_steps\",\n\t\t};\n\t}\n\n\treturn {\n\t\tsteps: [],\n\t\tsource: \"none\",\n\t};\n}\n\nexport function formatUltraplanArtifact(artifact: UltraplanArtifact): string {\n\tconst phaseLines = artifact.phases.flatMap((phase, index) => {\n\t\treturn [`${index + 1}. ${phase.title}`, ...phase.steps.map((step) => `   - ${step}`)];\n\t});\n\n\treturn [\n\t\t\"Ultraplan\",\n\t\t\"\",\n\t\t`Objective: ${artifact.objective}`,\n\t\t`Planner mode: local planner subagent (${artifact.plannerAgent})`,\n\t\t\"Execution: planning only; no execution has started\",\n\t\t`Stored: ${artifact.createdAt}`,\n\t\t\"\",\n\t\tformatSection(\"Assumptions\", artifact.assumptions),\n\t\t\"\",\n\t\tformatSection(\"Constraints\", artifact.constraints),\n\t\t\"\",\n\t\tphaseLines.length > 0 ? `Phases\\n${phaseLines.join(\"\\n\")}` : \"Phases\\n- (none)\",\n\t\t\"\",\n\t\tformatSection(\"Risks / blockers\", artifact.risks),\n\t\t\"\",\n\t\tformatSection(\"Recommended execution order\", artifact.recommendedExecutionOrder),\n\t\t\"\",\n\t\tformatSection(\"Actionable next steps\", artifact.actionableNextSteps),\n\t].join(\"\\n\");\n}\n\nexport function formatUltraplanShowOutput(artifact: UltraplanArtifact | undefined): string {\n\tif (!artifact) {\n\t\treturn \"No persisted Ultraplan plan found for the current session branch.\";\n\t}\n\n\treturn `${formatUltraplanArtifact(artifact)}\\n\\nPersisted as session-owned Ultraplan state on the current branch.`;\n}\n\nexport function buildUltraplanPlannerTask(options: {\n\tobjective: string;\n\tmemoryItems: readonly { key: string; value: string }[];\n\ttodos: ReadonlyArray<{ content: string; activeForm: string; status: string }>;\n}): string {\n\tconst memoryLines =\n\t\toptions.memoryItems.length > 0\n\t\t\t? options.memoryItems.map((item) => `- ${item.key}: ${item.value}`).join(\"\\n\")\n\t\t\t: \"- (none)\";\n\tconst todoLines =\n\t\toptions.todos.length > 0\n\t\t\t? options.todos.map((todo) => `- [${todo.status}] ${todo.content} | active: ${todo.activeForm}`).join(\"\\n\")\n\t\t\t: \"- (none)\";\n\n\treturn [\n\t\t\"Ultraplan task: produce a high-budget local execution plan only.\",\n\t\t\"Do not execute work.\",\n\t\t\"Do not suggest remote/background/session-URL/web-polling architecture.\",\n\t\t\"Do not widen into orchestration or automatic apply behavior.\",\n\t\t\"Return strict JSON only. No markdown fences. No prose before or after the JSON.\",\n\t\t\"\",\n\t\t`Objective: ${options.objective}`,\n\t\t\"\",\n\t\t\"Current persisted session memory:\",\n\t\tmemoryLines,\n\t\t\"\",\n\t\t\"Current persisted todo state:\",\n\t\ttodoLines,\n\t\t\"\",\n\t\t\"Required JSON shape:\",\n\t\t\"{\",\n\t\t'  \"objective\": \"string\",',\n\t\t'  \"assumptions\": [\"string\"],',\n\t\t'  \"constraints\": [\"string\"],',\n\t\t'  \"phases\": [{ \"title\": \"string\", \"steps\": [\"string\"] }],',\n\t\t'  \"risks\": [\"string\"],',\n\t\t'  \"recommendedExecutionOrder\": [\"string\"],',\n\t\t'  \"actionableNextSteps\": [\"string\"]',\n\t\t\"}\",\n\t\t\"\",\n\t\t\"Rules:\",\n\t\t\"- Keep the plan explicit, local-first, and user-triggered.\",\n\t\t\"- Include concrete constraints and blockers, not generic filler.\",\n\t\t\"- Make phases actionable enough to guide later manual execution.\",\n\t\t\"- Actionable next steps are planning outputs only; they are not executed.\",\n\t].join(\"\\n\");\n}\n\n/**\n * Build a planner task for revising an existing Ultraplan artifact.\n * The revision instruction guides how to modify the existing plan.\n */\nexport function buildUltraplanRevisionTask(options: {\n\tinstruction: string;\n\texistingArtifact: UltraplanArtifact;\n\tmemoryItems: readonly { key: string; value: string }[];\n\ttodos: ReadonlyArray<{ content: string; activeForm: string; status: string }>;\n}): string {\n\tconst memoryLines =\n\t\toptions.memoryItems.length > 0\n\t\t\t? options.memoryItems.map((item) => `- ${item.key}: ${item.value}`).join(\"\\n\")\n\t\t\t: \"- (none)\";\n\tconst todoLines =\n\t\toptions.todos.length > 0\n\t\t\t? options.todos.map((todo) => `- [${todo.status}] ${todo.content} | active: ${todo.activeForm}`).join(\"\\n\")\n\t\t\t: \"- (none)\";\n\n\treturn [\n\t\t\"Ultraplan revision task: revise an existing local execution plan based on the provided instruction.\",\n\t\t\"Do not execute work.\",\n\t\t\"Do not suggest remote/background/session-URL/web-polling architecture.\",\n\t\t\"Do not widen into orchestration or automatic apply behavior.\",\n\t\t\"Return strict JSON only. No markdown fences. No prose before or after the JSON.\",\n\t\t\"\",\n\t\t`Revision instruction: ${options.instruction}`,\n\t\t\"\",\n\t\t\"Existing persisted plan artifact (JSON) to revise:\",\n\t\tJSON.stringify(options.existingArtifact, null, 2),\n\t\t\"\",\n\t\t\"Human-readable summary of the existing plan:\",\n\t\tformatUltraplanArtifact(options.existingArtifact),\n\t\t\"\",\n\t\t\"Current persisted session memory:\",\n\t\tmemoryLines,\n\t\t\"\",\n\t\t\"Current persisted todo state:\",\n\t\ttodoLines,\n\t\t\"\",\n\t\t\"Required JSON shape:\",\n\t\t\"{\",\n\t\t'  \"objective\": \"string\",',\n\t\t'  \"assumptions\": [\"string\"],',\n\t\t'  \"constraints\": [\"string\"],',\n\t\t'  \"phases\": [{ \"title\": \"string\", \"steps\": [\"string\"] }],',\n\t\t'  \"risks\": [\"string\"],',\n\t\t'  \"recommendedExecutionOrder\": [\"string\"],',\n\t\t'  \"actionableNextSteps\": [\"string\"]',\n\t\t\"}\",\n\t\t\"\",\n\t\t\"Rules:\",\n\t\t\"- Apply the revision instruction to update the existing plan.\",\n\t\t\"- Keep the plan explicit, local-first, and user-triggered.\",\n\t\t\"- Include concrete constraints and blockers, not generic filler.\",\n\t\t\"- Make phases actionable enough to guide later manual execution.\",\n\t\t\"- Actionable next steps are planning outputs only; they are not executed.\",\n\t].join(\"\\n\");\n}\n"]}