@minimalcorp/tsunagi 0.1.18 → 0.1.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 (54) hide show
  1. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  3. package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  5. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  13. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +2 -2
  14. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  15. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  17. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  21. package/.next/standalone/apps/web/.next/server/app/index.rsc +3 -3
  22. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  23. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +3 -3
  24. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  25. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
  26. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  27. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  30. package/.next/standalone/apps/web/.next/server/app/settings.rsc +2 -2
  31. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  32. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  33. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  34. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  35. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  36. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  37. package/.next/standalone/apps/web/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__05isylw._.js +2 -2
  39. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ro8-ey._.js +2 -2
  40. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  41. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  42. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  43. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
  44. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  45. package/.next/standalone/apps/web/.next/static/chunks/{0e9ktynfbcnuu.js → 0c9ghpkhwpt12.js} +2 -2
  46. package/.next/standalone/apps/web/.next/static/chunks/{1170mb1fc0c_1.css → 147e715pxo.p..css} +1 -1
  47. package/.next/standalone/apps/web/.next/static/chunks/{1145l.gbs9mp0.js → 177m8zzm96aaw.js} +2 -2
  48. package/dist/server/index.js +8 -5
  49. package/dist/server/routes/terminal.js +13 -11
  50. package/npm-shrinkwrap.json +71 -39
  51. package/package.json +1 -1
  52. /package/.next/standalone/apps/web/.next/static/{36-cU0G0900-sCM9SPr1i → aUUElZxzfRVej0Okj9e9I}/_buildManifest.js +0 -0
  53. /package/.next/standalone/apps/web/.next/static/{36-cU0G0900-sCM9SPr1i → aUUElZxzfRVej0Okj9e9I}/_clientMiddlewareManifest.js +0 -0
  54. /package/.next/standalone/apps/web/.next/static/{36-cU0G0900-sCM9SPr1i → aUUElZxzfRVej0Okj9e9I}/_ssgManifest.js +0 -0
@@ -63,11 +63,14 @@ async function start() {
63
63
  allowRequest: basicAuth
64
64
  ? (req, callback) => callback(null, basicAuth.isAuthorized(req.headers, req.url, req.socket.remoteAddress))
65
65
  : undefined,
66
- // 死んだ接続(スリープ・ネットワーク断等)を早めに検出して、ぶら下がった socket が
67
- // 保持する PTY の onData/onExit ハンドラを早く解放する。既定 (25s/20s) では検出までに
68
- // 最大 ~45s かかり、その間ゾンビ socket がリスナーを溜め込み出力が多重化する。
69
- pingInterval: 15000,
70
- pingTimeout: 10000,
66
+ // 死んだ接続(スリープ・ネットワーク断等)を検出して、ぶら下がった socket が
67
+ // 保持する PTY の onData/onExit ハンドラを解放する。フォアグラウンド表示中の詰まり検知は
68
+ // クライアント側の能動的なヘルスチェック(TerminalView.tsx visibilitychange/interval)に
69
+ // 委ね、ここは主にバックグラウンド/スリープ由来のゾンビ socket 検出用。
70
+ // 既定 (25s/20s) より短いが、cloudflared 等のトンネル越しの一時的な詰まりを誤って
71
+ // 切断と判定しないよう、15s/10s よりは緩めている。
72
+ pingInterval: 20000,
73
+ pingTimeout: 15000,
71
74
  });
72
75
  fastify.decorate('io', io);
73
76
  fastify.get('/health', async () => ({ status: 'ok' }));
@@ -3,6 +3,7 @@ import * as os from 'os';
3
3
  import * as path from 'path';
4
4
  import { ptyManager } from '../pty-manager.js';
5
5
  import { prisma } from '../lib/db.js';
6
+ import { getEnv } from '../lib/repositories/environment.js';
6
7
  // サーバーはプロジェクトルートから起動されるため process.cwd() でルートを取得
7
8
  const TSUNAGI_EDITOR_PATH = path.resolve(process.cwd(), 'scripts/monaco-editor.sh');
8
9
  // Fastify(API) の公開ポート。index.ts と同じ既定値。monaco-editor.sh など PTY 内の
