@cocorograph/hub-agent 0.6.18 → 0.6.19

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocorograph/hub-agent",
3
- "version": "0.6.18",
3
+ "version": "0.6.19",
4
4
  "description": "Hub Hosted Cockpit のローカル常駐 agent。Hub と outbound WSS で接続し、ローカルの tmux/pty を中継する。",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -15,6 +15,8 @@ import path from "node:path"
15
15
  import { spawnSync } from "node:child_process"
16
16
  import { fileURLToPath } from "node:url"
17
17
 
18
+ import { readConfig } from "./config.mjs"
19
+
18
20
  const PLIST_LABEL = "co.cocorograph.hub-agent"
19
21
  const SYSTEMD_UNIT_NAME = "hub-agent.service"
20
22
 
@@ -50,7 +52,7 @@ function escapeXmlText(s) {
50
52
  .replaceAll(">", ">")
51
53
  }
52
54
 
53
- function expandTemplate(text, hubAgentBin) {
55
+ function expandTemplate(text, hubAgentBin, opts = {}) {
54
56
  // hub-agent デーモンの runtime 環境に必須な追加 env を、各プラットフォームの
55
57
  // 起動ファイル形式 (plist / systemd) に合わせて差し込むためのプレースホルダ展開。
56
58
  //
@@ -72,12 +74,43 @@ function expandTemplate(text, hubAgentBin) {
72
74
  // systemd 側: Environment=KEY=VALUE の 1 行。末尾 \n でテンプレ "__...__\n" を吸収。
73
75
  systemdLine = `Environment=NODE_EXTRA_CA_CERTS=${nodeExtraCa}\n`
74
76
  }
77
+
78
+ // 多端末共有チャット (HUB_AGENT_CHAT_SHARED)。NODE_EXTRA_CA_CERTS と同じ仕組みで
79
+ // plist / systemd の EnvironmentVariables に焼き込む。値ソースは (a) installService
80
+ // が agent.json.chat_shared を読んで渡す opts.chatShared、または (b) install-service
81
+ // 実行時の process.env.HUB_AGENT_CHAT_SHARED。これにより agent 更新で install-service
82
+ // が plist を再生成しても、agent.json に chat_shared=true があればフラグが維持される
83
+ // (旧実装は手動 plist 追記が再生成で消える事故があった。2026-05-30)。
84
+ const chatShared =
85
+ opts.chatShared === true || process.env.HUB_AGENT_CHAT_SHARED === "1"
86
+ let chatPlistEntry = ""
87
+ let chatSystemdLine = ""
88
+ if (chatShared) {
89
+ chatPlistEntry =
90
+ ` <key>HUB_AGENT_CHAT_SHARED</key>\n` +
91
+ ` <string>1</string>\n`
92
+ chatSystemdLine = `Environment=HUB_AGENT_CHAT_SHARED=1\n`
93
+ }
94
+
75
95
  return text
76
96
  .replaceAll("__HUB_AGENT_BIN__", hubAgentBin)
77
97
  .replaceAll("__HOME__", os.homedir())
78
98
  .replaceAll("__PATH__", process.env.PATH || "/usr/local/bin:/usr/bin:/bin")
79
99
  .replaceAll("__NODE_EXTRA_CA_CERTS_PLIST_ENTRY__", plistEntry)
80
100
  .replaceAll("__NODE_EXTRA_CA_CERTS_SYSTEMD_LINE__", systemdLine)
101
+ .replaceAll("__HUB_AGENT_CHAT_SHARED_PLIST_ENTRY__", chatPlistEntry)
102
+ .replaceAll("__HUB_AGENT_CHAT_SHARED_SYSTEMD_LINE__", chatSystemdLine)
103
+ }
104
+
105
+ /** agent.json から多端末共有フラグ (chat_shared) を読む。読めなければ false。
106
+ * install-service 時に plist/systemd へ焼き込む値ソースに使う (env 併用は expandTemplate 側)。 */
107
+ async function readChatSharedFromConfig() {
108
+ try {
109
+ const config = await readConfig()
110
+ return config?.chat_shared === true
111
+ } catch {
112
+ return false
113
+ }
81
114
  }
82
115
 
83
116
  async function ensureDir(p) {
@@ -156,9 +189,12 @@ export async function installService({ bin } = {}) {
156
189
  const hubAgentBin = bin || detectHubAgentBin()
157
190
  await ensureLogFile()
158
191
 
192
+ // agent.json の永続フラグを読み、テンプレ展開に渡す (再生成でも維持されるように)。
193
+ const chatShared = await readChatSharedFromConfig()
194
+
159
195
  if (process.platform === "darwin") {
160
196
  const tpl = await readTemplate("co.cocorograph.hub-agent.plist")
161
- const expanded = expandTemplate(tpl, hubAgentBin)
197
+ const expanded = expandTemplate(tpl, hubAgentBin, { chatShared })
162
198
  const dest = macPlistPath()
163
199
  await ensureDir(path.dirname(dest))
164
200
  await fs.writeFile(dest, expanded, { mode: 0o644 })
@@ -173,7 +209,7 @@ export async function installService({ bin } = {}) {
173
209
 
174
210
  if (process.platform === "linux") {
175
211
  const tpl = await readTemplate("hub-agent.service")
176
- const expanded = expandTemplate(tpl, hubAgentBin)
212
+ const expanded = expandTemplate(tpl, hubAgentBin, { chatShared })
177
213
  const dest = linuxUnitPath()
178
214
  await ensureDir(path.dirname(dest))
179
215
  await fs.writeFile(dest, expanded, { mode: 0o644 })
@@ -52,7 +52,7 @@
52
52
  <string>__PATH__</string>
53
53
  <key>HOME</key>
54
54
  <string>__HOME__</string>
55
- __NODE_EXTRA_CA_CERTS_PLIST_ENTRY__ </dict>
55
+ __NODE_EXTRA_CA_CERTS_PLIST_ENTRY____HUB_AGENT_CHAT_SHARED_PLIST_ENTRY__ </dict>
56
56
 
57
57
  <!-- KeepAlive で過剰再起動した時に 10 秒スロットルする -->
58
58
  <key>ThrottleInterval</key>
@@ -12,7 +12,7 @@ Type=simple
12
12
  # 行に、未 set なら空文字列に」展開する。
13
13
  Environment=PATH=__PATH__
14
14
  Environment=HOME=__HOME__
15
- __NODE_EXTRA_CA_CERTS_SYSTEMD_LINE__WorkingDirectory=__HOME__
15
+ __NODE_EXTRA_CA_CERTS_SYSTEMD_LINE____HUB_AGENT_CHAT_SHARED_SYSTEMD_LINE__WorkingDirectory=__HOME__
16
16
  ExecStart=__HUB_AGENT_BIN__ start
17
17
  Restart=always
18
18
  RestartSec=10