@oxagen/cli 0.3.2 → 0.4.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 (222) hide show
  1. package/README.md +234 -318
  2. package/dist/commands/agent.mcp.list.d.ts.map +1 -1
  3. package/dist/commands/agent.mcp.list.js +4 -2
  4. package/dist/commands/agent.mcp.list.js.map +1 -1
  5. package/dist/commands/agent.mcp.register.d.ts.map +1 -1
  6. package/dist/commands/agent.mcp.register.js +3 -2
  7. package/dist/commands/agent.mcp.register.js.map +1 -1
  8. package/dist/commands/agent.plan.approve.d.ts.map +1 -1
  9. package/dist/commands/agent.plan.approve.js +2 -1
  10. package/dist/commands/agent.plan.approve.js.map +1 -1
  11. package/dist/commands/agent.plan.create.d.ts.map +1 -1
  12. package/dist/commands/agent.plan.create.js +2 -1
  13. package/dist/commands/agent.plan.create.js.map +1 -1
  14. package/dist/commands/agent.skill.list.d.ts.map +1 -1
  15. package/dist/commands/agent.skill.list.js +4 -2
  16. package/dist/commands/agent.skill.list.js.map +1 -1
  17. package/dist/commands/agent.task.background.cancel.d.ts.map +1 -1
  18. package/dist/commands/agent.task.background.cancel.js +2 -1
  19. package/dist/commands/agent.task.background.cancel.js.map +1 -1
  20. package/dist/commands/agent.task.background.read.d.ts.map +1 -1
  21. package/dist/commands/agent.task.background.read.js.map +1 -1
  22. package/dist/commands/agent.task.background.start.d.ts.map +1 -1
  23. package/dist/commands/agent.task.background.start.js +2 -1
  24. package/dist/commands/agent.task.background.start.js.map +1 -1
  25. package/dist/commands/agent.tool.list.d.ts.map +1 -1
  26. package/dist/commands/agent.tool.list.js +4 -2
  27. package/dist/commands/agent.tool.list.js.map +1 -1
  28. package/dist/commands/api-key.create.d.ts.map +1 -1
  29. package/dist/commands/api-key.create.js +2 -1
  30. package/dist/commands/api-key.create.js.map +1 -1
  31. package/dist/commands/archive.create.d.ts.map +1 -1
  32. package/dist/commands/archive.create.js +2 -1
  33. package/dist/commands/archive.create.js.map +1 -1
  34. package/dist/commands/asset.upload.d.ts.map +1 -1
  35. package/dist/commands/asset.upload.js +2 -1
  36. package/dist/commands/asset.upload.js.map +1 -1
  37. package/dist/commands/automation.list.d.ts.map +1 -1
  38. package/dist/commands/automation.list.js +3 -1
  39. package/dist/commands/automation.list.js.map +1 -1
  40. package/dist/commands/billing.credits.purchase.d.ts.map +1 -1
  41. package/dist/commands/billing.credits.purchase.js +2 -1
  42. package/dist/commands/billing.credits.purchase.js.map +1 -1
  43. package/dist/commands/billing.status.d.ts.map +1 -1
  44. package/dist/commands/billing.status.js +2 -1
  45. package/dist/commands/billing.status.js.map +1 -1
  46. package/dist/commands/billing.subscription.read.d.ts.map +1 -1
  47. package/dist/commands/billing.subscription.read.js +4 -2
  48. package/dist/commands/billing.subscription.read.js.map +1 -1
  49. package/dist/commands/billing.subscription.upgrade.start.d.ts.map +1 -1
  50. package/dist/commands/billing.subscription.upgrade.start.js +2 -1
  51. package/dist/commands/billing.subscription.upgrade.start.js.map +1 -1
  52. package/dist/commands/brandkit.apply.d.ts.map +1 -1
  53. package/dist/commands/brandkit.apply.js +3 -2
  54. package/dist/commands/brandkit.apply.js.map +1 -1
  55. package/dist/commands/chat.send.d.ts.map +1 -1
  56. package/dist/commands/chat.send.js +124 -19
  57. package/dist/commands/chat.send.js.map +1 -1
  58. package/dist/commands/conversation.purge.d.ts.map +1 -1
  59. package/dist/commands/conversation.purge.js +3 -2
  60. package/dist/commands/conversation.purge.js.map +1 -1
  61. package/dist/commands/document.list.d.ts.map +1 -1
  62. package/dist/commands/document.list.js +4 -2
  63. package/dist/commands/document.list.js.map +1 -1
  64. package/dist/commands/documents.pdf.create.d.ts.map +1 -1
  65. package/dist/commands/documents.pdf.create.js +3 -2
  66. package/dist/commands/documents.pdf.create.js.map +1 -1
  67. package/dist/commands/form.fill.d.ts.map +1 -1
  68. package/dist/commands/form.fill.js +2 -1
  69. package/dist/commands/form.fill.js.map +1 -1
  70. package/dist/commands/graph.cypher.d.ts +3 -0
  71. package/dist/commands/graph.cypher.d.ts.map +1 -0
  72. package/dist/commands/graph.cypher.js +37 -0
  73. package/dist/commands/graph.cypher.js.map +1 -0
  74. package/dist/commands/graph.edge.delete.d.ts +3 -0
  75. package/dist/commands/graph.edge.delete.d.ts.map +1 -0
  76. package/dist/commands/graph.edge.delete.js +53 -0
  77. package/dist/commands/graph.edge.delete.js.map +1 -0
  78. package/dist/commands/graph.edge.upsert.d.ts +3 -0
  79. package/dist/commands/graph.edge.upsert.d.ts.map +1 -0
  80. package/dist/commands/graph.edge.upsert.js +47 -0
  81. package/dist/commands/graph.edge.upsert.js.map +1 -0
  82. package/dist/commands/graph.node.delete.d.ts +3 -0
  83. package/dist/commands/graph.node.delete.d.ts.map +1 -0
  84. package/dist/commands/graph.node.delete.js +34 -0
  85. package/dist/commands/graph.node.delete.js.map +1 -0
  86. package/dist/commands/graph.node.get.d.ts +3 -0
  87. package/dist/commands/graph.node.get.d.ts.map +1 -0
  88. package/dist/commands/graph.node.get.js +16 -0
  89. package/dist/commands/graph.node.get.js.map +1 -0
  90. package/dist/commands/graph.node.search.d.ts +3 -0
  91. package/dist/commands/graph.node.search.d.ts.map +1 -0
  92. package/dist/commands/graph.node.search.js +31 -0
  93. package/dist/commands/graph.node.search.js.map +1 -0
  94. package/dist/commands/graph.node.upsert.d.ts +3 -0
  95. package/dist/commands/graph.node.upsert.d.ts.map +1 -0
  96. package/dist/commands/graph.node.upsert.js +39 -0
  97. package/dist/commands/graph.node.upsert.js.map +1 -0
  98. package/dist/commands/image.list.d.ts.map +1 -1
  99. package/dist/commands/image.list.js +4 -2
  100. package/dist/commands/image.list.js.map +1 -1
  101. package/dist/commands/org.member.add.d.ts.map +1 -1
  102. package/dist/commands/org.member.add.js +2 -1
  103. package/dist/commands/org.member.add.js.map +1 -1
  104. package/dist/commands/org.member.invite.decline.d.ts.map +1 -1
  105. package/dist/commands/org.member.invite.decline.js +2 -1
  106. package/dist/commands/org.member.invite.decline.js.map +1 -1
  107. package/dist/commands/org.member.remove.d.ts.map +1 -1
  108. package/dist/commands/org.member.remove.js +2 -1
  109. package/dist/commands/org.member.remove.js.map +1 -1
  110. package/dist/commands/org.member.role.change.d.ts.map +1 -1
  111. package/dist/commands/org.member.role.change.js +2 -1
  112. package/dist/commands/org.member.role.change.js.map +1 -1
  113. package/dist/commands/plugin.credential.reauth.d.ts.map +1 -1
  114. package/dist/commands/plugin.credential.reauth.js.map +1 -1
  115. package/dist/commands/plugin.credential.set_secret.d.ts.map +1 -1
  116. package/dist/commands/plugin.credential.set_secret.js +2 -1
  117. package/dist/commands/plugin.credential.set_secret.js.map +1 -1
  118. package/dist/commands/plugin.denylist.add.d.ts.map +1 -1
  119. package/dist/commands/plugin.denylist.add.js +2 -1
  120. package/dist/commands/plugin.denylist.add.js.map +1 -1
  121. package/dist/commands/plugin.denylist.remove.d.ts.map +1 -1
  122. package/dist/commands/plugin.denylist.remove.js +2 -1
  123. package/dist/commands/plugin.denylist.remove.js.map +1 -1
  124. package/dist/commands/plugin.install.d.ts.map +1 -1
  125. package/dist/commands/plugin.install.js +2 -1
  126. package/dist/commands/plugin.install.js.map +1 -1
  127. package/dist/commands/plugin.list.d.ts.map +1 -1
  128. package/dist/commands/plugin.list.js +2 -1
  129. package/dist/commands/plugin.list.js.map +1 -1
  130. package/dist/commands/plugin.org.install.d.ts.map +1 -1
  131. package/dist/commands/plugin.org.install.js +2 -1
  132. package/dist/commands/plugin.org.install.js.map +1 -1
  133. package/dist/commands/plugin.org.install_bulk.d.ts.map +1 -1
  134. package/dist/commands/plugin.org.install_bulk.js +2 -1
  135. package/dist/commands/plugin.org.install_bulk.js.map +1 -1
  136. package/dist/commands/plugin.org.list.d.ts.map +1 -1
  137. package/dist/commands/plugin.org.list.js +4 -2
  138. package/dist/commands/plugin.org.list.js.map +1 -1
  139. package/dist/commands/plugin.org.set_enabled.d.ts.map +1 -1
  140. package/dist/commands/plugin.org.set_enabled.js +2 -1
  141. package/dist/commands/plugin.org.set_enabled.js.map +1 -1
  142. package/dist/commands/plugin.org.uninstall.d.ts.map +1 -1
  143. package/dist/commands/plugin.org.uninstall.js +2 -1
  144. package/dist/commands/plugin.org.uninstall.js.map +1 -1
  145. package/dist/commands/plugin.registry.add.d.ts.map +1 -1
  146. package/dist/commands/plugin.registry.add.js.map +1 -1
  147. package/dist/commands/plugin.registry.list.d.ts.map +1 -1
  148. package/dist/commands/plugin.registry.list.js.map +1 -1
  149. package/dist/commands/plugin.registry.remove.d.ts.map +1 -1
  150. package/dist/commands/plugin.registry.remove.js +2 -1
  151. package/dist/commands/plugin.registry.remove.js.map +1 -1
  152. package/dist/commands/plugin.registry.sync.d.ts.map +1 -1
  153. package/dist/commands/plugin.registry.sync.js +2 -1
  154. package/dist/commands/plugin.registry.sync.js.map +1 -1
  155. package/dist/commands/plugin.settings.set_auth_alerts.d.ts.map +1 -1
  156. package/dist/commands/plugin.settings.set_auth_alerts.js +3 -2
  157. package/dist/commands/plugin.settings.set_auth_alerts.js.map +1 -1
  158. package/dist/commands/plugin.uninstall.d.ts.map +1 -1
  159. package/dist/commands/plugin.uninstall.js +2 -1
  160. package/dist/commands/plugin.uninstall.js.map +1 -1
  161. package/dist/commands/plugin.workspace.set_enabled.d.ts.map +1 -1
  162. package/dist/commands/plugin.workspace.set_enabled.js +3 -2
  163. package/dist/commands/plugin.workspace.set_enabled.js.map +1 -1
  164. package/dist/commands/privacy.erase.d.ts.map +1 -1
  165. package/dist/commands/privacy.erase.js.map +1 -1
  166. package/dist/commands/privacy.export.d.ts.map +1 -1
  167. package/dist/commands/privacy.export.js.map +1 -1
  168. package/dist/commands/research.swarm.start.d.ts +3 -0
  169. package/dist/commands/research.swarm.start.d.ts.map +1 -0
  170. package/dist/commands/research.swarm.start.js +35 -0
  171. package/dist/commands/research.swarm.start.js.map +1 -0
  172. package/dist/commands/research.swarm.status.d.ts +3 -0
  173. package/dist/commands/research.swarm.status.d.ts.map +1 -0
  174. package/dist/commands/research.swarm.status.js +26 -0
  175. package/dist/commands/research.swarm.status.js.map +1 -0
  176. package/dist/commands/skill.workspace.list.d.ts.map +1 -1
  177. package/dist/commands/skill.workspace.list.js +4 -2
  178. package/dist/commands/skill.workspace.list.js.map +1 -1
  179. package/dist/commands/system.install.instructions.d.ts.map +1 -1
  180. package/dist/commands/system.install.instructions.js +7 -4
  181. package/dist/commands/system.install.instructions.js.map +1 -1
  182. package/dist/commands/web.fetch.d.ts +3 -0
  183. package/dist/commands/web.fetch.d.ts.map +1 -0
  184. package/dist/commands/web.fetch.js +39 -0
  185. package/dist/commands/web.fetch.js.map +1 -0
  186. package/dist/commands/web.search.d.ts +3 -0
  187. package/dist/commands/web.search.d.ts.map +1 -0
  188. package/dist/commands/web.search.js +50 -0
  189. package/dist/commands/web.search.js.map +1 -0
  190. package/dist/commands/workflow.cancel.d.ts.map +1 -1
  191. package/dist/commands/workflow.cancel.js +2 -1
  192. package/dist/commands/workflow.cancel.js.map +1 -1
  193. package/dist/commands/workflow.run.d.ts.map +1 -1
  194. package/dist/commands/workflow.run.js +2 -1
  195. package/dist/commands/workflow.run.js.map +1 -1
  196. package/dist/commands/workflow.status.d.ts.map +1 -1
  197. package/dist/commands/workflow.status.js +4 -2
  198. package/dist/commands/workflow.status.js.map +1 -1
  199. package/dist/commands/workspace.create.d.ts.map +1 -1
  200. package/dist/commands/workspace.create.js +2 -1
  201. package/dist/commands/workspace.create.js.map +1 -1
  202. package/dist/commands/workspace.list.d.ts.map +1 -1
  203. package/dist/commands/workspace.list.js +2 -1
  204. package/dist/commands/workspace.list.js.map +1 -1
  205. package/dist/commands/workspace.member.list.d.ts.map +1 -1
  206. package/dist/commands/workspace.member.list.js +3 -1
  207. package/dist/commands/workspace.member.list.js.map +1 -1
  208. package/dist/commands/workspace.model.settings.read.d.ts.map +1 -1
  209. package/dist/commands/workspace.model.settings.read.js +2 -1
  210. package/dist/commands/workspace.model.settings.read.js.map +1 -1
  211. package/dist/commands/workspace.model.settings.write.d.ts.map +1 -1
  212. package/dist/commands/workspace.model.settings.write.js +2 -1
  213. package/dist/commands/workspace.model.settings.write.js.map +1 -1
  214. package/dist/commands.test.js +202 -23
  215. package/dist/commands.test.js.map +1 -1
  216. package/dist/index.js +31 -0
  217. package/dist/index.js.map +1 -1
  218. package/dist/lib/config.d.ts +2 -0
  219. package/dist/lib/config.d.ts.map +1 -1
  220. package/dist/lib/config.js +7 -1
  221. package/dist/lib/config.js.map +1 -1
  222. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { apiRequest, requireAuth, ApiError } from "../lib/api-client.js";
