inferoa 0.1.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 (200) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +154 -0
  3. package/dist/src/app.d.ts +16 -0
  4. package/dist/src/app.js +17 -0
  5. package/dist/src/app.js.map +1 -0
  6. package/dist/src/autoresearch/state.d.ts +106 -0
  7. package/dist/src/autoresearch/state.js +469 -0
  8. package/dist/src/autoresearch/state.js.map +1 -0
  9. package/dist/src/cli.d.ts +2 -0
  10. package/dist/src/cli.js +415 -0
  11. package/dist/src/cli.js.map +1 -0
  12. package/dist/src/code-intelligence/codegraph-engine.d.ts +55 -0
  13. package/dist/src/code-intelligence/codegraph-engine.js +593 -0
  14. package/dist/src/code-intelligence/codegraph-engine.js.map +1 -0
  15. package/dist/src/code-intelligence/hub.d.ts +37 -0
  16. package/dist/src/code-intelligence/hub.js +65 -0
  17. package/dist/src/code-intelligence/hub.js.map +1 -0
  18. package/dist/src/config/config.d.ts +12 -0
  19. package/dist/src/config/config.js +229 -0
  20. package/dist/src/config/config.js.map +1 -0
  21. package/dist/src/config/defaults.d.ts +2 -0
  22. package/dist/src/config/defaults.js +44 -0
  23. package/dist/src/config/defaults.js.map +1 -0
  24. package/dist/src/config/secret-vault.d.ts +3 -0
  25. package/dist/src/config/secret-vault.js +106 -0
  26. package/dist/src/config/secret-vault.js.map +1 -0
  27. package/dist/src/context/compressor.d.ts +33 -0
  28. package/dist/src/context/compressor.js +501 -0
  29. package/dist/src/context/compressor.js.map +1 -0
  30. package/dist/src/context/prompt.d.ts +26 -0
  31. package/dist/src/context/prompt.js +572 -0
  32. package/dist/src/context/prompt.js.map +1 -0
  33. package/dist/src/daemon/serve.d.ts +2 -0
  34. package/dist/src/daemon/serve.js +11 -0
  35. package/dist/src/daemon/serve.js.map +1 -0
  36. package/dist/src/daemon/supervisor.d.ts +33 -0
  37. package/dist/src/daemon/supervisor.js +252 -0
  38. package/dist/src/daemon/supervisor.js.map +1 -0
  39. package/dist/src/goals/state.d.ts +105 -0
  40. package/dist/src/goals/state.js +736 -0
  41. package/dist/src/goals/state.js.map +1 -0
  42. package/dist/src/model/endpoint-signals.d.ts +15 -0
  43. package/dist/src/model/endpoint-signals.js +186 -0
  44. package/dist/src/model/endpoint-signals.js.map +1 -0
  45. package/dist/src/model/gateway.d.ts +11 -0
  46. package/dist/src/model/gateway.js +455 -0
  47. package/dist/src/model/gateway.js.map +1 -0
  48. package/dist/src/plans/state.d.ts +28 -0
  49. package/dist/src/plans/state.js +123 -0
  50. package/dist/src/plans/state.js.map +1 -0
  51. package/dist/src/runtime.d.ts +92 -0
  52. package/dist/src/runtime.js +757 -0
  53. package/dist/src/runtime.js.map +1 -0
  54. package/dist/src/session/store.d.ts +84 -0
  55. package/dist/src/session/store.js +593 -0
  56. package/dist/src/session/store.js.map +1 -0
  57. package/dist/src/session/workspace.d.ts +2 -0
  58. package/dist/src/session/workspace.js +14 -0
  59. package/dist/src/session/workspace.js.map +1 -0
  60. package/dist/src/skills/registry.d.ts +24 -0
  61. package/dist/src/skills/registry.js +203 -0
  62. package/dist/src/skills/registry.js.map +1 -0
  63. package/dist/src/tools/autoresearch-tools.d.ts +6 -0
  64. package/dist/src/tools/autoresearch-tools.js +412 -0
  65. package/dist/src/tools/autoresearch-tools.js.map +1 -0
  66. package/dist/src/tools/clarify-tool.d.ts +3 -0
  67. package/dist/src/tools/clarify-tool.js +107 -0
  68. package/dist/src/tools/clarify-tool.js.map +1 -0
  69. package/dist/src/tools/code-intelligence.d.ts +15 -0
  70. package/dist/src/tools/code-intelligence.js +391 -0
  71. package/dist/src/tools/code-intelligence.js.map +1 -0
  72. package/dist/src/tools/context.d.ts +11 -0
  73. package/dist/src/tools/context.js +2 -0
  74. package/dist/src/tools/context.js.map +1 -0
  75. package/dist/src/tools/goal-tools.d.ts +3 -0
  76. package/dist/src/tools/goal-tools.js +279 -0
  77. package/dist/src/tools/goal-tools.js.map +1 -0
  78. package/dist/src/tools/omni-tools.d.ts +8 -0
  79. package/dist/src/tools/omni-tools.js +349 -0
  80. package/dist/src/tools/omni-tools.js.map +1 -0
  81. package/dist/src/tools/permissions.d.ts +11 -0
  82. package/dist/src/tools/permissions.js +74 -0
  83. package/dist/src/tools/permissions.js.map +1 -0
  84. package/dist/src/tools/plan-tools.d.ts +3 -0
  85. package/dist/src/tools/plan-tools.js +314 -0
  86. package/dist/src/tools/plan-tools.js.map +1 -0
  87. package/dist/src/tools/process-tools.d.ts +6 -0
  88. package/dist/src/tools/process-tools.js +199 -0
  89. package/dist/src/tools/process-tools.js.map +1 -0
  90. package/dist/src/tools/registry.d.ts +20 -0
  91. package/dist/src/tools/registry.js +187 -0
  92. package/dist/src/tools/registry.js.map +1 -0
  93. package/dist/src/tools/schemas.d.ts +3 -0
  94. package/dist/src/tools/schemas.js +500 -0
  95. package/dist/src/tools/schemas.js.map +1 -0
  96. package/dist/src/tools/skill-tools.d.ts +6 -0
  97. package/dist/src/tools/skill-tools.js +124 -0
  98. package/dist/src/tools/skill-tools.js.map +1 -0
  99. package/dist/src/tools/text-args.d.ts +5 -0
  100. package/dist/src/tools/text-args.js +22 -0
  101. package/dist/src/tools/text-args.js.map +1 -0
  102. package/dist/src/tools/web-search.d.ts +5 -0
  103. package/dist/src/tools/web-search.js +602 -0
  104. package/dist/src/tools/web-search.js.map +1 -0
  105. package/dist/src/tools/workspace-tools.d.ts +17 -0
  106. package/dist/src/tools/workspace-tools.js +561 -0
  107. package/dist/src/tools/workspace-tools.js.map +1 -0
  108. package/dist/src/tui/activity.d.ts +11 -0
  109. package/dist/src/tui/activity.js +75 -0
  110. package/dist/src/tui/activity.js.map +1 -0
  111. package/dist/src/tui/ansi.d.ts +24 -0
  112. package/dist/src/tui/ansi.js +131 -0
  113. package/dist/src/tui/ansi.js.map +1 -0
  114. package/dist/src/tui/app.d.ts +163 -0
  115. package/dist/src/tui/app.js +4204 -0
  116. package/dist/src/tui/app.js.map +1 -0
  117. package/dist/src/tui/cache-footer.d.ts +21 -0
  118. package/dist/src/tui/cache-footer.js +75 -0
  119. package/dist/src/tui/cache-footer.js.map +1 -0
  120. package/dist/src/tui/clarify.d.ts +14 -0
  121. package/dist/src/tui/clarify.js +187 -0
  122. package/dist/src/tui/clarify.js.map +1 -0
  123. package/dist/src/tui/composer.d.ts +79 -0
  124. package/dist/src/tui/composer.js +592 -0
  125. package/dist/src/tui/composer.js.map +1 -0
  126. package/dist/src/tui/event-view.d.ts +5 -0
  127. package/dist/src/tui/event-view.js +392 -0
  128. package/dist/src/tui/event-view.js.map +1 -0
  129. package/dist/src/tui/home.d.ts +7 -0
  130. package/dist/src/tui/home.js +92 -0
  131. package/dist/src/tui/home.js.map +1 -0
  132. package/dist/src/tui/markdown.d.ts +18 -0
  133. package/dist/src/tui/markdown.js +271 -0
  134. package/dist/src/tui/markdown.js.map +1 -0
  135. package/dist/src/tui/mode-footer.d.ts +9 -0
  136. package/dist/src/tui/mode-footer.js +62 -0
  137. package/dist/src/tui/mode-footer.js.map +1 -0
  138. package/dist/src/tui/plan-view.d.ts +8 -0
  139. package/dist/src/tui/plan-view.js +45 -0
  140. package/dist/src/tui/plan-view.js.map +1 -0
  141. package/dist/src/tui/prompt-queue.d.ts +18 -0
  142. package/dist/src/tui/prompt-queue.js +27 -0
  143. package/dist/src/tui/prompt-queue.js.map +1 -0
  144. package/dist/src/tui/resize.d.ts +7 -0
  145. package/dist/src/tui/resize.js +15 -0
  146. package/dist/src/tui/resize.js.map +1 -0
  147. package/dist/src/tui/session-picker.d.ts +10 -0
  148. package/dist/src/tui/session-picker.js +17 -0
  149. package/dist/src/tui/session-picker.js.map +1 -0
  150. package/dist/src/tui/session-transcript.d.ts +2 -0
  151. package/dist/src/tui/session-transcript.js +44 -0
  152. package/dist/src/tui/session-transcript.js.map +1 -0
  153. package/dist/src/tui/slash-notice.d.ts +2 -0
  154. package/dist/src/tui/slash-notice.js +9 -0
  155. package/dist/src/tui/slash-notice.js.map +1 -0
  156. package/dist/src/tui/slash.d.ts +21 -0
  157. package/dist/src/tui/slash.js +103 -0
  158. package/dist/src/tui/slash.js.map +1 -0
  159. package/dist/src/tui/splash.d.ts +4 -0
  160. package/dist/src/tui/splash.js +64 -0
  161. package/dist/src/tui/splash.js.map +1 -0
  162. package/dist/src/tui/tool-renderer.d.ts +6 -0
  163. package/dist/src/tui/tool-renderer.js +1024 -0
  164. package/dist/src/tui/tool-renderer.js.map +1 -0
  165. package/dist/src/tui/transcript-spacing.d.ts +1 -0
  166. package/dist/src/tui/transcript-spacing.js +4 -0
  167. package/dist/src/tui/transcript-spacing.js.map +1 -0
  168. package/dist/src/types.d.ts +220 -0
  169. package/dist/src/types.js +2 -0
  170. package/dist/src/types.js.map +1 -0
  171. package/dist/src/util/abort.d.ts +3 -0
  172. package/dist/src/util/abort.js +19 -0
  173. package/dist/src/util/abort.js.map +1 -0
  174. package/dist/src/util/clock.d.ts +2 -0
  175. package/dist/src/util/clock.js +7 -0
  176. package/dist/src/util/clock.js.map +1 -0
  177. package/dist/src/util/fs.d.ts +13 -0
  178. package/dist/src/util/fs.js +75 -0
  179. package/dist/src/util/fs.js.map +1 -0
  180. package/dist/src/util/hash.d.ts +6 -0
  181. package/dist/src/util/hash.js +50 -0
  182. package/dist/src/util/hash.js.map +1 -0
  183. package/dist/src/util/limit.d.ts +11 -0
  184. package/dist/src/util/limit.js +29 -0
  185. package/dist/src/util/limit.js.map +1 -0
  186. package/dist/src/util/types.d.ts +22 -0
  187. package/dist/src/util/types.js +33 -0
  188. package/dist/src/util/types.js.map +1 -0
  189. package/dist/src/validation/acceptance.d.ts +12 -0
  190. package/dist/src/validation/acceptance.js +251 -0
  191. package/dist/src/validation/acceptance.js.map +1 -0
  192. package/dist/src/validation/milestone.d.ts +2 -0
  193. package/dist/src/validation/milestone.js +141 -0
  194. package/dist/src/validation/milestone.js.map +1 -0
  195. package/docs/final-acceptance-task.md +193 -0
  196. package/docs/public-source-hygiene.md +21 -0
  197. package/docs/roadmap.md +265 -0
  198. package/docs/tui-product-design.md +270 -0
  199. package/package.json +67 -0
  200. package/skills/coding-workflow/SKILL.md +16 -0
