natroc 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/AGENTS.md +494 -0
  2. package/LICENSE +7 -0
  3. package/README.md +0 -0
  4. package/install.ps1 +109 -0
  5. package/install.sh +132 -0
  6. package/package.json +77 -0
  7. package/server/dist/agent/agent-loop.d.ts +71 -0
  8. package/server/dist/agent/agent-loop.js +171 -0
  9. package/server/dist/agent/agent-loop.js.map +1 -0
  10. package/server/dist/agent/home-context.d.ts +29 -0
  11. package/server/dist/agent/home-context.js +134 -0
  12. package/server/dist/agent/home-context.js.map +1 -0
  13. package/server/dist/agent/improvement-engine.d.ts +23 -0
  14. package/server/dist/agent/improvement-engine.js +107 -0
  15. package/server/dist/agent/improvement-engine.js.map +1 -0
  16. package/server/dist/agent/tools/index.d.ts +14 -0
  17. package/server/dist/agent/tools/index.js +85 -0
  18. package/server/dist/agent/tools/index.js.map +1 -0
  19. package/server/dist/agent/tools/list-directory.d.ts +2 -0
  20. package/server/dist/agent/tools/list-directory.js +27 -0
  21. package/server/dist/agent/tools/list-directory.js.map +1 -0
  22. package/server/dist/agent/tools/read-file.d.ts +2 -0
  23. package/server/dist/agent/tools/read-file.js +30 -0
  24. package/server/dist/agent/tools/read-file.js.map +1 -0
  25. package/server/dist/agent/tools/run-command.d.ts +2 -0
  26. package/server/dist/agent/tools/run-command.js +72 -0
  27. package/server/dist/agent/tools/run-command.js.map +1 -0
  28. package/server/dist/agent/tools/system-info.d.ts +2 -0
  29. package/server/dist/agent/tools/system-info.js +28 -0
  30. package/server/dist/agent/tools/system-info.js.map +1 -0
  31. package/server/dist/agent/tools/types.d.ts +18 -0
  32. package/server/dist/agent/tools/types.js +2 -0
  33. package/server/dist/agent/tools/types.js.map +1 -0
  34. package/server/dist/agent/tools/util.d.ts +7 -0
  35. package/server/dist/agent/tools/util.js +24 -0
  36. package/server/dist/agent/tools/util.js.map +1 -0
  37. package/server/dist/agent/tools/write-file.d.ts +2 -0
  38. package/server/dist/agent/tools/write-file.js +25 -0
  39. package/server/dist/agent/tools/write-file.js.map +1 -0
  40. package/server/dist/app.d.ts +8 -0
  41. package/server/dist/app.js +39 -0
  42. package/server/dist/app.js.map +1 -0
  43. package/server/dist/auth/password.d.ts +7 -0
  44. package/server/dist/auth/password.js +20 -0
  45. package/server/dist/auth/password.js.map +1 -0
  46. package/server/dist/channels/channel-runtime.d.ts +32 -0
  47. package/server/dist/channels/channel-runtime.js +484 -0
  48. package/server/dist/channels/channel-runtime.js.map +1 -0
  49. package/server/dist/cli/agent-deliver.d.ts +14 -0
  50. package/server/dist/cli/agent-deliver.js +183 -0
  51. package/server/dist/cli/agent-deliver.js.map +1 -0
  52. package/server/dist/cli/args.d.ts +11 -0
  53. package/server/dist/cli/args.js +57 -0
  54. package/server/dist/cli/args.js.map +1 -0
  55. package/server/dist/cli/cli-token.d.ts +1 -0
  56. package/server/dist/cli/cli-token.js +22 -0
  57. package/server/dist/cli/cli-token.js.map +1 -0
  58. package/server/dist/cli/daemon.d.ts +2 -0
  59. package/server/dist/cli/daemon.js +252 -0
  60. package/server/dist/cli/daemon.js.map +1 -0
  61. package/server/dist/cli.d.ts +2 -0
  62. package/server/dist/cli.js +416 -0
  63. package/server/dist/cli.js.map +1 -0
  64. package/server/dist/config/natroc-home.d.ts +13 -0
  65. package/server/dist/config/natroc-home.js +730 -0
  66. package/server/dist/config/natroc-home.js.map +1 -0
  67. package/server/dist/gateway/agent-service.d.ts +16 -0
  68. package/server/dist/gateway/agent-service.js +261 -0
  69. package/server/dist/gateway/agent-service.js.map +1 -0
  70. package/server/dist/gateway/connection.d.ts +38 -0
  71. package/server/dist/gateway/connection.js +254 -0
  72. package/server/dist/gateway/connection.js.map +1 -0
  73. package/server/dist/gateway/gateway.d.ts +79 -0
  74. package/server/dist/gateway/gateway.js +150 -0
  75. package/server/dist/gateway/gateway.js.map +1 -0
  76. package/server/dist/gateway/index.d.ts +8 -0
  77. package/server/dist/gateway/index.js +26 -0
  78. package/server/dist/gateway/index.js.map +1 -0
  79. package/server/dist/gateway/protocol.d.ts +102 -0
  80. package/server/dist/gateway/protocol.js +63 -0
  81. package/server/dist/gateway/protocol.js.map +1 -0
  82. package/server/dist/gateway/rpc/agent.d.ts +3 -0
  83. package/server/dist/gateway/rpc/agent.js +174 -0
  84. package/server/dist/gateway/rpc/agent.js.map +1 -0
  85. package/server/dist/gateway/rpc/agents.d.ts +2 -0
  86. package/server/dist/gateway/rpc/agents.js +68 -0
  87. package/server/dist/gateway/rpc/agents.js.map +1 -0
  88. package/server/dist/gateway/rpc/auth.d.ts +3 -0
  89. package/server/dist/gateway/rpc/auth.js +180 -0
  90. package/server/dist/gateway/rpc/auth.js.map +1 -0
  91. package/server/dist/gateway/rpc/channels.d.ts +2 -0
  92. package/server/dist/gateway/rpc/channels.js +230 -0
  93. package/server/dist/gateway/rpc/channels.js.map +1 -0
  94. package/server/dist/gateway/rpc/conversations.d.ts +3 -0
  95. package/server/dist/gateway/rpc/conversations.js +36 -0
  96. package/server/dist/gateway/rpc/conversations.js.map +1 -0
  97. package/server/dist/gateway/rpc/projects.d.ts +3 -0
  98. package/server/dist/gateway/rpc/projects.js +49 -0
  99. package/server/dist/gateway/rpc/projects.js.map +1 -0
  100. package/server/dist/gateway/rpc/providers.d.ts +3 -0
  101. package/server/dist/gateway/rpc/providers.js +106 -0
  102. package/server/dist/gateway/rpc/providers.js.map +1 -0
  103. package/server/dist/gateway/rpc/usage.d.ts +2 -0
  104. package/server/dist/gateway/rpc/usage.js +41 -0
  105. package/server/dist/gateway/rpc/usage.js.map +1 -0
  106. package/server/dist/gateway/types.d.ts +43 -0
  107. package/server/dist/gateway/types.js +20 -0
  108. package/server/dist/gateway/types.js.map +1 -0
  109. package/server/dist/gateway/ws-server.d.ts +10 -0
  110. package/server/dist/gateway/ws-server.js +37 -0
  111. package/server/dist/gateway/ws-server.js.map +1 -0
  112. package/server/dist/index.d.ts +1 -0
  113. package/server/dist/index.js +9 -0
  114. package/server/dist/index.js.map +1 -0
  115. package/server/dist/local-runtime.d.ts +9 -0
  116. package/server/dist/local-runtime.js +16 -0
  117. package/server/dist/local-runtime.js.map +1 -0
  118. package/server/dist/providers/configured-adapters.d.ts +9 -0
  119. package/server/dist/providers/configured-adapters.js +34 -0
  120. package/server/dist/providers/configured-adapters.js.map +1 -0
  121. package/server/dist/providers/ollama.d.ts +23 -0
  122. package/server/dist/providers/ollama.js +164 -0
  123. package/server/dist/providers/ollama.js.map +1 -0
  124. package/server/dist/providers/openrouter.d.ts +24 -0
  125. package/server/dist/providers/openrouter.js +201 -0
  126. package/server/dist/providers/openrouter.js.map +1 -0
  127. package/server/dist/providers/thinking.d.ts +18 -0
  128. package/server/dist/providers/thinking.js +58 -0
  129. package/server/dist/providers/thinking.js.map +1 -0
  130. package/server/dist/providers/types.d.ts +55 -0
  131. package/server/dist/providers/types.js +2 -0
  132. package/server/dist/providers/types.js.map +1 -0
  133. package/server/dist/routes/schemas.d.ts +51 -0
  134. package/server/dist/routes/schemas.js +53 -0
  135. package/server/dist/routes/schemas.js.map +1 -0
  136. package/server/dist/runtime.d.ts +47 -0
  137. package/server/dist/runtime.js +29 -0
  138. package/server/dist/runtime.js.map +1 -0
  139. package/server/dist/server.d.ts +11 -0
  140. package/server/dist/server.js +19 -0
  141. package/server/dist/server.js.map +1 -0
  142. package/server/dist/storage/agent-repository.d.ts +59 -0
  143. package/server/dist/storage/agent-repository.js +192 -0
  144. package/server/dist/storage/agent-repository.js.map +1 -0
  145. package/server/dist/storage/auth-repository.d.ts +49 -0
  146. package/server/dist/storage/auth-repository.js +139 -0
  147. package/server/dist/storage/auth-repository.js.map +1 -0
  148. package/server/dist/storage/channel-repository.d.ts +152 -0
  149. package/server/dist/storage/channel-repository.js +413 -0
  150. package/server/dist/storage/channel-repository.js.map +1 -0
  151. package/server/dist/storage/conversation-repository.d.ts +63 -0
  152. package/server/dist/storage/conversation-repository.js +196 -0
  153. package/server/dist/storage/conversation-repository.js.map +1 -0
  154. package/server/dist/storage/database.d.ts +11 -0
  155. package/server/dist/storage/database.js +360 -0
  156. package/server/dist/storage/database.js.map +1 -0
  157. package/server/dist/storage/memory-repository.d.ts +70 -0
  158. package/server/dist/storage/memory-repository.js +279 -0
  159. package/server/dist/storage/memory-repository.js.map +1 -0
  160. package/server/dist/storage/project-repository.d.ts +25 -0
  161. package/server/dist/storage/project-repository.js +67 -0
  162. package/server/dist/storage/project-repository.js.map +1 -0
  163. package/server/dist/storage/provider-repository.d.ts +44 -0
  164. package/server/dist/storage/provider-repository.js +159 -0
  165. package/server/dist/storage/provider-repository.js.map +1 -0
  166. package/server/dist/storage/tool-call-repository.d.ts +35 -0
  167. package/server/dist/storage/tool-call-repository.js +83 -0
  168. package/server/dist/storage/tool-call-repository.js.map +1 -0
  169. package/server/dist/storage/usage-repository.d.ts +76 -0
  170. package/server/dist/storage/usage-repository.js +249 -0
  171. package/server/dist/storage/usage-repository.js.map +1 -0
  172. package/server/dist/storage/vault.d.ts +3 -0
  173. package/server/dist/storage/vault.js +57 -0
  174. package/server/dist/storage/vault.js.map +1 -0
  175. package/ui/README.md +0 -0
  176. package/ui/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  177. package/ui/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  178. package/ui/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  179. package/ui/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  180. package/ui/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  181. package/ui/dist/assets/index-DKaFmZNO.js +114 -0
  182. package/ui/dist/assets/index-DOfPcjx3.css +2 -0
  183. package/ui/dist/index.html +14 -0
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ import { OllamaAdapter, ollamaDefaults } from "../../providers/ollama.js";
3
+ import { OpenRouterAdapter, openRouterDefaults, } from "../../providers/openrouter.js";
4
+ import { resolveConfiguredAdapter } from "../../providers/configured-adapters.js";
5
+ import { activeProviderSchema, ollamaSetupSchema, openRouterSetupSchema, } from "../../routes/schemas.js";
6
+ import { encryptSecret } from "../../storage/vault.js";
7
+ import { requireAuth } from "../types.js";
8
+ const providerTargetSchema = z.object({
9
+ provider: z.enum(["openrouter", "ollama"]),
10
+ });
11
+ /** Mendaftarkan method RPC `providers.*` pada gateway. */
12
+ export function registerProviderMethods(gateway) {
13
+ gateway.registerUnary("providers.list", handleList);
14
+ gateway.registerUnary("providers.setActive", handleSetActive);
15
+ gateway.registerUnary("providers.connectOpenRouter", handleConnectOpenRouter);
16
+ gateway.registerUnary("providers.connectOllama", handleConnectOllama);
17
+ gateway.registerUnary("providers.test", handleTest);
18
+ gateway.registerUnary("providers.models", handleModels);
19
+ }
20
+ function handleList(ctx) {
21
+ const userId = requireAuth(ctx);
22
+ const providers = ctx.runtime.providers.listProviders({ userId });
23
+ return {
24
+ providers: providers.length === 0 && ctx.runtime.auth.countUsers() === 0
25
+ ? ctx.runtime.providers.listProviders()
26
+ : providers,
27
+ };
28
+ }
29
+ function handleSetActive(ctx, params) {
30
+ const userId = requireAuth(ctx);
31
+ const body = activeProviderSchema.parse(params);
32
+ const provider = ctx.runtime.providers.getById(body.providerId, { userId }) ??
33
+ (ctx.runtime.auth.countUsers() === 0
34
+ ? ctx.runtime.providers.getById(body.providerId)
35
+ : null);
36
+ if (!provider) {
37
+ throw new Error("Provider not found");
38
+ }
39
+ return { provider: ctx.runtime.providers.setActiveProvider(provider.id) };
40
+ }
41
+ async function handleConnectOpenRouter(ctx, params) {
42
+ const body = openRouterSetupSchema.parse(params);
43
+ const userId = requireAuth(ctx);
44
+ const { providers, masterKey } = ctx.runtime;
45
+ const secretRef = `provider-secret:${userId}:openrouter`;
46
+ const baseUrl = normalizeOptional(body.baseUrl) ?? openRouterDefaults.baseUrl;
47
+ const defaultModel = normalizeOptional(body.defaultModel) ?? openRouterDefaults.model;
48
+ const adapter = new OpenRouterAdapter({
49
+ apiKey: body.apiKey,
50
+ baseUrl,
51
+ defaultModel,
52
+ });
53
+ await adapter.testConnection();
54
+ providers.setSecret(secretRef, "openrouter", encryptSecret(body.apiKey, masterKey), { userId });
55
+ const provider = providers.upsertProvider({
56
+ userId,
57
+ provider: "openrouter",
58
+ displayName: "OpenRouter",
59
+ baseUrl,
60
+ defaultModel,
61
+ secretRef,
62
+ });
63
+ providers.setActiveProvider(provider.id);
64
+ return { provider: providers.getById(provider.id, { userId }) };
65
+ }
66
+ async function handleConnectOllama(ctx, params) {
67
+ const body = ollamaSetupSchema.parse(params);
68
+ const userId = requireAuth(ctx);
69
+ const { providers } = ctx.runtime;
70
+ const baseUrl = normalizeOptional(body.baseUrl) ?? ollamaDefaults.baseUrl;
71
+ const defaultModel = normalizeOptional(body.defaultModel) ?? ollamaDefaults.model;
72
+ const adapter = new OllamaAdapter({ baseUrl, defaultModel });
73
+ await adapter.testConnection();
74
+ const provider = providers.upsertProvider({
75
+ userId,
76
+ provider: "ollama",
77
+ displayName: "Ollama",
78
+ baseUrl,
79
+ defaultModel,
80
+ secretRef: null,
81
+ });
82
+ providers.setActiveProvider(provider.id);
83
+ return { provider: providers.getById(provider.id, { userId }) };
84
+ }
85
+ function handleTest(ctx, params) {
86
+ const userId = requireAuth(ctx);
87
+ const { provider } = providerTargetSchema.parse(params);
88
+ return resolveConfiguredAdapter(provider, {
89
+ runtime: ctx.runtime,
90
+ userId,
91
+ }).testConnection();
92
+ }
93
+ async function handleModels(ctx, params) {
94
+ const userId = requireAuth(ctx);
95
+ const { provider } = providerTargetSchema.parse(params);
96
+ const models = await resolveConfiguredAdapter(provider, {
97
+ runtime: ctx.runtime,
98
+ userId,
99
+ }).listModels();
100
+ return { models };
101
+ }
102
+ function normalizeOptional(value) {
103
+ const trimmed = value?.trim();
104
+ return trimmed ? trimmed : null;
105
+ }
106
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/gateway/rpc/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Gateway } from "../gateway.js";
2
+ export declare function registerUsageMethods(gateway: Gateway): void;
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ import { requireAuth } from "../types.js";
3
+ const usageFilterSchema = z.object({
4
+ from: z.string().optional(),
5
+ to: z.string().optional(),
6
+ provider: z.enum(["openrouter", "ollama"]).optional(),
7
+ model: z.string().optional(),
8
+ channel: z.string().optional(),
9
+ agentId: z.string().optional(),
10
+ limit: z.number().int().positive().max(500).optional(),
11
+ offset: z.number().int().min(0).optional(),
12
+ });
13
+ export function registerUsageMethods(gateway) {
14
+ gateway.registerUnary("usage.summary", handleSummary);
15
+ gateway.registerUnary("usage.detail", handleDetail);
16
+ gateway.registerUnary("usage.export", handleExport);
17
+ }
18
+ function handleSummary(ctx, params) {
19
+ const userId = requireAuth(ctx);
20
+ const filters = usageFilterSchema.parse(params ?? {});
21
+ return {
22
+ summary: ctx.runtime.usage.getSummary({ userId, ...filters }),
23
+ };
24
+ }
25
+ function handleDetail(ctx, params) {
26
+ const userId = requireAuth(ctx);
27
+ const filters = usageFilterSchema.parse(params ?? {});
28
+ return {
29
+ events: ctx.runtime.usage.listEvents({ userId, ...filters }),
30
+ };
31
+ }
32
+ function handleExport(ctx, params) {
33
+ const userId = requireAuth(ctx);
34
+ const filters = usageFilterSchema.parse(params ?? {});
35
+ return {
36
+ contentType: "text/csv",
37
+ fileName: "natroc-usage.csv",
38
+ data: ctx.runtime.usage.exportCsv({ userId, ...filters }),
39
+ };
40
+ }
41
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/gateway/rpc/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,WAAW,EAA0B,MAAM,aAAa,CAAA;AAEjE,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAA;AAEF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;IACrD,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;IACnD,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,GAAsB,EAAE,MAAe;IAC5D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAErD,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;KAC9D,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAsB,EAAE,MAAe;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAErD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;KAC7D,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAsB,EAAE,MAAe;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IAErD,OAAO;QACL,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;KAC1D,CAAA;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { AgentLoopEvent } from "../agent/agent-loop.js";
2
+ import type { RuntimeState } from "../runtime.js";
3
+ /**
4
+ * Konteks satu koneksi gateway, dibagikan ke setiap handler method.
5
+ * `userId` bersifat mutable: diisi oleh handler auth (Milestone 2) dan
6
+ * bertahan selama koneksi hidup.
7
+ */
8
+ export type ConnectionContext = {
9
+ readonly connectionId: string;
10
+ readonly runtime: RuntimeState;
11
+ userId: string | null;
12
+ token: string | null;
13
+ };
14
+ /** Handler RPC request-response (auth, CRUD). */
15
+ export type UnaryHandler = (ctx: ConnectionContext, params: unknown) => Promise<unknown> | unknown;
16
+ /**
17
+ * Handler RPC streaming (chat agent). Generator yield event antara; nilai
18
+ * `return`-nya dikirim sebagai `result` pada frame `end`.
19
+ */
20
+ export type StreamHandler = (ctx: ConnectionContext, params: unknown, signal: AbortSignal) => AsyncGenerator<AgentLoopEvent, unknown>;
21
+ /**
22
+ * Method terdaftar pada gateway. `public: true` boleh dipanggil tanpa
23
+ * autentikasi (mis. `auth.login`); selain itu koneksi wajib authenticated.
24
+ */
25
+ export type MethodHandler = {
26
+ kind: "unary";
27
+ handler: UnaryHandler;
28
+ public: boolean;
29
+ } | {
30
+ kind: "stream";
31
+ handler: StreamHandler;
32
+ public: boolean;
33
+ };
34
+ /**
35
+ * Error yang boleh dilempar handler untuk dikirim sebagai frame `error`
36
+ * dengan pesan & kode terkontrol (tanpa membocorkan detail internal).
37
+ */
38
+ export declare class GatewayRpcError extends Error {
39
+ readonly code?: string;
40
+ constructor(message: string, code?: string);
41
+ }
42
+ /** Memastikan koneksi sudah authenticated; mengembalikan userId atau melempar. */
43
+ export declare function requireAuth(ctx: ConnectionContext): string;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Error yang boleh dilempar handler untuk dikirim sebagai frame `error`
3
+ * dengan pesan & kode terkontrol (tanpa membocorkan detail internal).
4
+ */
5
+ export class GatewayRpcError extends Error {
6
+ code;
7
+ constructor(message, code) {
8
+ super(message);
9
+ this.name = "GatewayRpcError";
10
+ this.code = code;
11
+ }
12
+ }
13
+ /** Memastikan koneksi sudah authenticated; mengembalikan userId atau melempar. */
14
+ export function requireAuth(ctx) {
15
+ if (!ctx.userId) {
16
+ throw new GatewayRpcError("Authentication required.", "unauthenticated");
17
+ }
18
+ return ctx.userId;
19
+ }
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"AAuCA;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAS;IAEtB,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,GAAsB;IAChD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,eAAe,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAA;IAC1E,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,CAAA;AACnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { Gateway } from "./gateway.js";
3
+ /** Path WebSocket tempat semua client gateway menyambung. */
4
+ export declare const GATEWAY_WS_PATH = "/gateway";
5
+ /**
6
+ * Mendaftarkan endpoint WebSocket gateway pada instance Fastify.
7
+ * Plugin @fastify/websocket dan route-nya didaftarkan dalam satu scope
8
+ * plugin agar urutan registrasinya terjamin.
9
+ */
10
+ export declare function registerGatewayWebSocket(app: FastifyInstance, gateway: Gateway): void;
@@ -0,0 +1,37 @@
1
+ import websocket from "@fastify/websocket";
2
+ /** Path WebSocket tempat semua client gateway menyambung. */
3
+ export const GATEWAY_WS_PATH = "/gateway";
4
+ /**
5
+ * Mendaftarkan endpoint WebSocket gateway pada instance Fastify.
6
+ * Plugin @fastify/websocket dan route-nya didaftarkan dalam satu scope
7
+ * plugin agar urutan registrasinya terjamin.
8
+ */
9
+ export function registerGatewayWebSocket(app, gateway) {
10
+ app.register(async (instance) => {
11
+ await instance.register(websocket);
12
+ instance.get(GATEWAY_WS_PATH, { websocket: true }, (socket) => {
13
+ const connection = gateway.handleConnection((data) => {
14
+ if (socket.readyState === socket.OPEN) {
15
+ socket.send(data);
16
+ }
17
+ });
18
+ socket.on("message", (raw, isBinary) => {
19
+ if (isBinary)
20
+ return;
21
+ connection.handleRawMessage(rawDataToString(raw));
22
+ });
23
+ socket.on("close", () => {
24
+ connection.handleClose();
25
+ gateway.removeConnection(connection.id);
26
+ });
27
+ });
28
+ });
29
+ }
30
+ function rawDataToString(raw) {
31
+ if (Buffer.isBuffer(raw))
32
+ return raw.toString("utf8");
33
+ if (Array.isArray(raw))
34
+ return Buffer.concat(raw).toString("utf8");
35
+ return Buffer.from(raw).toString("utf8");
36
+ }
37
+ //# sourceMappingURL=ws-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-server.js","sourceRoot":"","sources":["../../src/gateway/ws-server.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAA;AAM1C,6DAA6D;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA;AAEzC;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,GAAoB,EACpB,OAAgB;IAEhB,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC9B,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAElC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAiB,EAAE,EAAE;YACvE,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACnD,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;oBACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACnB,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,QAAiB,EAAE,EAAE;gBACvD,IAAI,QAAQ;oBAAE,OAAM;gBACpB,UAAU,CAAC,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;YACnD,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,UAAU,CAAC,WAAW,EAAE,CAAA;gBACxB,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAClE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { startServer } from "./server.js";
2
+ async function main() {
3
+ await startServer();
4
+ }
5
+ main().catch((error) => {
6
+ console.error(error);
7
+ process.exitCode = 1;
8
+ });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,EAAE,CAAA;AACrB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACpB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { type DatabaseConnection } from "./storage/database.js";
2
+ import type { RuntimeState } from "./runtime.js";
3
+ import type { NatrocPaths } from "./config/natroc-home.js";
4
+ export type LocalRuntime = {
5
+ db: DatabaseConnection;
6
+ paths: NatrocPaths;
7
+ runtime: RuntimeState;
8
+ };
9
+ export declare function createLocalRuntime(): Promise<LocalRuntime>;
@@ -0,0 +1,16 @@
1
+ import { ensureNatrocHome, getNatrocPaths } from "./config/natroc-home.js";
2
+ import { createRuntime } from "./runtime.js";
3
+ import { openDatabase } from "./storage/database.js";
4
+ import { ensureMasterKey } from "./storage/vault.js";
5
+ export async function createLocalRuntime() {
6
+ const paths = await ensureNatrocHome(getNatrocPaths());
7
+ const masterKey = await ensureMasterKey(paths.masterKeyPath);
8
+ const db = openDatabase(paths.databasePath);
9
+ const runtime = createRuntime(db, masterKey, paths);
10
+ return {
11
+ db,
12
+ paths,
13
+ runtime
14
+ };
15
+ }
16
+ //# sourceMappingURL=local-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runtime.js","sourceRoot":"","sources":["../src/local-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAA2B,MAAM,uBAAuB,CAAA;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAQpD,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IAC5D,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;IAEnD,OAAO;QACL,EAAE;QACF,KAAK;QACL,OAAO;KACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { RuntimeState } from "../runtime.js";
2
+ import type { ProviderAdapter, ProviderName } from "./types.js";
3
+ export type ProviderAdapters = Partial<Record<ProviderName, ProviderAdapter>>;
4
+ export type AdapterResolutionOptions = {
5
+ runtime?: RuntimeState;
6
+ adapters?: ProviderAdapters;
7
+ userId?: string;
8
+ };
9
+ export declare function resolveConfiguredAdapter(provider: ProviderName, options: AdapterResolutionOptions): ProviderAdapter;
@@ -0,0 +1,34 @@
1
+ import { decryptSecret } from "../storage/vault.js";
2
+ import { OllamaAdapter } from "./ollama.js";
3
+ import { OpenRouterAdapter } from "./openrouter.js";
4
+ export function resolveConfiguredAdapter(provider, options) {
5
+ const adapter = options.adapters?.[provider];
6
+ if (adapter)
7
+ return adapter;
8
+ if (!options.runtime) {
9
+ throw new Error("Storage is required to resolve configured provider adapters.");
10
+ }
11
+ const connection = options.runtime.providers.getByProvider(provider, options.userId ? { userId: options.userId } : {});
12
+ if (!connection) {
13
+ throw new Error(`${provider} provider is not configured.`);
14
+ }
15
+ if (provider === "openrouter") {
16
+ if (!connection.secretRef) {
17
+ throw new Error("OpenRouter API key is not configured.");
18
+ }
19
+ const encryptedSecret = options.runtime.providers.getSecret(connection.secretRef);
20
+ if (!encryptedSecret) {
21
+ throw new Error("OpenRouter API key is not stored.");
22
+ }
23
+ return new OpenRouterAdapter({
24
+ apiKey: decryptSecret(encryptedSecret, options.runtime.masterKey),
25
+ baseUrl: connection.baseUrl,
26
+ defaultModel: connection.defaultModel,
27
+ });
28
+ }
29
+ return new OllamaAdapter({
30
+ baseUrl: connection.baseUrl,
31
+ defaultModel: connection.defaultModel,
32
+ });
33
+ }
34
+ //# sourceMappingURL=configured-adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configured-adapters.js","sourceRoot":"","sources":["../../src/providers/configured-adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAWnD,MAAM,UAAU,wBAAwB,CACtC,QAAsB,EACtB,OAAiC;IAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAA;IAE5C,IAAI,OAAO;QAAE,OAAO,OAAO,CAAA;IAE3B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CACxD,QAAQ,EACR,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CACjD,CAAA;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,8BAA8B,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC1D,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAEjF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACtD,CAAC;QAED,OAAO,IAAI,iBAAiB,CAAC;YAC3B,MAAM,EAAE,aAAa,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YACjE,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,YAAY,EAAE,UAAU,CAAC,YAAY;SACtC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,IAAI,aAAa,CAAC;QACvB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,YAAY,EAAE,UAAU,CAAC,YAAY;KACtC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ProviderAdapter, ProviderChatRequest, ProviderChatResponse, ProviderChatStreamEvent, ProviderModel } from "./types.js";
2
+ type OllamaAdapterOptions = {
3
+ baseUrl?: string | null;
4
+ defaultModel?: string | null;
5
+ };
6
+ export declare class OllamaAdapter implements ProviderAdapter {
7
+ private readonly client;
8
+ private readonly defaultModel;
9
+ constructor(options?: OllamaAdapterOptions);
10
+ testConnection(): Promise<{
11
+ ok: boolean;
12
+ message: string;
13
+ }>;
14
+ listModels(): Promise<ProviderModel[]>;
15
+ chat(request: ProviderChatRequest): Promise<ProviderChatResponse>;
16
+ streamChat(request: ProviderChatRequest): AsyncIterable<ProviderChatStreamEvent>;
17
+ private getThinkingCapabilities;
18
+ }
19
+ export declare const ollamaDefaults: {
20
+ baseUrl: string;
21
+ model: string;
22
+ };
23
+ export {};
@@ -0,0 +1,164 @@
1
+ import { Ollama } from "ollama";
2
+ import { getOllamaThinkingCapabilities, ollamaThinkingEfforts, } from "./thinking.js";
3
+ const DEFAULT_OLLAMA_HOST = "http://127.0.0.1:11434";
4
+ const DEFAULT_OLLAMA_MODEL = "llama3.1";
5
+ export class OllamaAdapter {
6
+ client;
7
+ defaultModel;
8
+ constructor(options = {}) {
9
+ this.defaultModel = options.defaultModel ?? DEFAULT_OLLAMA_MODEL;
10
+ this.client = new Ollama({
11
+ host: options.baseUrl ?? DEFAULT_OLLAMA_HOST,
12
+ });
13
+ }
14
+ async testConnection() {
15
+ await this.listModels();
16
+ return {
17
+ ok: true,
18
+ message: "Ollama connection is working.",
19
+ };
20
+ }
21
+ async listModels() {
22
+ const result = await this.client.list();
23
+ return Promise.all(result.models.map(async (model) => {
24
+ const id = model.model ?? model.name ?? "unknown";
25
+ return {
26
+ id,
27
+ name: model.name ?? id,
28
+ thinking: await this.getThinkingCapabilities(id, model.name),
29
+ };
30
+ }));
31
+ }
32
+ async chat(request) {
33
+ const model = request.model ?? this.defaultModel;
34
+ const messages = request.messages?.length
35
+ ? request.messages
36
+ : [{ role: "user", content: request.message }];
37
+ const think = toOllamaThink(request.thinking);
38
+ const result = await this.client.chat({
39
+ model,
40
+ messages,
41
+ ...(think !== undefined ? { think } : {}),
42
+ });
43
+ return {
44
+ provider: "ollama",
45
+ model: result.model ?? model,
46
+ content: result.message.content ?? "",
47
+ usage: getOllamaUsage(result) ?? undefined,
48
+ };
49
+ }
50
+ async *streamChat(request) {
51
+ const model = request.model ?? this.defaultModel;
52
+ const messages = request.messages?.length
53
+ ? request.messages
54
+ : [{ role: "user", content: request.message }];
55
+ const think = toOllamaThink(request.thinking);
56
+ const stream = await this.client.chat({
57
+ model,
58
+ messages,
59
+ stream: true,
60
+ ...(think !== undefined ? { think } : {}),
61
+ });
62
+ yield {
63
+ type: "metadata",
64
+ provider: "ollama",
65
+ model,
66
+ };
67
+ let finalUsage = null;
68
+ for await (const chunk of stream) {
69
+ const reasoning = chunk.message?.thinking ?? "";
70
+ const delta = chunk.message?.content ?? "";
71
+ const usage = getOllamaUsage(chunk);
72
+ if (usage) {
73
+ finalUsage = usage;
74
+ }
75
+ if (reasoning) {
76
+ yield {
77
+ type: "reasoning",
78
+ delta: reasoning,
79
+ };
80
+ }
81
+ if (delta) {
82
+ yield {
83
+ type: "text",
84
+ delta,
85
+ };
86
+ }
87
+ }
88
+ if (finalUsage) {
89
+ yield {
90
+ type: "usage",
91
+ usage: finalUsage,
92
+ };
93
+ }
94
+ }
95
+ async getThinkingCapabilities(model, name) {
96
+ try {
97
+ const details = await this.client.show({ model });
98
+ return getOllamaThinkingCapabilities({
99
+ capabilities: details.capabilities,
100
+ model,
101
+ name,
102
+ });
103
+ }
104
+ catch {
105
+ return getOllamaThinkingCapabilities({ model, name });
106
+ }
107
+ }
108
+ }
109
+ function getOllamaUsage(value) {
110
+ if (!isRecord(value))
111
+ return null;
112
+ const inputTokens = getNumberField(value, ["prompt_eval_count"]);
113
+ const outputTokens = getNumberField(value, ["eval_count"]);
114
+ const totalTokens = sumNullable(inputTokens, outputTokens);
115
+ const durationNs = getNumberField(value, ["total_duration"]);
116
+ if (inputTokens === null && outputTokens === null && durationNs === null) {
117
+ return null;
118
+ }
119
+ return {
120
+ inputTokens,
121
+ outputTokens,
122
+ reasoningTokens: null,
123
+ totalTokens,
124
+ costUsd: null,
125
+ durationMs: durationNs === null ? null : Math.round(durationNs / 1_000_000),
126
+ raw: value,
127
+ };
128
+ }
129
+ function getNumberField(record, keys) {
130
+ for (const key of keys) {
131
+ const value = record[key];
132
+ if (typeof value === "number" && Number.isFinite(value))
133
+ return value;
134
+ }
135
+ return null;
136
+ }
137
+ function isRecord(value) {
138
+ return typeof value === "object" && value !== null && !Array.isArray(value);
139
+ }
140
+ function sumNullable(...values) {
141
+ let total = 0;
142
+ let hasValue = false;
143
+ for (const value of values) {
144
+ if (typeof value !== "number")
145
+ continue;
146
+ total += value;
147
+ hasValue = true;
148
+ }
149
+ return hasValue ? total : null;
150
+ }
151
+ function toOllamaThink(thinking) {
152
+ if (!thinking?.enabled)
153
+ return undefined;
154
+ if (thinking.effort &&
155
+ ollamaThinkingEfforts.includes(thinking.effort)) {
156
+ return thinking.effort;
157
+ }
158
+ return true;
159
+ }
160
+ export const ollamaDefaults = {
161
+ baseUrl: DEFAULT_OLLAMA_HOST,
162
+ model: DEFAULT_OLLAMA_MODEL,
163
+ };
164
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ProviderAdapter, ProviderChatRequest, ProviderChatResponse, ProviderChatStreamEvent, ProviderModel } from "./types.js";
2
+ type OpenRouterAdapterOptions = {
3
+ apiKey: string;
4
+ baseUrl?: string | null;
5
+ defaultModel?: string | null;
6
+ };
7
+ export declare class OpenRouterAdapter implements ProviderAdapter {
8
+ private readonly agentClient;
9
+ private readonly sdkClient;
10
+ private readonly defaultModel;
11
+ constructor(options: OpenRouterAdapterOptions);
12
+ testConnection(): Promise<{
13
+ ok: boolean;
14
+ message: string;
15
+ }>;
16
+ listModels(): Promise<ProviderModel[]>;
17
+ chat(request: ProviderChatRequest): Promise<ProviderChatResponse>;
18
+ streamChat(request: ProviderChatRequest): AsyncIterable<ProviderChatStreamEvent>;
19
+ }
20
+ export declare const openRouterDefaults: {
21
+ baseUrl: string;
22
+ model: string;
23
+ };
24
+ export {};