@withbuddi/buddi 0.1.0-pre.19 → 0.1.0-pre.20

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 +1 -1
  2. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  3. package/node_modules/@buddi/cli/dist/commands.js +1 -1
  4. package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
  5. package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
  6. package/node_modules/@buddi/cli/dist/main.js +12 -2
  7. package/node_modules/@buddi/cli/dist/main.js.map +1 -1
  8. package/node_modules/@buddi/cli/dist/status.d.ts +10 -0
  9. package/node_modules/@buddi/cli/dist/status.d.ts.map +1 -1
  10. package/node_modules/@buddi/cli/dist/status.js +4 -0
  11. package/node_modules/@buddi/cli/dist/status.js.map +1 -1
  12. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  13. package/node_modules/@buddi/core/dist/agents/catalog.d.ts.map +1 -1
  14. package/node_modules/@buddi/core/dist/agents/catalog.js +7 -1
  15. package/node_modules/@buddi/core/dist/agents/catalog.js.map +1 -1
  16. package/node_modules/@buddi/core/dist/provider-accounts.d.ts +7 -1
  17. package/node_modules/@buddi/core/dist/provider-accounts.d.ts.map +1 -1
  18. package/node_modules/@buddi/core/dist/provider-accounts.js +14 -1
  19. package/node_modules/@buddi/core/dist/provider-accounts.js.map +1 -1
  20. package/node_modules/@buddi/core/dist/provider.d.ts +6 -0
  21. package/node_modules/@buddi/core/dist/provider.d.ts.map +1 -1
  22. package/node_modules/@buddi/core/dist/provider.js.map +1 -1
  23. package/node_modules/@buddi/core/migrations/046_ollama_device_key.sql +7 -0
  24. package/node_modules/@buddi/core/migrations/047_reported_context_windows.sql +5 -0
  25. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  26. package/node_modules/@buddi/gateway/dist/codex-accounts.d.ts +24 -11
  27. package/node_modules/@buddi/gateway/dist/codex-accounts.d.ts.map +1 -1
  28. package/node_modules/@buddi/gateway/dist/codex-accounts.js +151 -215
  29. package/node_modules/@buddi/gateway/dist/codex-accounts.js.map +1 -1
  30. package/node_modules/@buddi/gateway/dist/index.d.ts +1 -0
  31. package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
  32. package/node_modules/@buddi/gateway/dist/index.js +1 -0
  33. package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
  34. package/node_modules/@buddi/gateway/dist/ollama-accounts.d.ts +87 -0
  35. package/node_modules/@buddi/gateway/dist/ollama-accounts.d.ts.map +1 -0
  36. package/node_modules/@buddi/gateway/dist/ollama-accounts.js +179 -0
  37. package/node_modules/@buddi/gateway/dist/ollama-accounts.js.map +1 -0
  38. package/node_modules/@buddi/gateway/dist/provider-accounts.d.ts +47 -1
  39. package/node_modules/@buddi/gateway/dist/provider-accounts.d.ts.map +1 -1
  40. package/node_modules/@buddi/gateway/dist/provider-accounts.js +182 -25
  41. package/node_modules/@buddi/gateway/dist/provider-accounts.js.map +1 -1
  42. package/node_modules/@buddi/gateway/dist/surfaces/context-budget.d.ts.map +1 -1
  43. package/node_modules/@buddi/gateway/dist/surfaces/context-budget.js +10 -3
  44. package/node_modules/@buddi/gateway/dist/surfaces/context-budget.js.map +1 -1
  45. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  46. package/node_modules/@buddi/gateway/dist/web/server.js +16 -13
  47. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  48. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  49. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  50. package/node_modules/@buddi/runtime/dist/codex-direct.d.ts +55 -0
  51. package/node_modules/@buddi/runtime/dist/codex-direct.d.ts.map +1 -0
  52. package/node_modules/@buddi/runtime/dist/codex-direct.js +334 -0
  53. package/node_modules/@buddi/runtime/dist/codex-direct.js.map +1 -0
  54. package/node_modules/@buddi/runtime/dist/codex-oauth.d.ts +66 -0
  55. package/node_modules/@buddi/runtime/dist/codex-oauth.d.ts.map +1 -0
  56. package/node_modules/@buddi/runtime/dist/codex-oauth.js +210 -0
  57. package/node_modules/@buddi/runtime/dist/codex-oauth.js.map +1 -0
  58. package/node_modules/@buddi/runtime/dist/codex-profile.d.ts +19 -0
  59. package/node_modules/@buddi/runtime/dist/codex-profile.d.ts.map +1 -0
  60. package/node_modules/@buddi/runtime/dist/codex-profile.js +99 -0
  61. package/node_modules/@buddi/runtime/dist/codex-profile.js.map +1 -0
  62. package/node_modules/@buddi/runtime/dist/context-window.d.ts.map +1 -1
  63. package/node_modules/@buddi/runtime/dist/context-window.js +4 -0
  64. package/node_modules/@buddi/runtime/dist/context-window.js.map +1 -1
  65. package/node_modules/@buddi/runtime/dist/delegate.d.ts +24 -0
  66. package/node_modules/@buddi/runtime/dist/delegate.d.ts.map +1 -1
  67. package/node_modules/@buddi/runtime/dist/delegate.js +87 -11
  68. package/node_modules/@buddi/runtime/dist/delegate.js.map +1 -1
  69. package/node_modules/@buddi/runtime/dist/index.d.ts +4 -4
  70. package/node_modules/@buddi/runtime/dist/index.d.ts.map +1 -1
  71. package/node_modules/@buddi/runtime/dist/index.js +5 -5
  72. package/node_modules/@buddi/runtime/dist/index.js.map +1 -1
  73. package/node_modules/@buddi/runtime/dist/loop.d.ts +7 -0
  74. package/node_modules/@buddi/runtime/dist/loop.d.ts.map +1 -1
  75. package/node_modules/@buddi/runtime/dist/loop.js +48 -8
  76. package/node_modules/@buddi/runtime/dist/loop.js.map +1 -1
  77. package/node_modules/@buddi/runtime/dist/ollama-signing.d.ts +52 -0
  78. package/node_modules/@buddi/runtime/dist/ollama-signing.d.ts.map +1 -0
  79. package/node_modules/@buddi/runtime/dist/ollama-signing.js +154 -0
  80. package/node_modules/@buddi/runtime/dist/ollama-signing.js.map +1 -0
  81. package/node_modules/@buddi/runtime/dist/openai.d.ts.map +1 -1
  82. package/node_modules/@buddi/runtime/dist/openai.js +21 -7
  83. package/node_modules/@buddi/runtime/dist/openai.js.map +1 -1
  84. package/node_modules/@buddi/runtime/dist/provider-models.d.ts +2 -0
  85. package/node_modules/@buddi/runtime/dist/provider-models.d.ts.map +1 -1
  86. package/node_modules/@buddi/runtime/dist/provider-models.js +8 -3
  87. package/node_modules/@buddi/runtime/dist/provider-models.js.map +1 -1
  88. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  89. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  90. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  91. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  92. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  93. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  94. package/package.json +2 -2
  95. package/packages/cli/dist/.tsbuildinfo +1 -1
  96. package/packages/cli/dist/commands.js +1 -1
  97. package/packages/cli/dist/commands.js.map +1 -1
  98. package/packages/cli/dist/main.d.ts.map +1 -1
  99. package/packages/cli/dist/main.js +12 -2
  100. package/packages/cli/dist/main.js.map +1 -1
  101. package/packages/cli/dist/status.d.ts +10 -0
  102. package/packages/cli/dist/status.d.ts.map +1 -1
  103. package/packages/cli/dist/status.js +4 -0
  104. package/packages/cli/dist/status.js.map +1 -1
  105. package/packages/core/dist/.tsbuildinfo +1 -1
  106. package/packages/core/dist/agents/catalog.d.ts.map +1 -1
  107. package/packages/core/dist/agents/catalog.js +7 -1
  108. package/packages/core/dist/agents/catalog.js.map +1 -1
  109. package/packages/core/dist/provider-accounts.d.ts +7 -1
  110. package/packages/core/dist/provider-accounts.d.ts.map +1 -1
  111. package/packages/core/dist/provider-accounts.js +14 -1
  112. package/packages/core/dist/provider-accounts.js.map +1 -1
  113. package/packages/core/dist/provider.d.ts +6 -0
  114. package/packages/core/dist/provider.d.ts.map +1 -1
  115. package/packages/core/dist/provider.js.map +1 -1
  116. package/packages/core/migrations/046_ollama_device_key.sql +7 -0
  117. package/packages/core/migrations/047_reported_context_windows.sql +5 -0
  118. package/packages/gateway/dist/.tsbuildinfo +1 -1
  119. package/packages/gateway/dist/codex-accounts.d.ts +24 -11
  120. package/packages/gateway/dist/codex-accounts.d.ts.map +1 -1
  121. package/packages/gateway/dist/codex-accounts.js +151 -215
  122. package/packages/gateway/dist/codex-accounts.js.map +1 -1
  123. package/packages/gateway/dist/index.d.ts +1 -0
  124. package/packages/gateway/dist/index.d.ts.map +1 -1
  125. package/packages/gateway/dist/index.js +1 -0
  126. package/packages/gateway/dist/index.js.map +1 -1
  127. package/packages/gateway/dist/ollama-accounts.d.ts +87 -0
  128. package/packages/gateway/dist/ollama-accounts.d.ts.map +1 -0
  129. package/packages/gateway/dist/ollama-accounts.js +179 -0
  130. package/packages/gateway/dist/ollama-accounts.js.map +1 -0
  131. package/packages/gateway/dist/provider-accounts.d.ts +47 -1
  132. package/packages/gateway/dist/provider-accounts.d.ts.map +1 -1
  133. package/packages/gateway/dist/provider-accounts.js +182 -25
  134. package/packages/gateway/dist/provider-accounts.js.map +1 -1
  135. package/packages/gateway/dist/surfaces/context-budget.d.ts.map +1 -1
  136. package/packages/gateway/dist/surfaces/context-budget.js +10 -3
  137. package/packages/gateway/dist/surfaces/context-budget.js.map +1 -1
  138. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  139. package/packages/gateway/dist/web/server.js +16 -13
  140. package/packages/gateway/dist/web/server.js.map +1 -1
  141. package/packages/install/dist/.tsbuildinfo +1 -1
  142. package/packages/runtime/dist/.tsbuildinfo +1 -1
  143. package/packages/runtime/dist/codex-direct.d.ts +55 -0
  144. package/packages/runtime/dist/codex-direct.d.ts.map +1 -0
  145. package/packages/runtime/dist/codex-direct.js +334 -0
  146. package/packages/runtime/dist/codex-direct.js.map +1 -0
  147. package/packages/runtime/dist/codex-oauth.d.ts +66 -0
  148. package/packages/runtime/dist/codex-oauth.d.ts.map +1 -0
  149. package/packages/runtime/dist/codex-oauth.js +210 -0
  150. package/packages/runtime/dist/codex-oauth.js.map +1 -0
  151. package/packages/runtime/dist/codex-profile.d.ts +19 -0
  152. package/packages/runtime/dist/codex-profile.d.ts.map +1 -0
  153. package/packages/runtime/dist/codex-profile.js +99 -0
  154. package/packages/runtime/dist/codex-profile.js.map +1 -0
  155. package/packages/runtime/dist/context-window.d.ts.map +1 -1
  156. package/packages/runtime/dist/context-window.js +4 -0
  157. package/packages/runtime/dist/context-window.js.map +1 -1
  158. package/packages/runtime/dist/delegate.d.ts +24 -0
  159. package/packages/runtime/dist/delegate.d.ts.map +1 -1
  160. package/packages/runtime/dist/delegate.js +87 -11
  161. package/packages/runtime/dist/delegate.js.map +1 -1
  162. package/packages/runtime/dist/index.d.ts +4 -4
  163. package/packages/runtime/dist/index.d.ts.map +1 -1
  164. package/packages/runtime/dist/index.js +5 -5
  165. package/packages/runtime/dist/index.js.map +1 -1
  166. package/packages/runtime/dist/loop.d.ts +7 -0
  167. package/packages/runtime/dist/loop.d.ts.map +1 -1
  168. package/packages/runtime/dist/loop.js +48 -8
  169. package/packages/runtime/dist/loop.js.map +1 -1
  170. package/packages/runtime/dist/ollama-signing.d.ts +52 -0
  171. package/packages/runtime/dist/ollama-signing.d.ts.map +1 -0
  172. package/packages/runtime/dist/ollama-signing.js +154 -0
  173. package/packages/runtime/dist/ollama-signing.js.map +1 -0
  174. package/packages/runtime/dist/openai.d.ts.map +1 -1
  175. package/packages/runtime/dist/openai.js +21 -7
  176. package/packages/runtime/dist/openai.js.map +1 -1
  177. package/packages/runtime/dist/provider-models.d.ts +2 -0
  178. package/packages/runtime/dist/provider-models.d.ts.map +1 -1
  179. package/packages/runtime/dist/provider-models.js +8 -3
  180. package/packages/runtime/dist/provider-models.js.map +1 -1
  181. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  182. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  183. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  184. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  185. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  186. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  187. package/packages/web/dist/assets/index-BRc5auXm.js +123 -0
  188. package/packages/web/dist/assets/{index-B727JQsO.css → index-DwUpotTR.css} +1 -1
  189. package/packages/web/dist/index.html +2 -2
  190. package/node_modules/@buddi/runtime/dist/codex-app-server.d.ts +0 -20
  191. package/node_modules/@buddi/runtime/dist/codex-app-server.d.ts.map +0 -1
  192. package/node_modules/@buddi/runtime/dist/codex-app-server.js +0 -172
  193. package/node_modules/@buddi/runtime/dist/codex-app-server.js.map +0 -1
  194. package/node_modules/@buddi/runtime/dist/codex-policy.d.ts +0 -6
  195. package/node_modules/@buddi/runtime/dist/codex-policy.d.ts.map +0 -1
  196. package/node_modules/@buddi/runtime/dist/codex-policy.js +0 -79
  197. package/node_modules/@buddi/runtime/dist/codex-policy.js.map +0 -1
  198. package/node_modules/@buddi/runtime/dist/codex-rpc.d.ts +0 -34
  199. package/node_modules/@buddi/runtime/dist/codex-rpc.d.ts.map +0 -1
  200. package/node_modules/@buddi/runtime/dist/codex-rpc.js +0 -152
  201. package/node_modules/@buddi/runtime/dist/codex-rpc.js.map +0 -1
  202. package/node_modules/@buddi/runtime/dist/codex-session.d.ts +0 -30
  203. package/node_modules/@buddi/runtime/dist/codex-session.d.ts.map +0 -1
  204. package/node_modules/@buddi/runtime/dist/codex-session.js +0 -169
  205. package/node_modules/@buddi/runtime/dist/codex-session.js.map +0 -1
  206. package/packages/runtime/dist/codex-app-server.d.ts +0 -20
  207. package/packages/runtime/dist/codex-app-server.d.ts.map +0 -1
  208. package/packages/runtime/dist/codex-app-server.js +0 -172
  209. package/packages/runtime/dist/codex-app-server.js.map +0 -1
  210. package/packages/runtime/dist/codex-policy.d.ts +0 -6
  211. package/packages/runtime/dist/codex-policy.d.ts.map +0 -1
  212. package/packages/runtime/dist/codex-policy.js +0 -79
  213. package/packages/runtime/dist/codex-policy.js.map +0 -1
  214. package/packages/runtime/dist/codex-rpc.d.ts +0 -34
  215. package/packages/runtime/dist/codex-rpc.d.ts.map +0 -1
  216. package/packages/runtime/dist/codex-rpc.js +0 -152
  217. package/packages/runtime/dist/codex-rpc.js.map +0 -1
  218. package/packages/runtime/dist/codex-session.d.ts +0 -30
  219. package/packages/runtime/dist/codex-session.d.ts.map +0 -1
  220. package/packages/runtime/dist/codex-session.js +0 -169
  221. package/packages/runtime/dist/codex-session.js.map +0 -1
  222. package/packages/web/dist/assets/index-OA0xgibo.js +0 -123
