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,79 @@
1
+ import type { RuntimeState } from "../runtime.js";
2
+ import { GatewayConnection } from "./connection.js";
3
+ import type { MethodHandler, StreamHandler, UnaryHandler } from "./types.js";
4
+ /**
5
+ * Inti gateway: pemilik RuntimeState, registry method RPC, dan registry
6
+ * koneksi aktif. Method didaftarkan oleh modul RPC pada milestone berikutnya.
7
+ */
8
+ /** Versi server gateway. Ditampilkan di payload `hello-ok`. */
9
+ export declare const GATEWAY_SERVER_VERSION = "0.0.1";
10
+ /** Policy default — dilaporkan via `hello-ok` agar client tahu batasannya. */
11
+ export declare const GATEWAY_POLICY: {
12
+ /** Ukuran payload maksimum per frame (bytes). */
13
+ readonly maxPayload: number;
14
+ /** Buffer outbound maksimum per koneksi (bytes). */
15
+ readonly maxBufferedBytes: number;
16
+ /** Interval event `tick` (ms). Dipakai mulai Milestone 6. */
17
+ readonly tickIntervalMs: number;
18
+ };
19
+ /**
20
+ * Daftar event server-push yang DIDUKUNG.
21
+ * `agent` adalah event stream antara dari `agent.chat`; sisanya broadcast.
22
+ */
23
+ export declare const GATEWAY_EVENTS: readonly string[];
24
+ /** TTL idempotency cache (5 menit) — mengikuti pola "short-lived dedup". */
25
+ export declare const IDEMPOTENCY_TTL_MS: number;
26
+ /** Hasil terakhir yang di-cache untuk satu `(user, method, key)`. */
27
+ export type IdempotencyEntry = {
28
+ ok: true;
29
+ payload?: unknown;
30
+ } | {
31
+ ok: false;
32
+ error: {
33
+ message: string;
34
+ code?: string;
35
+ };
36
+ };
37
+ export declare class Gateway {
38
+ readonly runtime: RuntimeState;
39
+ readonly startedAtMs: number;
40
+ private readonly methods;
41
+ private readonly connections;
42
+ private readonly idempotencyCache;
43
+ private readonly eventSeqByTopic;
44
+ private tickTimer;
45
+ constructor(runtime: RuntimeState);
46
+ /**
47
+ * Mengirim event broadcast ke SEMUA koneksi aktif dengan `seq`
48
+ * monotonik per topic. Tanpa `id` — frame dianggap broadcast (Milestone 6).
49
+ */
50
+ broadcast(event: string, payload: unknown): void;
51
+ /** Memberhentikan timer + me-detach broadcaster — dipanggil saat shutdown. */
52
+ dispose(): void;
53
+ /**
54
+ * Mengambil hasil cache idempotency. Mengembalikan undefined bila tidak ada
55
+ * atau sudah kadaluarsa (entri kadaluarsa dibersihkan saat dilihat).
56
+ */
57
+ getIdempotent(key: string): IdempotencyEntry | undefined;
58
+ /** Menyimpan hasil ke cache idempotency dengan TTL pendek. */
59
+ setIdempotent(key: string, entry: IdempotencyEntry): void;
60
+ /** Nama seluruh method RPC terdaftar — dipakai di payload `hello-ok`. */
61
+ listMethodNames(): string[];
62
+ /** Uptime gateway dalam milidetik sejak konstruksi. */
63
+ uptimeMs(): number;
64
+ /** Mendaftarkan method RPC request-response. */
65
+ registerUnary(method: string, handler: UnaryHandler, options?: {
66
+ public?: boolean;
67
+ }): void;
68
+ /** Mendaftarkan method RPC streaming. */
69
+ registerStream(method: string, handler: StreamHandler, options?: {
70
+ public?: boolean;
71
+ }): void;
72
+ getMethod(method: string): MethodHandler | undefined;
73
+ /** Mendaftarkan koneksi WebSocket baru ke registry. */
74
+ handleConnection(sendRaw: (data: string) => void): GatewayConnection;
75
+ /** Melepas koneksi dari registry (dipanggil saat socket tertutup). */
76
+ removeConnection(connectionId: string): void;
77
+ get connectionCount(): number;
78
+ private assertMethodFree;
79
+ }
@@ -0,0 +1,150 @@
1
+ import { GatewayConnection } from "./connection.js";
2
+ /**
3
+ * Inti gateway: pemilik RuntimeState, registry method RPC, dan registry
4
+ * koneksi aktif. Method didaftarkan oleh modul RPC pada milestone berikutnya.
5
+ */
6
+ /** Versi server gateway. Ditampilkan di payload `hello-ok`. */
7
+ export const GATEWAY_SERVER_VERSION = "0.0.1";
8
+ /** Policy default — dilaporkan via `hello-ok` agar client tahu batasannya. */
9
+ export const GATEWAY_POLICY = {
10
+ /** Ukuran payload maksimum per frame (bytes). */
11
+ maxPayload: 1024 * 1024,
12
+ /** Buffer outbound maksimum per koneksi (bytes). */
13
+ maxBufferedBytes: 1024 * 1024,
14
+ /** Interval event `tick` (ms). Dipakai mulai Milestone 6. */
15
+ tickIntervalMs: 30 * 60 * 1000,
16
+ };
17
+ /**
18
+ * Daftar event server-push yang DIDUKUNG.
19
+ * `agent` adalah event stream antara dari `agent.chat`; sisanya broadcast.
20
+ */
21
+ export const GATEWAY_EVENTS = [
22
+ "agent",
23
+ "tick",
24
+ "presence",
25
+ "health",
26
+ ];
27
+ /** TTL idempotency cache (5 menit) — mengikuti pola "short-lived dedup". */
28
+ export const IDEMPOTENCY_TTL_MS = 5 * 60 * 1000;
29
+ export class Gateway {
30
+ runtime;
31
+ startedAtMs = Date.now();
32
+ methods = new Map();
33
+ connections = new Map();
34
+ idempotencyCache = new Map();
35
+ eventSeqByTopic = new Map();
36
+ tickTimer = null;
37
+ constructor(runtime) {
38
+ this.runtime = runtime;
39
+ // Inject broadcaster ke runtime supaya modul lain (mis. channel-runtime)
40
+ // bisa memicu event `health` tanpa import langsung ke gateway.
41
+ runtime.broadcaster = {
42
+ broadcast: (event, payload) => this.broadcast(event, payload),
43
+ };
44
+ this.tickTimer = setInterval(() => {
45
+ this.broadcast("tick", { ts: Date.now() });
46
+ }, GATEWAY_POLICY.tickIntervalMs);
47
+ // Jangan menahan event loop tetap hidup hanya karena timer tick.
48
+ if (typeof this.tickTimer.unref === "function") {
49
+ this.tickTimer.unref();
50
+ }
51
+ }
52
+ /**
53
+ * Mengirim event broadcast ke SEMUA koneksi aktif dengan `seq`
54
+ * monotonik per topic. Tanpa `id` — frame dianggap broadcast (Milestone 6).
55
+ */
56
+ broadcast(event, payload) {
57
+ const seq = (this.eventSeqByTopic.get(event) ?? 0) + 1;
58
+ this.eventSeqByTopic.set(event, seq);
59
+ for (const conn of this.connections.values()) {
60
+ conn.sendBroadcast(event, payload, seq);
61
+ }
62
+ }
63
+ /** Memberhentikan timer + me-detach broadcaster — dipanggil saat shutdown. */
64
+ dispose() {
65
+ if (this.tickTimer) {
66
+ clearInterval(this.tickTimer);
67
+ this.tickTimer = null;
68
+ }
69
+ if (this.runtime.broadcaster) {
70
+ this.runtime.broadcaster = undefined;
71
+ }
72
+ }
73
+ /**
74
+ * Mengambil hasil cache idempotency. Mengembalikan undefined bila tidak ada
75
+ * atau sudah kadaluarsa (entri kadaluarsa dibersihkan saat dilihat).
76
+ */
77
+ getIdempotent(key) {
78
+ const cached = this.idempotencyCache.get(key);
79
+ if (!cached)
80
+ return undefined;
81
+ if (cached.expiresAt < Date.now()) {
82
+ this.idempotencyCache.delete(key);
83
+ return undefined;
84
+ }
85
+ return cached.entry;
86
+ }
87
+ /** Menyimpan hasil ke cache idempotency dengan TTL pendek. */
88
+ setIdempotent(key, entry) {
89
+ this.idempotencyCache.set(key, {
90
+ expiresAt: Date.now() + IDEMPOTENCY_TTL_MS,
91
+ entry,
92
+ });
93
+ // Garbage collect lazy bila cache sudah membengkak.
94
+ if (this.idempotencyCache.size > 1000) {
95
+ const now = Date.now();
96
+ for (const [k, v] of this.idempotencyCache) {
97
+ if (v.expiresAt < now)
98
+ this.idempotencyCache.delete(k);
99
+ }
100
+ }
101
+ }
102
+ /** Nama seluruh method RPC terdaftar — dipakai di payload `hello-ok`. */
103
+ listMethodNames() {
104
+ return Array.from(this.methods.keys()).sort();
105
+ }
106
+ /** Uptime gateway dalam milidetik sejak konstruksi. */
107
+ uptimeMs() {
108
+ return Date.now() - this.startedAtMs;
109
+ }
110
+ /** Mendaftarkan method RPC request-response. */
111
+ registerUnary(method, handler, options = {}) {
112
+ this.assertMethodFree(method);
113
+ this.methods.set(method, {
114
+ kind: "unary",
115
+ handler,
116
+ public: options.public ?? false,
117
+ });
118
+ }
119
+ /** Mendaftarkan method RPC streaming. */
120
+ registerStream(method, handler, options = {}) {
121
+ this.assertMethodFree(method);
122
+ this.methods.set(method, {
123
+ kind: "stream",
124
+ handler,
125
+ public: options.public ?? false,
126
+ });
127
+ }
128
+ getMethod(method) {
129
+ return this.methods.get(method);
130
+ }
131
+ /** Mendaftarkan koneksi WebSocket baru ke registry. */
132
+ handleConnection(sendRaw) {
133
+ const connection = new GatewayConnection(this, sendRaw);
134
+ this.connections.set(connection.id, connection);
135
+ return connection;
136
+ }
137
+ /** Melepas koneksi dari registry (dipanggil saat socket tertutup). */
138
+ removeConnection(connectionId) {
139
+ this.connections.delete(connectionId);
140
+ }
141
+ get connectionCount() {
142
+ return this.connections.size;
143
+ }
144
+ assertMethodFree(method) {
145
+ if (this.methods.has(method)) {
146
+ throw new Error(`Gateway method already registered: ${method}`);
147
+ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RuntimeState } from "../runtime.js";
2
+ import { Gateway } from "./gateway.js";
3
+ /** Membuat instance Gateway dan mendaftarkan seluruh method RPC yang tersedia. */
4
+ export declare function createGateway(runtime: RuntimeState): Gateway;
5
+ export { Gateway } from "./gateway.js";
6
+ export { registerGatewayWebSocket, GATEWAY_WS_PATH } from "./ws-server.js";
7
+ export type { ConnectionContext, MethodHandler, StreamHandler, UnaryHandler, } from "./types.js";
8
+ export { GatewayRpcError } from "./types.js";
@@ -0,0 +1,26 @@
1
+ import { Gateway } from "./gateway.js";
2
+ import { registerAuthMethods } from "./rpc/auth.js";
3
+ import { registerConversationMethods } from "./rpc/conversations.js";
4
+ import { registerProjectMethods } from "./rpc/projects.js";
5
+ import { registerProviderMethods } from "./rpc/providers.js";
6
+ import { registerAgentMethods } from "./rpc/agent.js";
7
+ import { registerAgentsMethods } from "./rpc/agents.js";
8
+ import { registerChannelMethods } from "./rpc/channels.js";
9
+ import { registerUsageMethods } from "./rpc/usage.js";
10
+ /** Membuat instance Gateway dan mendaftarkan seluruh method RPC yang tersedia. */
11
+ export function createGateway(runtime) {
12
+ const gateway = new Gateway(runtime);
13
+ registerAuthMethods(gateway);
14
+ registerConversationMethods(gateway);
15
+ registerProjectMethods(gateway);
16
+ registerProviderMethods(gateway);
17
+ registerAgentMethods(gateway);
18
+ registerAgentsMethods(gateway);
19
+ registerUsageMethods(gateway);
20
+ registerChannelMethods(gateway);
21
+ return gateway;
22
+ }
23
+ export { Gateway } from "./gateway.js";
24
+ export { registerGatewayWebSocket, GATEWAY_WS_PATH } from "./ws-server.js";
25
+ export { GatewayRpcError } from "./types.js";
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAErD,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACpC,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC5B,2BAA2B,CAAC,OAAO,CAAC,CAAA;IACpC,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAA;IAChC,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAO1E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,102 @@
1
+ /** Versi wire protocol gateway. Naikkan saat ada breaking change. */
2
+ export declare const GATEWAY_PROTOCOL_VERSION = 1;
3
+ /**
4
+ * Frame yang dikirim client ke gateway.
5
+ * - `connect`: WAJIB jadi frame pertama. Membawa info client + token opsional.
6
+ * - `req`: panggilan RPC (CRUD/auth) atau pembuka stream (chat agent).
7
+ * - `cancel`: membatalkan request streaming yang sedang berjalan.
8
+ */
9
+ export type ClientFrame = {
10
+ type: "connect";
11
+ id: string;
12
+ params?: ConnectParams;
13
+ } | {
14
+ type: "req";
15
+ id: string;
16
+ method: string;
17
+ params?: unknown;
18
+ } | {
19
+ type: "cancel";
20
+ id: string;
21
+ };
22
+ /** Parameter handshake `connect`. Semua field opsional & toleran. */
23
+ export type ConnectParams = {
24
+ protocol?: number;
25
+ auth?: {
26
+ token?: string;
27
+ };
28
+ client?: {
29
+ id?: string;
30
+ displayName?: string;
31
+ version?: string;
32
+ platform?: string;
33
+ mode?: string;
34
+ instanceId?: string;
35
+ };
36
+ };
37
+ /**
38
+ * Payload reply handshake (`hello-ok`). Server memberi tahu client soal
39
+ * versi, kapabilitas (method/event), snapshot state awal, policy ukuran
40
+ * payload + tick interval, dan status auth atas token yang dikirim.
41
+ */
42
+ export type HelloOkPayload = {
43
+ type: "hello-ok";
44
+ protocol: number;
45
+ server: {
46
+ version: string;
47
+ connId: string;
48
+ };
49
+ features: {
50
+ methods: string[];
51
+ events: string[];
52
+ };
53
+ snapshot: {
54
+ stateVersion: Record<string, number>;
55
+ uptimeMs: number;
56
+ };
57
+ policy: {
58
+ maxPayload: number;
59
+ maxBufferedBytes: number;
60
+ tickIntervalMs: number;
61
+ };
62
+ auth: {
63
+ ok: boolean;
64
+ userId?: string;
65
+ };
66
+ };
67
+ /**
68
+ * Frame yang dikirim gateway kembali ke client.
69
+ * - `res`: penutup tiap request (unary maupun stream). `ok:true` membawa
70
+ * `payload`; `ok:false` membawa `error`. Untuk stream, ini frame final
71
+ * setelah seluruh `event` antara terkirim.
72
+ * - `event`: pesan satu arah dari server. Bila membawa `id`, ia terkait
73
+ * sebuah stream berjalan (mis. event dari `agent.chat`). Tanpa `id` ia
74
+ * broadcast (mis. `tick`, `presence`) — dipakai mulai Milestone 6.
75
+ * `seq` & `stateVersion` opsional untuk deteksi gap (Milestone 6).
76
+ */
77
+ export type ServerFrame = {
78
+ type: "res";
79
+ id: string;
80
+ ok: boolean;
81
+ payload?: unknown;
82
+ error?: GatewayError;
83
+ } | {
84
+ type: "event";
85
+ event: string;
86
+ payload: unknown;
87
+ id?: string;
88
+ seq?: number;
89
+ stateVersion?: number;
90
+ };
91
+ export type GatewayError = {
92
+ message: string;
93
+ code?: string;
94
+ };
95
+ /** Dilempar saat frame masuk tidak valid (JSON rusak atau bentuk salah). */
96
+ export declare class GatewayFrameError extends Error {
97
+ constructor(message: string);
98
+ }
99
+ /** Mem-parse & memvalidasi teks frame dari client. Melempar GatewayFrameError. */
100
+ export declare function parseClientFrame(raw: string): ClientFrame;
101
+ /** Mengubah frame server menjadi teks untuk dikirim lewat socket. */
102
+ export declare function serializeServerFrame(frame: ServerFrame): string;
@@ -0,0 +1,63 @@
1
+ /** Versi wire protocol gateway. Naikkan saat ada breaking change. */
2
+ export const GATEWAY_PROTOCOL_VERSION = 1;
3
+ /** Dilempar saat frame masuk tidak valid (JSON rusak atau bentuk salah). */
4
+ export class GatewayFrameError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "GatewayFrameError";
8
+ }
9
+ }
10
+ /** Mem-parse & memvalidasi teks frame dari client. Melempar GatewayFrameError. */
11
+ export function parseClientFrame(raw) {
12
+ let value;
13
+ try {
14
+ value = JSON.parse(raw);
15
+ }
16
+ catch {
17
+ throw new GatewayFrameError("Frame is not valid JSON.");
18
+ }
19
+ if (!isRecord(value)) {
20
+ throw new GatewayFrameError("Frame must be a JSON object.");
21
+ }
22
+ if (value.type === "connect") {
23
+ if (typeof value.id !== "string" || value.id.length === 0) {
24
+ throw new GatewayFrameError("Connect frame requires a non-empty string id.");
25
+ }
26
+ return {
27
+ type: "connect",
28
+ id: value.id,
29
+ params: isRecord(value.params)
30
+ ? value.params
31
+ : undefined,
32
+ };
33
+ }
34
+ if (value.type === "req") {
35
+ if (typeof value.id !== "string" || value.id.length === 0) {
36
+ throw new GatewayFrameError("Request frame requires a non-empty string id.");
37
+ }
38
+ if (typeof value.method !== "string" || value.method.length === 0) {
39
+ throw new GatewayFrameError("Request frame requires a method name.");
40
+ }
41
+ return {
42
+ type: "req",
43
+ id: value.id,
44
+ method: value.method,
45
+ params: value.params,
46
+ };
47
+ }
48
+ if (value.type === "cancel") {
49
+ if (typeof value.id !== "string" || value.id.length === 0) {
50
+ throw new GatewayFrameError("Cancel frame requires a non-empty string id.");
51
+ }
52
+ return { type: "cancel", id: value.id };
53
+ }
54
+ throw new GatewayFrameError(`Unknown frame type: ${String(value.type)}`);
55
+ }
56
+ /** Mengubah frame server menjadi teks untuk dikirim lewat socket. */
57
+ export function serializeServerFrame(frame) {
58
+ return JSON.stringify(frame);
59
+ }
60
+ function isRecord(value) {
61
+ return typeof value === "object" && value !== null && !Array.isArray(value);
62
+ }
63
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/gateway/protocol.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAiF1C,4EAA4E;AAC5E,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,KAAc,CAAC;IAEnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,iBAAiB,CACzB,+CAA+C,CAChD,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC5B,CAAC,CAAE,KAAK,CAAC,MAAwB;gBACjC,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,iBAAiB,CACzB,+CAA+C,CAChD,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,iBAAiB,CAAC,uCAAuC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,iBAAiB,CACzB,8CAA8C,CAC/C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Gateway } from "../gateway.js";
2
+ /** Mendaftarkan method RPC `agent.*` pada gateway. */
3
+ export declare function registerAgentMethods(gateway: Gateway): void;
@@ -0,0 +1,174 @@
1
+ import { access } from "node:fs/promises";
2
+ import { z } from "zod";
3
+ import { defaultHomeContextFileNames, listHomeContextFiles, resolveHomeFilePath, } from "../../agent/home-context.js";
4
+ import { generateImprovementProposals } from "../../agent/improvement-engine.js";
5
+ import { resolveConfiguredAdapter } from "../../providers/configured-adapters.js";
6
+ import { chatSchema, improveConversationSchema } from "../../routes/schemas.js";
7
+ import { runAgentTurn } from "../agent-service.js";
8
+ import { GatewayRpcError, requireAuth } from "../types.js";
9
+ const memorySchema = z.object({
10
+ query: z.string().optional(),
11
+ kind: z.string().optional(),
12
+ });
13
+ const proposalsListSchema = z.object({
14
+ status: z.string().optional(),
15
+ });
16
+ const proposalIdSchema = z.object({
17
+ id: z.string().min(1),
18
+ });
19
+ /** Mendaftarkan method RPC `agent.*` pada gateway. */
20
+ export function registerAgentMethods(gateway) {
21
+ gateway.registerStream("agent.chat", (ctx, params) => {
22
+ const userId = requireAuth(ctx);
23
+ const body = chatSchema.parse(params);
24
+ return runAgentTurn(ctx.runtime, body, {
25
+ userId,
26
+ agentId: body.agentId,
27
+ channel: "app",
28
+ });
29
+ });
30
+ gateway.registerUnary("agent.status", handleStatus);
31
+ gateway.registerUnary("agent.memory", handleMemory);
32
+ gateway.registerUnary("agent.proposals.list", handleProposalsList);
33
+ gateway.registerUnary("agent.proposals.approve", handleProposalApprove);
34
+ gateway.registerUnary("agent.proposals.reject", handleProposalReject);
35
+ gateway.registerUnary("agent.improve", handleImprove);
36
+ }
37
+ async function handleStatus(ctx) {
38
+ const userId = requireAuth(ctx);
39
+ const { runtime } = ctx;
40
+ return {
41
+ ok: true,
42
+ paths: runtime.paths
43
+ ? {
44
+ root: runtime.paths.root,
45
+ dataDir: runtime.paths.dataDir,
46
+ databasePath: runtime.paths.databasePath,
47
+ homeDir: runtime.paths.homeDir,
48
+ vaultDir: runtime.paths.vaultDir,
49
+ }
50
+ : null,
51
+ providers: {
52
+ active: runtime.providers.getActiveProvider({ userId }),
53
+ count: runtime.providers.listProviders({ userId }).length,
54
+ },
55
+ counts: {
56
+ conversations: runtime.conversations.listConversations({ userId }).length,
57
+ memories: runtime.memories.countEntries({ userId }),
58
+ pendingProposals: runtime.memories.countPendingProposals({ userId }),
59
+ },
60
+ homeFiles: await getHomeFileStatus(runtime),
61
+ };
62
+ }
63
+ function handleMemory(ctx, params) {
64
+ const userId = requireAuth(ctx);
65
+ const { query, kind } = memorySchema.parse(params);
66
+ const memoryKind = isMemoryKind(kind) ? kind : undefined;
67
+ const scopedEntries = query
68
+ ? ctx.runtime.memories.searchEntries(query, 50, { userId })
69
+ : ctx.runtime.memories.listEntries({ kind: memoryKind, limit: 50, userId });
70
+ const entries = scopedEntries.length === 0 && ctx.runtime.auth.countUsers() === 0
71
+ ? query
72
+ ? ctx.runtime.memories.searchEntries(query, 50)
73
+ : ctx.runtime.memories.listEntries({ kind: memoryKind, limit: 50 })
74
+ : scopedEntries;
75
+ return { entries };
76
+ }
77
+ function handleProposalsList(ctx, params) {
78
+ const userId = requireAuth(ctx);
79
+ const { status } = proposalsListSchema.parse(params);
80
+ const proposalStatus = isProposalStatus(status) ? status : undefined;
81
+ const scopedProposals = ctx.runtime.memories.listProposals({
82
+ status: proposalStatus,
83
+ limit: 100,
84
+ userId,
85
+ });
86
+ const proposals = scopedProposals.length === 0 && ctx.runtime.auth.countUsers() === 0
87
+ ? ctx.runtime.memories.listProposals({
88
+ status: proposalStatus,
89
+ limit: 100,
90
+ })
91
+ : scopedProposals;
92
+ return { proposals };
93
+ }
94
+ function handleProposalApprove(ctx, params) {
95
+ const userId = requireAuth(ctx);
96
+ const { id } = proposalIdSchema.parse(params);
97
+ try {
98
+ return { entry: ctx.runtime.memories.approveProposal(id, { userId }) };
99
+ }
100
+ catch (error) {
101
+ if (ctx.runtime.auth.countUsers() === 0) {
102
+ return { entry: ctx.runtime.memories.approveProposal(id) };
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+ function handleProposalReject(ctx, params) {
108
+ const userId = requireAuth(ctx);
109
+ const { id } = proposalIdSchema.parse(params);
110
+ try {
111
+ return { proposal: ctx.runtime.memories.rejectProposal(id, { userId }) };
112
+ }
113
+ catch (error) {
114
+ if (ctx.runtime.auth.countUsers() === 0) {
115
+ return { proposal: ctx.runtime.memories.rejectProposal(id) };
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+ async function handleImprove(ctx, params) {
121
+ const userId = requireAuth(ctx);
122
+ const body = improveConversationSchema.parse(params);
123
+ const { runtime } = ctx;
124
+ const conversation = (body.conversationId
125
+ ? runtime.conversations.getConversation(body.conversationId, { userId })
126
+ : runtime.conversations.listConversations({ userId })[0]) ?? null;
127
+ if (!conversation) {
128
+ throw new GatewayRpcError("Conversation not found.", "not_found");
129
+ }
130
+ const provider = conversation.activeProvider ??
131
+ runtime.providers.getActiveProvider({ userId })?.provider ??
132
+ null;
133
+ if (!provider) {
134
+ throw new GatewayRpcError("No provider available for self-improvement.", "no_active_provider");
135
+ }
136
+ const adapter = resolveConfiguredAdapter(provider, { runtime, userId });
137
+ const drafts = await generateImprovementProposals({
138
+ adapter,
139
+ conversationId: conversation.id,
140
+ messages: runtime.conversations.getMessages(conversation.id, { userId }),
141
+ model: body.model,
142
+ });
143
+ const proposals = drafts.map((draft) => runtime.memories.createProposal({ ...draft, userId }));
144
+ return { proposals };
145
+ }
146
+ async function getHomeFileStatus(runtime) {
147
+ const paths = runtime.paths;
148
+ if (!paths)
149
+ return [];
150
+ const homeFileNames = new Set(defaultHomeContextFileNames);
151
+ for (const fileName of await listHomeContextFiles(paths)) {
152
+ homeFileNames.add(fileName);
153
+ }
154
+ return Promise.all([...homeFileNames].sort().map(async (name) => ({
155
+ name,
156
+ exists: await fileExists(resolveHomeFilePath(paths, name)),
157
+ })));
158
+ }
159
+ async function fileExists(path) {
160
+ try {
161
+ await access(path);
162
+ return true;
163
+ }
164
+ catch {
165
+ return false;
166
+ }
167
+ }
168
+ function isMemoryKind(value) {
169
+ return value === "memory" || value === "knowledge" || value === "skill";
170
+ }
171
+ function isProposalStatus(value) {
172
+ return value === "pending" || value === "approved" || value === "rejected";
173
+ }
174
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/gateway/rpc/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Gateway } from "../gateway.js";
2
+ export declare function registerAgentsMethods(gateway: Gateway): void;