@minimalcorp/tsunagi 0.1.16 → 0.1.17

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 (44) 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.html +1 -1
  12. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  15. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  16. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  17. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  18. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  19. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  20. package/.next/standalone/apps/web/.next/server/app/index.rsc +1 -1
  21. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  22. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  23. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  24. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  25. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  26. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  27. package/.next/standalone/apps/web/.next/server/app/settings.rsc +1 -1
  28. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  29. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  30. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  31. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  32. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  33. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  34. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  35. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  36. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  37. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
  38. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  39. package/dist/server/routes/terminal.js +27 -1
  40. package/npm-shrinkwrap.json +5 -5
  41. package/package.json +1 -1
  42. /package/.next/standalone/apps/web/.next/static/{ZuFNfLCNNHQAu9ChQjnK7 → Q7QTiWuO93GtNyS-DgVqZ}/_buildManifest.js +0 -0
  43. /package/.next/standalone/apps/web/.next/static/{ZuFNfLCNNHQAu9ChQjnK7 → Q7QTiWuO93GtNyS-DgVqZ}/_clientMiddlewareManifest.js +0 -0
  44. /package/.next/standalone/apps/web/.next/static/{ZuFNfLCNNHQAu9ChQjnK7 → Q7QTiWuO93GtNyS-DgVqZ}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "h0dyD+C7T8loAzeQ04AGR7RZcdgkDXOlWtL/Q0cN/WY="
4
+ "encryptionKey": "O0DYR4RwzXb0nUrbJXGO+nXpLXEbVDsT/CNr7Snfop4="
5
5
  }
@@ -8,6 +8,29 @@ const TSUNAGI_EDITOR_PATH = path.resolve(process.cwd(), 'scripts/monaco-editor.s
8
8
  // Fastify(API) の公開ポート。index.ts と同じ既定値。monaco-editor.sh など PTY 内の
9
9
  // プロセスが API を叩く際の同一ホスト向けベース URL に使う。
10
10
  const SERVER_PORT = Number(process.env.PORT) || 2791;
11
+ /**
12
+ * 再接続時の画面復元用 scrollback から「端末への問い合わせ(クエリ)」シーケンスを除去する。
13
+ *
14
+ * Claude(Ink) は描画中に DECXCPR(ESC[?6n) や DA(ESC[c) を大量に出力する。これらは生の
15
+ * まま scrollback に蓄積される。再接続時に scrollback をそのまま replay すると、xterm.js が
16
+ * 「今ホストから来たクエリ」と誤認して応答を生成し(deviceStatusPrivate / sendDeviceAttributes →
17
+ * triggerDataEvent)、その応答が onData → emit('input') → PTY へ注入される。
18
+ * 結果、シェルや Claude の入力欄に "1;2c64;3R64;3R..."(DA応答 ESC[?1;2c / CPR応答 ESC[?r;cR の
19
+ * 可視部)が勝手に入力される。
20
+ *
21
+ * クエリ列は視覚出力を持たないため、replay からは除去して構わない(画面復元は壊れない)。
22
+ * 対象は CSI ... n(DSR系: ESC[?6n / ESC[6n / ESC[5n)と CSI ... c(DA系: ESC[c / ESC[0c /
23
+ * ESC[>c)。チャンク境界を跨ぐクエリ列を取りこぼさないよう、必ず scrollback を join した
24
+ * 後の文字列に適用する。
25
+ *
26
+ * 注意: ライブ出力(onData 経由の emit('output'))には適用しない。動作中の Claude が正当に
27
+ * 要求しているクエリへの応答は PTY に返す必要があるため、除去は replay 限定とする。
28
+ */
29
+ function stripTerminalQueries(s) {
30
+ return s
31
+ .replace(/\x1b\[[?>]?[0-9;]*n/g, '') // DSR: ESC[?6n(主犯) / ESC[6n / ESC[5n など
32
+ .replace(/\x1b\[[?>=]?[0-9;]*c/g, ''); // DA: ESC[c / ESC[0c / ESC[>c / ESC[=c
33
+ }
11
34
  export async function terminalRoutes(fastify) {
12
35
  const io = fastify.io;
13
36
  // socket.io イベントハンドラ
@@ -62,7 +85,10 @@ export async function terminalRoutes(fastify) {
62
85
  const isReused = session.scrollback.length > 0;
63
86
  // リングバッファの内容を一括送信(再接続時の画面復元)
64
87
  if (isReused) {
65
- const buffered = session.scrollback.join('');
88
+ // 端末クエリ列(ESC[?6n / ESC[c 等)を除去してから replay する。
89
+ // これを怠ると xterm.js が応答を生成し PTY へ注入され、入力欄に "1;2c64;3R..." が
90
+ // 勝手に入力される(stripTerminalQueries のコメント参照)。
91
+ const buffered = stripTerminalQueries(session.scrollback.join(''));
66
92
  // 末尾の \r\n / \n / \r をトリムする。
67
93
  const trimmed = buffered.replace(/[\r\n]+$/, '');
68
94
  socket.emit('output', { data: trimmed });
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@minimalcorp/tsunagi",
9
- "version": "0.1.16",
9
+ "version": "0.1.17",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "os": [
12
12
  "darwin",
@@ -2128,9 +2128,9 @@
2128
2128
  }
2129
2129
  },
2130
2130
  "node_modules/hono": {
2131
- "version": "4.12.26",
2132
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.26.tgz",
2133
- "integrity": "sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw==",
2131
+ "version": "4.12.27",
2132
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz",
2133
+ "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==",
2134
2134
  "license": "MIT",
2135
2135
  "engines": {
2136
2136
  "node": ">=16.9.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
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",