@nocobase/app-cli-client 0.1.0-beta.2 → 0.1.0-beta.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.
- package/LICENSE.txt +129 -0
- package/README.md +12 -0
- package/dist/acp-service.d.ts +52 -0
- package/dist/acp-service.d.ts.map +1 -0
- package/dist/acp-service.js +329 -0
- package/dist/acp-service.js.map +1 -0
- package/dist/acp.d.ts +28 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +414 -0
- package/dist/acp.js.map +1 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +10 -0
- package/dist/commands.js.map +1 -1
- package/dist/dynamic/index.d.ts +3 -1
- package/dist/dynamic/index.d.ts.map +1 -1
- package/dist/dynamic/index.js +48 -12
- package/dist/dynamic/index.js.map +1 -1
- package/dist/dynamic/manifest.d.ts.map +1 -1
- package/dist/dynamic/manifest.js +10 -0
- package/dist/dynamic/manifest.js.map +1 -1
- package/dist/dynamic/output.d.ts +2 -2
- package/dist/dynamic/output.d.ts.map +1 -1
- package/dist/dynamic/output.js +23 -8
- package/dist/dynamic/output.js.map +1 -1
- package/dist/dynamic/rest.d.ts.map +1 -1
- package/dist/dynamic/rest.js +24 -0
- package/dist/dynamic/rest.js.map +1 -1
- package/dist/dynamic/session.d.ts +1 -0
- package/dist/dynamic/session.d.ts.map +1 -1
- package/dist/dynamic/session.js +29 -1
- package/dist/dynamic/session.js.map +1 -1
- package/dist/lib/command.d.ts.map +1 -1
- package/dist/lib/command.js +14 -4
- package/dist/lib/command.js.map +1 -1
- package/dist/lib/credentials.d.ts +2 -0
- package/dist/lib/credentials.d.ts.map +1 -1
- package/dist/lib/credentials.js +7 -3
- package/dist/lib/credentials.js.map +1 -1
- package/dist/lib/envelope.d.ts +2 -0
- package/dist/lib/envelope.d.ts.map +1 -1
- package/dist/lib/envelope.js +16 -2
- package/dist/lib/envelope.js.map +1 -1
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +1 -0
- package/dist/lib/http.js.map +1 -1
- package/dist/parse/arguments.d.ts.map +1 -1
- package/dist/parse/arguments.js +9 -0
- package/dist/parse/arguments.js.map +1 -1
- package/dist/parse/distance.d.ts +22 -0
- package/dist/parse/distance.d.ts.map +1 -0
- package/dist/parse/distance.js +82 -0
- package/dist/parse/distance.js.map +1 -0
- package/dist/parse/manifest.d.ts +10 -0
- package/dist/parse/manifest.d.ts.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +36 -5
- package/dist/run.js.map +1 -1
- package/dist/skills-lock.d.ts +2 -0
- package/dist/skills-lock.d.ts.map +1 -0
- package/dist/skills-lock.js +151 -0
- package/dist/skills-lock.js.map +1 -0
- package/dist/skills.d.ts +73 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +728 -0
- package/dist/skills.js.map +1 -0
- package/dist/update.d.ts +4 -0
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +36 -1
- package/dist/update.js.map +1 -1
- package/dist/whoami.d.ts +2 -0
- package/dist/whoami.d.ts.map +1 -1
- package/dist/whoami.js +10 -3
- package/dist/whoami.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { lstat, mkdir, readFile, readdir, rmdir, unlink, writeFile, } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
6
|
+
import { EXIT_CODES } from '@nocobase/agent-protocol';
|
|
7
|
+
import { CliCommandError } from "./lib/envelope.js";
|
|
8
|
+
const OWNER_NAME = /^owner-[0-9a-f-]{36}\.json$/;
|
|
9
|
+
const LOCK_WAIT_MS = 30_000;
|
|
10
|
+
const LEGACY_LOCK_AGE_MS = 10 * 60_000;
|
|
11
|
+
// An empty directory can be replaced between any two calls. Never remove a
|
|
12
|
+
// directory recursively, and never reuse an owner filename across acquisitions.
|
|
13
|
+
async function removeEmptyLock(file) {
|
|
14
|
+
try {
|
|
15
|
+
await rmdir(file);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (!['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error.code ?? ''))
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function inspectLock(file) {
|
|
23
|
+
const info = await lstat(file).catch((error) => {
|
|
24
|
+
if (error.code === 'ENOENT')
|
|
25
|
+
return undefined;
|
|
26
|
+
throw error;
|
|
27
|
+
});
|
|
28
|
+
if (info === undefined)
|
|
29
|
+
return 'The previous operation has finished.';
|
|
30
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
31
|
+
return 'The lock is not a regular directory; it was left unchanged.';
|
|
32
|
+
const entries = await readdir(file).catch((error) => {
|
|
33
|
+
if (error.code === 'ENOENT')
|
|
34
|
+
return [];
|
|
35
|
+
throw error;
|
|
36
|
+
});
|
|
37
|
+
if (entries.length === 0) {
|
|
38
|
+
return Date.now() - info.mtimeMs >= LEGACY_LOCK_AGE_MS
|
|
39
|
+
? 'This unowned lock is over 10 minutes old, but its holder cannot be verified. Stop all CLI and bridge processes, then move this empty directory aside with your file manager and retry.'
|
|
40
|
+
: 'The lock has no owner record yet. Wait for the operation to finish and retry. If it was interrupted, stop all CLI and bridge processes, then move this empty directory aside with your file manager.';
|
|
41
|
+
}
|
|
42
|
+
let description = 'The owner could not be verified; the lock was left unchanged. Stop all CLI and bridge processes before moving this directory aside with your file manager.';
|
|
43
|
+
// Exactly one record can authorize cleanup. Together with its unique name,
|
|
44
|
+
// this permits only one outstanding directory removal per lock generation.
|
|
45
|
+
// In particular, no delayed second removal can reach a later legacy owner
|
|
46
|
+
// that holds an empty directory without publishing a record.
|
|
47
|
+
if (entries.length !== 1)
|
|
48
|
+
return description;
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
if (!OWNER_NAME.test(entry))
|
|
51
|
+
continue;
|
|
52
|
+
const marker = path.join(file, entry);
|
|
53
|
+
let owner;
|
|
54
|
+
try {
|
|
55
|
+
const metadata = await lstat(marker);
|
|
56
|
+
if (!metadata.isFile() || metadata.isSymbolicLink())
|
|
57
|
+
continue;
|
|
58
|
+
owner = JSON.parse(await readFile(marker, 'utf8'));
|
|
59
|
+
if (!Number.isSafeInteger(owner.pid) ||
|
|
60
|
+
owner.pid <= 0 ||
|
|
61
|
+
typeof owner.hostname !== 'string' ||
|
|
62
|
+
typeof owner.startedAt !== 'string')
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Missing, incomplete and unknown records never authorize deletion.
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
description = `Process ${owner.pid} on ${owner.hostname} has held the lock since ${owner.startedAt}. Wait for it to finish, or stop that process and retry.`;
|
|
70
|
+
if (owner.hostname !== os.hostname()) {
|
|
71
|
+
description +=
|
|
72
|
+
' Its process cannot be verified on this computer. Confirm that it has stopped on that host before moving the lock directory aside with your file manager.';
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
process.kill(owner.pid, 0);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error.code !== 'ESRCH')
|
|
80
|
+
continue;
|
|
81
|
+
try {
|
|
82
|
+
// Only one reaper can unlink this generation's record. A delayed
|
|
83
|
+
// reaper cannot unlink a later owner's differently named record.
|
|
84
|
+
await unlink(marker);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (error.code === 'ENOENT')
|
|
88
|
+
continue;
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
await removeEmptyLock(file);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return description;
|
|
95
|
+
}
|
|
96
|
+
export async function withSkillLock(file, work, timeoutMs = LOCK_WAIT_MS) {
|
|
97
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
98
|
+
const deadline = performance.now() + timeoutMs;
|
|
99
|
+
let interval = 25;
|
|
100
|
+
for (;;) {
|
|
101
|
+
let created = false;
|
|
102
|
+
try {
|
|
103
|
+
await mkdir(file);
|
|
104
|
+
created = true;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (error.code !== 'EEXIST')
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
if (created) {
|
|
111
|
+
const name = `owner-${randomUUID()}.json`;
|
|
112
|
+
const marker = path.join(file, name);
|
|
113
|
+
let acquired = false;
|
|
114
|
+
try {
|
|
115
|
+
await writeFile(marker, JSON.stringify({
|
|
116
|
+
pid: process.pid,
|
|
117
|
+
hostname: os.hostname(),
|
|
118
|
+
startedAt: new Date().toISOString(),
|
|
119
|
+
}), { flag: 'wx', mode: 0o600 });
|
|
120
|
+
// A delayed empty-directory cleanup may have replaced the directory
|
|
121
|
+
// during initialization. Only a sole published owner may start work;
|
|
122
|
+
// every colliding initializer withdraws rather than electing a winner.
|
|
123
|
+
const entries = await readdir(file);
|
|
124
|
+
acquired = entries.length === 1 && entries[0] === name;
|
|
125
|
+
if (!acquired) {
|
|
126
|
+
await unlink(marker);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (error.code !== 'ENOENT')
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
if (acquired) {
|
|
134
|
+
try {
|
|
135
|
+
return await work();
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
await unlink(marker);
|
|
139
|
+
await removeEmptyLock(file);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const description = await inspectLock(file);
|
|
144
|
+
const remaining = deadline - performance.now();
|
|
145
|
+
if (remaining <= 0)
|
|
146
|
+
throw new CliCommandError('SKILLS_BUSY', `Timed out after 30 seconds waiting for the Skill lock at ${file}. ${description}`, { exit: EXIT_CODES.conflict });
|
|
147
|
+
await delay(Math.min(interval, remaining));
|
|
148
|
+
interval = Math.min(interval * 2, 250);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=skills-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-lock.js","sourceRoot":"","sources":["../src/skills-lock.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type Command } from '@oclif/core';
|
|
2
|
+
import { type AppCliConfig } from './config.ts';
|
|
3
|
+
declare const TOOLS: readonly ["claude", "codex"];
|
|
4
|
+
type Tool = (typeof TOOLS)[number];
|
|
5
|
+
export interface SkillsEnvironment {
|
|
6
|
+
readonly packageRoot: string;
|
|
7
|
+
readonly cliVersion: string;
|
|
8
|
+
readonly bin: string;
|
|
9
|
+
readonly stateHome: string;
|
|
10
|
+
readonly home?: string;
|
|
11
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
12
|
+
}
|
|
13
|
+
interface Target {
|
|
14
|
+
skill: string;
|
|
15
|
+
tool: Tool;
|
|
16
|
+
path: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SkillStatus extends Target {
|
|
19
|
+
readonly legacy: boolean;
|
|
20
|
+
/** The registry records this copy but the package no longer ships its Skill. */
|
|
21
|
+
readonly dropped?: boolean;
|
|
22
|
+
readonly registered: boolean;
|
|
23
|
+
readonly present: boolean;
|
|
24
|
+
readonly upToDate: boolean;
|
|
25
|
+
readonly installedCliVersion?: string;
|
|
26
|
+
readonly error?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SkillsResult {
|
|
29
|
+
readonly skills: readonly {
|
|
30
|
+
readonly skill: string;
|
|
31
|
+
readonly hash: string;
|
|
32
|
+
}[];
|
|
33
|
+
/**
|
|
34
|
+
* The first shipped Skill's slug and hash, as the single-Skill result named them (`nb-studio-cli` when it is shipped);
|
|
35
|
+
* kept so readers of the earlier result keep working. `skills` lists every one.
|
|
36
|
+
*/
|
|
37
|
+
readonly skill: string;
|
|
38
|
+
readonly hash: string;
|
|
39
|
+
readonly cliVersion: string;
|
|
40
|
+
readonly targets: readonly SkillStatus[];
|
|
41
|
+
}
|
|
42
|
+
export interface SkillInstall extends SkillStatus {
|
|
43
|
+
readonly action: 'install' | 'update' | 'unchanged';
|
|
44
|
+
}
|
|
45
|
+
export interface SkillsInstallResult extends SkillsResult {
|
|
46
|
+
readonly dryRun: boolean;
|
|
47
|
+
readonly targets: readonly SkillInstall[];
|
|
48
|
+
}
|
|
49
|
+
export interface SkillsSyncResult {
|
|
50
|
+
readonly targets: readonly (Target & {
|
|
51
|
+
action: 'updated' | 'unchanged' | 'removed' | 'kept' | 'failed';
|
|
52
|
+
error?: string;
|
|
53
|
+
})[];
|
|
54
|
+
readonly warnings: readonly string[];
|
|
55
|
+
}
|
|
56
|
+
/** The Skills a package ships: directories of `<packageRoot>/skills` holding SKILL.md, sorted by slug. */
|
|
57
|
+
export declare function shippedSkills(packageRoot: string): string[];
|
|
58
|
+
/** Only packages shipping at least one Skill expose the two commands. */
|
|
59
|
+
export declare function hasStudioSkill(config: AppCliConfig): boolean;
|
|
60
|
+
export declare function skillsEnvironment(config: AppCliConfig): SkillsEnvironment;
|
|
61
|
+
/** Includes manual and legacy copies, and previously registered paths after environment variables change. */
|
|
62
|
+
export declare function skillsStatus(environment: SkillsEnvironment, tools?: readonly string[]): Promise<SkillsResult>;
|
|
63
|
+
/** Replaces only the Skills the package ships and registers successful installations for self-update. */
|
|
64
|
+
export declare function installSkills(environment: SkillsEnvironment, tools?: readonly string[], dryRun?: boolean): Promise<SkillsInstallResult>;
|
|
65
|
+
/** Preserve native Skill installation for the tools with a managed destination. */
|
|
66
|
+
export declare function prepareSessionSkill(environment: SkillsEnvironment, agentId: string): Promise<void>;
|
|
67
|
+
/** ACP text is the common fallback; it needs no agent-specific install directory. */
|
|
68
|
+
export declare function sessionSkillInstructions(environment: SkillsEnvironment, agentId: string): Promise<string | undefined>;
|
|
69
|
+
/** Called after CLI activation, reading the new package. Failures are warnings, never CLI update failures. */
|
|
70
|
+
export declare function syncInstalledSkills(environment: SkillsEnvironment): Promise<SkillsSyncResult>;
|
|
71
|
+
export declare function skillsCommands(app: AppCliConfig): Record<string, Command.Class>;
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|