@jterrats/open-orchestra 0.5.5 → 1.0.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 (310) hide show
  1. package/AGENTS.md +9 -8
  2. package/CLAUDE.md +13 -11
  3. package/README.md +78 -11
  4. package/dist/assets/web-console.js +203 -36
  5. package/dist/automation-evidence.d.ts +23 -0
  6. package/dist/automation-evidence.js +97 -0
  7. package/dist/automation-evidence.js.map +1 -0
  8. package/dist/autonomous-run-state.d.ts +4 -1
  9. package/dist/autonomous-run-state.js +8 -2
  10. package/dist/autonomous-run-state.js.map +1 -1
  11. package/dist/autonomous-run-store.d.ts +3 -1
  12. package/dist/autonomous-run-store.js +9 -3
  13. package/dist/autonomous-run-store.js.map +1 -1
  14. package/dist/autonomous-workflow-constants.js +5 -1
  15. package/dist/autonomous-workflow-constants.js.map +1 -1
  16. package/dist/benchmark.d.ts +4 -1
  17. package/dist/benchmark.js +140 -19
  18. package/dist/benchmark.js.map +1 -1
  19. package/dist/cli.js +88 -2
  20. package/dist/cli.js.map +1 -1
  21. package/dist/collaboration-flows.js +5 -19
  22. package/dist/collaboration-flows.js.map +1 -1
  23. package/dist/collection-utils.d.ts +3 -0
  24. package/dist/collection-utils.js +10 -0
  25. package/dist/collection-utils.js.map +1 -0
  26. package/dist/command-manifest.d.ts +12 -1
  27. package/dist/command-manifest.js +218 -10
  28. package/dist/command-manifest.js.map +1 -1
  29. package/dist/commands.d.ts +14 -6
  30. package/dist/commands.js +78 -28
  31. package/dist/commands.js.map +1 -1
  32. package/dist/config-migrations.d.ts +24 -0
  33. package/dist/config-migrations.js +102 -0
  34. package/dist/config-migrations.js.map +1 -0
  35. package/dist/constants.d.ts +3 -0
  36. package/dist/constants.js +26 -0
  37. package/dist/constants.js.map +1 -1
  38. package/dist/cursor-canvas.d.ts +20 -0
  39. package/dist/cursor-canvas.js +119 -0
  40. package/dist/cursor-canvas.js.map +1 -0
  41. package/dist/dashboard-commands.d.ts +2 -0
  42. package/dist/dashboard-commands.js +14 -0
  43. package/dist/dashboard-commands.js.map +1 -0
  44. package/dist/defaults.d.ts +13 -0
  45. package/dist/defaults.js +13 -0
  46. package/dist/defaults.js.map +1 -1
  47. package/dist/delegation-decision.js +23 -8
  48. package/dist/delegation-decision.js.map +1 -1
  49. package/dist/delivery-commands.js +5 -0
  50. package/dist/delivery-commands.js.map +1 -1
  51. package/dist/delivery-dashboard-charts.d.ts +4 -0
  52. package/dist/delivery-dashboard-charts.js +156 -0
  53. package/dist/delivery-dashboard-charts.js.map +1 -0
  54. package/dist/delivery-dashboard-html.d.ts +2 -0
  55. package/dist/delivery-dashboard-html.js +115 -0
  56. package/dist/delivery-dashboard-html.js.map +1 -0
  57. package/dist/delivery-dashboard-types.d.ts +78 -0
  58. package/dist/delivery-dashboard-types.js +2 -0
  59. package/dist/delivery-dashboard-types.js.map +1 -0
  60. package/dist/delivery-dashboard.d.ts +8 -0
  61. package/dist/delivery-dashboard.js +124 -0
  62. package/dist/delivery-dashboard.js.map +1 -0
  63. package/dist/doc-sync.d.ts +25 -0
  64. package/dist/doc-sync.js +79 -0
  65. package/dist/doc-sync.js.map +1 -0
  66. package/dist/effort-classification.d.ts +7 -0
  67. package/dist/effort-classification.js +72 -0
  68. package/dist/effort-classification.js.map +1 -0
  69. package/dist/extension-commands.d.ts +3 -0
  70. package/dist/extension-commands.js +40 -0
  71. package/dist/extension-commands.js.map +1 -0
  72. package/dist/extensions.d.ts +22 -0
  73. package/dist/extensions.js +126 -0
  74. package/dist/extensions.js.map +1 -0
  75. package/dist/gemini-provider.d.ts +3 -6
  76. package/dist/gemini-provider.js +8 -17
  77. package/dist/gemini-provider.js.map +1 -1
  78. package/dist/github.d.ts +2 -0
  79. package/dist/github.js +15 -3
  80. package/dist/github.js.map +1 -1
  81. package/dist/health-checks.js +51 -0
  82. package/dist/health-checks.js.map +1 -1
  83. package/dist/lucid-story-map.d.ts +73 -0
  84. package/dist/lucid-story-map.js +112 -0
  85. package/dist/lucid-story-map.js.map +1 -0
  86. package/dist/mcp-integrations.d.ts +19 -0
  87. package/dist/mcp-integrations.js +58 -0
  88. package/dist/mcp-integrations.js.map +1 -0
  89. package/dist/mcp-tool-adapter.d.ts +21 -0
  90. package/dist/mcp-tool-adapter.js +56 -0
  91. package/dist/mcp-tool-adapter.js.map +1 -0
  92. package/dist/metrics-commands.js +47 -13
  93. package/dist/metrics-commands.js.map +1 -1
  94. package/dist/model-commands.d.ts +5 -0
  95. package/dist/model-commands.js +95 -1
  96. package/dist/model-commands.js.map +1 -1
  97. package/dist/model-providers.d.ts +5 -12
  98. package/dist/model-providers.js +30 -43
  99. package/dist/model-providers.js.map +1 -1
  100. package/dist/network-policy.d.ts +2 -0
  101. package/dist/network-policy.js +6 -0
  102. package/dist/network-policy.js.map +1 -0
  103. package/dist/ollama-provider.d.ts +3 -6
  104. package/dist/ollama-provider.js +7 -16
  105. package/dist/ollama-provider.js.map +1 -1
  106. package/dist/package-update-check.d.ts +19 -0
  107. package/dist/package-update-check.js +24 -0
  108. package/dist/package-update-check.js.map +1 -1
  109. package/dist/phase-executor.d.ts +1 -0
  110. package/dist/phase-executor.js +401 -9
  111. package/dist/phase-executor.js.map +1 -1
  112. package/dist/phase-playbooks.d.ts +18 -1
  113. package/dist/phase-playbooks.js +146 -2
  114. package/dist/phase-playbooks.js.map +1 -1
  115. package/dist/planning-commands.d.ts +1 -0
  116. package/dist/planning-commands.js +36 -36
  117. package/dist/planning-commands.js.map +1 -1
  118. package/dist/policy-commands.d.ts +2 -0
  119. package/dist/policy-commands.js +29 -0
  120. package/dist/policy-commands.js.map +1 -0
  121. package/dist/policy-defaults.d.ts +2 -0
  122. package/dist/policy-defaults.js +42 -0
  123. package/dist/policy-defaults.js.map +1 -0
  124. package/dist/policy.d.ts +20 -0
  125. package/dist/policy.js +155 -0
  126. package/dist/policy.js.map +1 -0
  127. package/dist/project-detection.js +9 -7
  128. package/dist/project-detection.js.map +1 -1
  129. package/dist/prompt-registry-update.d.ts +2 -0
  130. package/dist/prompt-registry-update.js +5 -1
  131. package/dist/prompt-registry-update.js.map +1 -1
  132. package/dist/prompt-registry-validation.d.ts +3 -0
  133. package/dist/prompt-registry-validation.js +61 -21
  134. package/dist/prompt-registry-validation.js.map +1 -1
  135. package/dist/provider-utils.d.ts +11 -0
  136. package/dist/provider-utils.js +14 -0
  137. package/dist/provider-utils.js.map +1 -1
  138. package/dist/qa-commands.d.ts +2 -0
  139. package/dist/qa-commands.js +18 -0
  140. package/dist/qa-commands.js.map +1 -0
  141. package/dist/qa-coverage.d.ts +24 -0
  142. package/dist/qa-coverage.js +189 -0
  143. package/dist/qa-coverage.js.map +1 -0
  144. package/dist/qa-readiness.d.ts +5 -0
  145. package/dist/qa-readiness.js +26 -0
  146. package/dist/qa-readiness.js.map +1 -0
  147. package/dist/refresh-generated.d.ts +32 -0
  148. package/dist/refresh-generated.js +180 -0
  149. package/dist/refresh-generated.js.map +1 -0
  150. package/dist/release-candidate.d.ts +9 -1
  151. package/dist/release-candidate.js +52 -1
  152. package/dist/release-candidate.js.map +1 -1
  153. package/dist/release-commands.js +161 -8
  154. package/dist/release-commands.js.map +1 -1
  155. package/dist/release-readiness.d.ts +33 -0
  156. package/dist/release-readiness.js +187 -3
  157. package/dist/release-readiness.js.map +1 -1
  158. package/dist/runtime-adapters.d.ts +2 -1
  159. package/dist/runtime-adapters.js +16 -0
  160. package/dist/runtime-adapters.js.map +1 -1
  161. package/dist/runtime-bootstrap.js +1 -1
  162. package/dist/runtime-bootstrap.js.map +1 -1
  163. package/dist/runtime-commands.d.ts +2 -0
  164. package/dist/runtime-commands.js +85 -3
  165. package/dist/runtime-commands.js.map +1 -1
  166. package/dist/runtime-execution-adapters.js +40 -0
  167. package/dist/runtime-execution-adapters.js.map +1 -1
  168. package/dist/runtime-execution-renderer.d.ts +3 -2
  169. package/dist/runtime-execution-renderer.js +46 -8
  170. package/dist/runtime-execution-renderer.js.map +1 -1
  171. package/dist/runtime-execution.d.ts +8 -2
  172. package/dist/runtime-execution.js +109 -11
  173. package/dist/runtime-execution.js.map +1 -1
  174. package/dist/runtime-guardrails.d.ts +26 -0
  175. package/dist/runtime-guardrails.js +168 -0
  176. package/dist/runtime-guardrails.js.map +1 -0
  177. package/dist/setup-agents-import.js +5 -3
  178. package/dist/setup-agents-import.js.map +1 -1
  179. package/dist/skills-catalog.js +1 -0
  180. package/dist/skills-catalog.js.map +1 -1
  181. package/dist/skills-commands.d.ts +5 -0
  182. package/dist/skills-commands.js +79 -2
  183. package/dist/skills-commands.js.map +1 -1
  184. package/dist/skills-memory.d.ts +36 -2
  185. package/dist/skills-memory.js +165 -6
  186. package/dist/skills-memory.js.map +1 -1
  187. package/dist/skills-planning.js +9 -22
  188. package/dist/skills-planning.js.map +1 -1
  189. package/dist/skills-render.js +2 -4
  190. package/dist/skills-render.js.map +1 -1
  191. package/dist/skills.d.ts +1 -1
  192. package/dist/skills.js +1 -1
  193. package/dist/skills.js.map +1 -1
  194. package/dist/sprint-commands.js +2 -1
  195. package/dist/sprint-commands.js.map +1 -1
  196. package/dist/subagent-protocol.js +3 -5
  197. package/dist/subagent-protocol.js.map +1 -1
  198. package/dist/support-commands.d.ts +2 -0
  199. package/dist/support-commands.js +18 -0
  200. package/dist/support-commands.js.map +1 -0
  201. package/dist/support-diagnostics.d.ts +49 -0
  202. package/dist/support-diagnostics.js +86 -0
  203. package/dist/support-diagnostics.js.map +1 -0
  204. package/dist/task-graph-commands.js +6 -14
  205. package/dist/task-graph-commands.js.map +1 -1
  206. package/dist/task-text.d.ts +8 -0
  207. package/dist/task-text.js +18 -0
  208. package/dist/task-text.js.map +1 -0
  209. package/dist/telemetry-redaction.js +8 -1
  210. package/dist/telemetry-redaction.js.map +1 -1
  211. package/dist/tool-commands.d.ts +3 -0
  212. package/dist/tool-commands.js +62 -0
  213. package/dist/tool-commands.js.map +1 -1
  214. package/dist/tracker-adapters.d.ts +71 -0
  215. package/dist/tracker-adapters.js +186 -0
  216. package/dist/tracker-adapters.js.map +1 -0
  217. package/dist/tracker-commands.d.ts +2 -0
  218. package/dist/tracker-commands.js +119 -0
  219. package/dist/tracker-commands.js.map +1 -0
  220. package/dist/types/metrics.d.ts +25 -1
  221. package/dist/types/model-config.d.ts +51 -4
  222. package/dist/types/runtime.d.ts +83 -0
  223. package/dist/types/skills.d.ts +2 -0
  224. package/dist/types/tasks.d.ts +10 -0
  225. package/dist/types/workflow-run.d.ts +35 -0
  226. package/dist/types.d.ts +12 -4
  227. package/dist/types.js.map +1 -1
  228. package/dist/upgrade-commands.js +13 -4
  229. package/dist/upgrade-commands.js.map +1 -1
  230. package/dist/validation.js +2 -2
  231. package/dist/validation.js.map +1 -1
  232. package/dist/visual-validation.d.ts +81 -0
  233. package/dist/visual-validation.js +290 -0
  234. package/dist/visual-validation.js.map +1 -0
  235. package/dist/web-action-security.d.ts +11 -0
  236. package/dist/web-action-security.js +45 -0
  237. package/dist/web-action-security.js.map +1 -0
  238. package/dist/web-api-read-routes.js +115 -3
  239. package/dist/web-api-read-routes.js.map +1 -1
  240. package/dist/web-api.js +507 -5
  241. package/dist/web-api.js.map +1 -1
  242. package/dist/web-artifacts.d.ts +55 -0
  243. package/dist/web-artifacts.js +222 -0
  244. package/dist/web-artifacts.js.map +1 -0
  245. package/dist/web-console/assets/index-C9lx-V42.css +1 -0
  246. package/dist/web-console/assets/index-M3S0g1GK.js +11 -0
  247. package/dist/web-console/index.html +13 -0
  248. package/dist/web-console.js +9 -3
  249. package/dist/web-console.js.map +1 -1
  250. package/dist/web-recovery.d.ts +30 -0
  251. package/dist/web-recovery.js +163 -0
  252. package/dist/web-recovery.js.map +1 -0
  253. package/dist/web-workflow-progress.d.ts +41 -0
  254. package/dist/web-workflow-progress.js +114 -0
  255. package/dist/web-workflow-progress.js.map +1 -0
  256. package/dist/workflow-approval-service.d.ts +2 -1
  257. package/dist/workflow-approval-service.js +83 -4
  258. package/dist/workflow-approval-service.js.map +1 -1
  259. package/dist/workflow-approval-utils.js +13 -3
  260. package/dist/workflow-approval-utils.js.map +1 -1
  261. package/dist/workflow-event-query.d.ts +2 -0
  262. package/dist/workflow-event-query.js +6 -0
  263. package/dist/workflow-event-query.js.map +1 -0
  264. package/dist/workflow-evidence-service.js +18 -9
  265. package/dist/workflow-evidence-service.js.map +1 -1
  266. package/dist/workflow-gates.d.ts +2 -0
  267. package/dist/workflow-gates.js +103 -0
  268. package/dist/workflow-gates.js.map +1 -1
  269. package/dist/workflow-markdown.d.ts +6 -0
  270. package/dist/workflow-markdown.js +25 -0
  271. package/dist/workflow-markdown.js.map +1 -0
  272. package/dist/workflow-phase-planner.d.ts +19 -0
  273. package/dist/workflow-phase-planner.js +133 -0
  274. package/dist/workflow-phase-planner.js.map +1 -0
  275. package/dist/workflow-run-commands.d.ts +1 -0
  276. package/dist/workflow-run-commands.js +247 -20
  277. package/dist/workflow-run-commands.js.map +1 -1
  278. package/dist/workflow-services.d.ts +21 -12
  279. package/dist/workflow-services.js +376 -260
  280. package/dist/workflow-services.js.map +1 -1
  281. package/dist/workflow-task-service.d.ts +11 -0
  282. package/dist/workflow-task-service.js +242 -0
  283. package/dist/workflow-task-service.js.map +1 -0
  284. package/dist/workflow-templates.js +2 -14
  285. package/dist/workflow-templates.js.map +1 -1
  286. package/dist/workspace-validator.js +133 -5
  287. package/dist/workspace-validator.js.map +1 -1
  288. package/dist/workspace.js +10 -2
  289. package/dist/workspace.js.map +1 -1
  290. package/docs/adoption-guide.md +147 -0
  291. package/docs/autonomous-workflow.md +146 -28
  292. package/docs/benchmark.md +17 -9
  293. package/docs/command-contracts.md +18 -1
  294. package/docs/core-command-surface.md +62 -13
  295. package/docs/end-to-end-demo.md +1 -0
  296. package/docs/extension-contracts.md +83 -0
  297. package/docs/orchestra-mvp.md +86 -3
  298. package/docs/persona-workflows.md +32 -0
  299. package/docs/release-test-matrix.md +42 -0
  300. package/docs/runtime-adapters.md +113 -0
  301. package/docs/runtime-llm-flow.md +13 -0
  302. package/docs/setup-agents-applicability-review.md +173 -0
  303. package/docs/skill-loading-strategy.md +1 -0
  304. package/docs/source-of-truth-and-agent-learning.md +14 -0
  305. package/docs/traceability-flow.md +5 -1
  306. package/docs/tracker-adapter-contract.md +10 -1
  307. package/docs/web-console-qa.md +35 -0
  308. package/package.json +12 -6
  309. package/rules/development-engineering.mdc +66 -0
  310. package/skills/doc-sync/SKILL.md +2 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=delivery-dashboard-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-dashboard-types.js","sourceRoot":"","sources":["../src/delivery-dashboard-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { DeliveryDashboard, DeliveryDashboardOptions } from "./delivery-dashboard-types.js";