@@ -199,21 +200,22 @@ export async function terminalRoutes(fastify) {
199
200
  return reply.status(200).send({ sessionId, reused: true });
200
201
  }
201
202
  try {
202
- // DBからglobal環境変数を取得(有効なもののみ)
203
- const globalEnv = {};
203
+ // sessionId(=tab_id) から Task(owner/repo) を解決し、repo スコープまで階層マージした
204
+ // 環境変数を取得する(global owner → repo、後勝ちで上書き)。
205
+ // Plannerタブ等、Taskに紐づかないタブは Tab レコードが存在しないため global のみになる。
206
+ let dbEnv = {};
204
207
  try {
205
- const globalEnvVars = await prisma.environmentVariable.findMany({
206
- where: { scope: 'global', enabled: true },
207
- });
208
- globalEnvVars.forEach((e) => {
209
- globalEnv[e.key] = e.value;
208
+ const tab = await prisma.tab.findUnique({
209
+ where: { tabId: sessionId },
210
+ include: { task: true },
210
211
  });
211
- fastify.log.info({ count: globalEnvVars.length }, 'Loaded global env vars');
212
+ dbEnv = tab ? await getEnv('repo', tab.task.owner, tab.task.repo) : await getEnv('global');
213
+ fastify.log.info({ count: Object.keys(dbEnv).length, owner: tab?.task.owner, repo: tab?.task.repo }, 'Loaded env vars');
212
214
  }
213
215
  catch (err) {
214
- fastify.log.warn({ err }, 'Failed to load global env vars');
216
+ fastify.log.warn({ err }, 'Failed to load env vars');
215
217
  }
216
- // 優先順位: リクエストで渡されたenv > DBのglobal env > tsunagi独自のEDITOR設定
218
+ // 優先順位: リクエストで渡されたenv > DB env(global/owner/repo) > tsunagi独自のEDITOR設定
217
219
  // tsunagi-editor.sh をデフォルトにすることで Ctrl+G が Monaco Modal を開く。
218
220
  // DB / リクエストで EDITOR が明示設定されている場合はそちらが優先される。
219
221
  const tsunagiDefaultEnv = {
@@ -223,7 +225,7 @@ export async function terminalRoutes(fastify) {
223
225
  // ホストなので localhost。単一ポート化で API は SERVER_PORT(既定 2791)。
224
226
  TSUNAGI_API_BASE: `http://localhost:${SERVER_PORT}`,
225
227
  };
226
- const mergedEnv = { ...tsunagiDefaultEnv, ...globalEnv, ...env };
228
+ const mergedEnv = { ...tsunagiDefaultEnv, ...dbEnv, ...env };
227
229
  const session = ptyManager.createSession(sessionId, workingDir, mergedEnv);
228
230
  // コマンドが指定されていればPTY起動後にシェルへ書き込む
229
231
  if (command) {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@minimalcorp/tsunagi",
9
- "version": "0.1.18",
9
+ "version": "0.1.20",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "os": [
12
12
  "darwin",
@@ -83,9 +83,9 @@
83
83
  }
84
84
  },
85
85
  "node_modules/@fastify/cors": {
86
- "version": "11.2.0",
87
- "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.2.0.tgz",
88
- "integrity": "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==",
86
+ "version": "11.3.0",
87
+ "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.3.0.tgz",
88
+ "integrity": "sha512-ggQGua+xHv1MvePbPr0v//xLYEsCXbWspquXCJS9Ot5YoRXq8J8ZWzHnxDBVnbtXosvistXo6LtNzOJswf64Fw==",
89
89
  "funding": [
90
90
  {
91
91
  "type": "github",
@@ -98,7 +98,7 @@
98
98
  ],
99
99
  "license": "MIT",
100
100
  "dependencies": {
101
- "fastify-plugin": "^5.0.0",
101
+ "fastify-plugin": "^6.0.0",
102
102
  "toad-cache": "^3.7.0"
103
103
  }
104
104
  },
@@ -119,9 +119,9 @@
119
119
  "license": "MIT"
120
120
  },
121
121
  "node_modules/@fastify/fast-json-stringify-compiler": {
122
- "version": "5.0.3",
123
- "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz",
124
- "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==",
122
+ "version": "5.1.0",
123
+ "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.1.0.tgz",
124
+ "integrity": "sha512-PxcYtKLbQ8Z+yApiqjK8FwxIwvEj38k2OiLc17u8dkJSlmfi2wHHPaSnaoqBPQqtvF8YVsDgDpP2snDCfFrpfw==",
125
125
  "funding": [
126
126
  {
127
127
  "type": "github",
@@ -134,7 +134,7 @@
134
134
  ],
135
135
  "license": "MIT",
136
136
  "dependencies": {
137
- "fast-json-stringify": "^6.0.0"
137
+ "fast-json-stringify": "^7.0.0"
138
138
  }
139
139
  },
140
140
  "node_modules/@fastify/forwarded": {
@@ -175,6 +175,22 @@
175
175
  "ws": "^8.18.3"
176
176
  }
177
177
  },
178
+ "node_modules/@fastify/http-proxy/node_modules/fastify-plugin": {
179
+ "version": "5.1.0",
180
+ "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz",
181
+ "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==",
182
+ "funding": [
183
+ {
184
+ "type": "github",
185
+ "url": "https://github.com/sponsors/fastify"
186
+ },
187
+ {
188
+ "type": "opencollective",
189
+ "url": "https://opencollective.com/fastify"
190
+ }
191
+ ],
192
+ "license": "MIT"
193
+ },
178
194
  "node_modules/@fastify/merge-json-schemas": {
179
195
  "version": "0.2.1",
180
196
  "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz",
@@ -239,6 +255,22 @@
239
255
  "undici": "^7.0.0"
240
256
  }
241
257
  },
258
+ "node_modules/@fastify/reply-from/node_modules/fastify-plugin": {
259
+ "version": "5.1.0",
260
+ "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz",
261
+ "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==",
262
+ "funding": [
263
+ {
264
+ "type": "github",
265
+ "url": "https://github.com/sponsors/fastify"
266
+ },
267
+ {
268
+ "type": "opencollective",
269
+ "url": "https://opencollective.com/fastify"
270
+ }
271
+ ],
272
+ "license": "MIT"
273
+ },
242
274
  "node_modules/@hono/node-server": {
243
275
  "version": "1.19.14",
244
276
  "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz",
@@ -1034,9 +1066,9 @@
1034
1066
  }
1035
1067
  },
1036
1068
  "node_modules/@types/node": {
1037
- "version": "26.0.1",
1038
- "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.1.tgz",
1039
- "integrity": "sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==",
1069
+ "version": "26.1.1",
1070
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz",
1071
+ "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==",
1040
1072
  "license": "MIT",
1041
1073
  "dependencies": {
1042
1074
  "undici-types": "~8.3.0"
@@ -1793,9 +1825,9 @@
1793
1825
  "license": "MIT"
1794
1826
  },
1795
1827
  "node_modules/fast-json-stringify": {
1796
- "version": "6.4.0",
1797
- "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.4.0.tgz",
1798
- "integrity": "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ==",
1828
+ "version": "7.0.0",
1829
+ "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-7.0.0.tgz",
1830
+ "integrity": "sha512-YV53BAbR3Qwq37wfD1oZ97YJ0nYj6CwfzKXQ38ock9XxI2EnLOdl5psKms6Evook6ACckytZJOaKY0ThmIi1uw==",
1799
1831
  "funding": [
1800
1832
  {
1801
1833
  "type": "github",
@@ -1826,9 +1858,9 @@
1826
1858
  }
1827
1859
  },
1828
1860
  "node_modules/fast-uri": {
1829
- "version": "3.1.2",
1830
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
1831
- "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
1861
+ "version": "3.1.3",
1862
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz",
1863
+ "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==",
1832
1864
  "funding": [
1833
1865
  {
1834
1866
  "type": "github",
@@ -1842,9 +1874,9 @@
1842
1874
  "license": "BSD-3-Clause"
1843
1875
  },
1844
1876
  "node_modules/fastify": {
1845
- "version": "5.8.5",
1846
- "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz",
1847
- "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==",
1877
+ "version": "5.10.0",
1878
+ "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.10.0.tgz",
1879
+ "integrity": "sha512-A9L0ziuWGQHgEEVgF3davQ9vbD93IuX+lo2IsxapQmu5b/Y/ynn9m9K5JHt9dvyJXOFc5iN0Zk5GHEOqnzhWjg==",
1848
1880
  "funding": [
1849
1881
  {
1850
1882
  "type": "github",
@@ -1863,8 +1895,8 @@
1863
1895
  "@fastify/proxy-addr": "^5.0.0",
1864
1896
  "abstract-logging": "^2.0.1",
1865
1897
  "avvio": "^9.0.0",
1866
- "fast-json-stringify": "^6.0.0",
1867
- "find-my-way": "^9.0.0",
1898
+ "fast-json-stringify": "^7.0.0",
1899
+ "find-my-way": "^9.6.0",
1868
1900
  "light-my-request": "^6.0.0",
1869
1901
  "pino": "^9.14.0 || ^10.1.0",
1870
1902
  "process-warning": "^5.0.0",
@@ -1875,9 +1907,9 @@
1875
1907
  }
1876
1908
  },
1877
1909
  "node_modules/fastify-plugin": {
1878
- "version": "5.1.0",
1879
- "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz",
1880
- "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==",
1910
+ "version": "6.0.0",
1911
+ "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz",
1912
+ "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==",
1881
1913
  "funding": [
1882
1914
  {
1883
1915
  "type": "github",
@@ -2128,9 +2160,9 @@
2128
2160
  }
2129
2161
  },
2130
2162
  "node_modules/hono": {
2131
- "version": "4.12.27",
2132
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz",
2133
- "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==",
2163
+ "version": "4.12.28",
2164
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.28.tgz",
2165
+ "integrity": "sha512-YwUvVpSF7m1yOblFPrU3Hbo8XhPheBoiyfGuII6z19LnOr6JpDnyyp7LFNrfV56wS8tpvtBFGRISHN02pDdLOA==",
2134
2166
  "license": "MIT",
2135
2167
  "engines": {
2136
2168
  "node": ">=16.9.0"
@@ -2163,9 +2195,9 @@
2163
2195
  "license": "MIT"
2164
2196
  },
2165
2197
  "node_modules/iconv-lite": {
2166
- "version": "0.7.2",
2167
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
2168
- "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
2198
+ "version": "0.7.3",
2199
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
2200
+ "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
2169
2201
  "license": "MIT",
2170
2202
  "dependencies": {
2171
2203
  "safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -2239,9 +2271,9 @@
2239
2271
  }
2240
2272
  },
2241
2273
  "node_modules/js-base64": {
2242
- "version": "3.8.0",
2243
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.8.0.tgz",
2244
- "integrity": "sha512-65kvbemyZhj+ExQt1PEFyBEjL5vAHysu1lJdW1AwhhChkO8ZBPizYk/m9GVrpbS2Je1hF+UYZ+6KywqtZV8mHw==",
2274
+ "version": "3.8.1",
2275
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.8.1.tgz",
2276
+ "integrity": "sha512-5xVjhUZlHHeuO2W7w2rDFj/Kl1xLX+HjZxdOQwCsUOifl6UaoH1o1wsbsTMz+r0aeC7gCijvru02j6TfKZWzKg==",
2245
2277
  "license": "BSD-3-Clause"
2246
2278
  },
2247
2279
  "node_modules/json-schema-ref-resolver": {
@@ -3353,9 +3385,9 @@
3353
3385
  "license": "MIT"
3354
3386
  },
3355
3387
  "node_modules/toad-cache": {
3356
- "version": "3.7.1",
3357
- "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz",
3358
- "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==",
3388
+ "version": "3.7.4",
3389
+ "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz",
3390
+ "integrity": "sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==",
3359
3391
  "license": "MIT",
3360
3392
  "engines": {
3361
3393
  "node": ">=20"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Multi-repo GitHub project management with Claude AI integration, designed for visualizing and controlling AI-driven development locally.",
5
5
  "keywords": [
6
6
  "tsunagi",