3
+ import { getOrgId } from "../lib/config.js";
3
4
  export const workspaceCreateCommand = new Command("create")
4
5
  .description("Create a new workspace")
5
6
  .argument("<name>", "Workspace name")
@@ -10,7 +11,7 @@ export const workspaceCreateCommand = new Command("create")
10
11
  try {
11
12
  const data = await apiRequest("/workspaces", {
12
13
  method: "POST",
13
- body: JSON.stringify({ name, org: options.org, slug: options.slug }),
14
+ body: JSON.stringify({ name, org: options.org ?? getOrgId(), slug: options.slug }),
14
15
  });
15
16
  const ws = data.workspace ?? data;
16
17
  console.log(`✓ Workspace created: ${ws?.slug ?? ws.slug ?? "unknown"}`);
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.create.js","sourceRoot":"","sources":["../../src/commands/workspace.create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KACxD,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KACpC,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAwC,EAAE,EAAE;IACvE,WAAW,EAAE,CAAC;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAoB,aAAa,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;SACrE,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,wBAAyB,EAAqC,EAAE,IAAI,IAAK,EAAwB,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;IACrI,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"workspace.create.js","sourceRoot":"","sources":["../../src/commands/workspace.create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KACxD,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KACpC,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAwC,EAAE,EAAE;IACvE,WAAW,EAAE,CAAC;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAoB,aAAa,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;SACnF,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,wBAAyB,EAAqC,EAAE,IAAI,IAAK,EAAwB,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;IACrI,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.list.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,oBAAoB,SAqB7B,CAAC"}
1
+ {"version":3,"file":"workspace.list.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,oBAAoB,SAqB7B,CAAC"}
@@ -1,12 +1,13 @@
1
1
  import { Command } from "commander";
2
2
  import { apiRequest, requireAuth, ApiError } from "../lib/api-client.js";
3
+ import { getOrgId } from "../lib/config.js";
3
4
  export const workspaceListCommand = new Command("list")
4
5
  .description("List workspaces in current organization")
5
6
  .option("--org <slug>", "Organization slug")
6
7
  .action(async (options) => {
7
8
  requireAuth();
8
9
  try {
9
- const qs = options.org ? `?org=${options.org}` : "";
10
+ const qs = options.org ? `?org=${options.org ?? getOrgId()}` : "";
10
11
  const data = await apiRequest(`/workspaces${qs}`);
11
12
  const workspaces = data.workspaces ?? data.data ?? [];
12
13
  if (workspaces.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.list.js","sourceRoot":"","sources":["../../src/commands/workspace.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAazE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACpD,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IAC1C,WAAW,EAAE,CAAC;IACd,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAqB,cAAc,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACtD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,SAAS,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"workspace.list.js","sourceRoot":"","sources":["../../src/commands/workspace.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAa5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACpD,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IAC1C,WAAW,EAAE,CAAC;IACd,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAqB,cAAc,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACtD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,SAAS,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.member.list.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.member.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,0BAA0B,SAwBnC,CAAC"}
1
+ {"version":3,"file":"workspace.member.list.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.member.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,0BAA0B,SAyBnC,CAAC"}
@@ -1,11 +1,13 @@
1
1
  import { Command } from "commander";
2
2
  import { apiRequest, ApiError } from "../lib/api-client.js";
3
+ import { getWorkspaceId } from "../lib/config.js";
3
4
  export const workspaceMemberListCommand = new Command("list")
4
5
  .description("List members of a workspace")
5
6
  .option("-w, --workspace <id>", "Workspace ID (defaults to current workspace)")
6
7
  .action(async (options) => {
7
8
  try {
8
- const params = options.workspace ? `?workspace_id=${options.workspace}` : "";
9
+ const workspaceId = options.workspace ?? getWorkspaceId();
10
+ const params = workspaceId ? `?workspace_id=${workspaceId}` : "";
9
11
  const data = await apiRequest(`/workspace/member/list${params}`, { method: "GET" });
10
12
  if (!data.length) {
11
13
  console.log("No members found.");
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.member.list.js","sourceRoot":"","sources":["../../src/commands/workspace.member.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAS5D,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC1D,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,sBAAsB,EAAE,8CAA8C,CAAC;KAC9E,MAAM,CAAC,KAAK,EAAE,OAA+B,EAAE,EAAE;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,yBAAyB,MAAM,EAAE,EACjC,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"workspace.member.list.js","sourceRoot":"","sources":["../../src/commands/workspace.member.list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASlD,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC1D,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,sBAAsB,EAAE,8CAA8C,CAAC;KAC9E,MAAM,CAAC,KAAK,EAAE,OAA+B,EAAE,EAAE;IAChD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,yBAAyB,MAAM,EAAE,EACjC,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.model.settings.read.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,iCAAiC,SAgB1C,CAAC"}
1
+ {"version":3,"file":"workspace.model.settings.read.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,iCAAiC,SAgB1C,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { apiRequest } from "../lib/api-client.js";
3
+ import { getWorkspaceId } from "../lib/config.js";
3
4
  export const workspaceModelSettingsReadCommand = new Command("read")
4
5
  .description("Read model settings for a workspace")
5
6
  .option("-w, --workspace <slug>", "Workspace slug (uses current if not specified)")
@@ -8,7 +9,7 @@ export const workspaceModelSettingsReadCommand = new Command("read")
8
9
  const result = await apiRequest("/workspace/model-settings/read", {
9
10
  method: "POST",
10
11
  body: JSON.stringify({
11
- workspace: options.workspace,
12
+ workspace: options.workspace ?? getWorkspaceId(),
12
13
  }),
13
14
  });
14
15
  console.log(JSON.stringify(result, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.model.settings.read.js","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACjE,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,wBAAwB,EAAE,gDAAgD,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gCAAgC,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC;SACH,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"workspace.model.settings.read.js","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACjE,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,wBAAwB,EAAE,gDAAgD,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gCAAgC,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,cAAc,EAAE;aACjD,CAAC;SACH,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.model.settings.write.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,kCAAkC,SAoB3C,CAAC"}
1
+ {"version":3,"file":"workspace.model.settings.write.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,kCAAkC,SAoB3C,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { apiRequest } from "../lib/api-client.js";
3
+ import { getWorkspaceId } from "../lib/config.js";
3
4
  export const workspaceModelSettingsWriteCommand = new Command("write")
4
5
  .description("Update model settings for a workspace")
5
6
  .requiredOption("-k, --key <key>", "Setting key")
@@ -10,7 +11,7 @@ export const workspaceModelSettingsWriteCommand = new Command("write")
10
11
  const result = await apiRequest("/workspace/model-settings/write", {
11
12
  method: "POST",
12
13
  body: JSON.stringify({
13
- workspace: options.workspace,
14
+ workspace: options.workspace ?? getWorkspaceId(),
14
15
  key: options.key,
15
16
  value: options.value,
16
17
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.model.settings.write.js","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KACnE,WAAW,CAAC,uCAAuC,CAAC;KACpD,cAAc,CAAC,iBAAiB,EAAE,aAAa,CAAC;KAChD,cAAc,CAAC,qBAAqB,EAAE,eAAe,CAAC;KACtD,MAAM,CAAC,wBAAwB,EAAE,gDAAgD,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iCAAiC,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC;SACH,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"workspace.model.settings.write.js","sourceRoot":"","sources":["../../src/commands/workspace.model.settings.write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KACnE,WAAW,CAAC,uCAAuC,CAAC;KACpD,cAAc,CAAC,iBAAiB,EAAE,aAAa,CAAC;KAChD,cAAc,CAAC,qBAAqB,EAAE,eAAe,CAAC;KACtD,MAAM,CAAC,wBAAwB,EAAE,gDAAgD,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iCAAiC,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,cAAc,EAAE;gBAChD,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC;SACH,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -6,6 +6,8 @@ vi.mock("./lib/config.js", () => ({
6
6
  readConfig: vi.fn(() => ({ token: "test-token", orgSlug: "my-org", workspaceSlug: "default" })),
7
7
  writeConfig: vi.fn(),
8
8
  clearConfig: vi.fn(),
9
+ getOrgId: vi.fn(() => "my-org"),
10
+ getWorkspaceId: vi.fn(() => "default"),
9
11
  }));
10
12
  vi.mock("./lib/api-client.js", () => ({
11
13
  apiRequest: vi.fn(),
@@ -118,6 +120,8 @@ const mockRequireAuth = vi.mocked(apiClient.requireAuth);
118
120
  const mockWriteConfig = vi.mocked(config.writeConfig);
119
121
  const mockClearConfig = vi.mocked(config.clearConfig);
120
122
  const mockGetToken = vi.mocked(config.getToken);
123
+ const mockGetOrgId = vi.mocked(config.getOrgId);
124
+ const mockGetWorkspaceId = vi.mocked(config.getWorkspaceId);
121
125
  // Helper: throw an ApiError through apiRequest mock (covers instanceof branch in catch blocks)
122
126
  function mockApiError(status, message) {
123
127
  const ApiErrorClass = apiClient.ApiError;
@@ -355,33 +359,62 @@ describe("workspace create", () => {
355
359
  // ---------------------------------------------------------------------------
356
360
  // chat send
357
361
  // ---------------------------------------------------------------------------
362
+ // chat.send uses native fetch() directly for SSE streaming (not apiRequest).
363
+ // Build minimal SSE response helpers here.
364
+ function makeSseResponse(text) {
365
+ const line = `data: ${JSON.stringify({ type: "text", text })}\n\nevent: done\ndata: [DONE]\n\n`;
366
+ const encoder = new TextEncoder();
367
+ const stream = new ReadableStream({
368
+ start(c) { c.enqueue(encoder.encode(line)); c.close(); },
369
+ });
370
+ return new Response(stream, {
371
+ status: 200,
372
+ headers: { "content-type": "text/event-stream" },
373
+ });
374
+ }
375
+ function makeErrorResponse(status, message) {
376
+ return new Response(JSON.stringify({ error: message }), {
377
+ status,
378
+ headers: { "content-type": "application/json" },
379
+ });
380
+ }
358
381
  describe("chat send", () => {
359
- it("sends message and prints response", async () => {
360
- const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
361
- mockApiRequest.mockResolvedValueOnce({ content: "Hello back!" });
382
+ afterEach(() => { vi.restoreAllMocks(); });
383
+ it("sends message and streams response to stdout", async () => {
384
+ const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => true);
385
+ vi.spyOn(global, "fetch").mockResolvedValueOnce(makeSseResponse("Hello back!"));
362
386
  await chatSendCommand.parseAsync(["node", "cli", "hello"]);
363
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("hello"));
364
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Hello back!"));
365
- consoleSpy.mockRestore();
366
- });
367
- it("passes conversation id when provided", async () => {
368
- const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
369
- mockApiRequest.mockResolvedValueOnce({ content: "response" });
387
+ const written = stdoutSpy.mock.calls.map((c) => String(c[0])).join("");
388
+ expect(written).toContain("Hello back!");
389
+ stdoutSpy.mockRestore();
390
+ });
391
+ it("passes conversationId when --conversation is provided", async () => {
392
+ const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => true);
393
+ let capturedBody = null;
394
+ vi.spyOn(global, "fetch").mockImplementationOnce(async (_url, init) => {
395
+ capturedBody = JSON.parse(init.body);
396
+ return makeSseResponse("ok");
397
+ });
370
398
  await chatSendCommand.parseAsync(["node", "cli", "hi", "--conversation", "cnv_abc"]);
371
- const calls = mockApiRequest.mock.calls;
372
- const init = calls[0]?.[1];
373
- const callBody = JSON.parse(init?.body);
374
- expect(callBody.conversationId).toBe("cnv_abc");
375
- consoleSpy.mockRestore();
399
+ expect(capturedBody["conversationId"]).toBe("cnv_abc");
400
+ stdoutSpy.mockRestore();
376
401
  });
377
- it("exits 1 on API error", async () => {
402
+ it("exits 1 when fetch throws a network error", async () => {
378
403
  const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
379
404
  const exitSpy = vi.spyOn(process, "exit").mockImplementation(() => { throw new Error("exit"); });
380
- mockApiRequest.mockRejectedValueOnce(new Error("timeout"));
405
+ vi.spyOn(global, "fetch").mockRejectedValueOnce(new Error("ECONNREFUSED"));
381
406
  await expect(() => chatSendCommand.parseAsync(["node", "cli", "msg"])).rejects.toThrow("exit");
382
407
  consoleSpy.mockRestore();
383
408
  exitSpy.mockRestore();
384
409
  });
410
+ it("exits 1 on non-ok HTTP response", async () => {
411
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
412
+ const exitSpy = vi.spyOn(process, "exit").mockImplementation(() => { throw new Error("exit"); });
413
+ vi.spyOn(global, "fetch").mockResolvedValueOnce(makeErrorResponse(503, "Service unavailable"));
414
+ await expect(() => chatSendCommand.parseAsync(["node", "cli", "test"])).rejects.toThrow();
415
+ consoleSpy.mockRestore();
416
+ exitSpy.mockRestore();
417
+ });
385
418
  });
386
419
  // ---------------------------------------------------------------------------
387
420
  // conversation commands
@@ -637,7 +670,7 @@ describe("agent mcp list", () => {
637
670
  servers: [{ id: "mcp1", name: "claude", status: "active" }],
638
671
  });
639
672
  await agentMcpListCommand.parseAsync(["node", "cli"]);
640
- expect(mockApiRequest).toHaveBeenCalledWith("/agent/mcp/list?", expect.objectContaining({ method: "GET" }));
673
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.stringContaining("/agent/mcp/list"), expect.objectContaining({ method: "GET" }));
641
674
  expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("MCP Servers"));
642
675
  consoleSpy.mockRestore();
643
676
  });
@@ -652,7 +685,7 @@ describe("agent skill list", () => {
652
685
  skills: [{ id: "skill1", name: "memory", description: "Memory management" }],
653
686
  });
654
687
  await agentSkillListCommand.parseAsync(["node", "cli"]);
655
- expect(mockApiRequest).toHaveBeenCalledWith("/agent/skill/list?", expect.objectContaining({ method: "GET" }));
688
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.stringContaining("/agent/skill/list"), expect.objectContaining({ method: "GET" }));
656
689
  expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Agent Skills"));
657
690
  consoleSpy.mockRestore();
658
691
  });
@@ -667,7 +700,7 @@ describe("agent tool list", () => {
667
700
  tools: [{ id: "tool1", name: "search", description: "Search capability" }],
668
701
  });
669
702
  await agentToolListCommand.parseAsync(["node", "cli"]);
670
- expect(mockApiRequest).toHaveBeenCalledWith("/agent/tool/list?", expect.objectContaining({ method: "GET" }));
703
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.stringContaining("/agent/tool/list"), expect.objectContaining({ method: "GET" }));
671
704
  expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Agent Tools"));
672
705
  consoleSpy.mockRestore();
673
706
  });
@@ -698,7 +731,7 @@ describe("billing subscription read", () => {
698
731
  subscription: { id: "sub1", plan: "scale", status: "active" },
699
732
  });
700
733
  await billingSubscriptionReadCommand.parseAsync(["node", "cli"]);
701
- expect(mockApiRequest).toHaveBeenCalledWith("/billing/subscription/read?", expect.objectContaining({ method: "GET" }));
734
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.stringContaining("/billing/subscription/read"), expect.objectContaining({ method: "GET" }));
702
735
  expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Current Subscription"));
703
736
  consoleSpy.mockRestore();
704
737
  });
@@ -2187,9 +2220,12 @@ describe("branch coverage: empty/optional data branches", () => {
2187
2220
  it("chat send ApiError path", async () => {
2188
2221
  const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
2189
2222
  const exitSpy = vi.spyOn(process, "exit").mockImplementation((_code) => { throw new Error("exit"); });
2190
- mockApiError(503, "Service unavailable");
2223
+ // chat.send uses native fetch (not apiRequest); mock fetch directly.
2224
+ vi.spyOn(global, "fetch").mockResolvedValueOnce(new Response(JSON.stringify({ error: "Service unavailable" }), {
2225
+ status: 503,
2226
+ headers: { "content-type": "application/json" },
2227
+ }));
2191
2228
  await expect(chatSendCommand.parseAsync(["node", "cli", "test"])).rejects.toThrow();
2192
- expect(consoleSpy).toHaveBeenCalledWith("Error: Service unavailable");
2193
2229
  consoleSpy.mockRestore();
2194
2230
  exitSpy.mockRestore();
2195
2231
  });
@@ -2218,4 +2254,147 @@ describe("branch coverage: empty/optional data branches", () => {
2218
2254
  exitSpy.mockRestore();
2219
2255
  });
2220
2256
  });
2257
+ describe("Environment Variable Defaults", () => {
2258
+ beforeEach(() => {
2259
+ mockGetOrgId.mockReturnValue("default-org");
2260
+ mockGetWorkspaceId.mockReturnValue("default-workspace");
2261
+ mockGetToken.mockReturnValue("default-token");
2262
+ });
2263
+ afterEach(() => {
2264
+ delete process.env.OXAGEN_ORG_ID;
2265
+ delete process.env.OXAGEN_WORKSPACE_ID;
2266
+ delete process.env.OXAGEN_API_TOKEN;
2267
+ vi.clearAllMocks();
2268
+ });
2269
+ describe("OXAGEN_ORG_ID environment variable", () => {
2270
+ it("org member list uses OXAGEN_ORG_ID env var when no --org flag provided", async () => {
2271
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2272
+ mockGetOrgId.mockReturnValue("env-org-123");
2273
+ mockApiRequest.mockResolvedValueOnce({ members: [] });
2274
+ await orgMemberAddCommand.parseAsync(["node", "cli", "user@example.com", "--role", "admin"]);
2275
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
2276
+ body: expect.stringContaining("env-org-123"),
2277
+ }));
2278
+ consoleSpy.mockRestore();
2279
+ });
2280
+ it("org member list uses command-line --org flag to override OXAGEN_ORG_ID env var", async () => {
2281
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2282
+ mockGetOrgId.mockReturnValue("env-org-123");
2283
+ mockApiRequest.mockResolvedValueOnce({ members: [] });
2284
+ await orgMemberAddCommand.parseAsync(["node", "cli", "user@example.com", "--role", "admin", "--org", "cli-org-456"]);
2285
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
2286
+ body: expect.stringContaining("cli-org-456"),
2287
+ }));
2288
+ consoleSpy.mockRestore();
2289
+ });
2290
+ });
2291
+ describe("OXAGEN_WORKSPACE_ID environment variable", () => {
2292
+ afterEach(() => {
2293
+ mockApiRequest.mockClear();
2294
+ });
2295
+ it("workspace member list uses env var default when no --workspace flag", async () => {
2296
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2297
+ mockGetWorkspaceId.mockReturnValue("env-workspace-789");
2298
+ mockApiRequest.mockResolvedValueOnce([]);
2299
+ await workspaceMemberListCommand.parseAsync(["node", "cli"]);
2300
+ const calls = mockApiRequest.mock.calls;
2301
+ expect(calls.length).toBeGreaterThan(0);
2302
+ expect(calls[0]?.[0]).toContain("workspace_id=env-workspace-789");
2303
+ consoleSpy.mockRestore();
2304
+ });
2305
+ it("workspace member list uses explicit flag to override env var", async () => {
2306
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2307
+ mockGetWorkspaceId.mockReturnValue("env-workspace-789");
2308
+ mockApiRequest.mockResolvedValueOnce([]);
2309
+ await workspaceMemberListCommand.parseAsync(["node", "cli", "-w", "cli-workspace-xyz"]);
2310
+ const calls = mockApiRequest.mock.calls;
2311
+ expect(calls.length).toBeGreaterThan(0);
2312
+ expect(calls[0]?.[0]).toContain("workspace_id=cli-workspace-xyz");
2313
+ consoleSpy.mockRestore();
2314
+ });
2315
+ });
2316
+ describe("OXAGEN_API_TOKEN environment variable", () => {
2317
+ it("uses OXAGEN_API_TOKEN for Bearer token in Authorization header", async () => {
2318
+ mockGetToken.mockReturnValue("sk-token-from-env");
2319
+ mockApiRequest.mockResolvedValueOnce({ key: "key123" });
2320
+ await apiKeyCreateCommand.parseAsync(["node", "cli", "mykey"]);
2321
+ expect(mockApiRequest).toHaveBeenCalled();
2322
+ });
2323
+ });
2324
+ describe("Precedence: env vars > command-line args (fallback pattern)", () => {
2325
+ it("agent mcp register: workspace_id uses command-line --workspace when provided", async () => {
2326
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2327
+ mockGetWorkspaceId.mockReturnValue("env-workspace-999");
2328
+ mockApiRequest.mockResolvedValueOnce({
2329
+ mcpServerId: "mcp-123",
2330
+ healthStatus: "healthy",
2331
+ discoveredTools: ["tool1"],
2332
+ });
2333
+ await agentMcpRegisterCommand.parseAsync([
2334
+ "node", "cli", "register",
2335
+ "-n", "my-mcp",
2336
+ "-u", "http://localhost:9000",
2337
+ "-t", "streamable-http",
2338
+ "-w", "explicit-workspace-888"
2339
+ ]);
2340
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
2341
+ body: expect.stringContaining("explicit-workspace-888"),
2342
+ }));
2343
+ consoleSpy.mockRestore();
2344
+ });
2345
+ it("agent mcp register: org_id uses getOrgId fallback when no --org flag provided", async () => {
2346
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2347
+ mockGetOrgId.mockReturnValue("fallback-org-111");
2348
+ mockGetWorkspaceId.mockReturnValue("any-workspace");
2349
+ mockApiRequest.mockResolvedValueOnce({
2350
+ mcpServerId: "mcp-456",
2351
+ healthStatus: "healthy",
2352
+ discoveredTools: [],
2353
+ });
2354
+ await agentMcpRegisterCommand.parseAsync([
2355
+ "node", "cli", "register",
2356
+ "-n", "my-mcp",
2357
+ "-u", "http://localhost:9000",
2358
+ "-t", "streamable-http"
2359
+ ]);
2360
+ expect(mockApiRequest).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
2361
+ body: expect.stringContaining("fallback-org-111"),
2362
+ }));
2363
+ consoleSpy.mockRestore();
2364
+ });
2365
+ });
2366
+ describe("Multiple commands with env var defaults", () => {
2367
+ beforeEach(() => {
2368
+ vi.clearAllMocks();
2369
+ mockGetWorkspaceId.mockReturnValue("env-ws-default");
2370
+ // Commander retains option values between parseAsync calls; reset to avoid cross-test pollution
2371
+ workspaceMemberListCommand.setOptionValue("workspace", undefined);
2372
+ });
2373
+ it("workspace member list uses OXAGEN_WORKSPACE_ID as default when no --workspace flag", async () => {
2374
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2375
+ mockApiRequest.mockResolvedValueOnce([
2376
+ { id: "user1", email: "user@test.com", role: "member", joined_at: "2024-01-01" }
2377
+ ]);
2378
+ await workspaceMemberListCommand.parseAsync(["node", "cli"]);
2379
+ const calls = mockApiRequest.mock.calls;
2380
+ expect(calls.length).toBeGreaterThan(0);
2381
+ expect(calls[0]?.[0]).toContain("workspace_id=env-ws-default");
2382
+ consoleSpy.mockRestore();
2383
+ });
2384
+ it("workspace member list uses explicit --workspace to override OXAGEN_WORKSPACE_ID", async () => {
2385
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
2386
+ mockApiRequest.mockResolvedValueOnce([
2387
+ { id: "user1", email: "user@test.com", role: "member", joined_at: "2024-01-01" }
2388
+ ]);
2389
+ await workspaceMemberListCommand.parseAsync([
2390
+ "node", "cli",
2391
+ "-w", "explicit-ws"
2392
+ ]);
2393
+ const calls = mockApiRequest.mock.calls;
2394
+ expect(calls.length).toBeGreaterThan(0);
2395
+ expect(calls[0]?.[0]).toContain("workspace_id=explicit-ws");
2396
+ consoleSpy.mockRestore();
2397
+ });
2398
+ });
2399
+ });
2221
2400
  //# sourceMappingURL=commands.test.js.map