2
+ import type { CliOptions } from "./types.js";
3
+ export declare function buildDeliveryDashboard(root: string): Promise<DeliveryDashboard>;
4
+ export declare function writeDeliveryDashboard(root: string, options?: DeliveryDashboardOptions): Promise<{
5
+ dashboard: DeliveryDashboard;
6
+ outputPath?: string;
7
+ }>;
8
+ export declare function dashboardOptions(options: CliOptions): DeliveryDashboardOptions;
@@ -0,0 +1,124 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { listAutonomousRuns } from "./autonomous-workflow.js";
5
+ import { computeBenchmark, listEstimates } from "./benchmark.js";
6
+ import { chartData, effortMetrics } from "./delivery-dashboard-charts.js";
7
+ import { renderDeliveryDashboardHtml } from "./delivery-dashboard-html.js";
8
+ import { ensureDir, exists, resolveWorkflowPath, resolveWorkspaceWritePath, } from "./fs-utils.js";
9
+ import { loadWorkspace, readEvents } from "./workspace.js";
10
+ import { getUsageReport } from "./workflow-services.js";
11
+ const DEFAULT_OUTPUT = "docs/dashboard.html";
12
+ export async function buildDeliveryDashboard(root) {
13
+ await assertDashboardState(root);
14
+ const [workspace, runs, events, estimates, usage] = await Promise.all([
15
+ loadWorkspace(root),
16
+ listAutonomousRuns(root),
17
+ readEvents(root),
18
+ listEstimates(root),
19
+ getUsageReport(undefined, root),
20
+ ]);
21
+ const benchmarks = await Promise.all(estimates.map((estimate) => computeBenchmark(root, estimate.taskId)));
22
+ return {
23
+ project: {
24
+ name: await projectName(root),
25
+ root,
26
+ generatedAt: new Date().toISOString(),
27
+ },
28
+ metrics: {
29
+ tasks: taskMetrics(workspace.tasks, benchmarks, runs.length),
30
+ effort: effortMetrics(benchmarks.map((story) => story.effortBreakdown)),
31
+ evidence: evidenceMetrics(events),
32
+ },
33
+ charts: chartData(workspace.tasks, benchmarks, runs, events),
34
+ stories: benchmarks.map((benchmark) => ({
35
+ taskId: benchmark.taskId,
36
+ status: benchmark.status,
37
+ sizingLabel: benchmark.sizingLabel,
38
+ actualHours: benchmark.actualHours,
39
+ classification: benchmark.effortBreakdown.classification,
40
+ effort: effortMetrics([benchmark.effortBreakdown]),
41
+ })),
42
+ usage,
43
+ };
44
+ }
45
+ export async function writeDeliveryDashboard(root, options = {}) {
46
+ const dashboard = await buildDeliveryDashboard(root);
47
+ if ((options.format ?? "html") === "json") {
48
+ return { dashboard };
49
+ }
50
+ const outputPath = resolveWorkspaceWritePath(root, options.output ?? DEFAULT_OUTPUT);
51
+ await ensureDir(path.dirname(outputPath));
52
+ await writeFile(outputPath, renderDeliveryDashboardHtml(dashboard), "utf8");
53
+ if (options.open)
54
+ openFile(outputPath);
55
+ return { dashboard, outputPath };
56
+ }
57
+ export function dashboardOptions(options) {
58
+ const format = typeof options.format === "string" ? options.format : "html";
59
+ if (format !== "html" && format !== "json") {
60
+ throw new Error("--format must be html or json");
61
+ }
62
+ return {
63
+ ...(typeof options.output === "string" ? { output: options.output } : {}),
64
+ format,
65
+ open: Boolean(options.open),
66
+ recalculateEffort: Boolean(options["recalculate-effort"]),
67
+ };
68
+ }
69
+ async function assertDashboardState(root) {
70
+ const required = ["tasks.json", "events.jsonl", "workflow-runs.jsonl"];
71
+ const missing = [];
72
+ for (const file of required) {
73
+ if (!(await exists(resolveWorkflowPath(root, file))))
74
+ missing.push(file);
75
+ }
76
+ if (missing.length > 0) {
77
+ throw new Error(`dashboard requires initialized workflow state: ${missing.join(", ")}`);
78
+ }
79
+ }
80
+ async function projectName(root) {
81
+ const packagePath = path.join(root, "package.json");
82
+ if (await exists(packagePath)) {
83
+ const pkg = JSON.parse(await readFile(packagePath, "utf8"));
84
+ if (pkg.name)
85
+ return pkg.name;
86
+ }
87
+ return path.basename(root);
88
+ }
89
+ function taskMetrics(tasks, benchmarks, workflowRuns) {
90
+ const done = tasks.filter((task) => task.status === "done").length;
91
+ const completedBenchmarks = benchmarks.filter((story) => story.actualHours !== null);
92
+ const avgCycleHours = completedBenchmarks.length > 0
93
+ ? roundHours(completedBenchmarks.reduce((sum, story) => sum + (story.actualHours ?? 0), 0) / completedBenchmarks.length)
94
+ : null;
95
+ return {
96
+ total: tasks.length,
97
+ done,
98
+ claimed: tasks.filter((task) => ["in_progress", "review", "approved"].includes(task.status)).length,
99
+ open: tasks.filter((task) => task.status !== "done").length,
100
+ completionPct: tasks.length > 0 ? Math.round((done / tasks.length) * 100) : 0,
101
+ avgCycleHours,
102
+ workflowRuns,
103
+ };
104
+ }
105
+ function evidenceMetrics(events) {
106
+ return {
107
+ count: events.filter((event) => event.type === "EVIDENCE_ADDED").length,
108
+ decisions: events.filter((event) => event.type === "DECISION_RECORDED")
109
+ .length,
110
+ };
111
+ }
112
+ function openFile(filePath) {
113
+ const command = process.platform === "darwin"
114
+ ? "open"
115
+ : process.platform === "win32"
116
+ ? "cmd"
117
+ : "xdg-open";
118
+ const args = process.platform === "win32" ? ["/c", "start", "", filePath] : [filePath];
119
+ spawnSync(command, args, { stdio: "ignore" });
120
+ }
121
+ function roundHours(value) {
122
+ return Math.round(value * 100) / 100;
123
+ }
124
+ //# sourceMappingURL=delivery-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-dashboard.js","sourceRoot":"","sources":["../src/delivery-dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { PromptRegistryFileName } from "./prompt-registry.js";
2
+ export interface DocSyncAuditOptions {
3
+ root?: string;
4
+ taskId?: string;
5
+ strict?: boolean;
6
+ }
7
+ export interface DocSyncPromptIssue {
8
+ severity: "warning" | "error";
9
+ path: string;
10
+ register: PromptRegistryFileName;
11
+ message: string;
12
+ recommendation: string;
13
+ }
14
+ export interface DocSyncLessonSuggestion {
15
+ path: string;
16
+ reason: string;
17
+ command: string;
18
+ }
19
+ export interface DocSyncAuditReport {
20
+ valid: boolean;
21
+ changedPaths: string[];
22
+ promptIssues: DocSyncPromptIssue[];
23
+ lessonSuggestions: DocSyncLessonSuggestion[];
24
+ }
25
+ export declare function auditDocSync(options?: DocSyncAuditOptions): Promise<DocSyncAuditReport>;
@@ -0,0 +1,79 @@
1
+ import { hasPromptRegistryCoverage, readPromptRegistryEntries, readRelevantPromptRegistryChangedPaths, } from "./prompt-registry-validation.js";
2
+ export async function auditDocSync(options = {}) {
3
+ const root = options.root ?? process.cwd();
4
+ const changedPaths = (await readRelevantPromptRegistryChangedPaths(root))
5
+ .filter(isDocumentationSyncPath)
6
+ .sort();
7
+ const entries = await readPromptRegistryEntries(root);
8
+ const promptIssues = changedPaths.flatMap((changedPath) => expectedDocSyncRegisters(changedPath).flatMap((register) => {
9
+ const registerEntries = entries.get(register) ?? [];
10
+ if (hasPromptRegistryCoverage(registerEntries, changedPath))
11
+ return [];
12
+ return [
13
+ buildPromptIssue({
14
+ changedPath,
15
+ register,
16
+ strict: options.strict ?? false,
17
+ }),
18
+ ];
19
+ }));
20
+ const lessonSuggestions = changedPaths.flatMap((changedPath) => lessonSuggestionForPath({
21
+ changedPath,
22
+ entries: expectedDocSyncRegisters(changedPath).flatMap((register) => entries.get(register) ?? []),
23
+ ...(options.taskId ? { taskId: options.taskId } : {}),
24
+ }));
25
+ return {
26
+ valid: !promptIssues.some((issue) => issue.severity === "error"),
27
+ changedPaths,
28
+ promptIssues,
29
+ lessonSuggestions,
30
+ };
31
+ }
32
+ function buildPromptIssue({ changedPath, register, strict, }) {
33
+ return {
34
+ severity: strict ? "error" : "warning",
35
+ path: changedPath,
36
+ register,
37
+ message: `doc-sync missing prompt registry coverage for ${changedPath}`,
38
+ recommendation: `Run orchestra prompts update --artifact "${changedPath}" --paths "${changedPath}" --register ${register.replace(".md", "")}`,
39
+ };
40
+ }
41
+ function lessonSuggestionForPath({ changedPath, entries, taskId, }) {
42
+ const matchedEntries = entries.filter((entry) => entry.includes(changedPath));
43
+ const hasRepeatedWork = matchedEntries.some((entry) => {
44
+ const iterations = /^- \*\*Iterations:\*\*\s+(\d+)$/m.exec(entry)?.[1];
45
+ return Number(iterations ?? "0") > 1;
46
+ });
47
+ if (!hasRepeatedWork)
48
+ return [];
49
+ const taskFlag = taskId ? ` --task ${taskId}` : "";
50
+ return [
51
+ {
52
+ path: changedPath,
53
+ reason: "This documentation artifact has multiple prompt iterations; capture a lesson if the change corrected a repeatable drift, missed evidence, or unclear architecture wording.",
54
+ command: `orchestra lessons assist${taskFlag} --role technical_writer --operation doc-sync --failed-action "repeat documentation correction for ${changedPath}" --error-signature "documentation rework pattern" --root-cause "<why the drift happened>" --fix "<what changed>" --prevention "<how to avoid it next time>" --applies-to "documentation,doc-sync" --verified-by "<validation command or review>"`,
55
+ },
56
+ ];
57
+ }
58
+ function isDocumentationSyncPath(path) {
59
+ const normalized = path.toLowerCase();
60
+ return (normalized === "readme.md" ||
61
+ normalized === "changelog.md" ||
62
+ normalized.startsWith("docs/") ||
63
+ normalized.startsWith("site/") ||
64
+ normalized.includes("architecture") ||
65
+ normalized.includes("diagram") ||
66
+ normalized.includes("mermaid") ||
67
+ normalized.endsWith(".mmd"));
68
+ }
69
+ function expectedDocSyncRegisters(path) {
70
+ const normalized = path.toLowerCase();
71
+ if (normalized.includes("architecture") ||
72
+ normalized.includes("diagram") ||
73
+ normalized.includes("mermaid") ||
74
+ normalized.endsWith(".mmd")) {
75
+ return ["diagrams.md"];
76
+ }
77
+ return ["docs.md"];
78
+ }
79
+ //# sourceMappingURL=doc-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-sync.js","sourceRoot":"","sources":["../src/doc-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { EstimateRecord, EffortBreakdown } from "./types/metrics.js";
2
+ import type { AutonomousRun, BenchmarkPhaseDuration } from "./types/workflow-run.js";
3
+ export declare function pendingEffortBreakdown(estimate: EstimateRecord): EffortBreakdown;
4
+ export declare function manualEffortBreakdown(estimate: EstimateRecord, timing: {
5
+ hours: number;
6
+ }): EffortBreakdown;
7
+ export declare function workflowEffortBreakdown(estimate: EstimateRecord, run: AutonomousRun, phaseDurations: BenchmarkPhaseDuration[]): EffortBreakdown;
@@ -0,0 +1,72 @@
1
+ export function pendingEffortBreakdown(estimate) {
2
+ return {
3
+ aiAutonomousMinutes: 0,
4
+ aiSupervisedMinutes: 0,
5
+ aiCalibrationBaselineMinutes: daysToMinutes(estimate.aiUnguidedEstimateDays),
6
+ humanReviewMinutes: 0,
7
+ humanManualMinutes: 0,
8
+ classification: "pending",
9
+ notes: [
10
+ "No completed run or task lifecycle duration exists yet.",
11
+ "AI calibration baseline comes from the declared ai-unguided estimate.",
12
+ ],
13
+ };
14
+ }
15
+ export function manualEffortBreakdown(estimate, timing) {
16
+ return {
17
+ aiAutonomousMinutes: 0,
18
+ aiSupervisedMinutes: 0,
19
+ aiCalibrationBaselineMinutes: daysToMinutes(estimate.aiUnguidedEstimateDays),
20
+ humanReviewMinutes: 0,
21
+ humanManualMinutes: roundMinutes(timing.hours * 60),
22
+ classification: "human_manual",
23
+ notes: [
24
+ "No completed workflow phase evidence was found, so lifecycle duration is classified as human manual effort.",
25
+ "AI calibration baseline comes from the declared ai-unguided estimate.",
26
+ ],
27
+ };
28
+ }
29
+ export function workflowEffortBreakdown(estimate, run, phaseDurations) {
30
+ const phaseMinutes = roundMinutes(phaseDurations.reduce((sum, phase) => sum + (phase.durationMs ?? 0), 0) /
31
+ 1000 /
32
+ 60);
33
+ const humanReviewMinutes = gateReviewMinutes(run);
34
+ const isAutonomous = run.gates === "none";
35
+ return {
36
+ aiAutonomousMinutes: isAutonomous ? phaseMinutes : 0,
37
+ aiSupervisedMinutes: isAutonomous ? 0 : phaseMinutes,
38
+ aiCalibrationBaselineMinutes: daysToMinutes(estimate.aiUnguidedEstimateDays),
39
+ humanReviewMinutes,
40
+ humanManualMinutes: 0,
41
+ classification: isAutonomous ? "ai_autonomous" : "ai_supervised",
42
+ notes: [
43
+ isAutonomous
44
+ ? "Workflow ran without human phase gates; phase time is classified as ai_autonomous."
45
+ : "Workflow used human phase gates; phase time is classified as ai_supervised and gate approval time is human_review.",
46
+ "Gate mode controls supervision checkpoints, not whether project rules, skills, and playbooks were available.",
47
+ "AI calibration baseline comes from the declared ai-unguided estimate.",
48
+ ],
49
+ };
50
+ }
51
+ function gateReviewMinutes(run) {
52
+ const totalMs = run.phases.reduce((sum, phase, index) => {
53
+ if (!phase.gateId || !phase.completedAt)
54
+ return sum;
55
+ const reviewEnd = phase.approvedAt ?? run.phases[index + 1]?.startedAt;
56
+ if (!reviewEnd)
57
+ return sum;
58
+ const started = new Date(phase.completedAt).getTime();
59
+ const ended = new Date(reviewEnd).getTime();
60
+ if (!Number.isFinite(started) || !Number.isFinite(ended))
61
+ return sum;
62
+ return sum + Math.max(0, ended - started);
63
+ }, 0);
64
+ return roundMinutes(totalMs / 1000 / 60);
65
+ }
66
+ function daysToMinutes(days) {
67
+ return Math.round(days * 24 * 60);
68
+ }
69
+ function roundMinutes(minutes) {
70
+ return Math.round(minutes * 100) / 100;
71
+ }
72
+ //# sourceMappingURL=effort-classification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort-classification.js","sourceRoot":"","sources":["../src/effort-classification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliIo, CliOptions } from "./types.js";
2
+ export declare function extensionsListCommand(options: CliOptions, io: CliIo): Promise<void>;
3
+ export declare function extensionsValidateCommand(options: CliOptions, io: CliIo): Promise<void>;
@@ -0,0 +1,40 @@
1
+ import { discoverExtensions } from "./extensions.js";
2
+ export async function extensionsListCommand(options, io) {
3
+ const extensions = await discoverExtensions();
4
+ if (options.json) {
5
+ io.log(JSON.stringify(extensions, null, 2));
6
+ return;
7
+ }
8
+ if (extensions.length === 0) {
9
+ io.log("No extensions discovered");
10
+ return;
11
+ }
12
+ for (const extension of extensions) {
13
+ io.log(`${extension.manifest?.id ?? extension.path}: ${extension.valid ? "valid" : "invalid"}`);
14
+ }
15
+ }
16
+ export async function extensionsValidateCommand(options, io) {
17
+ const extensions = await discoverExtensions();
18
+ const result = {
19
+ valid: extensions.every((extension) => extension.valid),
20
+ extensions,
21
+ };
22
+ if (options.json) {
23
+ io.log(JSON.stringify(result, null, 2));
24
+ }
25
+ else {
26
+ io.log(result.valid ? "Extensions valid" : "Extensions invalid");
27
+ for (const extension of extensions) {
28
+ for (const error of extension.errors) {
29
+ io.log(`ERROR ${extension.path}: ${error}`);
30
+ }
31
+ for (const warning of extension.warnings) {
32
+ io.log(`WARN ${extension.path}: ${warning}`);
33
+ }
34
+ }
35
+ }
36
+ if (!result.valid) {
37
+ throw new Error("extensions validation failed");
38
+ }
39
+ }
40
+ //# sourceMappingURL=extension-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-commands.js","sourceRoot":"","sources":["../src/extension-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAmB,EACnB,EAAS;IAET,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,EAAE,CAAC,GAAG,CACJ,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,SAAS,CAAC,IAAI,KACzC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAC9B,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAmB,EACnB,EAAS;IAET,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QACvD,UAAU;KACX,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACjE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrC,EAAE,CAAC,GAAG,CAAC,SAAS,SAAS,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACzC,EAAE,CAAC,GAAG,CAAC,QAAQ,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type ExtensionPoint = "skill" | "tracker-adapter" | "provider-adapter" | "phase-playbook" | "refresh-target";
2
+ export interface ExtensionManifest {
3
+ id: string;
4
+ name: string;
5
+ version: string;
6
+ compatibility: {
7
+ orchestra: string;
8
+ };
9
+ extensionPoints: ExtensionPoint[];
10
+ entry?: string;
11
+ capabilities?: string[];
12
+ riskAreas?: string[];
13
+ }
14
+ export interface ExtensionValidationResult {
15
+ valid: boolean;
16
+ manifest?: ExtensionManifest;
17
+ path: string;
18
+ errors: string[];
19
+ warnings: string[];
20
+ }
21
+ export declare function discoverExtensions(root?: string): Promise<ExtensionValidationResult[]>;
22
+ export declare function validateExtensionManifest(extensionPath: string): Promise<ExtensionValidationResult>;
@@ -0,0 +1,126 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readJson, resolveWorkflowPath } from "./fs-utils.js";
4
+ export async function discoverExtensions(root = process.cwd()) {
5
+ const base = resolveWorkflowPath(root, "extensions");
6
+ let entries;
7
+ try {
8
+ entries = await readdir(base);
9
+ }
10
+ catch {
11
+ return [];
12
+ }
13
+ const results = [];
14
+ for (const entry of entries.sort()) {
15
+ results.push(await validateExtensionManifest(path.join(base, entry)));
16
+ }
17
+ return results;
18
+ }
19
+ export async function validateExtensionManifest(extensionPath) {
20
+ const manifestPath = path.join(extensionPath, "manifest.json");
21
+ const errors = [];
22
+ const warnings = [];
23
+ const raw = await readJson(manifestPath, {});
24
+ const manifest = normalizeManifest(raw);
25
+ validateRequiredFields(raw, errors);
26
+ validateExtensionId(raw.id, errors);
27
+ validateExtensionPoints(raw.extensionPoints, errors);
28
+ validateCompatibility(raw.compatibility, warnings);
29
+ validateEntryPath(raw.entry, errors);
30
+ if (manifest.extensionPoints.includes("provider-adapter")) {
31
+ warnings.push("provider-adapter extensions are metadata-only until runtime provider loading is stabilized");
32
+ }
33
+ return {
34
+ valid: errors.length === 0,
35
+ manifest,
36
+ path: manifestPath,
37
+ errors,
38
+ warnings,
39
+ };
40
+ }
41
+ function normalizeManifest(raw) {
42
+ return {
43
+ id: stringValue(raw.id),
44
+ name: stringValue(raw.name),
45
+ version: stringValue(raw.version),
46
+ compatibility: {
47
+ orchestra: stringValue(isRecord(raw.compatibility) ? raw.compatibility.orchestra : undefined),
48
+ },
49
+ extensionPoints: Array.isArray(raw.extensionPoints)
50
+ ? raw.extensionPoints.filter(isExtensionPoint)
51
+ : [],
52
+ ...(typeof raw.entry === "string" ? { entry: raw.entry } : {}),
53
+ ...(Array.isArray(raw.capabilities)
54
+ ? { capabilities: raw.capabilities.filter(isString) }
55
+ : {}),
56
+ ...(Array.isArray(raw.riskAreas)
57
+ ? { riskAreas: raw.riskAreas.filter(isString) }
58
+ : {}),
59
+ };
60
+ }
61
+ function validateRequiredFields(raw, errors) {
62
+ for (const field of [
63
+ "id",
64
+ "name",
65
+ "version",
66
+ "compatibility",
67
+ "extensionPoints",
68
+ ]) {
69
+ if (!(field in raw))
70
+ errors.push(`manifest missing ${field}`);
71
+ }
72
+ if (!isRecord(raw.compatibility) || !isString(raw.compatibility.orchestra)) {
73
+ errors.push("manifest compatibility.orchestra is required");
74
+ }
75
+ }
76
+ function validateExtensionId(value, errors) {
77
+ if (!isString(value) || !/^[a-z0-9][a-z0-9._-]{1,62}$/i.test(value)) {
78
+ errors.push("manifest id must be 2-63 characters using letters, numbers, dots, underscores, or dashes");
79
+ }
80
+ }
81
+ function validateExtensionPoints(value, errors) {
82
+ if (!Array.isArray(value) || value.length === 0) {
83
+ errors.push("manifest extensionPoints must include at least one extension point");
84
+ return;
85
+ }
86
+ const invalid = value.filter((item) => !isExtensionPoint(item));
87
+ if (invalid.length > 0) {
88
+ errors.push(`unsupported extension point(s): ${invalid.join(", ")}`);
89
+ }
90
+ }
91
+ function validateCompatibility(value, warnings) {
92
+ const orchestra = isRecord(value) ? stringValue(value.orchestra) : "";
93
+ if (!orchestra)
94
+ return;
95
+ if (!/^(\^|>=)?(0\.5|1\.0)/.test(orchestra)) {
96
+ warnings.push(`compatibility.orchestra ${orchestra} is outside the documented 0.5/1.0 contract range`);
97
+ }
98
+ }
99
+ function validateEntryPath(value, errors) {
100
+ if (value === undefined)
101
+ return;
102
+ if (!isString(value)) {
103
+ errors.push("manifest entry must be a relative path");
104
+ return;
105
+ }
106
+ if (path.isAbsolute(value) || value.split(/[\\/]/).includes("..")) {
107
+ errors.push("manifest entry must stay inside the extension directory");
108
+ }
109
+ }
110
+ function isExtensionPoint(value) {
111
+ return (value === "skill" ||
112
+ value === "tracker-adapter" ||
113
+ value === "provider-adapter" ||
114
+ value === "phase-playbook" ||
115
+ value === "refresh-target");
116
+ }
117
+ function isRecord(value) {
118
+ return typeof value === "object" && value !== null;
119
+ }
120
+ function isString(value) {
121
+ return typeof value === "string" && value.trim() !== "";
122
+ }
123
+ function stringValue(value) {
124
+ return isString(value) ? value : "";
125
+ }
126
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,10 @@
1
+ import { type ModelProviderRuntimeOptions } from "./provider-utils.js";
1
2
  import type { ModelProvider, ModelProviderCapabilities, ModelRequest, ModelResponse } from "./types.js";
