@nowcrew/daemon 0.6.88-beta.2 → 0.6.88-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/README.md +38 -10
- package/dist/agent-memory/policy.js +3 -1
- package/dist/daemon-update-eligibility.js +1 -1
- package/dist/execution-journal.js +9 -6
- package/dist/execution-protocol.js +2 -1
- package/dist/execution-runner.js +5 -3
- package/dist/list-models.js +2 -0
- package/dist/local-execution-lease.js +22 -0
- package/dist/local-executor.js +57 -37
- package/dist/local-memory/candidate.js +43 -0
- package/dist/local-memory/index-budget.js +8 -0
- package/dist/local-memory/inventory-cli.js +61 -0
- package/dist/local-memory/inventory-preview.js +154 -0
- package/dist/local-memory/inventory-source.js +159 -0
- package/dist/local-memory/pending-match.js +29 -0
- package/dist/local-memory/pending-query.js +100 -0
- package/dist/local-memory/pending-schema.js +29 -0
- package/dist/local-memory/pending-source.js +126 -0
- package/dist/local-memory/pending.js +34 -84
- package/dist/local-memory/prompt.js +14 -11
- package/dist/local-memory/read-cli.js +59 -8
- package/dist/local-memory/runtime.js +24 -17
- package/dist/local-memory/work-log-execution.js +31 -0
- package/dist/local-memory/work-log.js +58 -0
- package/dist/local-memory/write.js +27 -58
- package/dist/machine-info.js +54 -16
- package/dist/main.js +4 -69
- package/dist/native-thread-context.js +59 -0
- package/dist/pre-admission-rejection.js +64 -0
- package/dist/project-skills/execution-adapter.js +3 -2
- package/dist/project-skills/runtime-launch.js +14 -0
- package/dist/prompt.js +15 -15
- package/dist/provider-env.js +3 -4
- package/dist/runner.js +14 -15
- package/dist/runtime-probe.js +34 -5
- package/dist/runtimes/acp-probe-transport.js +69 -0
- package/dist/runtimes/claude-session-start-hook.js +24 -0
- package/dist/runtimes/claude-thread-runner.js +266 -0
- package/dist/runtimes/claude.js +23 -4
- package/dist/runtimes/codex-app-server-runner.js +43 -4
- package/dist/runtimes/deepseek-harness-profile.js +92 -0
- package/dist/runtimes/deepseek-harness-runner.js +224 -0
- package/dist/runtimes/deepseek-harness.js +64 -11
- package/dist/runtimes/harness-probe-retry.js +42 -0
- package/dist/runtimes/kimi-acp-runner.js +63 -10
- package/dist/runtimes/opencode-runner.js +7 -1
- package/dist/serve.js +58 -88
- package/dist/session.js +4 -0
- package/dist/storage-identity.js +0 -3
- package/dist/storage-serve-adapter.js +6 -72
- package/dist/supervised-runtime.js +28 -18
- package/dist/thread-input-delivery.js +217 -0
- package/package.json +2 -2
- package/dist/daemon-migration-controller.js +0 -211
- package/dist/daemon-migration-wiring.js +0 -22
- package/dist/storage-control.js +0 -212
- package/dist/storage-copy.js +0 -628
- package/dist/storage-credential-guard.js +0 -21
- package/dist/storage-doctor.js +0 -228
- package/dist/storage-manifest.js +0 -1027
- package/dist/storage-migration-controller.js +0 -440
- package/dist/storage-migration-manifest.js +0 -105
- package/dist/storage-migration-policy.js +0 -100
- package/dist/storage-runtime-controller.js +0 -381
- package/dist/storage-runtime-readiness.js +0 -240
- package/dist/storage-safe-fs.js +0 -302
- package/dist/storage-status-delivery.js +0 -224
- package/dist/storage-status-replay.js +0 -140
- package/dist/storage-target-confirmation.js +0 -129
- package/dist/storage-worker-command.js +0 -37
- package/dist/storage-worker-executor.js +0 -449
- package/dist/storage-worker-handoff.js +0 -151
- package/dist/storage-worker-operation.js +0 -294
- package/dist/storage-worker-status.js +0 -259
package/dist/storage-control.js
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export const STORAGE_MIGRATION_CAPABILITY = "storage_migration_v1";
|
|
3
|
-
export const STORAGE_MIGRATION_STATUS_CAPABILITY = "storage_migration_status_v1";
|
|
4
|
-
const IdentitySchema = z.object({
|
|
5
|
-
migrationId: z.string().uuid(),
|
|
6
|
-
environment: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,31}$/u),
|
|
7
|
-
workspaceId: z.string().uuid(),
|
|
8
|
-
ownerEpoch: z.number().int().positive().safe().optional(),
|
|
9
|
-
ownershipClaimFingerprint: z.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
|
|
10
|
-
});
|
|
11
|
-
const DoctorRequestSchema = IdentitySchema.extend({ type: z.literal("daemon:storage-doctor") }).strict();
|
|
12
|
-
const MigrateRequestSchema = IdentitySchema.extend({
|
|
13
|
-
type: z.literal("daemon:storage-migrate"),
|
|
14
|
-
manifestDigest: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
15
|
-
}).strict();
|
|
16
|
-
const StatusSchema = z.enum([
|
|
17
|
-
"preflight_running", "preflight_passed", "backing_up", "initial_sync", "quiescing", "final_sync", "verified",
|
|
18
|
-
"service_switched", "hello_confirmed", "completed", "failed", "rollback_pending", "rolled_back",
|
|
19
|
-
"rollback_failed",
|
|
20
|
-
]);
|
|
21
|
-
const TOKEN = /(?:\bsk_(?:machine|user|agent)_[A-Za-z0-9_-]{4,}\b|\bbearer\s+[^\s]+|(?:password|secret|token)\s*[:=]\s*[^\s]+)/giu;
|
|
22
|
-
const safeError = (error) => (error instanceof Error ? error.message : String(error))
|
|
23
|
-
.replaceAll(TOKEN, "<redacted>").slice(0, 500) || "storage migration failed";
|
|
24
|
-
const stableErrorCode = (candidate, fallback) => typeof candidate === "string" && /^[a-z0-9._-]{1,128}$/u.test(candidate) ? candidate : fallback;
|
|
25
|
-
export function createStorageControlController(input) {
|
|
26
|
-
const environment = z.string().regex(/^[a-z0-9][a-z0-9_-]{0,31}$/u).parse(input.environment);
|
|
27
|
-
const workspaceId = z.string().uuid().parse(input.workspaceId);
|
|
28
|
-
const profile = z.string().regex(/^[a-z0-9][a-z0-9_-]{0,47}$/u).parse(input.profile);
|
|
29
|
-
const sourceStorageFingerprint = z.string().regex(/^sha256:[0-9a-f]{64}$/u).parse(input.sourceStorageFingerprint);
|
|
30
|
-
const targetStorageFingerprint = z.string().regex(/^sha256:[0-9a-f]{64}$/u).parse(input.targetStorageFingerprint);
|
|
31
|
-
const ownership = input.ownership === undefined ? undefined : Object.freeze({
|
|
32
|
-
ownerEpoch: z.number().int().positive().safe().parse(input.ownership.ownerEpoch),
|
|
33
|
-
ownershipClaimFingerprint: z.string().regex(/^sha256:[0-9a-f]{64}$/u)
|
|
34
|
-
.parse(input.ownership.ownershipClaimFingerprint),
|
|
35
|
-
});
|
|
36
|
-
const preflights = new Map();
|
|
37
|
-
const preflightRuns = new Map();
|
|
38
|
-
const appliedMigrationIds = new Set();
|
|
39
|
-
let runningMigrationId = null;
|
|
40
|
-
const preflightTimeoutMs = z.number().int().positive().max(24 * 60 * 60 * 1000)
|
|
41
|
-
.parse(input.preflightTimeoutMs ?? 30 * 60 * 1000);
|
|
42
|
-
const frame = (identity, status, extra = {}) => ({
|
|
43
|
-
type: "daemon:storage-migration-status",
|
|
44
|
-
migrationId: identity.migrationId,
|
|
45
|
-
status,
|
|
46
|
-
environment,
|
|
47
|
-
workspaceId,
|
|
48
|
-
profile,
|
|
49
|
-
...(ownership === undefined ? {} : ownership),
|
|
50
|
-
...extra,
|
|
51
|
-
});
|
|
52
|
-
const failure = (identity, errorCode, error, reopenAdmission = false, extra = {}) => {
|
|
53
|
-
reportStatus(frame(identity, "failed", {
|
|
54
|
-
errorCode,
|
|
55
|
-
...extra,
|
|
56
|
-
...(error === undefined ? {} : { errorMessage: safeError(error) }),
|
|
57
|
-
...(reopenAdmission || error?.reopenAdmission === true
|
|
58
|
-
? { reopenAdmission: true }
|
|
59
|
-
: {}),
|
|
60
|
-
}));
|
|
61
|
-
};
|
|
62
|
-
const reportStatus = (statusFrame) => {
|
|
63
|
-
try {
|
|
64
|
-
input.sendStatus(statusFrame);
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
input.onStatusError?.(error, statusFrame);
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
const matchesIdentity = (identity) => identity.environment === environment && identity.workspaceId === workspaceId
|
|
71
|
-
&& (ownership === undefined
|
|
72
|
-
|| (identity.ownerEpoch === ownership.ownerEpoch
|
|
73
|
-
&& identity.ownershipClaimFingerprint === ownership.ownershipClaimFingerprint));
|
|
74
|
-
const preflightKey = (identity) => `${identity.migrationId}\0${identity.environment}\0${identity.workspaceId}`;
|
|
75
|
-
const runPreflight = (identity, failureFallback = "doctor_failed") => {
|
|
76
|
-
const key = preflightKey(identity);
|
|
77
|
-
const existing = preflightRuns.get(key);
|
|
78
|
-
if (existing !== undefined)
|
|
79
|
-
return existing;
|
|
80
|
-
const controller = new AbortController();
|
|
81
|
-
let scannedEntries = 0;
|
|
82
|
-
let timedOut = false;
|
|
83
|
-
reportStatus(frame(identity, "preflight_running", {
|
|
84
|
-
progress: { state: "running", scannedEntries: 0 },
|
|
85
|
-
}));
|
|
86
|
-
const doctorPromise = Promise.resolve().then(() => input.runDoctor(identity.migrationId, {
|
|
87
|
-
signal: controller.signal,
|
|
88
|
-
onProgress: (progress) => {
|
|
89
|
-
if (timedOut)
|
|
90
|
-
return;
|
|
91
|
-
scannedEntries = progress.scannedEntries;
|
|
92
|
-
reportStatus(frame(identity, "preflight_running", {
|
|
93
|
-
progress: { state: "running", scannedEntries },
|
|
94
|
-
}));
|
|
95
|
-
},
|
|
96
|
-
}));
|
|
97
|
-
let timeoutHandle;
|
|
98
|
-
const timeout = new Promise((_, reject) => {
|
|
99
|
-
timeoutHandle = setTimeout(() => {
|
|
100
|
-
timedOut = true;
|
|
101
|
-
controller.abort();
|
|
102
|
-
reject(Object.assign(new Error("storage doctor preflight timed out"), {
|
|
103
|
-
code: "preflight_stale",
|
|
104
|
-
scannedEntries,
|
|
105
|
-
}));
|
|
106
|
-
}, preflightTimeoutMs);
|
|
107
|
-
timeoutHandle.unref?.();
|
|
108
|
-
});
|
|
109
|
-
void doctorPromise.catch(() => undefined);
|
|
110
|
-
let outcome;
|
|
111
|
-
outcome = Promise.race([doctorPromise, timeout]).then((doctor) => {
|
|
112
|
-
if (doctor.manifest.migrationId !== identity.migrationId
|
|
113
|
-
|| doctor.environment !== environment || doctor.workspaceId !== workspaceId
|
|
114
|
-
|| doctor.profile !== profile) {
|
|
115
|
-
failure(identity, "storage_identity_mismatch", undefined, true);
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
if (!doctor.applyAllowed) {
|
|
119
|
-
failure(identity, doctor.blockers[0]?.code ?? "doctor_blocked", undefined, true);
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
preflights.set(identity.migrationId, doctor);
|
|
123
|
-
reportStatus(frame(identity, "preflight_passed", {
|
|
124
|
-
sourceStorageFingerprint,
|
|
125
|
-
targetStorageFingerprint,
|
|
126
|
-
manifestDigest: doctor.manifestDigest,
|
|
127
|
-
}));
|
|
128
|
-
return doctor;
|
|
129
|
-
}).catch((error) => {
|
|
130
|
-
const code = error.code;
|
|
131
|
-
if (code === "preflight_stale") {
|
|
132
|
-
failure(identity, "preflight_stale", undefined, true, {
|
|
133
|
-
retryable: true,
|
|
134
|
-
progress: { state: "stale", scannedEntries: Number(error.scannedEntries) || scannedEntries },
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
else if (code === "preflight_aborted") {
|
|
138
|
-
failure(identity, "preflight_aborted", error, true, {
|
|
139
|
-
retryable: true,
|
|
140
|
-
progress: { state: "stale", scannedEntries },
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
failure(identity, stableErrorCode(code, failureFallback), error, true);
|
|
145
|
-
}
|
|
146
|
-
return null;
|
|
147
|
-
}).finally(() => {
|
|
148
|
-
if (timeoutHandle !== undefined)
|
|
149
|
-
clearTimeout(timeoutHandle);
|
|
150
|
-
if (preflightRuns.get(key) === outcome)
|
|
151
|
-
preflightRuns.delete(key);
|
|
152
|
-
});
|
|
153
|
-
preflightRuns.set(key, outcome);
|
|
154
|
-
return outcome;
|
|
155
|
-
};
|
|
156
|
-
const handle = async (raw) => {
|
|
157
|
-
const type = typeof raw === "object" && raw !== null && "type" in raw ? raw.type : null;
|
|
158
|
-
if (type !== "daemon:storage-doctor" && type !== "daemon:storage-migrate")
|
|
159
|
-
return false;
|
|
160
|
-
const schema = type === "daemon:storage-doctor" ? DoctorRequestSchema : MigrateRequestSchema;
|
|
161
|
-
const parsed = schema.safeParse(raw);
|
|
162
|
-
if (!parsed.success)
|
|
163
|
-
return true;
|
|
164
|
-
const identity = parsed.data;
|
|
165
|
-
if (!matchesIdentity(identity)) {
|
|
166
|
-
failure(identity, "storage_identity_mismatch", undefined, true);
|
|
167
|
-
return true;
|
|
168
|
-
}
|
|
169
|
-
if (type === "daemon:storage-doctor") {
|
|
170
|
-
await runPreflight(identity);
|
|
171
|
-
return true;
|
|
172
|
-
}
|
|
173
|
-
if (runningMigrationId !== null) {
|
|
174
|
-
if (runningMigrationId !== identity.migrationId)
|
|
175
|
-
failure(identity, "migration_active");
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
const migrate = MigrateRequestSchema.parse(identity);
|
|
179
|
-
if (appliedMigrationIds.has(identity.migrationId))
|
|
180
|
-
return true;
|
|
181
|
-
let doctor = preflights.get(identity.migrationId);
|
|
182
|
-
if (doctor === undefined) {
|
|
183
|
-
const rebuilt = await runPreflight(identity, "preflight_rebuild_failed");
|
|
184
|
-
if (rebuilt === null)
|
|
185
|
-
return true;
|
|
186
|
-
doctor = rebuilt;
|
|
187
|
-
}
|
|
188
|
-
if (!doctor.applyAllowed || doctor.manifestDigest !== migrate.manifestDigest
|
|
189
|
-
|| doctor.manifest.migrationId !== identity.migrationId
|
|
190
|
-
|| doctor.environment !== environment || doctor.workspaceId !== workspaceId || doctor.profile !== profile) {
|
|
191
|
-
failure(identity, "preflight_digest_mismatch", undefined, true);
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
preflights.delete(identity.migrationId);
|
|
195
|
-
runningMigrationId = identity.migrationId;
|
|
196
|
-
try {
|
|
197
|
-
await input.runMigration(doctor, (status) => {
|
|
198
|
-
if (StatusSchema.safeParse(status).success)
|
|
199
|
-
reportStatus(frame(identity, status));
|
|
200
|
-
});
|
|
201
|
-
appliedMigrationIds.add(identity.migrationId);
|
|
202
|
-
}
|
|
203
|
-
catch (error) {
|
|
204
|
-
failure(identity, stableErrorCode(error.code, "storage_migration_failed"), error);
|
|
205
|
-
}
|
|
206
|
-
finally {
|
|
207
|
-
runningMigrationId = null;
|
|
208
|
-
}
|
|
209
|
-
return true;
|
|
210
|
-
};
|
|
211
|
-
return Object.freeze({ handle });
|
|
212
|
-
}
|