@@ -0,0 +1,279 @@
1
+ import { fail, ok } from "../util/limit.js";
2
+ import { cloneGoalState, completionBudgetReport, createGoalState, formatGoalDuration, incompleteGoalPlanningMessage, goalPlanningProgressSummary, parseGoalStepStatus, readGoalState, replaceGoalPlanning, updateGoalPlanningStep, validateTokenBudget, writeGoalState, } from "../goals/state.js";
3
+ export async function goalTool(args, context) {
4
+ const op = stringArg(args.op) ?? "get";
5
+ try {
6
+ switch (op) {
7
+ case "create":
8
+ return createGoal(args, context);
9
+ case "get":
10
+ return describeGoal(readGoalState(context.store, context.session_id), "Goal state");
11
+ case "decompose":
12
+ case "update_plan":
13
+ return updateGoalPlan(args, context, op);
14
+ case "update_step":
15
+ return updateGoalStep(args, context);
16
+ case "resume":
17
+ return resumeGoal(context);
18
+ case "complete":
19
+ return finishGoal(args, context, "complete");
20
+ case "drop":
21
+ return finishGoal(args, context, "dropped");
22
+ default:
23
+ return fail("invalid_goal_op", `Unknown goal operation: ${op}`);
24
+ }
25
+ }
26
+ catch (error) {
27
+ return fail("goal_error", error instanceof Error ? error.message : String(error));
28
+ }
29
+ }
30
+ function createGoal(args, context) {
31
+ const existing = readGoalState(context.store, context.session_id);
32
+ if (existing && existing.goal.status !== "complete" && existing.goal.status !== "dropped") {
33
+ return fail("goal_exists", "cannot create a new goal because this session already has a goal");
34
+ }
35
+ const objective = stringArg(args.objective)?.trim();
36
+ if (!objective) {
37
+ return fail("goal_objective_required", "objective is required when op=create");
38
+ }
39
+ const tokenBudget = numberArg(args.token_budget);
40
+ validateTokenBudget(tokenBudget);
41
+ let state = createGoalState({ objective, token_budget: tokenBudget });
42
+ const steps = stepsArg(args.steps);
43
+ if (steps) {
44
+ state = replaceGoalPlanning(state, {
45
+ summary: stringArg(args.summary),
46
+ active_step_id: stringArg(args.active_step_id),
47
+ steps,
48
+ });
49
+ }
50
+ state = writeGoalState(context.store, context.session_id, state, context.run_id);
51
+ return describeGoal(state, "Goal created");
52
+ }
53
+ function updateGoalPlan(args, context, op) {
54
+ const state = readGoalState(context.store, context.session_id);
55
+ if (!state) {
56
+ return fail("goal_missing", "No goal to decompose.");
57
+ }
58
+ if (state.goal.status === "complete" || state.goal.status === "dropped") {
59
+ return fail("goal_closed", `Cannot update a ${state.goal.status} goal.`);
60
+ }
61
+ const steps = stepsArg(args.steps);
62
+ if (!steps && op === "decompose") {
63
+ return fail("goal_steps_required", "steps are required when op=decompose");
64
+ }
65
+ let next = cloneGoalState(state);
66
+ if (steps) {
67
+ next = replaceGoalPlanning(next, {
68
+ summary: stringArg(args.summary),
69
+ active_step_id: stringArg(args.active_step_id),
70
+ steps,
71
+ });
72
+ }
73
+ else if (next.goal.planning) {
74
+ const summary = stringArg(args.summary);
75
+ if (summary !== undefined) {
76
+ const trimmed = summary.trim();
77
+ if (trimmed) {
78
+ next.goal.planning.summary = trimmed;
79
+ }
80
+ else {
81
+ delete next.goal.planning.summary;
82
+ }
83
+ }
84
+ const activeStepId = stringArg(args.active_step_id)?.trim();
85
+ if (activeStepId && next.goal.planning.steps.some((step) => step.id === activeStepId)) {
86
+ next.goal.planning.active_step_id = activeStepId;
87
+ const active = next.goal.planning.steps.find((step) => step.id === activeStepId);
88
+ if (active && active.status === "pending") {
89
+ active.status = "in_progress";
90
+ }
91
+ }
92
+ next.goal.planning.updated_at = new Date().toISOString();
93
+ next.goal.updated_at = next.goal.planning.updated_at;
94
+ }
95
+ else {
96
+ return fail("goal_steps_required", "steps are required before goal planning can be updated");
97
+ }
98
+ return describeGoal(writeGoalState(context.store, context.session_id, next, context.run_id), steps ? "Goal decomposed" : "Goal plan updated");
99
+ }
100
+ function updateGoalStep(args, context) {
101
+ const state = readGoalState(context.store, context.session_id);
102
+ if (!state) {
103
+ return fail("goal_missing", "No goal to update.");
104
+ }
105
+ if (state.goal.status === "complete" || state.goal.status === "dropped") {
106
+ return fail("goal_closed", `Cannot update a ${state.goal.status} goal.`);
107
+ }
108
+ const stepId = stringArg(args.step_id)?.trim();
109
+ if (!stepId) {
110
+ return fail("goal_step_required", "step_id is required when op=update_step");
111
+ }
112
+ const status = parseGoalStepStatus(stringArg(args.status));
113
+ if (args.status !== undefined && !status) {
114
+ return fail("goal_step_status_invalid", "status must be pending, in_progress, completed, blocked, or skipped");
115
+ }
116
+ try {
117
+ const next = updateGoalPlanningStep(state, {
118
+ step_id: stepId,
119
+ title: stringArg(args.title),
120
+ status,
121
+ notes: stringArg(args.notes),
122
+ evidence: objectArg(args.evidence),
123
+ active_step_id: stringArg(args.active_step_id),
124
+ });
125
+ return describeGoal(writeGoalState(context.store, context.session_id, next, context.run_id), "Goal step updated");
126
+ }
127
+ catch (error) {
128
+ return fail("goal_step_update_failed", error instanceof Error ? error.message : String(error));
129
+ }
130
+ }
131
+ function resumeGoal(context) {
132
+ const state = readGoalState(context.store, context.session_id);
133
+ if (!state) {
134
+ return fail("goal_missing", "No goal to resume.");
135
+ }
136
+ if (state.goal.status === "complete") {
137
+ return fail("goal_complete", "Goal is already complete.");
138
+ }
139
+ if (state.goal.status === "dropped") {
140
+ return fail("goal_dropped", "Cannot resume a dropped goal.");
141
+ }
142
+ const next = cloneGoalState(state);
143
+ next.enabled = true;
144
+ next.goal.status = "active";
145
+ next.goal.updated_at = new Date().toISOString();
146
+ return describeGoal(writeGoalState(context.store, context.session_id, next, context.run_id), "Goal resumed");
147
+ }
148
+ function finishGoal(args, context, status) {
149
+ const state = readGoalState(context.store, context.session_id);
150
+ if (!state) {
151
+ return fail("goal_missing", status === "complete" ? "cannot complete goal because no goal is active" : "No goal to drop.");
152
+ }
153
+ if (state.goal.status === "dropped") {
154
+ return fail("goal_dropped", "Goal is already dropped.");
155
+ }
156
+ if (status === "complete" && state.goal.status === "complete") {
157
+ return fail("goal_complete", "Goal is already complete.");
158
+ }
159
+ if (status === "complete" && !booleanArg(args.force)) {
160
+ const incompleteMessage = incompleteGoalPlanningMessage(state.goal);
161
+ if (incompleteMessage) {
162
+ return failGoalWithState(state, "goal_incomplete_plan", incompleteMessage);
163
+ }
164
+ }
165
+ const next = cloneGoalState(state);
166
+ const summary = stringArg(args.summary)?.trim();
167
+ if (status === "complete" && !summary) {
168
+ return failGoalWithState(state, "goal_summary_required", "summary is required when completing a goal");
169
+ }
170
+ if (summary) {
171
+ next.goal.summary = summary;
172
+ }
173
+ next.enabled = false;
174
+ next.goal.status = status;
175
+ next.goal.updated_at = new Date().toISOString();
176
+ return describeGoal(writeGoalState(context.store, context.session_id, next, context.run_id), status === "complete" ? "Goal complete" : "Goal dropped");
177
+ }
178
+ function failGoalWithState(state, code, message, extra = {}) {
179
+ return fail(code, message, {
180
+ enabled: state.enabled,
181
+ goal: state.goal,
182
+ remaining_tokens: state.goal.token_budget === undefined ? null : Math.max(0, state.goal.token_budget - state.goal.tokens_used),
183
+ ...extra,
184
+ });
185
+ }
186
+ function describeGoal(state, summary) {
187
+ if (!state) {
188
+ return ok("No goal set.", { goal: null });
189
+ }
190
+ const goal = state.goal;
191
+ const completion = goal.status === "complete"
192
+ ? {
193
+ completion_summary: goal.summary ?? null,
194
+ completion_budget_report: completionBudgetReport(goal) ?? null,
195
+ }
196
+ : {};
197
+ return ok(goalSummary(summary, goal), {
198
+ enabled: state.enabled,
199
+ goal: goal,
200
+ remaining_tokens: goal.token_budget === undefined ? null : Math.max(0, goal.token_budget - goal.tokens_used),
201
+ ...completion,
202
+ });
203
+ }
204
+ function goalSummary(prefix, goal) {
205
+ const lines = [`${prefix}: ${goal.objective}`, `Status: ${goal.status}`];
206
+ if (goal.token_budget !== undefined || goal.tokens_used > 0) {
207
+ lines.push(goal.token_budget === undefined
208
+ ? `${goal.tokens_used} tokens used`
209
+ : `${goal.tokens_used} / ${goal.token_budget} tokens used`);
210
+ }
211
+ if (goal.time_used_ms > 0) {
212
+ lines.push(`Time: ${formatGoalDuration(goal)}`);
213
+ }
214
+ if (goal.planning) {
215
+ lines.push(`Plan: ${goalPlanningProgressSummary(goal.planning)}`);
216
+ const active = goal.planning.active_step_id ? goal.planning.steps.find((step) => step.id === goal.planning.active_step_id) : undefined;
217
+ if (active) {
218
+ lines.push(`Active step: ${active.id} ${active.title}`);
219
+ }
220
+ }
221
+ if (goal.status === "complete" && goal.summary) {
222
+ lines.push(`Completion summary: ${goal.summary}`);
223
+ }
224
+ if (goal.status === "complete") {
225
+ const report = completionBudgetReport(goal);
226
+ if (report) {
227
+ lines.push(report);
228
+ }
229
+ }
230
+ return lines.filter((line) => Boolean(line)).join("\n");
231
+ }
232
+ function stringArg(value) {
233
+ return typeof value === "string" && value.length > 0 ? value : undefined;
234
+ }
235
+ function numberArg(value) {
236
+ return typeof value === "number" && Number.isFinite(value) ? Math.trunc(value) : undefined;
237
+ }
238
+ function booleanArg(value) {
239
+ return value === true;
240
+ }
241
+ function objectArg(value) {
242
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
243
+ return undefined;
244
+ }
245
+ return value;
246
+ }
247
+ function stepsArg(value) {
248
+ if (!Array.isArray(value)) {
249
+ return undefined;
250
+ }
251
+ const steps = [];
252
+ for (const item of value) {
253
+ if (typeof item === "string") {
254
+ const title = item.trim();
255
+ if (title) {
256
+ steps.push({ title });
257
+ }
258
+ continue;
259
+ }
260
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
261
+ continue;
262
+ }
263
+ const data = item;
264
+ const title = stringArg(data.title)?.trim();
265
+ if (!title) {
266
+ continue;
267
+ }
268
+ const status = parseGoalStepStatus(stringArg(data.status));
269
+ steps.push({
270
+ id: stringArg(data.id),
271
+ title,
272
+ status,
273
+ notes: stringArg(data.notes),
274
+ evidence: objectArg(data.evidence),
275
+ });
276
+ }
277
+ return steps.length ? steps : undefined;
278
+ }
279
+ //# sourceMappingURL=goal-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-tools.js","sourceRoot":"","sources":["../../../src/tools/goal-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { JsonObject, ToolResult } from "../types.js";
2
+ import type { ToolExecutionContext } from "./context.js";
3
+ export declare function visionUnderstanding(args: JsonObject, context: ToolExecutionContext): Promise<ToolResult>;
4
+ export declare function videoUnderstanding(args: JsonObject, context: ToolExecutionContext): Promise<ToolResult>;
5
+ export declare function audioUnderstanding(args: JsonObject, context: ToolExecutionContext): Promise<ToolResult>;
6
+ export declare function imageGeneration(args: JsonObject, context: ToolExecutionContext): Promise<ToolResult>;
7
+ export declare function videoGeneration(args: JsonObject, context: ToolExecutionContext): Promise<ToolResult>;
8
+ export declare function audioGeneration(args: JsonObject, context: ToolExecutionContext): Promise<ToolResult>;
@@ -0,0 +1,349 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { endpointApiKey } from "../config/config.js";
4
+ import { fail, ok, truncateText } from "../util/limit.js";
5
+ import { delay, numberOrDefault, stringField } from "../util/types.js";
6
+ import { resolveInside } from "../util/fs.js";
7
+ export async function visionUnderstanding(args, context) {
8
+ return await understanding("vision", args, context, "image_url");
9
+ }
10
+ export async function videoUnderstanding(args, context) {
11
+ return await understanding("video_understanding", args, context, "video_url");
12
+ }
13
+ export async function audioUnderstanding(args, context) {
14
+ return await understanding("audio_understanding", args, context, "audio_url");
15
+ }
16
+ export async function imageGeneration(args, context) {
17
+ return await generation("image_generation", "/images/generations", args, context);
18
+ }
19
+ export async function videoGeneration(args, context) {
20
+ return await videoGenerationJob(args, context);
21
+ }
22
+ export async function audioGeneration(args, context) {
23
+ return await generation("audio_generation", "/audio/generations", args, context);
24
+ }
25
+ async function understanding(capability, args, context, inputType) {
26
+ const endpoint = endpointFor(capability, context);
27
+ if (!endpoint.ok) {
28
+ return endpoint.result;
29
+ }
30
+ const inputs = Array.isArray(args.inputs) ? args.inputs.map(String) : [];
31
+ const content = [{ type: "text", text: String(args.prompt) }];
32
+ for (const input of inputs) {
33
+ content.push({ type: inputType, [inputType]: { url: await normalizeInput(input, context) } });
34
+ }
35
+ const response = await postJson(endpoint.config, "/chat/completions", {
36
+ model: String(args.model ?? endpoint.config.model),
37
+ messages: [
38
+ {
39
+ role: "user",
40
+ content,
41
+ },
42
+ ],
43
+ temperature: 0,
44
+ });
45
+ if (!response.ok) {
46
+ return fail(`${capability}_failed`, response.error);
47
+ }
48
+ const text = extractChatText(response.json);
49
+ const truncated = truncateText(text, 16_000);
50
+ const resource = truncated.truncated || JSON.stringify(response.json).length > 20_000
51
+ ? context.store.putResource(context.session_id, `omni.${capability}`, JSON.stringify(response.json, null, 2), {
52
+ capability,
53
+ model: endpoint.config.model,
54
+ }).uri
55
+ : undefined;
56
+ return {
57
+ ok: true,
58
+ summary: `${capability} completed`,
59
+ data: {
60
+ capability,
61
+ model: endpoint.config.model,
62
+ answer: truncated.text,
63
+ raw_usage: response.json.usage ?? {},
64
+ },
65
+ resource_uri: resource,
66
+ };
67
+ }
68
+ async function generation(capability, apiPath, args, context) {
69
+ const endpoint = endpointFor(capability, context);
70
+ if (!endpoint.ok) {
71
+ return endpoint.result;
72
+ }
73
+ const body = {
74
+ model: String(args.model ?? endpoint.config.model),
75
+ prompt: String(args.prompt),
76
+ };
77
+ for (const key of ["size", "seed", "duration", "voice"]) {
78
+ if (args[key] !== undefined) {
79
+ body[key] = args[key];
80
+ }
81
+ }
82
+ const response = await postJson(endpoint.config, apiPath, body);
83
+ if (!response.ok) {
84
+ return fail(`${capability}_failed`, response.error);
85
+ }
86
+ const media = extractMedia(response.json);
87
+ const content = JSON.stringify({ capability, request: body, response: response.json }, null, 2);
88
+ const resource = context.store.putResource(context.session_id, `omni.${capability}`, content, {
89
+ capability,
90
+ model: endpoint.config.model,
91
+ media_count: media.length,
92
+ });
93
+ return ok(`${capability} completed with ${media.length} media item(s)`, {
94
+ capability,
95
+ model: endpoint.config.model,
96
+ media: media,
97
+ resource_uri: resource.uri,
98
+ });
99
+ }
100
+ async function videoGenerationJob(args, context) {
101
+ const endpoint = endpointFor("video_generation", context);
102
+ if (!endpoint.ok) {
103
+ return endpoint.result;
104
+ }
105
+ const fields = {
106
+ model: String(args.model ?? endpoint.config.model),
107
+ prompt: String(args.prompt),
108
+ };
109
+ for (const key of ["seed", "duration", "size", "width", "height", "num_frames", "fps"]) {
110
+ if (args[key] !== undefined) {
111
+ fields[key] = String(args[key]);
112
+ }
113
+ }
114
+ const submitted = await postForm(endpoint.config, "/videos", fields);
115
+ if (!submitted.ok) {
116
+ return fail("video_generation_failed", submitted.error);
117
+ }
118
+ const jobId = stringField(submitted.json.id) ?? stringField(submitted.json.video_id) ?? stringField(submitted.json.job_id);
119
+ if (!jobId) {
120
+ const media = extractMedia(submitted.json);
121
+ const resource = context.store.putResource(context.session_id, "omni.video_generation", JSON.stringify({ capability: "video_generation", request: fields, response: submitted.json }, null, 2), { capability: "video_generation", model: endpoint.config.model, media_count: media.length });
122
+ return ok(`video_generation completed with ${media.length} media item(s)`, {
123
+ capability: "video_generation",
124
+ model: endpoint.config.model,
125
+ media: media,
126
+ resource_uri: resource.uri,
127
+ });
128
+ }
129
+ const deadline = Date.now() + numberOrDefault(args.timeout_ms, 180_000);
130
+ let statusJson = submitted.json;
131
+ while (Date.now() < deadline) {
132
+ const status = statusText(statusJson);
133
+ if (["completed", "succeeded", "success", "finished"].includes(status)) {
134
+ break;
135
+ }
136
+ if (["failed", "error", "cancelled", "canceled"].includes(status)) {
137
+ return fail("video_generation_failed", `Video job ${jobId} ${status}`, { job_id: jobId, status: statusJson });
138
+ }
139
+ await delay(numberOrDefault(args.poll_ms, 2_000));
140
+ const polled = await getJson(endpoint.config, `/videos/${encodeURIComponent(jobId)}`);
141
+ if (!polled.ok) {
142
+ return fail("video_generation_status_failed", polled.error, { job_id: jobId });
143
+ }
144
+ statusJson = polled.json;
145
+ }
146
+ if (!["completed", "succeeded", "success", "finished"].includes(statusText(statusJson))) {
147
+ return fail("video_generation_timeout", `Video job ${jobId} did not finish before timeout.`, {
148
+ job_id: jobId,
149
+ status: statusJson,
150
+ });
151
+ }
152
+ const content = await getBytes(endpoint.config, `/videos/${encodeURIComponent(jobId)}/content`);
153
+ if (!content.ok) {
154
+ return fail("video_generation_download_failed", content.error, { job_id: jobId, status: statusJson });
155
+ }
156
+ const mediaResource = context.store.putResource(context.session_id, "omni.video_generation.media", content.bytes.toString("base64"), {
157
+ capability: "video_generation",
158
+ model: endpoint.config.model,
159
+ job_id: jobId,
160
+ content_type: content.content_type,
161
+ encoding: "base64",
162
+ bytes: content.bytes.length,
163
+ });
164
+ const evidenceResource = context.store.putResource(context.session_id, "omni.video_generation", JSON.stringify({ capability: "video_generation", request: fields, status: statusJson, media_resource: mediaResource.uri }, null, 2), { capability: "video_generation", model: endpoint.config.model, job_id: jobId });
165
+ return ok("video_generation completed with 1 media item(s)", {
166
+ capability: "video_generation",
167
+ model: endpoint.config.model,
168
+ job_id: jobId,
169
+ media: [{ resource_uri: mediaResource.uri, content_type: content.content_type, bytes: content.bytes.length }],
170
+ resource_uri: evidenceResource.uri,
171
+ });
172
+ }
173
+ function endpointFor(capability, context) {
174
+ if (!context.config.omni.enabled) {
175
+ return { ok: false, result: fail("omni_disabled", "Omni tools are not enabled in config.") };
176
+ }
177
+ const config = context.config.omni.endpoints[capability];
178
+ if (!config?.base_url || !config.model) {
179
+ return {
180
+ ok: false,
181
+ result: fail("omni_capability_unavailable", `Omni capability ${capability} is not configured with base_url and model.`),
182
+ };
183
+ }
184
+ return { ok: true, config };
185
+ }
186
+ async function postJson(endpoint, apiPath, body) {
187
+ const base = endpoint.base_url?.replace(/\/$/, "");
188
+ const apiKey = endpointApiKey(endpoint);
189
+ const headers = {
190
+ "content-type": "application/json",
191
+ ...(endpoint.headers ?? {}),
192
+ };
193
+ if (apiKey) {
194
+ headers.authorization = `Bearer ${apiKey}`;
195
+ }
196
+ try {
197
+ const response = await fetch(`${base}${apiPath}`, {
198
+ method: "POST",
199
+ headers,
200
+ body: JSON.stringify(body),
201
+ });
202
+ const text = await response.text();
203
+ if (!response.ok) {
204
+ return { ok: false, error: `${response.status}: ${text}` };
205
+ }
206
+ return { ok: true, json: text ? JSON.parse(text) : {} };
207
+ }
208
+ catch (error) {
209
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
210
+ }
211
+ }
212
+ async function postForm(endpoint, apiPath, fields) {
213
+ const base = endpoint.base_url?.replace(/\/$/, "");
214
+ const apiKey = endpointApiKey(endpoint);
215
+ const form = new FormData();
216
+ for (const [key, value] of Object.entries(fields)) {
217
+ form.set(key, value);
218
+ }
219
+ const headers = { ...(endpoint.headers ?? {}) };
220
+ if (apiKey) {
221
+ headers.authorization = `Bearer ${apiKey}`;
222
+ }
223
+ try {
224
+ const response = await fetch(`${base}${apiPath}`, {
225
+ method: "POST",
226
+ headers,
227
+ body: form,
228
+ });
229
+ const text = await response.text();
230
+ if (!response.ok) {
231
+ return { ok: false, error: `${response.status}: ${text}` };
232
+ }
233
+ return { ok: true, json: text ? JSON.parse(text) : {} };
234
+ }
235
+ catch (error) {
236
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
237
+ }
238
+ }
239
+ async function getJson(endpoint, apiPath) {
240
+ const base = endpoint.base_url?.replace(/\/$/, "");
241
+ const response = await get(endpoint, `${base}${apiPath}`);
242
+ if (!response.ok) {
243
+ return response;
244
+ }
245
+ try {
246
+ return { ok: true, json: response.text ? JSON.parse(response.text) : {} };
247
+ }
248
+ catch (error) {
249
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
250
+ }
251
+ }
252
+ async function getBytes(endpoint, apiPath) {
253
+ const base = endpoint.base_url?.replace(/\/$/, "");
254
+ const apiKey = endpointApiKey(endpoint);
255
+ const headers = { ...(endpoint.headers ?? {}) };
256
+ if (apiKey) {
257
+ headers.authorization = `Bearer ${apiKey}`;
258
+ }
259
+ try {
260
+ const response = await fetch(`${base}${apiPath}`, { headers });
261
+ const bytes = Buffer.from(await response.arrayBuffer());
262
+ if (!response.ok) {
263
+ return { ok: false, error: `${response.status}: ${bytes.toString("utf8")}` };
264
+ }
265
+ return {
266
+ ok: true,
267
+ bytes,
268
+ content_type: response.headers.get("content-type") ?? "application/octet-stream",
269
+ };
270
+ }
271
+ catch (error) {
272
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
273
+ }
274
+ }
275
+ async function get(endpoint, url) {
276
+ const apiKey = endpointApiKey(endpoint);
277
+ const headers = { ...(endpoint.headers ?? {}) };
278
+ if (apiKey) {
279
+ headers.authorization = `Bearer ${apiKey}`;
280
+ }
281
+ try {
282
+ const response = await fetch(url, { headers });
283
+ const text = await response.text();
284
+ if (!response.ok) {
285
+ return { ok: false, error: `${response.status}: ${text}` };
286
+ }
287
+ return { ok: true, text };
288
+ }
289
+ catch (error) {
290
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
291
+ }
292
+ }
293
+ async function normalizeInput(input, context) {
294
+ if (/^(https?:|data:|file:)/.test(input)) {
295
+ return input;
296
+ }
297
+ const file = resolveInside(context.workspace.root, input);
298
+ const bytes = await fs.readFile(file);
299
+ return `data:${mimeType(file)};base64,${bytes.toString("base64")}`;
300
+ }
301
+ function mimeType(file) {
302
+ const ext = path.extname(file).toLowerCase();
303
+ if (ext === ".png")
304
+ return "image/png";
305
+ if (ext === ".jpg" || ext === ".jpeg")
306
+ return "image/jpeg";
307
+ if (ext === ".webp")
308
+ return "image/webp";
309
+ if (ext === ".gif")
310
+ return "image/gif";
311
+ if (ext === ".mp4")
312
+ return "video/mp4";
313
+ if (ext === ".webm")
314
+ return "video/webm";
315
+ if (ext === ".wav")
316
+ return "audio/wav";
317
+ if (ext === ".mp3")
318
+ return "audio/mpeg";
319
+ return "application/octet-stream";
320
+ }
321
+ function extractChatText(json) {
322
+ const choices = json.choices;
323
+ const message = choices?.[0]?.message;
324
+ const content = message?.content;
325
+ if (typeof content === "string") {
326
+ return content;
327
+ }
328
+ return JSON.stringify(json);
329
+ }
330
+ function extractMedia(json) {
331
+ const data = json.data;
332
+ if (Array.isArray(data)) {
333
+ return data.map((item) => ({
334
+ url: item.url,
335
+ b64_json: typeof item.b64_json === "string" ? `[base64:${item.b64_json.length} chars]` : undefined,
336
+ revised_prompt: item.revised_prompt,
337
+ }));
338
+ }
339
+ const output = json.output;
340
+ if (Array.isArray(output)) {
341
+ return output;
342
+ }
343
+ return [];
344
+ }
345
+ function statusText(json) {
346
+ const status = stringField(json.status) ?? stringField(json.state) ?? stringField(json.data?.status);
347
+ return (status ?? "queued").toLowerCase();
348
+ }
349
+ //# sourceMappingURL=omni-tools.js.map