2
3
  export declare class GeminiModelProvider implements ModelProvider {
3
4
  readonly id = "gemini";
4
5
  readonly capabilities: ModelProviderCapabilities;
5
- private readonly fetchFn;
6
- private readonly env;
7
- constructor({ fetchFn, env, }?: {
8
- fetchFn?: typeof fetch;
9
- env?: NodeJS.ProcessEnv;
10
- });
6
+ private readonly runtime;
7
+ constructor(options?: ModelProviderRuntimeOptions);
11
8
  complete(request: ModelRequest): Promise<ModelResponse>;
12
9
  private sendRequest;
13
10
  }
@@ -1,26 +1,17 @@
1
- import { apiKeyFromEnvFile, joinUrlPath, numberFrom, stringFrom, } from "./provider-utils.js";
1
+ import { apiKeyFromEnvFile, joinUrlPath, modelProviderCapabilities, modelProviderRuntime, numberFrom, stringFrom, } from "./provider-utils.js";
2
2
  export class GeminiModelProvider {
3
3
  id = "gemini";
4
- capabilities = {
5
- streaming: false,
6
- tools: false,
7
- vision: false,
8
- jsonMode: true,
9
- maxContextTokens: 0,
10
- timeoutMs: 30000,
11
- };
12
- fetchFn;
13
- env;
14
- constructor({ fetchFn = fetch, env = process.env, } = {}) {
15
- this.fetchFn = fetchFn;
16
- this.env = env;
4
+ capabilities = modelProviderCapabilities();
5
+ runtime;
6
+ constructor(options = {}) {
7
+ this.runtime = modelProviderRuntime(options);
17
8
  }
18
9
  async complete(request) {
19
- const apiKey = geminiApiKey(this.env);
10
+ const apiKey = geminiApiKey(this.runtime.env);
20
11
  if (!apiKey) {
21
12
  throw new Error("GEMINI_API_KEY is required for provider gemini");
22
13
  }
23
- const endpoint = geminiGenerateContentEndpoint(this.env.GEMINI_BASE_URL, request.model);
14
+ const endpoint = geminiGenerateContentEndpoint(this.runtime.env.GEMINI_BASE_URL, request.model);
24
15
  const response = await this.sendRequest(endpoint, apiKey, request, geminiRequestBody(request));
25
16
  const finalResponse = response.status === 403 && request.jsonMode
26
17
  ? await this.sendRequest(endpoint, apiKey, request, geminiRequestBody(request, { responseMimeType: false }))
@@ -42,7 +33,7 @@ export class GeminiModelProvider {
42
33
  };
43
34
  }
44
35
  async sendRequest(endpoint, apiKey, request, body) {
45
- return this.fetchFn(endpoint, {
36
+ return this.runtime.fetchFn(endpoint, {
46
37
  method: "POST",
47
38
  headers: {
48
39
  "x-goog-api-key": apiKey,