@lnar/cli 0.0.1-dev.1da013d
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/README.md +96 -0
- package/dist/api-client.d.ts +17 -0
- package/dist/api-client.js +35 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +91 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/daemon.d.ts +5 -0
- package/dist/commands/daemon.js +158 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/down.d.ts +1 -0
- package/dist/commands/down.js +12 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.js +86 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/scan.d.ts +4 -0
- package/dist/commands/scan.js +36 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +32 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +4 -0
- package/dist/commands/sync.js +96 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.js +27 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +82 -0
- package/dist/config.js.map +1 -0
- package/dist/hash.d.ts +7 -0
- package/dist/hash.js +12 -0
- package/dist/hash.js.map +1 -0
- package/dist/oauth-client.d.ts +32 -0
- package/dist/oauth-client.js +62 -0
- package/dist/oauth-client.js.map +1 -0
- package/dist/pending-client.d.ts +40 -0
- package/dist/pending-client.js +48 -0
- package/dist/pending-client.js.map +1 -0
- package/dist/scanners/_normalize.d.ts +13 -0
- package/dist/scanners/_normalize.js +76 -0
- package/dist/scanners/_normalize.js.map +1 -0
- package/dist/scanners/chatgpt.d.ts +20 -0
- package/dist/scanners/chatgpt.js +49 -0
- package/dist/scanners/chatgpt.js.map +1 -0
- package/dist/scanners/claude-code-plugins.d.ts +2 -0
- package/dist/scanners/claude-code-plugins.js +104 -0
- package/dist/scanners/claude-code-plugins.js.map +1 -0
- package/dist/scanners/claude-code.d.ts +13 -0
- package/dist/scanners/claude-code.js +221 -0
- package/dist/scanners/claude-code.js.map +1 -0
- package/dist/scanners/claude-desktop.d.ts +1 -0
- package/dist/scanners/claude-desktop.js +2 -0
- package/dist/scanners/claude-desktop.js.map +1 -0
- package/dist/scanners/codex.d.ts +5 -0
- package/dist/scanners/codex.js +69 -0
- package/dist/scanners/codex.js.map +1 -0
- package/dist/scanners/cursor.d.ts +9 -0
- package/dist/scanners/cursor.js +25 -0
- package/dist/scanners/cursor.js.map +1 -0
- package/dist/scanners/gemini-cli.d.ts +21 -0
- package/dist/scanners/gemini-cli.js +37 -0
- package/dist/scanners/gemini-cli.js.map +1 -0
- package/dist/scanners/index.d.ts +6 -0
- package/dist/scanners/index.js +16 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/service/files.d.ts +26 -0
- package/dist/service/files.js +119 -0
- package/dist/service/files.js.map +1 -0
- package/dist/service/install.d.ts +14 -0
- package/dist/service/install.js +231 -0
- package/dist/service/install.js.map +1 -0
- package/dist/types.d.ts +161 -0
- package/dist/types.js +53 -0
- package/dist/types.js.map +1 -0
- package/dist/writers/_fs.d.ts +22 -0
- package/dist/writers/_fs.js +55 -0
- package/dist/writers/_fs.js.map +1 -0
- package/dist/writers/chatgpt.d.ts +8 -0
- package/dist/writers/chatgpt.js +12 -0
- package/dist/writers/chatgpt.js.map +1 -0
- package/dist/writers/claude-code-plugins.d.ts +3 -0
- package/dist/writers/claude-code-plugins.js +74 -0
- package/dist/writers/claude-code-plugins.js.map +1 -0
- package/dist/writers/claude-code.d.ts +4 -0
- package/dist/writers/claude-code.js +128 -0
- package/dist/writers/claude-code.js.map +1 -0
- package/dist/writers/codex.d.ts +4 -0
- package/dist/writers/codex.js +88 -0
- package/dist/writers/codex.js.map +1 -0
- package/dist/writers/cursor.d.ts +4 -0
- package/dist/writers/cursor.js +74 -0
- package/dist/writers/cursor.js.map +1 -0
- package/dist/writers/gemini-cli.d.ts +4 -0
- package/dist/writers/gemini-cli.js +87 -0
- package/dist/writers/gemini-cli.js.map +1 -0
- package/dist/writers/index.d.ts +18 -0
- package/dist/writers/index.js +11 -0
- package/dist/writers/index.js.map +1 -0
- package/dist/writers/registry.d.ts +7 -0
- package/dist/writers/registry.js +31 -0
- package/dist/writers/registry.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { scanChatgpt } from './chatgpt.js';
|
|
2
|
+
import { scanClaudeCode } from './claude-code.js';
|
|
3
|
+
import { scanCodex } from './codex.js';
|
|
4
|
+
import { scanCursor } from './cursor.js';
|
|
5
|
+
import { scanGeminiCli } from './gemini-cli.js';
|
|
6
|
+
export const runAllScanners = async (options = {}) => {
|
|
7
|
+
const results = await Promise.all([
|
|
8
|
+
scanClaudeCode(options),
|
|
9
|
+
scanCodex({ home: options.home }),
|
|
10
|
+
scanCursor(options),
|
|
11
|
+
scanGeminiCli(options),
|
|
12
|
+
scanChatgpt({ home: options.home }),
|
|
13
|
+
]);
|
|
14
|
+
return results.filter((r) => r !== null);
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,UAA0B,EAAE,EACF,EAAE;IAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChC,cAAc,CAAC,OAAO,CAAC;QACvB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,UAAU,CAAC,OAAO,CAAC;QACnB,aAAa,CAAC,OAAO,CAAC;QACtB,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;KACpC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC/D,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS 別の常駐サービスファイルを生成する純粋関数群。
|
|
3
|
+
*
|
|
4
|
+
* 実際にファイル書き込みや launchctl/systemctl/schtasks を叩く処理は
|
|
5
|
+
* `service/install.ts` に分離して、ここはテストしやすい純粋関数のみ。
|
|
6
|
+
*/
|
|
7
|
+
export declare const SERVICE_LABEL = "ai.lnar.daemon";
|
|
8
|
+
export interface ServiceTarget {
|
|
9
|
+
/** node 実行ファイルの絶対パス (process.execPath) */
|
|
10
|
+
nodePath: string;
|
|
11
|
+
/** lnar の CLI スクリプト絶対パス (= process.argv[1]) */
|
|
12
|
+
scriptPath: string;
|
|
13
|
+
}
|
|
14
|
+
/** macOS launchd LaunchAgent plist。RunAtLoad + KeepAlive で常駐させる。 */
|
|
15
|
+
export declare function macOsPlist(target: ServiceTarget): string;
|
|
16
|
+
/** Linux systemd user unit。`systemctl --user enable --now` で起動。 */
|
|
17
|
+
export declare function linuxSystemdUnit(target: ServiceTarget): string;
|
|
18
|
+
/**
|
|
19
|
+
* Windows Task Scheduler 用の XML。`schtasks /Create /XML` で登録する。
|
|
20
|
+
* RegisterTaskDefinition XML schema (https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-schema)
|
|
21
|
+
*
|
|
22
|
+
* - LogonTrigger: ユーザーログオン時に起動
|
|
23
|
+
* - Settings.RestartCount: 失敗時に最大 9999 回まで 1 分間隔で再起動
|
|
24
|
+
* - RunLevel=LeastPrivilege: 管理者権限不要
|
|
25
|
+
*/
|
|
26
|
+
export declare function windowsTaskXml(target: ServiceTarget, userName: string): string;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS 別の常駐サービスファイルを生成する純粋関数群。
|
|
3
|
+
*
|
|
4
|
+
* 実際にファイル書き込みや launchctl/systemctl/schtasks を叩く処理は
|
|
5
|
+
* `service/install.ts` に分離して、ここはテストしやすい純粋関数のみ。
|
|
6
|
+
*/
|
|
7
|
+
export const SERVICE_LABEL = 'ai.lnar.daemon';
|
|
8
|
+
/** macOS launchd LaunchAgent plist。RunAtLoad + KeepAlive で常駐させる。 */
|
|
9
|
+
export function macOsPlist(target) {
|
|
10
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
11
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
12
|
+
<plist version="1.0">
|
|
13
|
+
<dict>
|
|
14
|
+
<key>Label</key><string>${SERVICE_LABEL}</string>
|
|
15
|
+
<key>ProgramArguments</key>
|
|
16
|
+
<array>
|
|
17
|
+
<string>${target.nodePath}</string>
|
|
18
|
+
<string>${target.scriptPath}</string>
|
|
19
|
+
<string>daemon</string>
|
|
20
|
+
</array>
|
|
21
|
+
<key>RunAtLoad</key><true/>
|
|
22
|
+
<key>KeepAlive</key><true/>
|
|
23
|
+
<key>StandardOutPath</key><string>/tmp/lnar-daemon.log</string>
|
|
24
|
+
<key>StandardErrorPath</key><string>/tmp/lnar-daemon.err.log</string>
|
|
25
|
+
<key>EnvironmentVariables</key>
|
|
26
|
+
<dict>
|
|
27
|
+
<key>PATH</key>
|
|
28
|
+
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
|
|
29
|
+
</dict>
|
|
30
|
+
</dict>
|
|
31
|
+
</plist>
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
/** Linux systemd user unit。`systemctl --user enable --now` で起動。 */
|
|
35
|
+
export function linuxSystemdUnit(target) {
|
|
36
|
+
return `[Unit]
|
|
37
|
+
Description=Lnar CLI daemon
|
|
38
|
+
After=network.target
|
|
39
|
+
|
|
40
|
+
[Service]
|
|
41
|
+
Type=simple
|
|
42
|
+
ExecStart=${target.nodePath} ${target.scriptPath} daemon
|
|
43
|
+
Restart=on-failure
|
|
44
|
+
RestartSec=5
|
|
45
|
+
StandardOutput=append:%h/.local/state/lnar-daemon.log
|
|
46
|
+
StandardError=append:%h/.local/state/lnar-daemon.err.log
|
|
47
|
+
|
|
48
|
+
[Install]
|
|
49
|
+
WantedBy=default.target
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Windows Task Scheduler 用の XML。`schtasks /Create /XML` で登録する。
|
|
54
|
+
* RegisterTaskDefinition XML schema (https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-schema)
|
|
55
|
+
*
|
|
56
|
+
* - LogonTrigger: ユーザーログオン時に起動
|
|
57
|
+
* - Settings.RestartCount: 失敗時に最大 9999 回まで 1 分間隔で再起動
|
|
58
|
+
* - RunLevel=LeastPrivilege: 管理者権限不要
|
|
59
|
+
*/
|
|
60
|
+
export function windowsTaskXml(target, userName) {
|
|
61
|
+
// XML 属性に文字列を埋め込むので "&", "<", ">", quote をエスケープ
|
|
62
|
+
const escape = (s) => s
|
|
63
|
+
.replace(/&/g, '&')
|
|
64
|
+
.replace(/</g, '<')
|
|
65
|
+
.replace(/>/g, '>')
|
|
66
|
+
.replace(/"/g, '"');
|
|
67
|
+
// PowerShell や cmd で実行することを考えるとパスは quote で囲む
|
|
68
|
+
const arguments_ = `"${escape(target.scriptPath)}" daemon`;
|
|
69
|
+
return `<?xml version="1.0" encoding="UTF-16"?>
|
|
70
|
+
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
71
|
+
<RegistrationInfo>
|
|
72
|
+
<Description>Lnar CLI daemon</Description>
|
|
73
|
+
</RegistrationInfo>
|
|
74
|
+
<Triggers>
|
|
75
|
+
<LogonTrigger>
|
|
76
|
+
<Enabled>true</Enabled>
|
|
77
|
+
<UserId>${escape(userName)}</UserId>
|
|
78
|
+
</LogonTrigger>
|
|
79
|
+
</Triggers>
|
|
80
|
+
<Principals>
|
|
81
|
+
<Principal id="Author">
|
|
82
|
+
<UserId>${escape(userName)}</UserId>
|
|
83
|
+
<LogonType>InteractiveToken</LogonType>
|
|
84
|
+
<RunLevel>LeastPrivilege</RunLevel>
|
|
85
|
+
</Principal>
|
|
86
|
+
</Principals>
|
|
87
|
+
<Settings>
|
|
88
|
+
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
|
89
|
+
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
|
90
|
+
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
|
91
|
+
<AllowHardTerminate>true</AllowHardTerminate>
|
|
92
|
+
<StartWhenAvailable>true</StartWhenAvailable>
|
|
93
|
+
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
|
|
94
|
+
<IdleSettings>
|
|
95
|
+
<StopOnIdleEnd>false</StopOnIdleEnd>
|
|
96
|
+
<RestartOnIdle>false</RestartOnIdle>
|
|
97
|
+
</IdleSettings>
|
|
98
|
+
<AllowStartOnDemand>true</AllowStartOnDemand>
|
|
99
|
+
<Enabled>true</Enabled>
|
|
100
|
+
<Hidden>false</Hidden>
|
|
101
|
+
<RunOnlyIfIdle>false</RunOnlyIfIdle>
|
|
102
|
+
<WakeToRun>false</WakeToRun>
|
|
103
|
+
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
|
|
104
|
+
<Priority>7</Priority>
|
|
105
|
+
<RestartOnFailure>
|
|
106
|
+
<Interval>PT1M</Interval>
|
|
107
|
+
<Count>9999</Count>
|
|
108
|
+
</RestartOnFailure>
|
|
109
|
+
</Settings>
|
|
110
|
+
<Actions Context="Author">
|
|
111
|
+
<Exec>
|
|
112
|
+
<Command>${escape(target.nodePath)}</Command>
|
|
113
|
+
<Arguments>${arguments_}</Arguments>
|
|
114
|
+
</Exec>
|
|
115
|
+
</Actions>
|
|
116
|
+
</Task>
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/service/files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAA;AAS7C,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,OAAO;;;;4BAImB,aAAa;;;cAG3B,MAAM,CAAC,QAAQ;cACf,MAAM,CAAC,UAAU;;;;;;;;;;;;;;CAc9B,CAAA;AACD,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO;;;;;;YAMG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU;;;;;;;;CAQ/C,CAAA;AACD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB,EAAE,QAAgB;IACpE,gDAAgD;IAChD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CACnC,CAAC;SACE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC5B,6CAA6C;IAC7C,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAA;IAC1D,OAAO;;;;;;;;gBAQO,MAAM,CAAC,QAAQ,CAAC;;;;;gBAKhB,MAAM,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8Bf,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;mBACrB,UAAU;;;;CAI5B,CAAA;AACD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `lnar daemon install` / `uninstall` / `status` のプラットフォーム別ハンドラ。
|
|
3
|
+
*
|
|
4
|
+
* 各 OS で「インストールしたら再起動後も含めて自動的に動き続ける」常駐サービスを
|
|
5
|
+
* セットアップする。
|
|
6
|
+
* - macOS : ~/Library/LaunchAgents/<label>.plist + launchctl bootstrap/bootout
|
|
7
|
+
* - Linux : ~/.config/systemd/user/lnar-daemon.service + systemctl --user enable --now
|
|
8
|
+
* - Windows: schtasks /Create /XML (ユーザーログオン時起動 + 失敗時自動再起動)
|
|
9
|
+
*
|
|
10
|
+
* いずれも管理者権限不要 (per-user スコープ) でインストールできる構成。
|
|
11
|
+
*/
|
|
12
|
+
export declare function runDaemonInstall(): Promise<void>;
|
|
13
|
+
export declare function runDaemonUninstall(): Promise<void>;
|
|
14
|
+
export declare function runDaemonStatus(): Promise<boolean>;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `lnar daemon install` / `uninstall` / `status` のプラットフォーム別ハンドラ。
|
|
3
|
+
*
|
|
4
|
+
* 各 OS で「インストールしたら再起動後も含めて自動的に動き続ける」常駐サービスを
|
|
5
|
+
* セットアップする。
|
|
6
|
+
* - macOS : ~/Library/LaunchAgents/<label>.plist + launchctl bootstrap/bootout
|
|
7
|
+
* - Linux : ~/.config/systemd/user/lnar-daemon.service + systemctl --user enable --now
|
|
8
|
+
* - Windows: schtasks /Create /XML (ユーザーログオン時起動 + 失敗時自動再起動)
|
|
9
|
+
*
|
|
10
|
+
* いずれも管理者権限不要 (per-user スコープ) でインストールできる構成。
|
|
11
|
+
*/
|
|
12
|
+
import { exec } from 'node:child_process';
|
|
13
|
+
import { mkdir, mkdtemp, rm, unlink, writeFile } from 'node:fs/promises';
|
|
14
|
+
import { homedir, platform, tmpdir, userInfo } from 'node:os';
|
|
15
|
+
import { dirname, join } from 'node:path';
|
|
16
|
+
import { promisify } from 'node:util';
|
|
17
|
+
import { linuxSystemdUnit, macOsPlist, SERVICE_LABEL, windowsTaskXml, } from './files.js';
|
|
18
|
+
const execAsync = promisify(exec);
|
|
19
|
+
async function run(cmd, options = {}) {
|
|
20
|
+
const { stdout } = await execAsync(cmd, options);
|
|
21
|
+
return typeof stdout === 'string' ? stdout : stdout.toString('utf-8');
|
|
22
|
+
}
|
|
23
|
+
async function runIgnoring(cmd) {
|
|
24
|
+
try {
|
|
25
|
+
await execAsync(cmd);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// best-effort: 失敗を無視する場合に使う (例: 既に止まっているサービスの stop)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function detectTarget() {
|
|
32
|
+
const nodePath = process.execPath;
|
|
33
|
+
const scriptPath = process.argv[1] ?? '';
|
|
34
|
+
let warning = null;
|
|
35
|
+
if (scriptPath.includes('/_npx/') || scriptPath.includes('\\_npx\\')) {
|
|
36
|
+
warning =
|
|
37
|
+
'You are running via `npx`. The npx cache directory may be cleared eventually, ' +
|
|
38
|
+
'which would break the installed service. For stable operation, install globally:\n' +
|
|
39
|
+
' npm install -g @lnar/cli\n' +
|
|
40
|
+
' lnar daemon install\n';
|
|
41
|
+
}
|
|
42
|
+
return { target: { nodePath, scriptPath }, warning };
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// macOS (launchd)
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
function macOsPlistPath() {
|
|
48
|
+
return join(homedir(), 'Library', 'LaunchAgents', `${SERVICE_LABEL}.plist`);
|
|
49
|
+
}
|
|
50
|
+
function macOsServiceTarget() {
|
|
51
|
+
return `gui/${userInfo().uid}/${SERVICE_LABEL}`;
|
|
52
|
+
}
|
|
53
|
+
async function isMacOsServiceLoaded() {
|
|
54
|
+
try {
|
|
55
|
+
await execAsync(`launchctl print ${macOsServiceTarget()}`);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function installMacOs(target) {
|
|
63
|
+
const plistPath = macOsPlistPath();
|
|
64
|
+
await mkdir(dirname(plistPath), { recursive: true });
|
|
65
|
+
await writeFile(plistPath, macOsPlist(target));
|
|
66
|
+
// 既存サービスを bootout → bootstrap で差し替える。
|
|
67
|
+
// macOS は bootout が非同期で、すぐ bootstrap すると "Input/output error (EIO)" を返すため、
|
|
68
|
+
// 実際に unload されるまで最大 ~3 秒ポーリングする。`lnar up` の冪等性に必要。
|
|
69
|
+
if (await isMacOsServiceLoaded()) {
|
|
70
|
+
await runIgnoring(`launchctl bootout ${macOsServiceTarget()}`);
|
|
71
|
+
for (let i = 0; i < 30; i++) {
|
|
72
|
+
if (!(await isMacOsServiceLoaded()))
|
|
73
|
+
break;
|
|
74
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
await run(`launchctl bootstrap gui/${userInfo().uid} ${plistPath}`);
|
|
78
|
+
await run(`launchctl enable ${macOsServiceTarget()}`);
|
|
79
|
+
process.stdout.write(`Installed: ${plistPath}\n`);
|
|
80
|
+
process.stdout.write(`Logs: /tmp/lnar-daemon.log /tmp/lnar-daemon.err.log\n`);
|
|
81
|
+
}
|
|
82
|
+
async function uninstallMacOs() {
|
|
83
|
+
const plistPath = macOsPlistPath();
|
|
84
|
+
await runIgnoring(`launchctl bootout ${macOsServiceTarget()}`);
|
|
85
|
+
try {
|
|
86
|
+
await unlink(plistPath);
|
|
87
|
+
process.stdout.write(`Removed: ${plistPath}\n`);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
if (err.code !== 'ENOENT')
|
|
91
|
+
throw err;
|
|
92
|
+
process.stdout.write('No service file found (already uninstalled).\n');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function statusMacOs() {
|
|
96
|
+
try {
|
|
97
|
+
const output = await run(`launchctl print ${macOsServiceTarget()}`);
|
|
98
|
+
process.stdout.write(`${output}\n`);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
process.stdout.write(`Service ${SERVICE_LABEL} is not loaded.\n`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Linux (systemd user unit)
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
function linuxUnitPath() {
|
|
110
|
+
return join(homedir(), '.config', 'systemd', 'user', 'lnar-daemon.service');
|
|
111
|
+
}
|
|
112
|
+
async function installLinux(target) {
|
|
113
|
+
const unitPath = linuxUnitPath();
|
|
114
|
+
await mkdir(dirname(unitPath), { recursive: true });
|
|
115
|
+
await writeFile(unitPath, linuxSystemdUnit(target));
|
|
116
|
+
await run('systemctl --user daemon-reload');
|
|
117
|
+
await run('systemctl --user enable --now lnar-daemon.service');
|
|
118
|
+
process.stdout.write(`Installed: ${unitPath}\n`);
|
|
119
|
+
process.stdout.write('Status: systemctl --user status lnar-daemon\n');
|
|
120
|
+
process.stdout.write('Tip: to survive logout, run `loginctl enable-linger $USER` (requires sudo).\n');
|
|
121
|
+
}
|
|
122
|
+
async function uninstallLinux() {
|
|
123
|
+
await runIgnoring('systemctl --user disable --now lnar-daemon.service');
|
|
124
|
+
try {
|
|
125
|
+
await unlink(linuxUnitPath());
|
|
126
|
+
process.stdout.write(`Removed: ${linuxUnitPath()}\n`);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (err.code !== 'ENOENT')
|
|
130
|
+
throw err;
|
|
131
|
+
process.stdout.write('No service unit found (already uninstalled).\n');
|
|
132
|
+
}
|
|
133
|
+
await runIgnoring('systemctl --user daemon-reload');
|
|
134
|
+
}
|
|
135
|
+
async function statusLinux() {
|
|
136
|
+
try {
|
|
137
|
+
const output = await run('systemctl --user is-active lnar-daemon.service');
|
|
138
|
+
process.stdout.write(output.trim() + '\n');
|
|
139
|
+
return output.trim() === 'active';
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
process.stdout.write('inactive (or not installed)\n');
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Windows (Task Scheduler)
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
const WINDOWS_TASK_NAME = 'LnarDaemon';
|
|
150
|
+
async function installWindows(target) {
|
|
151
|
+
const uname = userInfo().username;
|
|
152
|
+
const xml = windowsTaskXml(target, uname);
|
|
153
|
+
// 一時 XML ファイルを書き出して schtasks /XML で取り込む
|
|
154
|
+
const dir = await mkdtemp(join(tmpdir(), 'lnar-task-'));
|
|
155
|
+
const xmlPath = join(dir, 'lnar-daemon.xml');
|
|
156
|
+
await writeFile(xmlPath, xml, 'utf-16le');
|
|
157
|
+
try {
|
|
158
|
+
await run(`schtasks /Create /TN "${WINDOWS_TASK_NAME}" /XML "${xmlPath}" /F`);
|
|
159
|
+
await run(`schtasks /Run /TN "${WINDOWS_TASK_NAME}"`);
|
|
160
|
+
process.stdout.write(`Installed Windows Task Scheduler entry: ${WINDOWS_TASK_NAME}\n`);
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
await rm(dir, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async function uninstallWindows() {
|
|
167
|
+
await runIgnoring(`schtasks /End /TN "${WINDOWS_TASK_NAME}"`);
|
|
168
|
+
try {
|
|
169
|
+
await run(`schtasks /Delete /TN "${WINDOWS_TASK_NAME}" /F`);
|
|
170
|
+
process.stdout.write(`Removed Windows Task: ${WINDOWS_TASK_NAME}\n`);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
process.stdout.write('No task found (already uninstalled).\n');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function statusWindows() {
|
|
177
|
+
try {
|
|
178
|
+
const output = await run(`schtasks /Query /TN "${WINDOWS_TASK_NAME}" /FO LIST /V`);
|
|
179
|
+
process.stdout.write(`${output}\n`);
|
|
180
|
+
return /Status:\s*Running/i.test(output);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
process.stdout.write(`Task ${WINDOWS_TASK_NAME} not registered.\n`);
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
// Public entry points
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
function dispatchByPlatform(handlers) {
|
|
191
|
+
const os = platform();
|
|
192
|
+
switch (os) {
|
|
193
|
+
case 'darwin':
|
|
194
|
+
return handlers.darwin();
|
|
195
|
+
case 'linux':
|
|
196
|
+
return handlers.linux();
|
|
197
|
+
case 'win32':
|
|
198
|
+
return handlers.win32();
|
|
199
|
+
default:
|
|
200
|
+
throw new Error(`Unsupported platform: ${os}. lnar daemon install supports darwin, linux, win32.`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export async function runDaemonInstall() {
|
|
204
|
+
const { target, warning } = detectTarget();
|
|
205
|
+
if (warning)
|
|
206
|
+
process.stderr.write(`${warning}\n`);
|
|
207
|
+
process.stdout.write(`Installing lnar daemon as a background service…\n` +
|
|
208
|
+
` node: ${target.nodePath}\n` +
|
|
209
|
+
` script: ${target.scriptPath}\n`);
|
|
210
|
+
await dispatchByPlatform({
|
|
211
|
+
darwin: () => installMacOs(target),
|
|
212
|
+
linux: () => installLinux(target),
|
|
213
|
+
win32: () => installWindows(target),
|
|
214
|
+
});
|
|
215
|
+
process.stdout.write('Done. The daemon will now sync your local AI agents with lnar every 30s.\n');
|
|
216
|
+
}
|
|
217
|
+
export async function runDaemonUninstall() {
|
|
218
|
+
await dispatchByPlatform({
|
|
219
|
+
darwin: uninstallMacOs,
|
|
220
|
+
linux: uninstallLinux,
|
|
221
|
+
win32: uninstallWindows,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
export async function runDaemonStatus() {
|
|
225
|
+
return dispatchByPlatform({
|
|
226
|
+
darwin: statusMacOs,
|
|
227
|
+
linux: statusLinux,
|
|
228
|
+
win32: statusWindows,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/service/install.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const AgentKind: z.ZodEnum<{
|
|
3
|
+
claude_code: "claude_code";
|
|
4
|
+
codex: "codex";
|
|
5
|
+
cursor: "cursor";
|
|
6
|
+
gemini_cli: "gemini_cli";
|
|
7
|
+
chatgpt: "chatgpt";
|
|
8
|
+
}>;
|
|
9
|
+
export type AgentKind = z.infer<typeof AgentKind>;
|
|
10
|
+
export declare const McpTransport: z.ZodEnum<{
|
|
11
|
+
stdio: "stdio";
|
|
12
|
+
http: "http";
|
|
13
|
+
sse: "sse";
|
|
14
|
+
}>;
|
|
15
|
+
export type McpTransport = z.infer<typeof McpTransport>;
|
|
16
|
+
export declare const SourceScope: z.ZodEnum<{
|
|
17
|
+
global: "global";
|
|
18
|
+
project: "project";
|
|
19
|
+
local: "local";
|
|
20
|
+
remote: "remote";
|
|
21
|
+
}>;
|
|
22
|
+
export type SourceScope = z.infer<typeof SourceScope>;
|
|
23
|
+
export declare const McpServerEntry: z.ZodObject<{
|
|
24
|
+
name: z.ZodString;
|
|
25
|
+
transport: z.ZodEnum<{
|
|
26
|
+
stdio: "stdio";
|
|
27
|
+
http: "http";
|
|
28
|
+
sse: "sse";
|
|
29
|
+
}>;
|
|
30
|
+
command: z.ZodOptional<z.ZodString>;
|
|
31
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
32
|
+
url: z.ZodOptional<z.ZodString>;
|
|
33
|
+
envKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
34
|
+
configHash: z.ZodString;
|
|
35
|
+
sourceScope: z.ZodEnum<{
|
|
36
|
+
global: "global";
|
|
37
|
+
project: "project";
|
|
38
|
+
local: "local";
|
|
39
|
+
remote: "remote";
|
|
40
|
+
}>;
|
|
41
|
+
sourcePath: z.ZodString;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
export type McpServerEntry = z.infer<typeof McpServerEntry>;
|
|
44
|
+
export declare const PluginScope: z.ZodEnum<{
|
|
45
|
+
project: "project";
|
|
46
|
+
local: "local";
|
|
47
|
+
user: "user";
|
|
48
|
+
}>;
|
|
49
|
+
export type PluginScope = z.infer<typeof PluginScope>;
|
|
50
|
+
export declare const PluginEntry: z.ZodObject<{
|
|
51
|
+
name: z.ZodString;
|
|
52
|
+
version: z.ZodString;
|
|
53
|
+
scope: z.ZodEnum<{
|
|
54
|
+
project: "project";
|
|
55
|
+
local: "local";
|
|
56
|
+
user: "user";
|
|
57
|
+
}>;
|
|
58
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
59
|
+
installPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
60
|
+
enabled: z.ZodBoolean;
|
|
61
|
+
installedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
62
|
+
lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
63
|
+
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
export type PluginEntry = z.infer<typeof PluginEntry>;
|
|
66
|
+
export declare const AgentSnapshot: z.ZodObject<{
|
|
67
|
+
agentKind: z.ZodEnum<{
|
|
68
|
+
claude_code: "claude_code";
|
|
69
|
+
codex: "codex";
|
|
70
|
+
cursor: "cursor";
|
|
71
|
+
gemini_cli: "gemini_cli";
|
|
72
|
+
chatgpt: "chatgpt";
|
|
73
|
+
}>;
|
|
74
|
+
agentVersion: z.ZodOptional<z.ZodString>;
|
|
75
|
+
servers: z.ZodArray<z.ZodObject<{
|
|
76
|
+
name: z.ZodString;
|
|
77
|
+
transport: z.ZodEnum<{
|
|
78
|
+
stdio: "stdio";
|
|
79
|
+
http: "http";
|
|
80
|
+
sse: "sse";
|
|
81
|
+
}>;
|
|
82
|
+
command: z.ZodOptional<z.ZodString>;
|
|
83
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
84
|
+
url: z.ZodOptional<z.ZodString>;
|
|
85
|
+
envKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
86
|
+
configHash: z.ZodString;
|
|
87
|
+
sourceScope: z.ZodEnum<{
|
|
88
|
+
global: "global";
|
|
89
|
+
project: "project";
|
|
90
|
+
local: "local";
|
|
91
|
+
remote: "remote";
|
|
92
|
+
}>;
|
|
93
|
+
sourcePath: z.ZodString;
|
|
94
|
+
}, z.core.$strip>>;
|
|
95
|
+
plugins: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
96
|
+
name: z.ZodString;
|
|
97
|
+
version: z.ZodString;
|
|
98
|
+
scope: z.ZodEnum<{
|
|
99
|
+
project: "project";
|
|
100
|
+
local: "local";
|
|
101
|
+
user: "user";
|
|
102
|
+
}>;
|
|
103
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
104
|
+
installPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
105
|
+
enabled: z.ZodBoolean;
|
|
106
|
+
installedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
107
|
+
lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
108
|
+
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
109
|
+
}, z.core.$strip>>>;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
export type AgentSnapshot = z.infer<typeof AgentSnapshot>;
|
|
112
|
+
export declare const ScanResult: z.ZodObject<{
|
|
113
|
+
hostname: z.ZodString;
|
|
114
|
+
scannedAt: z.ZodString;
|
|
115
|
+
agents: z.ZodArray<z.ZodObject<{
|
|
116
|
+
agentKind: z.ZodEnum<{
|
|
117
|
+
claude_code: "claude_code";
|
|
118
|
+
codex: "codex";
|
|
119
|
+
cursor: "cursor";
|
|
120
|
+
gemini_cli: "gemini_cli";
|
|
121
|
+
chatgpt: "chatgpt";
|
|
122
|
+
}>;
|
|
123
|
+
agentVersion: z.ZodOptional<z.ZodString>;
|
|
124
|
+
servers: z.ZodArray<z.ZodObject<{
|
|
125
|
+
name: z.ZodString;
|
|
126
|
+
transport: z.ZodEnum<{
|
|
127
|
+
stdio: "stdio";
|
|
128
|
+
http: "http";
|
|
129
|
+
sse: "sse";
|
|
130
|
+
}>;
|
|
131
|
+
command: z.ZodOptional<z.ZodString>;
|
|
132
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
133
|
+
url: z.ZodOptional<z.ZodString>;
|
|
134
|
+
envKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
135
|
+
configHash: z.ZodString;
|
|
136
|
+
sourceScope: z.ZodEnum<{
|
|
137
|
+
global: "global";
|
|
138
|
+
project: "project";
|
|
139
|
+
local: "local";
|
|
140
|
+
remote: "remote";
|
|
141
|
+
}>;
|
|
142
|
+
sourcePath: z.ZodString;
|
|
143
|
+
}, z.core.$strip>>;
|
|
144
|
+
plugins: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
145
|
+
name: z.ZodString;
|
|
146
|
+
version: z.ZodString;
|
|
147
|
+
scope: z.ZodEnum<{
|
|
148
|
+
project: "project";
|
|
149
|
+
local: "local";
|
|
150
|
+
user: "user";
|
|
151
|
+
}>;
|
|
152
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
153
|
+
installPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
154
|
+
enabled: z.ZodBoolean;
|
|
155
|
+
installedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
156
|
+
lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
157
|
+
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
158
|
+
}, z.core.$strip>>>;
|
|
159
|
+
}, z.core.$strip>>;
|
|
160
|
+
}, z.core.$strip>;
|
|
161
|
+
export type ScanResult = z.infer<typeof ScanResult>;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// claude_code: Claude / Claude Code (CLI + claude.ai 連携)
|
|
3
|
+
// codex: Codex CLI (OpenAI)
|
|
4
|
+
// cursor: Cursor IDE
|
|
5
|
+
// gemini_cli: Google Gemini CLI (~/.gemini/settings.json)
|
|
6
|
+
// chatgpt: ChatGPT (Desktop / connectors) — 設定の暗号化のため現状は placeholder
|
|
7
|
+
export const AgentKind = z.enum(['claude_code', 'codex', 'cursor', 'gemini_cli', 'chatgpt']);
|
|
8
|
+
export const McpTransport = z.enum(['stdio', 'http', 'sse']);
|
|
9
|
+
// global: マシン全体 (plugin / ~/.claude.json top-level)
|
|
10
|
+
// project: .mcp.json (チーム共有 / repo にコミットされる)
|
|
11
|
+
// local: ~/.claude.json projects[cwd].mcpServers (個人/マシンローカル)
|
|
12
|
+
// remote: claude.ai 等のクラウド管理 (ローカル設定ファイルに存在しない)
|
|
13
|
+
export const SourceScope = z.enum(['global', 'project', 'local', 'remote']);
|
|
14
|
+
export const McpServerEntry = z.object({
|
|
15
|
+
name: z.string(),
|
|
16
|
+
transport: McpTransport,
|
|
17
|
+
command: z.string().optional(),
|
|
18
|
+
args: z.array(z.string()).optional(),
|
|
19
|
+
url: z.string().optional(),
|
|
20
|
+
envKeys: z.array(z.string()).optional(),
|
|
21
|
+
configHash: z.string(),
|
|
22
|
+
sourceScope: SourceScope,
|
|
23
|
+
sourcePath: z.string(),
|
|
24
|
+
});
|
|
25
|
+
// user: ~/.claude/settings.json#enabledPlugins
|
|
26
|
+
// local: ~/.claude.json#projects[<path>].enabledPlugins
|
|
27
|
+
// project: <project>/.claude/settings.json#enabledPlugins (チーム共有)
|
|
28
|
+
export const PluginScope = z.enum(['user', 'local', 'project']);
|
|
29
|
+
export const PluginEntry = z.object({
|
|
30
|
+
// `<plugin>@<marketplace>` の完全修飾名 (例: "serena@claude-plugins-official")
|
|
31
|
+
name: z.string(),
|
|
32
|
+
version: z.string(),
|
|
33
|
+
scope: PluginScope,
|
|
34
|
+
projectPath: z.string().nullable().optional(),
|
|
35
|
+
installPath: z.string().nullable().optional(),
|
|
36
|
+
enabled: z.boolean(),
|
|
37
|
+
installedAt: z.string().nullable().optional(),
|
|
38
|
+
lastUpdatedAt: z.string().nullable().optional(),
|
|
39
|
+
gitCommitSha: z.string().nullable().optional(),
|
|
40
|
+
});
|
|
41
|
+
export const AgentSnapshot = z.object({
|
|
42
|
+
agentKind: AgentKind,
|
|
43
|
+
agentVersion: z.string().optional(),
|
|
44
|
+
servers: z.array(McpServerEntry),
|
|
45
|
+
// Claude Code のみ意味があるので、他 agent_kind では未指定でよい (omit = 空)。
|
|
46
|
+
plugins: z.array(PluginEntry).optional(),
|
|
47
|
+
});
|
|
48
|
+
export const ScanResult = z.object({
|
|
49
|
+
hostname: z.string(),
|
|
50
|
+
scannedAt: z.string(),
|
|
51
|
+
agents: z.array(AgentSnapshot),
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|