@runfusion/fusion 0.28.0 → 0.29.0

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/bin.js +3126 -1051
  2. package/dist/client/assets/AgentDetailView-CWyOv8HJ.js +18 -0
  3. package/dist/client/assets/{AgentDetailView-DSpIqBOs.css → AgentDetailView-ChIKbcEi.css} +1 -1
  4. package/dist/client/assets/AgentsView-BI_CESkd.css +1 -0
  5. package/dist/client/assets/AgentsView-DljrBNE1.js +34 -0
  6. package/dist/client/assets/ChatView-BklDUi5_.js +1 -0
  7. package/dist/client/assets/{DevServerView-Diw4hjw0.js → DevServerView-BqcI1wXr.js} +1 -1
  8. package/dist/client/assets/{DirectoryPicker-CWSApoLU.js → DirectoryPicker-Bb3TIWEa.js} +1 -1
  9. package/dist/client/assets/{DocumentsView-1kr0dhsV.js → DocumentsView-BhrdTTh3.js} +1 -1
  10. package/dist/client/assets/{EvalsView-cDfXYiK6.js → EvalsView-DrFp2cLg.js} +1 -1
  11. package/dist/client/assets/{ExperimentalAgentOnboardingModal-lNSf6UtY.js → ExperimentalAgentOnboardingModal-AsmRLMxm.js} +1 -1
  12. package/dist/client/assets/ExperimentalAgentOnboardingModal-BNpveCEk.css +1 -0
  13. package/dist/client/assets/{InsightsView-D2AjxOnu.js → InsightsView-j7J_vUME.js} +1 -1
  14. package/dist/client/assets/{MemoryView-Dq4yjIPI.js → MemoryView-QWiqVDuQ.js} +2 -2
  15. package/dist/client/assets/{NodesView-Cpmkze7n.js → NodesView-Cr4CXr7b.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-oi9FHT0y.js → PiExtensionsManager-CPZ-82Wl.js} +2 -2
  17. package/dist/client/assets/PluginManager-BJQXdUmV.css +1 -0
  18. package/dist/client/assets/{PluginManager-o12KG4e8.js → PluginManager-DShC4UiM.js} +1 -1
  19. package/dist/client/assets/{ResearchView-C9bjVB7-.js → ResearchView-B5wYC1KE.js} +1 -1
  20. package/dist/client/assets/{SettingsModal-CT01a5Rh.js → SettingsModal-8l8vfXns.js} +1 -1
  21. package/dist/client/assets/SettingsModal-BAx4gt2A.css +1 -0
  22. package/dist/client/assets/SettingsModal-CYetgxZj.js +31 -0
  23. package/dist/client/assets/SettingsModal-ChnabMhF.css +1 -0
  24. package/dist/client/assets/{SetupWizardModal-Agi3XNtZ.js → SetupWizardModal-_IK6hTA7.js} +1 -1
  25. package/dist/client/assets/SkillsView-CUbSBeZ2.css +1 -0
  26. package/dist/client/assets/{SkillsView-DmZfbGLs.js → SkillsView-Dilmj1nh.js} +1 -1
  27. package/dist/client/assets/{StashRecoveryView-BwKJQaUW.js → StashRecoveryView-BtL9aAn3.js} +1 -1
  28. package/dist/client/assets/{TodoView-uJRg4Cnl.js → TodoView-rSn0aPsb.js} +1 -1
  29. package/dist/client/assets/{dashboard-view-C7Snlgow.js → dashboard-view-C_G8JVU7.js} +1 -1
  30. package/dist/client/assets/{folder-open-DU-Ec_iC.js → folder-open-Bq_TweLR.js} +1 -1
  31. package/dist/client/assets/index-DjfAYMGG.css +1 -0
  32. package/dist/client/assets/index-tbwUVj8p.js +696 -0
  33. package/dist/client/assets/{star-Qi0GspVN.js → star-Dn0V0Cnq.js} +1 -1
  34. package/dist/client/assets/{upload-Dx_l9Vbu.js → upload-D1y22Www.js} +1 -1
  35. package/dist/client/assets/{users-3Qw_TMah.js → users-UQdBpweI.js} +1 -1
  36. package/dist/client/index.html +2 -2
  37. package/dist/client/version.json +1 -1
  38. package/dist/droid-cli/package.json +1 -1
  39. package/dist/extension.js +2499 -656
  40. package/dist/pi-claude-cli/package.json +1 -1
  41. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  42. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/registration.test.ts +20 -3
  43. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/workflow-integration.test.ts +103 -8
  44. package/dist/plugins/fusion-plugin-cli-printing-press/src/index.ts +4 -0
  45. package/dist/plugins/fusion-plugin-cli-printing-press/src/workflow-steps.ts +14 -0
  46. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  47. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  48. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  50. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  52. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  54. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  55. package/package.json +1 -1
  56. package/skill/fusion/references/extension-tools.md +5 -5
  57. package/skill/fusion/references/fusion-capabilities.md +5 -5
  58. package/dist/client/assets/AgentDetailView-V32TpEe1.js +0 -18
  59. package/dist/client/assets/AgentsView-B3ADnF0D.css +0 -1
  60. package/dist/client/assets/AgentsView-CxITZE-U.js +0 -34
  61. package/dist/client/assets/ChatView-7WPHyB_7.js +0 -1
  62. package/dist/client/assets/ExperimentalAgentOnboardingModal-B-APN_lM.css +0 -1
  63. package/dist/client/assets/PluginManager-C4UoLv4U.css +0 -1
  64. package/dist/client/assets/SettingsModal-Ci0_sqbU.css +0 -1
  65. package/dist/client/assets/SettingsModal-Cu93Jjho.js +0 -31
  66. package/dist/client/assets/SettingsModal-DWKgRxBA.css +0 -1
  67. package/dist/client/assets/SkillsView-Cytf009Z.css +0 -1
  68. package/dist/client/assets/index-CD0_dkME.css +0 -1
  69. package/dist/client/assets/index-DiewofJh.js +0 -692
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "description": "Fusion vendored fork: pi coding-agent extension that routes LLM calls through the Claude Code CLI. Forked from rchern/pi-claude-cli (MIT). See UPSTREAM.md.",
5
5
  "license": "MIT",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cli-printing-press",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "description": "CLI Printing Press plugin package for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { validatePluginManifest } from "@fusion/core";