@@ -0,0 +1,87 @@
1
+ import type { Vault } from '@buddi/core';
2
+ import { OllamaConnectProtocol } from '@buddi/runtime';
3
+ import type { Pool } from 'pg';
4
+ /** What the vault holds for one connected (or connecting) device. */
5
+ export interface OllamaDeviceEnvelope {
6
+ version: 1;
7
+ /** PKCS8 PEM. Never leaves the gateway. */
8
+ privateKey: string;
9
+ /** The authorized_keys line ollama.com shows under "Show key". */
10
+ publicKey: string;
11
+ /** What ollama.com lists the device as. */
12
+ deviceName: string;
13
+ createdAt: string;
14
+ /** Set the first time ollama.com answered with an account for this key. */
15
+ connectedAt: string | null;
16
+ /** The ollama.com account the key is connected to, as the server said. */
17
+ username: string | null;
18
+ }
19
+ /** What may be shown about a device: never the private key. */
20
+ export interface OllamaDeviceView {
21
+ deviceName: string;
22
+ username: string | null;
23
+ connectedAt: string | null;
24
+ }
25
+ export declare function readOllamaDevice(raw: string): OllamaDeviceEnvelope;
26
+ export declare function deviceView(device: OllamaDeviceEnvelope): OllamaDeviceView;
27
+ /** "connected as amen, device buddi on studio": the line status and the card show. */
28
+ export declare function connectedLine(device: OllamaDeviceView): string;
29
+ /** "buddi on <this computer>", without the `.local` macOS adds. */
30
+ export declare function ollamaDeviceName(host?: string): string;
31
+ /** How long a connect attempt waits for the owner to press Connect. */
32
+ export declare const OLLAMA_CONNECT_TTL_MS: number;
33
+ export type OllamaPoll = {
34
+ state: 'connected';
35
+ username: string;
36
+ deviceName: string;
37
+ } | {
38
+ state: 'waiting';
39
+ expiresAt: string;
40
+ } | {
41
+ state: 'failed';
42
+ message: string;
43
+ };
44
+ /** Caller serialises account operations; this holds only the in-flight attempts. */
45
+ export declare class OllamaAccounts {
46
+ #private;
47
+ readonly vault: Vault;
48
+ readonly protocol: OllamaConnectProtocol;
49
+ readonly now: () => number;
50
+ readonly deviceName: typeof ollamaDeviceName;
51
+ constructor(vault: Vault, protocol?: OllamaConnectProtocol, now?: () => number, deviceName?: typeof ollamaDeviceName);
52
+ /** A new key pair into the vault, and the page the owner presses Connect on. */
53
+ start(id: string, revision: number, owner: string, ref: string): Promise<{
54
+ state: "pending";
55
+ attemptId: string;
56
+ verificationUrl: string;
57
+ deviceName: string;
58
+ expiresAt: string;
59
+ }>;
60
+ view(id: string, revision: number, owner?: string): {
61
+ state: "pending";
62
+ attemptId: string;
63
+ verificationUrl: string;
64
+ deviceName: string;
65
+ expiresAt: string;
66
+ } | null;
67
+ forget(id: string): void;
68
+ /** One signed request: has the owner pressed Connect yet? */
69
+ poll(id: string, revision: number, owner: string, attemptId: string, ref: string): Promise<OllamaPoll>;
70
+ /**
71
+ * Ask ollama.com to forget this device before the key is dropped, as
72
+ * `ollama signout` does. Best effort: false when it could not be asked or
73
+ * said no, and the caller removes the key either way.
74
+ */
75
+ unpair(ref: string): Promise<boolean>;
76
+ /** The private key a run signs with, once the device is connected. */
77
+ credential(ref: string): Promise<string>;
78
+ }
79
+ /**
80
+ * The connected devices, for `buddi status`: read straight from the rows and
81
+ * the raw vault (a device envelope is never an owner secret). A device that
82
+ * cannot be read is left out, not guessed at.
83
+ */
84
+ export declare function readOllamaDevices(pool: Pick<Pool, 'query'>, vault: Vault | undefined): Promise<Array<{
85
+ label: string;
86
+ } & OllamaDeviceView>>;
87
+ //# sourceMappingURL=ollama-accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-accounts.d.ts","sourceRoot":"","sources":["../src/ollama-accounts.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAA8D,MAAM,gBAAgB,CAAC;AACnH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,qEAAqE;AACrE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,CAAC;IACX,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAYlE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,gBAAgB,CAEzE;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAI9D;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAmB,GAAG,MAAM,CAGlE;AAED,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAIjD,MAAM,MAAM,UAAU,GAClB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,oFAAoF;AACpF,qBAAa,cAAc;;IAGvB,QAAQ,CAAC,KAAK,EAAE,KAAK;IACrB,QAAQ,CAAC,QAAQ;IACjB,QAAQ,CAAC,GAAG;IACZ,QAAQ,CAAC,UAAU;gBAHV,KAAK,EAAE,KAAK,EACZ,QAAQ,wBAA8B,EACtC,GAAG,eAAW,EACd,UAAU,0BAAmB;IAKxC,gFAAgF;IAC1E,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;;;;;;;IAepE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;IAQjD,MAAM,CAAC,EAAE,EAAE,MAAM;IAEjB,6DAA6D;IACvD,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA4B5G;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,sEAAsE;IAChE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAK/C;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAAC,CAajJ"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Ollama Cloud, connected with a device key (buddi-planning
3
+ * specs/ollama-connect.md): buddi makes an ed25519 key pair, the owner presses
4
+ * Connect on ollama.com, and from then on each request to ollama.com is signed
5
+ * with the key. Nobody ever sees a key.
6
+ *
7
+ * The key pair lives in the vault, under the account's own name, as one JSON
8
+ * envelope. Postgres holds only that the account signs in this way.
9
+ */
10
+ import { randomUUID } from 'node:crypto';
11
+ import { hostname } from 'node:os';
12
+ import { OllamaConnectProtocol, generateOllamaDeviceKey, ollamaConnectUrl, ollamaPublicKey } from '@buddi/runtime';
13
+ export function readOllamaDevice(raw) {
14
+ try {
15
+ if (raw.length > 16384)
16
+ throw new Error();
17
+ const data = JSON.parse(raw);
18
+ if (data.version !== 1 || typeof data.privateKey !== 'string' || typeof data.publicKey !== 'string' ||
19
+ typeof data.deviceName !== 'string' || typeof data.createdAt !== 'string' ||
20
+ !(data.connectedAt === null || typeof data.connectedAt === 'string') ||
21
+ !(data.username === null || typeof data.username === 'string'))
22
+ throw new Error();
23
+ // The public key is derived again rather than trusted, so the two can never disagree.
24
+ if (ollamaPublicKey(data.privateKey) !== data.publicKey)
25
+ throw new Error();
26
+ return data;
27
+ }
28
+ catch {
29
+ throw new Error('Invalid Ollama device key. Connect this account again.');
30
+ }
31
+ }
32
+ export function deviceView(device) {
33
+ return { deviceName: device.deviceName, username: device.username, connectedAt: device.connectedAt };
34
+ }
35
+ /** "connected as amen, device buddi on studio": the line status and the card show. */
36
+ export function connectedLine(device) {
37
+ return device.connectedAt
38
+ ? `connected as ${device.username || 'an ollama.com account'}, device ${device.deviceName}`
39
+ : `not connected yet, device ${device.deviceName}`;
40
+ }
41
+ /** "buddi on <this computer>", without the `.local` macOS adds. */
42
+ export function ollamaDeviceName(host = hostname()) {
43
+ const short = host.replace(/\.local$/i, '').replace(/[\x00-\x1f\x7f]/g, '').trim().slice(0, 60);
44
+ return short ? `buddi on ${short}` : 'buddi';
45
+ }
46
+ /** How long a connect attempt waits for the owner to press Connect. */
47
+ export const OLLAMA_CONNECT_TTL_MS = 15 * 60_000;
48
+ /** Caller serialises account operations; this holds only the in-flight attempts. */
49
+ export class OllamaAccounts {
50
+ vault;
51
+ protocol;
52
+ now;
53
+ deviceName;
54
+ #pending = new Map();
55
+ constructor(vault, protocol = new OllamaConnectProtocol(), now = Date.now, deviceName = ollamaDeviceName) {
56
+ this.vault = vault;
57
+ this.protocol = protocol;
58
+ this.now = now;
59
+ this.deviceName = deviceName;
60
+ }
61
+ #prune() { for (const [id, p] of this.#pending)
62
+ if (p.expiresAt <= this.now())
63
+ this.#pending.delete(id); }
64
+ /** A new key pair into the vault, and the page the owner presses Connect on. */
65
+ async start(id, revision, owner, ref) {
66
+ this.#prune();
67
+ if (this.#pending.size >= 128 && !this.#pending.has(id))
68
+ throw new Error('Too many connections waiting. Cancel one or wait 15 minutes.');
69
+ const key = generateOllamaDeviceKey();
70
+ const name = this.deviceName();
71
+ const envelope = {
72
+ version: 1, privateKey: key.privateKey, publicKey: key.publicKey, deviceName: name,
73
+ createdAt: new Date(this.now()).toISOString(), connectedAt: null, username: null,
74
+ };
75
+ try {
76
+ await this.vault.set(ref, JSON.stringify(envelope));
77
+ }
78
+ catch {
79
+ throw new Error('Could not save the Ollama device key securely. Unlock the vault and try again.');
80
+ }
81
+ this.#pending.set(id, { attemptId: randomUUID(), owner, revision, expiresAt: this.now() + OLLAMA_CONNECT_TTL_MS, url: ollamaConnectUrl(key.publicKey, name), deviceName: name });
82
+ return this.view(id, revision, owner);
83
+ }
84
+ view(id, revision, owner) {
85
+ this.#prune();
86
+ const p = this.#pending.get(id);
87
+ return p && p.owner === owner && p.revision === revision ? {
88
+ state: 'pending', attemptId: p.attemptId, verificationUrl: p.url, deviceName: p.deviceName,
89
+ expiresAt: new Date(p.expiresAt).toISOString(),
90
+ } : null;
91
+ }
92
+ forget(id) { this.#pending.delete(id); }
93
+ /** One signed request: has the owner pressed Connect yet? */
94
+ async poll(id, revision, owner, attemptId, ref) {
95
+ const p = this.#pending.get(id);
96
+ if (!p || p.owner !== owner || p.revision !== revision || p.attemptId !== attemptId) {
97
+ return { state: 'failed', message: 'This connection changed or belongs to another session. Connect again.' };
98
+ }
99
+ if (p.expiresAt <= this.now()) {
100
+ this.#pending.delete(id);
101
+ return { state: 'failed', message: 'The 15 minutes to press Connect ran out. Connect again.' };
102
+ }
103
+ const device = await this.#device(ref);
104
+ const answer = await this.protocol.whoami(device.privateKey);
105
+ if (answer.state === 'waiting')
106
+ return { state: 'waiting', expiresAt: new Date(p.expiresAt).toISOString() };
107
+ this.#pending.delete(id);
108
+ if (answer.state === 'failed')
109
+ return answer;
110
+ const connected = { ...device, connectedAt: new Date(this.now()).toISOString(), username: answer.username };
111
+ try {
112
+ await this.vault.set(ref, JSON.stringify(connected));
113
+ }
114
+ catch {
115
+ return { state: 'failed', message: 'Connected, but the vault refused the update. Unlock it and connect again.' };
116
+ }
117
+ return { state: 'connected', username: answer.username, deviceName: device.deviceName };
118
+ }
119
+ async #device(ref) {
120
+ let raw;
121
+ try {
122
+ raw = await this.vault.get(ref);
123
+ }
124
+ catch {
125
+ throw new Error('The credential vault is unavailable or locked. Unlock it on the host and retry.');
126
+ }
127
+ if (!raw)
128
+ throw new Error('Connect this Ollama account first.');
129
+ return readOllamaDevice(raw);
130
+ }
131
+ /**
132
+ * Ask ollama.com to forget this device before the key is dropped, as
133
+ * `ollama signout` does. Best effort: false when it could not be asked or
134
+ * said no, and the caller removes the key either way.
135
+ */
136
+ async unpair(ref) {
137
+ let device;
138
+ try {
139
+ device = await this.#device(ref);
140
+ }
141
+ catch {
142
+ return false;
143
+ }
144
+ if (!device.connectedAt)
145
+ return false;
146
+ return this.protocol.forget(device.privateKey);
147
+ }
148
+ /** The private key a run signs with, once the device is connected. */
149
+ async credential(ref) {
150
+ const device = await this.#device(ref);
151
+ if (!device.connectedAt)
152
+ throw new Error('Connect this Ollama account first.');
153
+ return device.privateKey;
154
+ }
155
+ }
156
+ /**
157
+ * The connected devices, for `buddi status`: read straight from the rows and
158
+ * the raw vault (a device envelope is never an owner secret). A device that
159
+ * cannot be read is left out, not guessed at.
160
+ */
161
+ export async function readOllamaDevices(pool, vault) {
162
+ if (!vault)
163
+ return [];
164
+ const { rows } = await pool.query(`select label, secret_ref as "secretRef" from core.provider_accounts
165
+ where auth = 'device-key' and deleting = false order by created_at, id`);
166
+ const found = [];
167
+ for (const row of rows) {
168
+ if (!row.secretRef)
169
+ continue;
170
+ try {
171
+ const raw = await vault.get(row.secretRef);
172
+ if (raw)
173
+ found.push({ label: row.label, ...deviceView(readOllamaDevice(raw)) });
174
+ }
175
+ catch { /* unreadable: left out */ }
176
+ }
177
+ return found;
178
+ }
179
+ //# sourceMappingURL=ollama-accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-accounts.js","sourceRoot":"","sources":["../src/ollama-accounts.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { type AgentCatalog, type LoadAgentCatalogOptions, type ProviderAccountsAccess, type ProviderRef, type ResolvedProvider, type Vault } from '@buddi/core';
2
- import { listProviderModels, type AccountModels, type RuntimeProvider } from '@buddi/runtime';
2
+ import { listProviderModels, type AccountModels, type OllamaConnectProtocol, type RuntimeProvider } from '@buddi/runtime';
3
3
  import type { Pool } from 'pg';
4
4
  import { type ProviderDiagnostic } from './provider-diagnostics.js';
5
5
  import { CodexAccounts } from './codex-accounts.js';
6
6
  import { AnthropicAccounts } from './anthropic-accounts.js';
7
+ import { OllamaAccounts, type OllamaDeviceView } from './ollama-accounts.js';
7
8
  type Binding = {
8
9
  agentId: string;
9
10
  accountId: string;
@@ -59,10 +60,17 @@ export declare class ProviderAccounts {
59
60
  vault?: Vault;
60
61
  test?: (resolved: ResolvedProvider) => Promise<void>;
61
62
  listModels?: typeof listProviderModels;
63
+ /** The one signed `/api/me` call and the device name, replaceable in tests. */
64
+ ollama?: {
65
+ protocol?: OllamaConnectProtocol;
66
+ deviceName?: () => string;
67
+ now?: () => number;
68
+ };
62
69
  };
63
70
  readonly vault: Vault | undefined;
64
71
  readonly codex: CodexAccounts | undefined;
65
72
  readonly anthropic: AnthropicAccounts | undefined;
73
+ readonly ollama: OllamaAccounts | undefined;
66
74
  /** The vault the OAuth adapters see, with account names translated onto owner secrets. */
67
75
  readonly accountVault: Vault | undefined;
68
76
  constructor(deps: {
@@ -73,6 +81,12 @@ export declare class ProviderAccounts {
73
81
  vault?: Vault;
74
82
  test?: (resolved: ResolvedProvider) => Promise<void>;
75
83
  listModels?: typeof listProviderModels;
84
+ /** The one signed `/api/me` call and the device name, replaceable in tests. */
85
+ ollama?: {
86
+ protocol?: OllamaConnectProtocol;
87
+ deviceName?: () => string;
88
+ now?: () => number;
89
+ };
76
90
  });
77
91
  get anthropicOAuthEnabled(): boolean;
78
92
  initialize(): Promise<void>;
@@ -92,6 +106,7 @@ export declare class ProviderAccounts {
92
106
  accounts: {
93
107
  assignedAgents: string[];
94
108
  test: TestResult | null;
109
+ device?: OllamaDeviceView | null | undefined;
95
110
  login?: import("./codex-accounts.js").CodexLoginView | {
96
111
  state: "pending";
97
112
  attemptId: string;
@@ -102,6 +117,7 @@ export declare class ProviderAccounts {
102
117
  reconnectRequired?: boolean | undefined;
103
118
  configured: boolean;
104
119
  detectedContextWindowTokens: number;
120
+ detectedContextWindowSource: "provider" | "table";
105
121
  removalPending: boolean;
106
122
  refreshable: boolean;
107
123
  subscriptionRenewsAt: null;
@@ -159,6 +175,36 @@ export declare class ProviderAccounts {
159
175
  } | {
160
176
  completed: boolean;
161
177
  } | null>;
178
+ /**
179
+ * Ollama Cloud with a device key: `connect` makes a key pair in the vault and
180
+ * answers with the page to press Connect on; `poll` asks ollama.com once
181
+ * whether that happened; `disconnect` removes the key from the vault. The
182
+ * device stays listed on ollama.com until the owner removes it there.
183
+ */
184
+ ollamaAction(id: string, action: 'connect' | 'poll' | 'disconnect', body: {
185
+ revision?: unknown;
186
+ attemptId?: unknown;
187
+ }, owner: string): Promise<{
188
+ state: "connected";
189
+ username: string;
190
+ deviceName: string;
191
+ } | {
192
+ state: "waiting";
193
+ expiresAt: string;
194
+ } | {
195
+ state: "failed";
196
+ message: string;
197
+ } | {
198
+ state: "pending";
199
+ attemptId: string;
200
+ verificationUrl: string;
201
+ deviceName: string;
202
+ expiresAt: string;
203
+ } | {
204
+ removed: boolean;
205
+ unpaired: boolean;
206
+ note: string;
207
+ }>;
162
208
  codexAction(id: string, action: 'login' | 'cancel-login' | 'logout', revision: unknown): Promise<import("./codex-accounts.js").CodexLoginView | {
163
209
  cancelled: boolean;
164
210
  removed?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"provider-accounts.d.ts","sourceRoot":"","sources":["../src/provider-accounts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-accounts.d.ts","sourceRoot":"","sources":["../src/provider-accounts.ts"],"names":[],"mappings":"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"}