@telora/daemon 0.15.13 → 0.15.15
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/build-info.json +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -50
- package/dist/config.js.map +1 -1
- package/dist/directive-executor.d.ts +92 -0
- package/dist/directive-executor.d.ts.map +1 -1
- package/dist/directive-executor.js +172 -11
- package/dist/directive-executor.js.map +1 -1
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +0 -43
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-executor.d.ts.map +1 -1
- package/dist/focus-executor.js +8 -2
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-lifecycle.d.ts +3 -4
- package/dist/focus-lifecycle.d.ts.map +1 -1
- package/dist/focus-lifecycle.js +6 -79
- package/dist/focus-lifecycle.js.map +1 -1
- package/dist/focus-phase.d.ts +26 -0
- package/dist/focus-phase.d.ts.map +1 -1
- package/dist/focus-phase.js +43 -0
- package/dist/focus-phase.js.map +1 -1
- package/dist/focus-provisioning.d.ts.map +1 -1
- package/dist/focus-provisioning.js +1 -7
- package/dist/focus-provisioning.js.map +1 -1
- package/dist/focus-worktree-state.d.ts.map +1 -1
- package/dist/focus-worktree-state.js +0 -1
- package/dist/focus-worktree-state.js.map +1 -1
- package/dist/listener.d.ts.map +1 -1
- package/dist/listener.js +0 -6
- package/dist/listener.js.map +1 -1
- package/dist/queries/shared.d.ts.map +1 -1
- package/dist/queries/shared.js +0 -3
- package/dist/queries/shared.js.map +1 -1
- package/dist/supabase.d.ts +0 -4
- package/dist/supabase.d.ts.map +1 -1
- package/dist/supabase.js +0 -8
- package/dist/supabase.js.map +1 -1
- package/dist/team-spawner.d.ts.map +1 -1
- package/dist/team-spawner.js +8 -2
- package/dist/team-spawner.js.map +1 -1
- package/dist/types/config.d.ts +0 -10
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/focus.d.ts +11 -2
- package/dist/types/focus.d.ts.map +1 -1
- package/dist/unified-shell-config.d.ts.map +1 -1
- package/dist/unified-shell-config.js +0 -39
- package/dist/unified-shell-config.js.map +1 -1
- package/package.json +1 -1
- package/dist/qa-crash-recovery.d.ts +0 -77
- package/dist/qa-crash-recovery.d.ts.map +0 -1
- package/dist/qa-crash-recovery.js +0 -243
- package/dist/qa-crash-recovery.js.map +0 -1
- package/dist/qa-dev-server.d.ts +0 -73
- package/dist/qa-dev-server.d.ts.map +0 -1
- package/dist/qa-dev-server.js +0 -279
- package/dist/qa-dev-server.js.map +0 -1
- package/dist/qa-orchestrator.d.ts +0 -107
- package/dist/qa-orchestrator.d.ts.map +0 -1
- package/dist/qa-orchestrator.js +0 -518
- package/dist/qa-orchestrator.js.map +0 -1
- package/dist/qa-port-allocator.d.ts +0 -34
- package/dist/qa-port-allocator.d.ts.map +0 -1
- package/dist/qa-port-allocator.js +0 -75
- package/dist/qa-port-allocator.js.map +0 -1
- package/dist/qa-provisioner.d.ts +0 -33
- package/dist/qa-provisioner.d.ts.map +0 -1
- package/dist/qa-provisioner.js +0 -139
- package/dist/qa-provisioner.js.map +0 -1
- package/dist/qa-state.d.ts +0 -118
- package/dist/qa-state.d.ts.map +0 -1
- package/dist/qa-state.js +0 -88
- package/dist/qa-state.js.map +0 -1
- package/dist/queries/qa.d.ts +0 -120
- package/dist/queries/qa.d.ts.map +0 -1
- package/dist/queries/qa.js +0 -118
- package/dist/queries/qa.js.map +0 -1
- package/dist/save-point-restore.d.ts +0 -35
- package/dist/save-point-restore.d.ts.map +0 -1
- package/dist/save-point-restore.js +0 -146
- package/dist/save-point-restore.js.map +0 -1
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Save point restore orchestration.
|
|
3
|
-
*
|
|
4
|
-
* Polls for save points with restore_status = 'requested', then executes
|
|
5
|
-
* the destructive git operations: reset main, force push, sync integration.
|
|
6
|
-
*
|
|
7
|
-
* Optionally creates an auto-save of current HEAD before restoring.
|
|
8
|
-
*/
|
|
9
|
-
import type { DaemonConfig } from './types.js';
|
|
10
|
-
interface RestoreRequest {
|
|
11
|
-
savePointId: string;
|
|
12
|
-
name: string;
|
|
13
|
-
commitSha: string;
|
|
14
|
-
productId: string;
|
|
15
|
-
autoSaveBeforeRestore: boolean;
|
|
16
|
-
organizationId: string;
|
|
17
|
-
}
|
|
18
|
-
/** Injectable deps for testing. */
|
|
19
|
-
export interface SavePointRestoreDeps {
|
|
20
|
-
getSavePointRestoreRequests: (productId: string) => Promise<RestoreRequest[]>;
|
|
21
|
-
updateSavePointRestoreStatus: (id: string, fields: Record<string, unknown>) => Promise<void>;
|
|
22
|
-
runGit: (args: string[], cwd: string) => {
|
|
23
|
-
success: boolean;
|
|
24
|
-
output: string;
|
|
25
|
-
error?: string;
|
|
26
|
-
};
|
|
27
|
-
createAutoSave: (productId: string, commitSha: string, savePointId: string) => Promise<void>;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Check for and process pending save point restore requests.
|
|
31
|
-
* Called each poll cycle from listener.ts.
|
|
32
|
-
*/
|
|
33
|
-
export declare function checkSavePointRestoreRequests(config: DaemonConfig, deps?: SavePointRestoreDeps): Promise<void>;
|
|
34
|
-
export {};
|
|
35
|
-
//# sourceMappingURL=save-point-restore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save-point-restore.d.ts","sourceRoot":"","sources":["../src/save-point-restore.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,2BAA2B,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9E,4BAA4B,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9F,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9F;AAwCD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,oBAAkC,GACvC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Save point restore orchestration.
|
|
3
|
-
*
|
|
4
|
-
* Polls for save points with restore_status = 'requested', then executes
|
|
5
|
-
* the destructive git operations: reset main, force push, sync integration.
|
|
6
|
-
*
|
|
7
|
-
* Optionally creates an auto-save of current HEAD before restoring.
|
|
8
|
-
*/
|
|
9
|
-
import { execFileSync } from 'node:child_process';
|
|
10
|
-
import { getSavePointRestoreRequests, updateSavePointRestoreStatus } from './supabase.js';
|
|
11
|
-
import { callApi } from './queries/shared.js';
|
|
12
|
-
function runGitSync(args, cwd) {
|
|
13
|
-
try {
|
|
14
|
-
const output = execFileSync('git', args, {
|
|
15
|
-
cwd,
|
|
16
|
-
encoding: 'utf-8',
|
|
17
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
18
|
-
timeout: 60_000,
|
|
19
|
-
});
|
|
20
|
-
return { success: true, output: output.trim() };
|
|
21
|
-
}
|
|
22
|
-
catch (err) {
|
|
23
|
-
const e = err;
|
|
24
|
-
return { success: false, output: '', error: e.stderr || e.message || String(err) };
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
async function createAutoSaveImpl(productId, commitSha, savePointId) {
|
|
28
|
-
try {
|
|
29
|
-
await callApi('save_point_create', {
|
|
30
|
-
productId,
|
|
31
|
-
fields: {
|
|
32
|
-
name: `Auto-save before restore to ${savePointId.slice(0, 8)}`,
|
|
33
|
-
commitSha,
|
|
34
|
-
description: `Automatic save of main HEAD before restoring to save point ${savePointId}`,
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
// Non-fatal: auto-save may fail if this SHA already has a save point
|
|
40
|
-
console.warn(`[save-point-restore] Auto-save failed (non-fatal), continuing with restore`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const defaultDeps = {
|
|
44
|
-
getSavePointRestoreRequests,
|
|
45
|
-
updateSavePointRestoreStatus,
|
|
46
|
-
runGit: runGitSync,
|
|
47
|
-
createAutoSave: createAutoSaveImpl,
|
|
48
|
-
};
|
|
49
|
-
/**
|
|
50
|
-
* Check for and process pending save point restore requests.
|
|
51
|
-
* Called each poll cycle from listener.ts.
|
|
52
|
-
*/
|
|
53
|
-
export async function checkSavePointRestoreRequests(config, deps = defaultDeps) {
|
|
54
|
-
let requests;
|
|
55
|
-
try {
|
|
56
|
-
requests = await deps.getSavePointRestoreRequests(config.productId);
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
console.warn(`[save-point-restore] Failed to fetch restore requests: ${err.message}`);
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (requests.length === 0)
|
|
63
|
-
return;
|
|
64
|
-
// Only process the first request (restore is destructive, one at a time)
|
|
65
|
-
const req = requests[0];
|
|
66
|
-
try {
|
|
67
|
-
await handleRestore(config, req, deps);
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
console.error(`[save-point-restore] Error restoring "${req.name}": ${err.message}`);
|
|
71
|
-
try {
|
|
72
|
-
await deps.updateSavePointRestoreStatus(req.savePointId, {
|
|
73
|
-
restoreStatus: 'failed',
|
|
74
|
-
restoreError: err.message,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
catch (updateErr) {
|
|
78
|
-
console.warn(`[save-point-restore] Failed to update error state: ${updateErr.message}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
async function handleRestore(config, req, deps) {
|
|
83
|
-
const { savePointId, name, commitSha, productId, autoSaveBeforeRestore } = req;
|
|
84
|
-
const repoPath = config.repoPath;
|
|
85
|
-
console.log(`[save-point-restore] Starting restore to "${name}" (${commitSha.slice(0, 7)})`);
|
|
86
|
-
// Mark as in progress
|
|
87
|
-
await deps.updateSavePointRestoreStatus(savePointId, { restoreStatus: 'in_progress' });
|
|
88
|
-
// Auto-save current HEAD if requested
|
|
89
|
-
if (autoSaveBeforeRestore) {
|
|
90
|
-
const headResult = deps.runGit(['rev-parse', 'HEAD'], repoPath);
|
|
91
|
-
if (headResult.success && headResult.output !== commitSha) {
|
|
92
|
-
await deps.createAutoSave(productId, headResult.output, savePointId);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Fetch to ensure we have the target commit
|
|
96
|
-
const fetchResult = deps.runGit(['fetch', 'origin'], repoPath);
|
|
97
|
-
if (!fetchResult.success) {
|
|
98
|
-
throw new Error(`Failed to fetch from origin: ${fetchResult.error}`);
|
|
99
|
-
}
|
|
100
|
-
// Checkout main
|
|
101
|
-
const checkoutResult = deps.runGit(['checkout', 'main'], repoPath);
|
|
102
|
-
if (!checkoutResult.success) {
|
|
103
|
-
throw new Error(`Failed to checkout main: ${checkoutResult.error}`);
|
|
104
|
-
}
|
|
105
|
-
// Reset main to target SHA
|
|
106
|
-
const resetResult = deps.runGit(['reset', '--hard', commitSha], repoPath);
|
|
107
|
-
if (!resetResult.success) {
|
|
108
|
-
throw new Error(`Failed to reset main to ${commitSha}: ${resetResult.error}`);
|
|
109
|
-
}
|
|
110
|
-
// Force push main
|
|
111
|
-
const pushResult = deps.runGit(['push', '--force-with-lease', 'origin', 'main'], repoPath);
|
|
112
|
-
if (!pushResult.success) {
|
|
113
|
-
throw new Error(`Failed to push main: ${pushResult.error}`);
|
|
114
|
-
}
|
|
115
|
-
// Sync integration branch
|
|
116
|
-
const integrationBranch = config.integrationBranch || 'integration';
|
|
117
|
-
const branchResult = deps.runGit(['branch', '-f', integrationBranch, commitSha], repoPath);
|
|
118
|
-
if (!branchResult.success) {
|
|
119
|
-
const msg = `Main restored to ${commitSha.slice(0, 7)} but integration branch sync failed: ${branchResult.error}`;
|
|
120
|
-
console.error(`[save-point-restore] ${msg}`);
|
|
121
|
-
await deps.updateSavePointRestoreStatus(savePointId, {
|
|
122
|
-
restoreStatus: 'done',
|
|
123
|
-
restoreCompletedAt: new Date().toISOString(),
|
|
124
|
-
restoreError: msg,
|
|
125
|
-
});
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const intPushResult = deps.runGit(['push', '--force-with-lease', 'origin', integrationBranch], repoPath);
|
|
129
|
-
if (!intPushResult.success) {
|
|
130
|
-
const msg = `Main restored to ${commitSha.slice(0, 7)} but integration branch push failed: ${intPushResult.error}`;
|
|
131
|
-
console.error(`[save-point-restore] ${msg}`);
|
|
132
|
-
await deps.updateSavePointRestoreStatus(savePointId, {
|
|
133
|
-
restoreStatus: 'done',
|
|
134
|
-
restoreCompletedAt: new Date().toISOString(),
|
|
135
|
-
restoreError: msg,
|
|
136
|
-
});
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
// Mark as done
|
|
140
|
-
await deps.updateSavePointRestoreStatus(savePointId, {
|
|
141
|
-
restoreStatus: 'done',
|
|
142
|
-
restoreCompletedAt: new Date().toISOString(),
|
|
143
|
-
});
|
|
144
|
-
console.log(`[save-point-restore] Restore complete: main reset to ${commitSha.slice(0, 7)}`);
|
|
145
|
-
}
|
|
146
|
-
//# sourceMappingURL=save-point-restore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save-point-restore.js","sourceRoot":"","sources":["../src/save-point-restore.ts"],"names":[],"mappings":"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"}
|