3
- import plugin from "../index.js";
3
+ import plugin, { CLI_PRINTING_PRESS_WORKFLOW_STEPS } from "../index.js";
4
4
  import { ensureCliPressSchema } from "../store/cli-press-store.js";
5
5
  import { makeFakeRegistry } from "./fixtures/registry.js";
6
6
 
@@ -18,10 +18,27 @@ describe("plugin registration contracts", () => {
18
18
  expect(plugin.routes?.some((route) => route.path === "/drafts")).toBe(true);
19
19
  expect(plugin.dashboardViews?.map((view) => view.viewId)).toEqual(["wizard", "manage"]);
20
20
  expect(typeof plugin.executorRuntimeEnv).toBe("function");
21
- // FN-4150/FN-3768 track future workflow step template contributions.
22
- expect(plugin.workflowStepTemplates).toBeUndefined();
21
+ expect(plugin.workflowSteps?.length).toBeGreaterThan(0);
23
22
  } finally {
24
23
  h.cleanup();
25
24
  }
26
25
  });
26
+
27
+ it("contributes script-mode workflow step templates", () => {
28
+ expect(plugin.workflowSteps?.length).toBeGreaterThan(0);
29
+ expect(plugin.workflowSteps).toEqual(CLI_PRINTING_PRESS_WORKFLOW_STEPS);
30
+
31
+ for (const step of plugin.workflowSteps ?? []) {
32
+ expect(step.stepId).toMatch(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);
33
+ }
34
+
35
+ expect(
36
+ plugin.workflowSteps?.some((step) => step.mode === "script" && step.phase === "pre-merge"),
37
+ ).toBe(true);
38
+
39
+ expect(plugin.manifest.workflowSteps?.map((step) => step.stepId)).toEqual(
40
+ plugin.workflowSteps?.map((step) => step.stepId),
41
+ );
42
+ expect(validatePluginManifest(plugin.manifest).valid).toBe(true);
43
+ });
27
44
  });
@@ -1,22 +1,117 @@
1
- import { describe, expect, it } from "vitest";
1
+ import { exec } from "node:child_process";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { afterEach, describe, expect, it } from "vitest";
7
+ import { TaskStore, type WorkflowStepTemplate } from "@fusion/core";
2
8
  import plugin from "../index.js";
