@bluelamp/cli-token 1.3.0 → 1.4.0-rc.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.
- package/README.md +11 -0
- package/dist/cjs/cli-update.js +222 -0
- package/dist/cjs/cli-update.js.map +1 -0
- package/dist/cjs/index.js +85 -12
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/cli-update.d.ts +93 -0
- package/dist/esm/cli-update.d.ts.map +1 -0
- package/dist/esm/cli-update.js +177 -0
- package/dist/esm/cli-update.js.map +1 -0
- package/dist/esm/index.d.ts +21 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +83 -12
- package/dist/esm/index.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 発火の前に BlueLamp CLI を最低版へ上げる——routine と scheduler の**単一実装**(箱 n=4076 → n=4082 で共用へ)。
|
|
3
|
+
*
|
|
4
|
+
* 定期便(routine・scheduler)は launchd から起きる=PATH が /usr/bin:/bin だけ。6.7.2 以前の起動子は
|
|
5
|
+
* そこで素の npm を見つけられず自己更新に失敗し、古い gateway のまま load_knowledge を撃ち続ける(n=4058・n=4072)。
|
|
6
|
+
* ⇒ 席を立てる前に `/cli/min-version` と比べ、古いときだけ node の隣の npm で新しい版の入口を借りて上げる。
|
|
7
|
+
*
|
|
8
|
+
* ⛔ 置き場の選び方・npm の撃ち方は CLI の `bluelamp-self-update`(n=4072・selfUpdate.ts)が持つ。ここは二重に作らない。
|
|
9
|
+
* ここがするのは「古いかを測る」と「新しい版の入口を npm exec で借りて撃つ」だけ(古い版には入口が無い)。
|
|
10
|
+
* 「どの CLI を上げるか」は呼び出し側が locate で渡す(routine=gateway の package/scheduler=起動子の package)。
|
|
11
|
+
*
|
|
12
|
+
* 制約は index.ts と同じ: node 標準モジュール以外に依存しない・console に出さない・throw しない(結果は CliUpdate で返す)。
|
|
13
|
+
*/
|
|
14
|
+
/** CLI の更新だけの入口(n=4072) */
|
|
15
|
+
export declare const SELF_UPDATE_BIN = "bluelamp-self-update";
|
|
16
|
+
/** 入口が入った最初の版。min がこれより低くても、入口はこの版から借りる */
|
|
17
|
+
export declare const SELF_UPDATE_SINCE = "6.7.3";
|
|
18
|
+
/** 入口を借りる package を上書きする env(rc を撃つ検体のため。例 bluelamp@6.7.3-rc.1) */
|
|
19
|
+
export declare const SELF_UPDATE_PACKAGE_ENV = "BLUELAMP_SELF_UPDATE_PACKAGE";
|
|
20
|
+
/** 起動子が子へ渡す「もう上げた」の印(n=4072)。npm の子へは渡さない */
|
|
21
|
+
export declare const SELF_UPDATE_DONE_ENV = "BLUELAMP_SELFUPDATE_DONE";
|
|
22
|
+
export declare const MIN_VERSION_TIMEOUT_MS = 2500;
|
|
23
|
+
/** npm exec(入口の取得+npm install)を待つ上限 */
|
|
24
|
+
export declare const SELF_UPDATE_TIMEOUT_MS = 180000;
|
|
25
|
+
/** 版の比較(a < b)。起動子の isOlderThan と同じ数え方(数字以外は 0) */
|
|
26
|
+
export declare function isOlderThan(a: string, b: string): boolean;
|
|
27
|
+
/** 入口を借りる package(env の上書き>max(min, 入口の版)) */
|
|
28
|
+
export declare function selfUpdatePackage(minVersion: string, override: string | undefined): string;
|
|
29
|
+
/** `npm` に渡す引数(⛔ @latest にしない・入れる版は --min で名指し) */
|
|
30
|
+
export declare function selfUpdateExecArgs(pkg: string, root: string, minVersion: string): string[];
|
|
31
|
+
export interface SelfUpdateLine {
|
|
32
|
+
ok: boolean;
|
|
33
|
+
from?: string;
|
|
34
|
+
to?: string;
|
|
35
|
+
root?: string;
|
|
36
|
+
reason?: string;
|
|
37
|
+
}
|
|
38
|
+
/** 入口の stdout の最後の JSON 行(npm の出力が混じっても拾う)。無ければ null */
|
|
39
|
+
export declare function parseSelfUpdateLine(stdout: string): SelfUpdateLine | null;
|
|
40
|
+
/** 発火の前の更新の結果 */
|
|
41
|
+
export type CliUpdate =
|
|
42
|
+
/** 測れなかった・測る物が無い(CLI が無い・最低版が引けない)=いまの版のまま */
|
|
43
|
+
{
|
|
44
|
+
kind: 'skipped';
|
|
45
|
+
reason: string;
|
|
46
|
+
} | {
|
|
47
|
+
kind: 'current';
|
|
48
|
+
version: string;
|
|
49
|
+
} | {
|
|
50
|
+
kind: 'updated';
|
|
51
|
+
from: string;
|
|
52
|
+
to: string;
|
|
53
|
+
} | {
|
|
54
|
+
kind: 'failed';
|
|
55
|
+
from: string;
|
|
56
|
+
want: string;
|
|
57
|
+
reason: string;
|
|
58
|
+
};
|
|
59
|
+
/** 記録の行に足す括弧の中(current・skipped は何も足さない) */
|
|
60
|
+
export declare function describeCliUpdate(u: CliUpdate): string | null;
|
|
61
|
+
/** 上げる対象の CLI(package の dir と、その package.json の版) */
|
|
62
|
+
export interface InstalledCli {
|
|
63
|
+
root: string;
|
|
64
|
+
version: string | null;
|
|
65
|
+
}
|
|
66
|
+
export interface NpmRun {
|
|
67
|
+
code: number | null;
|
|
68
|
+
stdout: string;
|
|
69
|
+
error?: string;
|
|
70
|
+
}
|
|
71
|
+
export interface CliUpdateDeps {
|
|
72
|
+
/** 席が使う CLI を引く(上げた後にもう一度撃つ=入口の ok を鵜呑みにしない)。無ければ null */
|
|
73
|
+
locate: () => InstalledCli | null;
|
|
74
|
+
/** 最低版(引けなければ null) */
|
|
75
|
+
fetchMinVersion: () => Promise<string | null>;
|
|
76
|
+
/** npm を撃つ(throw しない) */
|
|
77
|
+
runNpm: (args: string[]) => Promise<NpmRun>;
|
|
78
|
+
env: NodeJS.ProcessEnv;
|
|
79
|
+
}
|
|
80
|
+
/** package の dir の package.json の版(読めなければ null) */
|
|
81
|
+
export declare function readPackageVersion(root: string): string | null;
|
|
82
|
+
/** `<base>/cli/min-version` の最低版(base は `/api/bluelamp` 付き)。引けなければ null・throw しない */
|
|
83
|
+
export declare function fetchMinCliVersion(base: string, fetchFn?: typeof fetch, timeoutMs?: number): Promise<string | null>;
|
|
84
|
+
/**
|
|
85
|
+
* node の隣の npm で撃つ(launchd の発火は PATH が /usr/bin:/bin だけ=素の npm は ENOENT)。
|
|
86
|
+
* Windows の npm.cmd は shell 経由でないと spawn できない。cwd は home(作業フォルダの package.json を拾わない)
|
|
87
|
+
*/
|
|
88
|
+
export declare function runNpmBesideNode(args: string[], nodePath?: string): Promise<NpmRun>;
|
|
89
|
+
/**
|
|
90
|
+
* 席を立てる前に、locate が指す CLI を最低版へ上げる。throw しない=上げられなくても便は今の版で走る。
|
|
91
|
+
*/
|
|
92
|
+
export declare function updateCliToMin(deps: CliUpdateDeps): Promise<CliUpdate>;
|
|
93
|
+
//# sourceMappingURL=cli-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-update.d.ts","sourceRoot":"","sources":["../../src/cli-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 発火の前に BlueLamp CLI を最低版へ上げる——routine と scheduler の**単一実装**(箱 n=4076 → n=4082 で共用へ)。
|
|
3
|
+
*
|
|
4
|
+
* 定期便(routine・scheduler)は launchd から起きる=PATH が /usr/bin:/bin だけ。6.7.2 以前の起動子は
|
|
5
|
+
* そこで素の npm を見つけられず自己更新に失敗し、古い gateway のまま load_knowledge を撃ち続ける(n=4058・n=4072)。
|
|
6
|
+
* ⇒ 席を立てる前に `/cli/min-version` と比べ、古いときだけ node の隣の npm で新しい版の入口を借りて上げる。
|
|
7
|
+
*
|
|
8
|
+
* ⛔ 置き場の選び方・npm の撃ち方は CLI の `bluelamp-self-update`(n=4072・selfUpdate.ts)が持つ。ここは二重に作らない。
|
|
9
|
+
* ここがするのは「古いかを測る」と「新しい版の入口を npm exec で借りて撃つ」だけ(古い版には入口が無い)。
|
|
10
|
+
* 「どの CLI を上げるか」は呼び出し側が locate で渡す(routine=gateway の package/scheduler=起動子の package)。
|
|
11
|
+
*
|
|
12
|
+
* 制約は index.ts と同じ: node 標準モジュール以外に依存しない・console に出さない・throw しない(結果は CliUpdate で返す)。
|
|
13
|
+
*/
|
|
14
|
+
import { execFile } from 'node:child_process';
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as os from 'node:os';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
/** CLI の更新だけの入口(n=4072) */
|
|
19
|
+
export const SELF_UPDATE_BIN = 'bluelamp-self-update';
|
|
20
|
+
/** 入口が入った最初の版。min がこれより低くても、入口はこの版から借りる */
|
|
21
|
+
export const SELF_UPDATE_SINCE = '6.7.3';
|
|
22
|
+
/** 入口を借りる package を上書きする env(rc を撃つ検体のため。例 bluelamp@6.7.3-rc.1) */
|
|
23
|
+
export const SELF_UPDATE_PACKAGE_ENV = 'BLUELAMP_SELF_UPDATE_PACKAGE';
|
|
24
|
+
/** 起動子が子へ渡す「もう上げた」の印(n=4072)。npm の子へは渡さない */
|
|
25
|
+
export const SELF_UPDATE_DONE_ENV = 'BLUELAMP_SELFUPDATE_DONE';
|
|
26
|
+
export const MIN_VERSION_TIMEOUT_MS = 2500;
|
|
27
|
+
/** npm exec(入口の取得+npm install)を待つ上限 */
|
|
28
|
+
export const SELF_UPDATE_TIMEOUT_MS = 180_000;
|
|
29
|
+
/** 版の比較(a < b)。起動子の isOlderThan と同じ数え方(数字以外は 0) */
|
|
30
|
+
export function isOlderThan(a, b) {
|
|
31
|
+
const parse = (v) => String(v)
|
|
32
|
+
.trim()
|
|
33
|
+
.split('.')
|
|
34
|
+
.map((p) => {
|
|
35
|
+
const n = parseInt(p, 10);
|
|
36
|
+
return Number.isFinite(n) ? n : 0;
|
|
37
|
+
});
|
|
38
|
+
const pa = parse(a);
|
|
39
|
+
const pb = parse(b);
|
|
40
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
41
|
+
const x = pa[i] ?? 0;
|
|
42
|
+
const y = pb[i] ?? 0;
|
|
43
|
+
if (x !== y)
|
|
44
|
+
return x < y;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
/** 入口を借りる package(env の上書き>max(min, 入口の版)) */
|
|
49
|
+
export function selfUpdatePackage(minVersion, override) {
|
|
50
|
+
if (override && override.trim())
|
|
51
|
+
return override.trim();
|
|
52
|
+
return `bluelamp@${isOlderThan(minVersion, SELF_UPDATE_SINCE) ? SELF_UPDATE_SINCE : minVersion}`;
|
|
53
|
+
}
|
|
54
|
+
/** `npm` に渡す引数(⛔ @latest にしない・入れる版は --min で名指し) */
|
|
55
|
+
export function selfUpdateExecArgs(pkg, root, minVersion) {
|
|
56
|
+
return ['exec', '--yes', `--package=${pkg}`, '--', SELF_UPDATE_BIN, '--root', root, '--min', minVersion];
|
|
57
|
+
}
|
|
58
|
+
/** 入口の stdout の最後の JSON 行(npm の出力が混じっても拾う)。無ければ null */
|
|
59
|
+
export function parseSelfUpdateLine(stdout) {
|
|
60
|
+
const lines = stdout.split(/\r?\n/).map((l) => l.trim()).filter(Boolean).reverse();
|
|
61
|
+
for (const line of lines) {
|
|
62
|
+
if (!line.startsWith('{'))
|
|
63
|
+
continue;
|
|
64
|
+
try {
|
|
65
|
+
const v = JSON.parse(line);
|
|
66
|
+
if (typeof v.ok !== 'boolean')
|
|
67
|
+
continue;
|
|
68
|
+
const str = (k) => (typeof v[k] === 'string' ? v[k] : undefined);
|
|
69
|
+
return {
|
|
70
|
+
ok: v.ok,
|
|
71
|
+
...(str('from') ? { from: str('from') } : {}),
|
|
72
|
+
...(str('to') ? { to: str('to') } : {}),
|
|
73
|
+
...(str('root') ? { root: str('root') } : {}),
|
|
74
|
+
...(str('reason') ? { reason: str('reason') } : {}),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// 次の行へ
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
/** 記録の行に足す括弧の中(current・skipped は何も足さない) */
|
|
84
|
+
export function describeCliUpdate(u) {
|
|
85
|
+
switch (u.kind) {
|
|
86
|
+
case 'updated':
|
|
87
|
+
return `CLI ${u.from}→${u.to}`;
|
|
88
|
+
case 'failed':
|
|
89
|
+
return `CLI の更新に失敗: ${u.reason}・${u.from} のまま(最低版 ${u.want})`;
|
|
90
|
+
default:
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** package の dir の package.json の版(読めなければ null) */
|
|
95
|
+
export function readPackageVersion(root) {
|
|
96
|
+
try {
|
|
97
|
+
const v = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8')).version;
|
|
98
|
+
return typeof v === 'string' && v.trim() ? v.trim() : null;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** `<base>/cli/min-version` の最低版(base は `/api/bluelamp` 付き)。引けなければ null・throw しない */
|
|
105
|
+
export async function fetchMinCliVersion(base, fetchFn = fetch, timeoutMs = MIN_VERSION_TIMEOUT_MS) {
|
|
106
|
+
const controller = new AbortController();
|
|
107
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
108
|
+
try {
|
|
109
|
+
const res = await fetchFn(`${base.replace(/\/+$/, '')}/cli/min-version`, { signal: controller.signal });
|
|
110
|
+
if (!res.ok)
|
|
111
|
+
return null;
|
|
112
|
+
const v = (await res.json())?.data?.min_cli_version;
|
|
113
|
+
return typeof v === 'string' && v.trim() ? v.trim() : null;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* node の隣の npm で撃つ(launchd の発火は PATH が /usr/bin:/bin だけ=素の npm は ENOENT)。
|
|
124
|
+
* Windows の npm.cmd は shell 経由でないと spawn できない。cwd は home(作業フォルダの package.json を拾わない)
|
|
125
|
+
*/
|
|
126
|
+
export function runNpmBesideNode(args, nodePath = process.execPath) {
|
|
127
|
+
const dir = path.dirname(nodePath);
|
|
128
|
+
const win = process.platform === 'win32';
|
|
129
|
+
const beside = path.join(dir, win ? 'npm.cmd' : 'npm');
|
|
130
|
+
const bin = fs.existsSync(beside) ? beside : win ? 'npm.cmd' : 'npm';
|
|
131
|
+
const env = { ...process.env, PATH: process.env.PATH ? `${dir}${path.delimiter}${process.env.PATH}` : dir };
|
|
132
|
+
delete env[SELF_UPDATE_DONE_ENV];
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
execFile(win && bin.includes(' ') ? `"${bin}"` : bin, args, { cwd: os.homedir(), env, timeout: SELF_UPDATE_TIMEOUT_MS, maxBuffer: 4 * 1024 * 1024, shell: win }, (err, stdout) => {
|
|
135
|
+
const e = err;
|
|
136
|
+
if (!e)
|
|
137
|
+
return resolve({ code: 0, stdout: String(stdout) });
|
|
138
|
+
const error = e.killed ? `時間切れ(${SELF_UPDATE_TIMEOUT_MS / 1000} 秒)` : typeof e.code === 'string' ? e.code : undefined;
|
|
139
|
+
resolve({ code: typeof e.code === 'number' ? e.code : null, stdout: String(stdout ?? ''), ...(error ? { error } : {}) });
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 席を立てる前に、locate が指す CLI を最低版へ上げる。throw しない=上げられなくても便は今の版で走る。
|
|
145
|
+
*/
|
|
146
|
+
export async function updateCliToMin(deps) {
|
|
147
|
+
try {
|
|
148
|
+
const cli = deps.locate();
|
|
149
|
+
if (!cli)
|
|
150
|
+
return { kind: 'skipped', reason: 'CLI が無い' };
|
|
151
|
+
if (!cli.version)
|
|
152
|
+
return { kind: 'skipped', reason: '版が読めない' };
|
|
153
|
+
const min = await deps.fetchMinVersion();
|
|
154
|
+
if (!min)
|
|
155
|
+
return { kind: 'skipped', reason: '最低版を引けない' };
|
|
156
|
+
if (!isOlderThan(cli.version, min))
|
|
157
|
+
return { kind: 'current', version: cli.version };
|
|
158
|
+
const run = await deps.runNpm(selfUpdateExecArgs(selfUpdatePackage(min, deps.env[SELF_UPDATE_PACKAGE_ENV]), cli.root, min));
|
|
159
|
+
const line = parseSelfUpdateLine(run.stdout);
|
|
160
|
+
// ⛔ 入口の ok を鵜呑みにしない=使う CLI を引き直して版を読む
|
|
161
|
+
const after = deps.locate();
|
|
162
|
+
const now = after?.version ?? null;
|
|
163
|
+
if (now && !isOlderThan(now, min))
|
|
164
|
+
return { kind: 'updated', from: cli.version, to: now };
|
|
165
|
+
const reason = (line?.ok && line.root && after && path.resolve(line.root) !== path.resolve(after.root)
|
|
166
|
+
? `${line.to ?? min} は ${line.root} に入ったが、席が使うのは ${after.root}`
|
|
167
|
+
: undefined) ??
|
|
168
|
+
line?.reason ??
|
|
169
|
+
run.error ??
|
|
170
|
+
(run.code !== 0 ? `npm が失敗しました(終了コード ${run.code ?? 'null'})` : `入れたはずの ${min} が見つかりません(いま ${now ?? '不明'})`);
|
|
171
|
+
return { kind: 'failed', from: cli.version, want: min, reason };
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
return { kind: 'skipped', reason: `測れない: ${err.message.slice(0, 80)}` };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=cli-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-update.js","sourceRoot":"","sources":["../../src/cli-update.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -12,7 +12,19 @@
|
|
|
12
12
|
* null 版(tryReadCliToken)の両方を出す。片方に寄せると挙動が変わる。
|
|
13
13
|
*/
|
|
14
14
|
import { type KeyObject } from 'node:crypto';
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* 箱 n=4109: `~/.musuhi` の置き場はここ 1 本から出す(札・pin の宣言・機体の鍵・機体の id・延ばしのロック)。
|
|
17
|
+
* 順=env `BLUELAMP_MUSUHI_DIR` → env の HOME(Windows は USERPROFILE)の下 → `os.homedir()` の下。
|
|
18
|
+
* 🔑 env を JS から読む=jest が写しの env に HOME を入れても効く(`os.homedir()` は本物の環境を読むので、
|
|
19
|
+
* jest の中で HOME を替えても本物の ~/.musuhi に書いた・2026-10-30 13:58)。呼び出し時に解決する。
|
|
20
|
+
*/
|
|
21
|
+
export declare function musuhiDir(): string;
|
|
22
|
+
/**
|
|
23
|
+
* 箱 n=4109: 試験の中では本物の ~/.musuhi に書かない(fail-safe)。書く口(save・delete・機体の id・鍵の生成・ロック)
|
|
24
|
+
* は書く前にこれを通す。逃げ道は env `BLUELAMP_ALLOW_REAL_HOME_WRITE=1` だけ。試験の外では何もしない。
|
|
25
|
+
*/
|
|
26
|
+
export declare function assertMusuhiWritable(target: string): void;
|
|
27
|
+
/** 保存先パス。テストで HOME/USERPROFILE・BLUELAMP_MUSUHI_DIR を差し替えられるよう呼び出し時に解決する。 */
|
|
16
28
|
export declare function getTokenFilePath(): string;
|
|
17
29
|
/**
|
|
18
30
|
* n=2083: 艦隊の機体の宣言ファイル(`{"tenant_id":"<uuid>"}`・秘密ではない)。
|
|
@@ -86,14 +98,18 @@ export declare function readCliTokenSync(): string;
|
|
|
86
98
|
* 呼び出し側が「ファイルが無いのと同じ」に倒したい場合に使う。
|
|
87
99
|
*/
|
|
88
100
|
export declare function tryReadCliToken(): string | null;
|
|
89
|
-
/**
|
|
90
|
-
|
|
101
|
+
/**
|
|
102
|
+
* 保存済みデータを構造ごと読む。ファイル無し・内容不正は null、復号失敗は throw。
|
|
103
|
+
* 箱 n=4102: 置き場は引数で渡せる(既定は ~/.musuhi)。試験は一時ディレクトリを渡す=HOME の差し替えに頼らない
|
|
104
|
+
* (jest の sandbox では os.homedir() が本物の HOME を指し、本物の札を上書きした・2026-10-30)。
|
|
105
|
+
*/
|
|
106
|
+
export declare function loadPortalToken(filePath?: string): StoredTokenData | null;
|
|
91
107
|
/**
|
|
92
108
|
* トークンを暗号化保存する。フォーマット不正・書込失敗は throw。
|
|
93
109
|
* n=3918: 置き場は 0600(フォルダ 0700)。一時ファイルに書いてから rename する=読み手が書きかけを読まない。
|
|
94
|
-
* `binding` は機体に結んだ札だけが渡す(期限と機体の id)。
|
|
110
|
+
* `binding` は機体に結んだ札だけが渡す(期限と機体の id)。`filePath` は置き場(既定は ~/.musuhi・試験は一時ディレクトリを渡す=箱 n=4102)。
|
|
95
111
|
*/
|
|
96
|
-
export declare function savePortalToken(token: string, userInfo?: StoredUserInfo, binding?: DeviceBinding): void;
|
|
112
|
+
export declare function savePortalToken(token: string, userInfo?: StoredUserInfo, binding?: DeviceBinding, filePath?: string): void;
|
|
97
113
|
/** 保存済みトークンを削除する。ファイル無しは no-op。削除失敗は throw。 */
|
|
98
114
|
export declare function deletePortalToken(): void;
|
|
99
115
|
/**
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAcrB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -22,9 +22,68 @@ const KEY_LENGTH = 32;
|
|
|
22
22
|
// 複製すると露出面が増え、差し替えが同時多発の書き換えになる。
|
|
23
23
|
// 再発は CI(scripts/assert-cli-token-key-single-source.mjs)が赤にする。
|
|
24
24
|
const SECRET = 'musuhi-vscode-portal-token-key-2025';
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* 箱 n=4109: `~/.musuhi` の置き場はここ 1 本から出す(札・pin の宣言・機体の鍵・機体の id・延ばしのロック)。
|
|
27
|
+
* 順=env `BLUELAMP_MUSUHI_DIR` → env の HOME(Windows は USERPROFILE)の下 → `os.homedir()` の下。
|
|
28
|
+
* 🔑 env を JS から読む=jest が写しの env に HOME を入れても効く(`os.homedir()` は本物の環境を読むので、
|
|
29
|
+
* jest の中で HOME を替えても本物の ~/.musuhi に書いた・2026-10-30 13:58)。呼び出し時に解決する。
|
|
30
|
+
*/
|
|
31
|
+
export function musuhiDir() {
|
|
32
|
+
const override = process.env.BLUELAMP_MUSUHI_DIR;
|
|
33
|
+
if (override)
|
|
34
|
+
return path.resolve(override);
|
|
35
|
+
const home = process.platform === 'win32' ? process.env.USERPROFILE : process.env.HOME;
|
|
36
|
+
return path.join(home || os.homedir(), '.musuhi');
|
|
37
|
+
}
|
|
38
|
+
/** 試験の走り手の中か(jest・vitest・node --test・Playwright・NODE_ENV=test) */
|
|
39
|
+
function inTestRunner() {
|
|
40
|
+
const e = process.env;
|
|
41
|
+
return Boolean(e.JEST_WORKER_ID || e.VITEST || e.NODE_TEST_CONTEXT || e.TEST_WORKER_INDEX || e.NODE_ENV === 'test');
|
|
42
|
+
}
|
|
43
|
+
/** 在る祖先まで realpath で解く(/var → /private/var 等のずれで素通りしない) */
|
|
44
|
+
function canonicalPath(p) {
|
|
45
|
+
let cur = path.resolve(p);
|
|
46
|
+
const rest = [];
|
|
47
|
+
for (;;) {
|
|
48
|
+
try {
|
|
49
|
+
return path.join(fs.realpathSync(cur), ...rest.reverse());
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
const parent = path.dirname(cur);
|
|
53
|
+
if (parent === cur)
|
|
54
|
+
return path.resolve(p);
|
|
55
|
+
rest.push(path.basename(cur));
|
|
56
|
+
cur = parent;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** 本物の HOME(passwd 由来・env に依らない)の ~/.musuhi */
|
|
61
|
+
function realMusuhiDir() {
|
|
62
|
+
let home;
|
|
63
|
+
try {
|
|
64
|
+
home = os.userInfo().homedir;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
home = os.homedir();
|
|
68
|
+
}
|
|
69
|
+
return canonicalPath(path.join(home, '.musuhi'));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 箱 n=4109: 試験の中では本物の ~/.musuhi に書かない(fail-safe)。書く口(save・delete・機体の id・鍵の生成・ロック)
|
|
73
|
+
* は書く前にこれを通す。逃げ道は env `BLUELAMP_ALLOW_REAL_HOME_WRITE=1` だけ。試験の外では何もしない。
|
|
74
|
+
*/
|
|
75
|
+
export function assertMusuhiWritable(target) {
|
|
76
|
+
if (!inTestRunner() || process.env.BLUELAMP_ALLOW_REAL_HOME_WRITE === '1')
|
|
77
|
+
return;
|
|
78
|
+
const rel = path.relative(realMusuhiDir(), canonicalPath(target));
|
|
79
|
+
if (rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel))) {
|
|
80
|
+
throw new Error(`refused: 試験の中から本物の ~/.musuhi に書こうとした(${path.basename(target)})。` +
|
|
81
|
+
'BLUELAMP_MUSUHI_DIR か HOME を一時ディレクトリに向けること');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** 保存先パス。テストで HOME/USERPROFILE・BLUELAMP_MUSUHI_DIR を差し替えられるよう呼び出し時に解決する。 */
|
|
26
85
|
export function getTokenFilePath() {
|
|
27
|
-
return path.join(
|
|
86
|
+
return path.join(musuhiDir(), 'portal-token.enc');
|
|
28
87
|
}
|
|
29
88
|
/**
|
|
30
89
|
* n=2083: 艦隊の機体の宣言ファイル(`{"tenant_id":"<uuid>"}`・秘密ではない)。
|
|
@@ -32,7 +91,7 @@ export function getTokenFilePath() {
|
|
|
32
91
|
* 人の機体には置かない=置かなければ今までどおり pin 無し(fail-safe default)。
|
|
33
92
|
*/
|
|
34
93
|
export function getPinnedTenantFilePath() {
|
|
35
|
-
return path.join(
|
|
94
|
+
return path.join(musuhiDir(), 'pinned-tenant.json');
|
|
36
95
|
}
|
|
37
96
|
/**
|
|
38
97
|
* トークンが読めないことを表す。
|
|
@@ -133,9 +192,12 @@ export function tryReadCliToken() {
|
|
|
133
192
|
return null;
|
|
134
193
|
}
|
|
135
194
|
}
|
|
136
|
-
/**
|
|
137
|
-
|
|
138
|
-
|
|
195
|
+
/**
|
|
196
|
+
* 保存済みデータを構造ごと読む。ファイル無し・内容不正は null、復号失敗は throw。
|
|
197
|
+
* 箱 n=4102: 置き場は引数で渡せる(既定は ~/.musuhi)。試験は一時ディレクトリを渡す=HOME の差し替えに頼らない
|
|
198
|
+
* (jest の sandbox では os.homedir() が本物の HOME を指し、本物の札を上書きした・2026-10-30)。
|
|
199
|
+
*/
|
|
200
|
+
export function loadPortalToken(filePath = getTokenFilePath()) {
|
|
139
201
|
if (!fs.existsSync(filePath)) {
|
|
140
202
|
return null;
|
|
141
203
|
}
|
|
@@ -148,9 +210,9 @@ export function loadPortalToken() {
|
|
|
148
210
|
/**
|
|
149
211
|
* トークンを暗号化保存する。フォーマット不正・書込失敗は throw。
|
|
150
212
|
* n=3918: 置き場は 0600(フォルダ 0700)。一時ファイルに書いてから rename する=読み手が書きかけを読まない。
|
|
151
|
-
* `binding` は機体に結んだ札だけが渡す(期限と機体の id)。
|
|
213
|
+
* `binding` は機体に結んだ札だけが渡す(期限と機体の id)。`filePath` は置き場(既定は ~/.musuhi・試験は一時ディレクトリを渡す=箱 n=4102)。
|
|
152
214
|
*/
|
|
153
|
-
export function savePortalToken(token, userInfo = {}, binding) {
|
|
215
|
+
export function savePortalToken(token, userInfo = {}, binding, filePath = getTokenFilePath()) {
|
|
154
216
|
if (!validateTokenFormat(token)) {
|
|
155
217
|
throw new Error('Invalid CLI token format');
|
|
156
218
|
}
|
|
@@ -162,7 +224,7 @@ export function savePortalToken(token, userInfo = {}, binding) {
|
|
|
162
224
|
source: 'portal',
|
|
163
225
|
...(binding ? { expiresAt: binding.expiresAt, deviceId: binding.deviceId } : {}),
|
|
164
226
|
};
|
|
165
|
-
writePrivateFileAtomic(
|
|
227
|
+
writePrivateFileAtomic(filePath, encryptPayload(JSON.stringify(tokenData)));
|
|
166
228
|
}
|
|
167
229
|
/** 自分だけが読めるフォルダ(0700)を用意する。既に在るフォルダも 0700 に揃える */
|
|
168
230
|
function ensurePrivateDir(dir) {
|
|
@@ -171,6 +233,7 @@ function ensurePrivateDir(dir) {
|
|
|
171
233
|
}
|
|
172
234
|
/** 一時ファイル(0600)に書いて rename する。umask に依らず 0600 */
|
|
173
235
|
function writePrivateFileAtomic(filePath, content) {
|
|
236
|
+
assertMusuhiWritable(filePath);
|
|
174
237
|
ensurePrivateDir(path.dirname(filePath));
|
|
175
238
|
const tmp = `${filePath}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`;
|
|
176
239
|
try {
|
|
@@ -191,6 +254,7 @@ function writePrivateFileAtomic(filePath, content) {
|
|
|
191
254
|
/** 保存済みトークンを削除する。ファイル無しは no-op。削除失敗は throw。 */
|
|
192
255
|
export function deletePortalToken() {
|
|
193
256
|
const filePath = getTokenFilePath();
|
|
257
|
+
assertMusuhiWritable(filePath);
|
|
194
258
|
if (fs.existsSync(filePath)) {
|
|
195
259
|
fs.unlinkSync(filePath);
|
|
196
260
|
}
|
|
@@ -554,15 +618,15 @@ export function evictExchangedJwt(key, rejectedToken, cacheDir = getExchangedJwt
|
|
|
554
618
|
// - ⛔ 札・署名・鍵をログ・例外文・返り値の detail に出さない。throw しない(延ばせなくても本線を落とさない)
|
|
555
619
|
/** 機体の鍵の置き場。テストで HOME を差し替えられるよう呼び出し時に解決する */
|
|
556
620
|
export function getDeviceKeyPath() {
|
|
557
|
-
return path.join(
|
|
621
|
+
return path.join(musuhiDir(), 'device-key.pem');
|
|
558
622
|
}
|
|
559
623
|
/** 口座ごとの機体の id の置き場 */
|
|
560
624
|
export function getDeviceMapPath() {
|
|
561
|
-
return path.join(
|
|
625
|
+
return path.join(musuhiDir(), 'device.json');
|
|
562
626
|
}
|
|
563
627
|
/** 札を延ばす 1 手を選ぶロック */
|
|
564
628
|
export function getTokenRefreshLockPath() {
|
|
565
|
-
return path.join(
|
|
629
|
+
return path.join(musuhiDir(), 'token-refresh.lock');
|
|
566
630
|
}
|
|
567
631
|
/** 機体の鍵が読めない(権限が開いている・形が壊れている)。文面に鍵の中身は載せない */
|
|
568
632
|
export class DeviceKeyError extends Error {
|
|
@@ -619,6 +683,7 @@ export function loadOrCreateDeviceKey() {
|
|
|
619
683
|
if (existing)
|
|
620
684
|
return existing;
|
|
621
685
|
const keyPath = getDeviceKeyPath();
|
|
686
|
+
assertMusuhiWritable(keyPath);
|
|
622
687
|
ensurePrivateDir(path.dirname(keyPath));
|
|
623
688
|
const { privateKey } = generateKeyPairSync('ed25519');
|
|
624
689
|
const pem = privateKey.export({ type: 'pkcs8', format: 'pem' }).toString();
|
|
@@ -777,6 +842,12 @@ export async function ensureFreshCliToken(options = {}) {
|
|
|
777
842
|
if (!needsRefresh(initial, now(), beforeMs))
|
|
778
843
|
return { status: 'fresh', expiresAt: initial.expiresAt };
|
|
779
844
|
const lockFile = getTokenRefreshLockPath();
|
|
845
|
+
try {
|
|
846
|
+
assertMusuhiWritable(lockFile);
|
|
847
|
+
}
|
|
848
|
+
catch (e) {
|
|
849
|
+
return { status: 'error', detail: e.message };
|
|
850
|
+
}
|
|
780
851
|
if (!tryLock(lockFile, Date.now(), TOKEN_REFRESH_LOCK_STALE_MS)) {
|
|
781
852
|
// 他の手が延ばしている。札が替わるまで少し待つ(替わらなくても今の札のまま返す)
|
|
782
853
|
// 待ちは実時間で測る(now は期限の判定のための時計で、試験では止まっている)
|