3
9
  import { installExecMock } from "./fixtures/exec-mock.js";
4
10
 
11
+ const execAsync = promisify(exec);
12
+
13
+ async function makeTaskStore() {
14
+ const rootDir = await mkdtemp(join(tmpdir(), "fn-4150-cli-printing-press-"));
15
+ const globalDir = await mkdtemp(join(tmpdir(), "fn-4150-cli-printing-press-global-"));
16
+ const store = new TaskStore(rootDir, globalDir, { inMemoryDb: true });
17
+ await store.init();
18
+ return { store, rootDir, globalDir };
19
+ }
20
+
21
+ async function cleanupTaskStore(ctx: Awaited<ReturnType<typeof makeTaskStore>>) {
22
+ ctx.store.stopWatching();
23
+ ctx.store.close();
24
+ await rm(ctx.rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 });
25
+ await rm(ctx.globalDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 });
26
+ }
27
+
28
+ function injectPluginTemplates(store: TaskStore): void {
29
+ const templates: Array<{ pluginId: string; template: WorkflowStepTemplate }> = (plugin.workflowSteps ?? []).map((template) => ({
30
+ pluginId: plugin.manifest.id,
31
+ template: {
32
+ id: `plugin:${plugin.manifest.id}:${template.stepId}`,
33
+ name: template.name,
34
+ description: template.description,
35
+ prompt: template.prompt ?? "",
36
+ mode: template.mode,
37
+ phase: template.phase,
38
+ scriptName: template.scriptName,
39
+ toolMode: template.toolMode,
40
+ defaultOn: template.defaultOn,
41
+ modelProvider: template.modelProvider,
42
+ modelId: template.modelId,
43
+ enabled: template.enabled,
44
+ category: "Plugin",
45
+ icon: "puzzle",
46
+ },
47
+ }));
48
+ store.setPluginWorkflowStepTemplates(templates);
49
+ }
50
+
51
+ async function runScriptStepFromSettings(store: TaskStore, scriptName: string): Promise<{ stdout: string; stderr: string }> {
52
+ const settings = await store.getSettings();
53
+ const command = settings.scripts?.[scriptName];
54
+ if (!command) {
55
+ throw new Error(`Missing script command for ${scriptName}`);
56
+ }
57
+ return execAsync(command, { timeout: 20_000, maxBuffer: 5 * 1024 * 1024 });
58
+ }
59
+
5
60
  describe("workflow integration contracts", () => {
6
- // FN-4150/FN-3768 track future workflow-step template + runWorkflowSteps coverage.
61
+ const stores: Array<Awaited<ReturnType<typeof makeTaskStore>>> = [];
62
+
63
+ afterEach(async () => {
64
+ while (stores.length > 0) {
65
+ const ctx = stores.pop();
66
+ if (ctx) {
67
+ await cleanupTaskStore(ctx);
68
+ }
69
+ }
70
+ });
71
+
7
72
  it("guards against execSync usage in workflow-oriented execution fixtures", () => {
8
73
  const execMock = installExecMock();
9
74
  execMock.assertExecSyncUnused();
10
75
  expect(typeof plugin.manifest.id).toBe("string");
11
76
  });
12
77
 
13
- it("does not currently contribute plugin workflow step templates", () => {
14
- expect(plugin.workflowStepTemplates).toBeUndefined();
78
+ it("materializes plugin script-mode workflow step through TaskStore", async () => {
79
+ const ctx = await makeTaskStore();
80
+ stores.push(ctx);
81
+ injectPluginTemplates(ctx.store);
82
+
83
+ const step = await ctx.store.getWorkflowStep("plugin:fusion-plugin-cli-printing-press:run-service-cli");
84
+ expect(step).toMatchObject({
85
+ id: "plugin:fusion-plugin-cli-printing-press:run-service-cli",
86
+ mode: "script",
87
+ phase: "pre-merge",
88
+ scriptName: "cli-printing-press:run-service-cli",
89
+ });
15
90
  });
16
91
 
17
- it("exposes no plugin workflow step IDs to runWorkflowSteps today", () => {
18
- const workflowStepTemplates = plugin.workflowStepTemplates ?? [];
19
- expect(workflowStepTemplates).toEqual([]);
20
- expect(workflowStepTemplates.some((template) => template.id.startsWith("plugin:"))).toBe(false);
92
+ it("runs a plugin script-mode step end-to-end via TaskStore plus project scripts", async () => {
93
+ const execMock = installExecMock();
94
+ execMock.setNextResult({ stdout: "ok\n", stderr: "", code: 0 });
95
+
96
+ const ctx = await makeTaskStore();
97
+ stores.push(ctx);
98
+ injectPluginTemplates(ctx.store);
99
+
100
+ await ctx.store.updateSettings({
101
+ scripts: {
102
+ "cli-printing-press:run-service-cli": "echo ok",
103
+ },
104
+ });
105
+
106
+ const step = await ctx.store.getWorkflowStep("plugin:fusion-plugin-cli-printing-press:run-service-cli");
107
+ expect(step).toMatchObject({
108
+ mode: "script",
109
+ scriptName: "cli-printing-press:run-service-cli",
110
+ phase: "pre-merge",
111
+ });
112
+
113
+ const result = await runScriptStepFromSettings(ctx.store, step!.scriptName!);
114
+ expect(result.stdout).toContain("ok");
115
+ execMock.assertExecSyncUnused();
21
116
  });
22
117
  });
@@ -2,6 +2,7 @@ import { definePlugin } from "@fusion/plugin-sdk";
2
2
  import { createCliPrintingPressRoutes } from "./routes/wizard-routes.js";
3
3
  import { buildExecutorRuntimeEnv } from "./runtime/executor-runtime-env.js";
4
4
  import { createCliPressStore, ensureCliPressSchema } from "./store/cli-press-store.js";
5
+ import { CLI_PRINTING_PRESS_WORKFLOW_STEPS } from "./workflow-steps.js";
5
6
 
6
7
  const storeByDb = new WeakMap<object, ReturnType<typeof createCliPressStore>>();
7
8
 
@@ -20,6 +21,7 @@ const plugin = definePlugin({
20
21
  name: "CLI Printing Press",
21
22
  version: "0.1.0",
22
23
  description: "Guided wizard for drafting external service CLI definitions",
24
+ workflowSteps: CLI_PRINTING_PRESS_WORKFLOW_STEPS.map((step) => ({ stepId: step.stepId, name: step.name })),
23
25
  },
24
26
  state: "installed",
25
27
  hooks: {
@@ -30,6 +32,7 @@ const plugin = definePlugin({
30
32
  const store = getStore(ctx.taskStore as { getDatabase: () => object });
31
33
  return buildExecutorRuntimeEnv(store, taskCtx, ctx);
32
34
  },
35
+ workflowSteps: CLI_PRINTING_PRESS_WORKFLOW_STEPS,
33
36
  dashboardViews: [
34
37
  {
35
38
  viewId: "wizard",
@@ -55,4 +58,5 @@ export { CliPrintingPressWizardView } from "./dashboard-view.js";
55
58
  export { CliPrintingPressManageView } from "./manage-view.js";
56
59
  export { CliPrintingPressTestRunner } from "./run/TestRunnerPanel.js";
57
60
  export { createCliPressStore, ensureCliPressSchema } from "./store/cli-press-store.js";
61
+ export { CLI_PRINTING_PRESS_WORKFLOW_STEPS } from "./workflow-steps.js";
58
62
  export * from "./store/cli-press-types.js";
@@ -0,0 +1,14 @@
1
+ import type { PluginWorkflowStepContribution } from "@fusion/plugin-sdk";
2
+
3
+ export const CLI_PRINTING_PRESS_WORKFLOW_STEPS: PluginWorkflowStepContribution[] = [
4
+ {
5
+ stepId: "run-service-cli",
6
+ name: "Run Service CLI",
7
+ description: "Run generated service CLI checks before merge using the task project script map.",
8
+ mode: "script",
9
+ phase: "pre-merge",
10
+ scriptName: "cli-printing-press:run-service-cli",
11
+ enabled: true,
12
+ defaultOn: false,
13
+ },
14
+ ];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cursor-runtime",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.37",
3
+ "version": "0.2.39",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/openclaw-runtime",
3
- "version": "0.2.37",
3
+ "version": "0.2.39",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/paperclip-runtime",
3
- "version": "0.2.37",
3
+ "version": "0.2.39",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/reports",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "description": "Reports plugin for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/roadmap",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/whatsapp-chat",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "description": "WhatsApp Web (Baileys) chat bridge for Fusion agents",
6
6
  "keywords": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -407,7 +407,7 @@ Lightweight URL fetch (no JS rendering). Use agent-browser skill for JS-heavy pa
407
407
 
408
408
  ### fn_research_run
409
409
 
410
- Start a bounded research run and optionally wait for findings.
410
+ Cited-research pipeline: create a bounded search/fetch/synthesis run (not an autonomous experiment loop) and optionally wait for completion.
411
411
 
412
412
  | Parameter | Type | Required | Description |
413
413
  |-----------|------|----------|-------------|
@@ -417,7 +417,7 @@ Start a bounded research run and optionally wait for findings.
417
417
 
418
418
  ### fn_research_list
419
419
 
420
- List recent research runs.
420
+ Cited-research pipeline: list recent search/fetch/synthesis runs (not experiment-loop sessions).
421
421
 
422
422
  | Parameter | Type | Required | Description |
423
423
  |-----------|------|----------|-------------|
@@ -426,7 +426,7 @@ List recent research runs.
426
426
 
427
427
  ### fn_research_get
428
428
 
429
- Get one research run and structured findings.
429
+ Cited-research pipeline: get one run with structured findings and citations (not experiment-loop state).
430
430
 
431
431
  | Parameter | Type | Required | Description |
432
432
  |-----------|------|----------|-------------|
@@ -434,7 +434,7 @@ Get one research run and structured findings.
434
434
 
435
435
  ### fn_research_cancel
436
436
 
437
- Cancel an in-flight research run. Terminal runs return INVALID_TRANSITION.
437
+ Cited-research pipeline: cancel an in-flight run; terminal runs return INVALID_TRANSITION (does not control experiment loops).
438
438
 
439
439
  | Parameter | Type | Required | Description |
440
440
  |-----------|------|----------|-------------|
@@ -442,7 +442,7 @@ Cancel an in-flight research run. Terminal runs return INVALID_TRANSITION.
442
442
 
443
443
  ### fn_research_retry
444
444
 
445
- Retry a failed research run when lifecycle marks it retryable.
445
+ Cited-research pipeline: retry a failed run when lifecycle marks it retryable (not an autonomous experiment loop retry).
446
446
 
447
447
  | Parameter | Type | Required | Description |
448
448
  |-----------|------|----------|-------------|
@@ -30,11 +30,11 @@ All skill/extension tool invocations in this catalog use the public `fn_*` names
30
30
  | `fn_task_browse_github_issues` | List open GitHub issues from a repository to browse before importing. Returns issue numbers, titles, and URLs for selection. Use with fn_task_import_github_issue to import specific issues by number. |
31
31
  | `fn_task_plan` | Create a task via AI-guided planning mode — interactive conversation to refine your idea into a well-specified task. |
32
32
  | `fn_web_fetch` | Lightweight URL fetch (no JS rendering). Use agent-browser skill for JS-heavy pages. URL to fetch (http/https) Optional extraction hint for downstream summarization Timeout in milliseconds (default: 30000) Max bytes to return (default: 512000) |
33
- | `fn_research_run` | Start a bounded research run and optionally wait for findings. |
34
- | `fn_research_list` | List recent research runs. |
35
- | `fn_research_get` | Get one research run and structured findings. |
36
- | `fn_research_cancel` | Cancel an in-flight research run. Terminal runs return INVALID_TRANSITION. |
37
- | `fn_research_retry` | Retry a failed research run when lifecycle marks it retryable. |
33
+ | `fn_research_run` | Cited-research pipeline: create a bounded search/fetch/synthesis run (not an autonomous experiment loop) and optionally wait for completion. |
34
+ | `fn_research_list` | Cited-research pipeline: list recent search/fetch/synthesis runs (not experiment-loop sessions). |
35
+ | `fn_research_get` | Cited-research pipeline: get one run with structured findings and citations (not experiment-loop state). |
36
+ | `fn_research_cancel` | Cited-research pipeline: cancel an in-flight run; terminal runs return INVALID_TRANSITION (does not control experiment loops). |
37
+ | `fn_research_retry` | Cited-research pipeline: retry a failed run when lifecycle marks it retryable (not an autonomous experiment loop retry). |
38
38
  | `fn_insight_list` | List persisted project insights with optional category/status filters. |
39
39
  | `fn_insight_show` | Show a single persisted insight by ID. |
40
40
  | `fn_insight_run_list` | List recent insight-generation runs with optional status/trigger filters. |