tim-hooks 0.1.0-beta.0
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 +31 -0
- package/dist/cadence-runner.d.ts +11 -0
- package/dist/cadence-runner.d.ts.map +1 -0
- package/dist/cadence-runner.js +30 -0
- package/dist/cadence-runner.js.map +1 -0
- package/dist/cadence.d.ts +10 -0
- package/dist/cadence.d.ts.map +1 -0
- package/dist/cadence.js +36 -0
- package/dist/cadence.js.map +1 -0
- package/dist/checkpoint.d.ts +56 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +232 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/claude-stop.d.ts +32 -0
- package/dist/claude-stop.d.ts.map +1 -0
- package/dist/claude-stop.js +213 -0
- package/dist/claude-stop.js.map +1 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/delta.d.ts +7 -0
- package/dist/delta.d.ts.map +1 -0
- package/dist/delta.js +53 -0
- package/dist/delta.js.map +1 -0
- package/dist/hooks.d.ts +39 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +136 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/marker.d.ts +179 -0
- package/dist/marker.d.ts.map +1 -0
- package/dist/marker.js +590 -0
- package/dist/marker.js.map +1 -0
- package/dist/phantom-recovery.d.ts +13 -0
- package/dist/phantom-recovery.d.ts.map +1 -0
- package/dist/phantom-recovery.js +113 -0
- package/dist/phantom-recovery.js.map +1 -0
- package/dist/project-creation.d.ts +48 -0
- package/dist/project-creation.d.ts.map +1 -0
- package/dist/project-creation.js +265 -0
- package/dist/project-creation.js.map +1 -0
- package/dist/prompt-submit.d.ts +16 -0
- package/dist/prompt-submit.d.ts.map +1 -0
- package/dist/prompt-submit.js +69 -0
- package/dist/prompt-submit.js.map +1 -0
- package/dist/rebalance.d.ts +17 -0
- package/dist/rebalance.d.ts.map +1 -0
- package/dist/rebalance.js +91 -0
- package/dist/rebalance.js.map +1 -0
- package/dist/session-hooks.d.ts +53 -0
- package/dist/session-hooks.d.ts.map +1 -0
- package/dist/session-hooks.js +167 -0
- package/dist/session-hooks.js.map +1 -0
- package/dist/update-check.d.ts +5 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +66 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +24 -0
- package/scripts/README-hermes-statusline.md +47 -0
- package/scripts/hermes-cli-tim-statusline.patch +75 -0
- package/scripts/lib/resolve-tim-cli.sh +30 -0
- package/scripts/post-commit.sh +30 -0
- package/scripts/tim-claude-session-start.sh +26 -0
- package/scripts/tim-cursor-inject.sh +17 -0
- package/scripts/tim-hermes-session-cache.sh +32 -0
- package/scripts/tim-hermes-statusline.sh +28 -0
- package/scripts/tim-post-commit.sh +14 -0
- package/scripts/tim-session-start.sh +104 -0
- package/scripts/tim-statusline.sh +16 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.repairPhantomProjectBinding = repairPhantomProjectBinding;
|
|
37
|
+
exports.stripUnboundProjectSuffix = stripUnboundProjectSuffix;
|
|
38
|
+
exports.formatUnboundProjectLabel = formatUnboundProjectLabel;
|
|
39
|
+
exports.isUnboundProjectLabel = isUnboundProjectLabel;
|
|
40
|
+
exports.markerWithRepairedProject = markerWithRepairedProject;
|
|
41
|
+
const fs = __importStar(require("node:fs"));
|
|
42
|
+
const path = __importStar(require("node:path"));
|
|
43
|
+
const marker_js_1 = require("./marker.js");
|
|
44
|
+
function readTimJsonProjectLabel(dir) {
|
|
45
|
+
const filePath = path.join(dir, marker_js_1.CANONICAL_PROJECT_FILENAME);
|
|
46
|
+
if (!fs.existsSync(filePath))
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
const raw = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
50
|
+
const label = raw.project;
|
|
51
|
+
return typeof label === 'string' && (0, marker_js_1.validateProjectLabel)(label) ? label : null;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function labelIfValidProject(store, label) {
|
|
58
|
+
const validated = await (0, marker_js_1.validateMarkerAgainstStore)({
|
|
59
|
+
version: 2,
|
|
60
|
+
project: label,
|
|
61
|
+
session: '',
|
|
62
|
+
exchanges: 0,
|
|
63
|
+
batch_size: 5,
|
|
64
|
+
batches_summarized: 0,
|
|
65
|
+
}, store);
|
|
66
|
+
return validated?.project ?? null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Attempt to recover a real project label when `.tim-project` points at a
|
|
70
|
+
* phantom (pattern-valid label missing from the DB).
|
|
71
|
+
*/
|
|
72
|
+
async function repairPhantomProjectBinding(store, dir) {
|
|
73
|
+
const resolvedDir = path.resolve(dir);
|
|
74
|
+
const fromTimJson = readTimJsonProjectLabel(resolvedDir);
|
|
75
|
+
if (fromTimJson) {
|
|
76
|
+
const label = await labelIfValidProject(store, fromTimJson);
|
|
77
|
+
if (label)
|
|
78
|
+
return label;
|
|
79
|
+
}
|
|
80
|
+
const byPath = await store.findProjectByPath(resolvedDir);
|
|
81
|
+
if (byPath && byPath.metadata.kind === 'project' && !byPath.irrelevant) {
|
|
82
|
+
const label = typeof byPath.metadata.label === 'string'
|
|
83
|
+
? byPath.metadata.label
|
|
84
|
+
: byPath.id;
|
|
85
|
+
return label;
|
|
86
|
+
}
|
|
87
|
+
const alias = path.basename(resolvedDir).toLowerCase();
|
|
88
|
+
if (alias) {
|
|
89
|
+
const resolved = await store.resolveProjectLabel(alias);
|
|
90
|
+
if (resolved.status === 'found') {
|
|
91
|
+
const entry = await store.read(resolved.label);
|
|
92
|
+
if (entry?.metadata.kind === 'project' && !entry.irrelevant) {
|
|
93
|
+
return resolved.label;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ambiguous → leave unrepaired (caller must not mint another contested alias)
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
/** Strip trailing `?` from statusline unbound display labels. */
|
|
101
|
+
function stripUnboundProjectSuffix(label) {
|
|
102
|
+
return label.endsWith('?') ? label.slice(0, -1) : label;
|
|
103
|
+
}
|
|
104
|
+
function formatUnboundProjectLabel(label) {
|
|
105
|
+
return label.endsWith('?') ? label : `${label}?`;
|
|
106
|
+
}
|
|
107
|
+
function isUnboundProjectLabel(label) {
|
|
108
|
+
return label.endsWith('?');
|
|
109
|
+
}
|
|
110
|
+
function markerWithRepairedProject(marker, recoveredLabel) {
|
|
111
|
+
return { ...marker, project: recoveredLabel };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=phantom-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phantom-recovery.js","sourceRoot":"","sources":["../src/phantom-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Entry } from 'tim-core';
|
|
2
|
+
import { TimStore } from 'tim-store';
|
|
3
|
+
import { writeMarkerExclusive } from './marker.js';
|
|
4
|
+
export declare const MODE_ERROR = "Exactly one creation mode is required. Pass an absolute project path for a repository/workspace, or memoryOnly: true only when no directory should be bound.";
|
|
5
|
+
export interface ProjectCreationArgs {
|
|
6
|
+
label: string;
|
|
7
|
+
content?: string;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
aliases?: string[];
|
|
10
|
+
path?: string;
|
|
11
|
+
memoryOnly?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface MemoryOnlyProjectCreationResult extends Entry {
|
|
14
|
+
mode: 'memory-only';
|
|
15
|
+
}
|
|
16
|
+
export interface BoundProjectCreationResult extends Entry {
|
|
17
|
+
mode: 'bound';
|
|
18
|
+
projectPath: string;
|
|
19
|
+
markerPath: string;
|
|
20
|
+
}
|
|
21
|
+
export type ProjectCreationResult = MemoryOnlyProjectCreationResult | BoundProjectCreationResult;
|
|
22
|
+
export interface ProjectCreationDeps {
|
|
23
|
+
sessionId: () => string;
|
|
24
|
+
writeExclusive: typeof writeMarkerExclusive;
|
|
25
|
+
preflight: typeof preflightProjectDirectory;
|
|
26
|
+
}
|
|
27
|
+
export interface RecoverProjectBindingArgs {
|
|
28
|
+
label: string;
|
|
29
|
+
path: string;
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface RecoverProjectBindingResult {
|
|
33
|
+
label: string;
|
|
34
|
+
projectPath: string;
|
|
35
|
+
markerPath: string;
|
|
36
|
+
alreadyBound: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare class ProjectCreationPartialFailureError extends Error {
|
|
39
|
+
readonly createdLabel: string;
|
|
40
|
+
readonly projectPath: string;
|
|
41
|
+
constructor(message: string, createdLabel: string, projectPath: string);
|
|
42
|
+
}
|
|
43
|
+
export declare function validateMode(args: ProjectCreationArgs): 'bound' | 'memory-only';
|
|
44
|
+
export declare function canonicalDirectory(directory: string): string;
|
|
45
|
+
export declare function preflightProjectDirectory(directory: string): void;
|
|
46
|
+
export declare function createProjectCoordinated(store: TimStore, args: ProjectCreationArgs, deps?: Partial<ProjectCreationDeps>): Promise<ProjectCreationResult>;
|
|
47
|
+
export declare function recoverProjectBinding(store: TimStore, args: RecoverProjectBindingArgs, deps?: Partial<ProjectCreationDeps>): Promise<RecoverProjectBindingResult>;
|
|
48
|
+
//# sourceMappingURL=project-creation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-creation.d.ts","sourceRoot":"","sources":["../src/project-creation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAIL,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,UAAU,iKAAiK,CAAC;AAEzL,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,+BAAgC,SAAQ,KAAK;IAC5D,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,qBAAqB,GAC7B,+BAA+B,GAC/B,0BAA0B,CAAC;AAE/B,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,cAAc,EAAE,OAAO,oBAAoB,CAAC;IAC5C,SAAS,EAAE,OAAO,yBAAyB,CAAC;CAC7C;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,kCAAmC,SAAQ,KAAK;aAGzC,YAAY,EAAE,MAAM;aACpB,WAAW,EAAE,MAAM;gBAFnC,OAAO,EAAE,MAAM,EACC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM;CAKtC;AAQD,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,GAAG,aAAa,CAY/E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkB5D;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CASjE;AAmFD,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,mBAAmB,EACzB,IAAI,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACtC,OAAO,CAAC,qBAAqB,CAAC,CA6EhC;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,yBAAyB,EAC/B,IAAI,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACtC,OAAO,CAAC,2BAA2B,CAAC,CAoDtC"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ProjectCreationPartialFailureError = exports.MODE_ERROR = void 0;
|
|
37
|
+
exports.validateMode = validateMode;
|
|
38
|
+
exports.canonicalDirectory = canonicalDirectory;
|
|
39
|
+
exports.preflightProjectDirectory = preflightProjectDirectory;
|
|
40
|
+
exports.createProjectCoordinated = createProjectCoordinated;
|
|
41
|
+
exports.recoverProjectBinding = recoverProjectBinding;
|
|
42
|
+
const crypto = __importStar(require("node:crypto"));
|
|
43
|
+
const fs = __importStar(require("node:fs"));
|
|
44
|
+
const os = __importStar(require("node:os"));
|
|
45
|
+
const path = __importStar(require("node:path"));
|
|
46
|
+
const marker_js_1 = require("./marker.js");
|
|
47
|
+
exports.MODE_ERROR = 'Exactly one creation mode is required. Pass an absolute project path for a repository/workspace, or memoryOnly: true only when no directory should be bound.';
|
|
48
|
+
class ProjectCreationPartialFailureError extends Error {
|
|
49
|
+
createdLabel;
|
|
50
|
+
projectPath;
|
|
51
|
+
constructor(message, createdLabel, projectPath) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.createdLabel = createdLabel;
|
|
54
|
+
this.projectPath = projectPath;
|
|
55
|
+
this.name = 'ProjectCreationPartialFailureError';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.ProjectCreationPartialFailureError = ProjectCreationPartialFailureError;
|
|
59
|
+
const DEFAULT_DEPS = {
|
|
60
|
+
sessionId: () => crypto.randomUUID(),
|
|
61
|
+
writeExclusive: marker_js_1.writeMarkerExclusive,
|
|
62
|
+
preflight: preflightProjectDirectory,
|
|
63
|
+
};
|
|
64
|
+
function validateMode(args) {
|
|
65
|
+
const hasPath = typeof args.path === 'string' && args.path.length > 0;
|
|
66
|
+
const isMemoryOnly = args.memoryOnly === true;
|
|
67
|
+
if (hasPath === isMemoryOnly) {
|
|
68
|
+
throw new Error(exports.MODE_ERROR);
|
|
69
|
+
}
|
|
70
|
+
if (isMemoryOnly && args.metadata && Object.prototype.hasOwnProperty.call(args.metadata, 'path')) {
|
|
71
|
+
throw new Error('metadata.path is service-owned and cannot be supplied in memory-only mode');
|
|
72
|
+
}
|
|
73
|
+
return isMemoryOnly ? 'memory-only' : 'bound';
|
|
74
|
+
}
|
|
75
|
+
function canonicalDirectory(directory) {
|
|
76
|
+
const environmentShorthand = /\$(?:\{|[A-Za-z_])|%[A-Za-z_][A-Za-z0-9_]*%/;
|
|
77
|
+
if (directory.startsWith('~') || environmentShorthand.test(directory)) {
|
|
78
|
+
throw new Error(`Project path must not use home or environment shorthand: ${directory}`);
|
|
79
|
+
}
|
|
80
|
+
if (!path.isAbsolute(directory)) {
|
|
81
|
+
throw new Error(`Pass an absolute project path; received: ${directory}`);
|
|
82
|
+
}
|
|
83
|
+
const canonical = fs.realpathSync(directory);
|
|
84
|
+
if (!fs.statSync(canonical).isDirectory()) {
|
|
85
|
+
throw new Error(`Project path must be a directory: ${directory}`);
|
|
86
|
+
}
|
|
87
|
+
if (canonical === fs.realpathSync(os.homedir())) {
|
|
88
|
+
throw new Error('The home directory cannot be bound as a project directory');
|
|
89
|
+
}
|
|
90
|
+
return canonical;
|
|
91
|
+
}
|
|
92
|
+
function preflightProjectDirectory(directory) {
|
|
93
|
+
const probe = path.join(directory, `.tim-write-probe.${process.pid}.${crypto.randomUUID()}`);
|
|
94
|
+
let ownsProbe = false;
|
|
95
|
+
try {
|
|
96
|
+
fs.writeFileSync(probe, '', { flag: 'wx' });
|
|
97
|
+
ownsProbe = true;
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
if (ownsProbe)
|
|
101
|
+
fs.rmSync(probe, { force: true });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const UNKNOWN_LOCAL_MARKER = Symbol('unknown-local-marker');
|
|
105
|
+
function localMarkerLabel(projectPath) {
|
|
106
|
+
const marker = (0, marker_js_1.markerPath)(projectPath);
|
|
107
|
+
let markerStat;
|
|
108
|
+
try {
|
|
109
|
+
markerStat = fs.lstatSync(marker);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (error.code === 'ENOENT')
|
|
113
|
+
return null;
|
|
114
|
+
return UNKNOWN_LOCAL_MARKER;
|
|
115
|
+
}
|
|
116
|
+
if (markerStat.isSymbolicLink()) {
|
|
117
|
+
try {
|
|
118
|
+
markerStat = fs.statSync(marker);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return UNKNOWN_LOCAL_MARKER;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!markerStat.isFile())
|
|
125
|
+
return UNKNOWN_LOCAL_MARKER;
|
|
126
|
+
return (0, marker_js_1.readMarker)(projectPath)?.project ?? UNKNOWN_LOCAL_MARKER;
|
|
127
|
+
}
|
|
128
|
+
function shellSingleQuote(value) {
|
|
129
|
+
return `'${value.replaceAll("'", "'\"'\"'")}'`;
|
|
130
|
+
}
|
|
131
|
+
function markerInput(label, session) {
|
|
132
|
+
return {
|
|
133
|
+
project: label,
|
|
134
|
+
session,
|
|
135
|
+
exchanges: 0,
|
|
136
|
+
batch_size: 5,
|
|
137
|
+
batches_summarized: 0,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function recoveryCommand(databasePath, label, projectPath) {
|
|
141
|
+
return `TIM_DB_PATH=${shellSingleQuote(databasePath)} tim bind-project --label ${shellSingleQuote(label)} --cwd ${shellSingleQuote(projectPath)}`;
|
|
142
|
+
}
|
|
143
|
+
function errorText(error) {
|
|
144
|
+
return error instanceof Error ? error.message : String(error);
|
|
145
|
+
}
|
|
146
|
+
function targetMarkerConflict(markerPath, label) {
|
|
147
|
+
const owner = label === UNKNOWN_LOCAL_MARKER ? 'an unknown or corrupt marker' : `project ${label}`;
|
|
148
|
+
return new Error(`A target-local project marker already exists at ${markerPath} and belongs to ${owner}. ` +
|
|
149
|
+
'Remove it only if it is stale, or explicitly reconcile/rebind this directory before creating a project.');
|
|
150
|
+
}
|
|
151
|
+
function publicationFailure(databasePath, label, projectPath, reason) {
|
|
152
|
+
return new ProjectCreationPartialFailureError(`Project ${label} was created in the database, but its local marker was not published or verified at ${projectPath}: ${reason}. ` +
|
|
153
|
+
`Recover the binding with: ${recoveryCommand(databasePath, label, projectPath)}`, label, projectPath);
|
|
154
|
+
}
|
|
155
|
+
function publicationRace(requested, winner, projectPath) {
|
|
156
|
+
const winnerText = winner === UNKNOWN_LOCAL_MARKER ? 'an unknown or corrupt marker' : `project ${winner}`;
|
|
157
|
+
return new ProjectCreationPartialFailureError(`Project ${requested} was created in the database, but ${winnerText} won marker publication at ${projectPath}. ` +
|
|
158
|
+
`The existing marker was preserved. Explicit reconciliation is required between the requested project ${requested} and the marker winner; do not overwrite the marker.`, requested, projectPath);
|
|
159
|
+
}
|
|
160
|
+
async function createProjectCoordinated(store, args, deps = {}) {
|
|
161
|
+
const runtime = {
|
|
162
|
+
sessionId: deps.sessionId ?? DEFAULT_DEPS.sessionId,
|
|
163
|
+
writeExclusive: deps.writeExclusive ?? DEFAULT_DEPS.writeExclusive,
|
|
164
|
+
preflight: deps.preflight ?? DEFAULT_DEPS.preflight,
|
|
165
|
+
};
|
|
166
|
+
const mode = validateMode(args);
|
|
167
|
+
if (mode === 'memory-only') {
|
|
168
|
+
const entry = await store.createProject(args.label, {
|
|
169
|
+
content: args.content,
|
|
170
|
+
metadata: args.metadata,
|
|
171
|
+
aliases: args.aliases,
|
|
172
|
+
});
|
|
173
|
+
return { ...entry, mode };
|
|
174
|
+
}
|
|
175
|
+
if (store.getDatabasePath() === ':memory:') {
|
|
176
|
+
throw new Error('Bound projects require a persistent database. Configure TIM_DB_PATH to a filesystem database, ' +
|
|
177
|
+
'then retry; use memoryOnly:true only for an intentionally virtual project.');
|
|
178
|
+
}
|
|
179
|
+
const projectPath = canonicalDirectory(args.path);
|
|
180
|
+
if (!(0, marker_js_1.validateProjectLabel)(args.label)) {
|
|
181
|
+
throw new Error(`Invalid project label for a bound project: ${args.label}`);
|
|
182
|
+
}
|
|
183
|
+
const markerPath = (0, marker_js_1.markerPath)(projectPath);
|
|
184
|
+
const existing = localMarkerLabel(projectPath);
|
|
185
|
+
if (existing !== null) {
|
|
186
|
+
throw new Error(`${targetMarkerConflict(markerPath, existing).message} Requested project: ${args.label}.`);
|
|
187
|
+
}
|
|
188
|
+
runtime.preflight(projectPath);
|
|
189
|
+
const resolved = await store.resolveProjectLabel(args.label);
|
|
190
|
+
if (resolved.status !== 'not_found') {
|
|
191
|
+
const detail = resolved.status === 'found'
|
|
192
|
+
? resolved.label === args.label
|
|
193
|
+
? 'already exists'
|
|
194
|
+
: `already resolves to project ${resolved.label}`
|
|
195
|
+
: 'has an ambiguous project-label conflict';
|
|
196
|
+
throw new Error(`Project label ${args.label} ${detail}`);
|
|
197
|
+
}
|
|
198
|
+
const entry = await store.createProject(args.label, {
|
|
199
|
+
content: args.content,
|
|
200
|
+
metadata: { ...(args.metadata ?? {}), path: projectPath },
|
|
201
|
+
aliases: args.aliases,
|
|
202
|
+
});
|
|
203
|
+
try {
|
|
204
|
+
runtime.writeExclusive(projectPath, markerInput(args.label, runtime.sessionId()));
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
const winner = localMarkerLabel(projectPath);
|
|
208
|
+
if (winner !== null && winner !== args.label) {
|
|
209
|
+
throw publicationRace(args.label, winner, projectPath);
|
|
210
|
+
}
|
|
211
|
+
if (winner !== args.label) {
|
|
212
|
+
throw publicationFailure(store.getDatabasePath(), args.label, projectPath, errorText(error));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const verified = localMarkerLabel(projectPath);
|
|
216
|
+
if (verified !== args.label) {
|
|
217
|
+
if (verified !== null)
|
|
218
|
+
throw publicationRace(args.label, verified, projectPath);
|
|
219
|
+
throw publicationFailure(store.getDatabasePath(), args.label, projectPath, 'the marker is absent after publication');
|
|
220
|
+
}
|
|
221
|
+
return { ...entry, mode, projectPath, markerPath };
|
|
222
|
+
}
|
|
223
|
+
async function recoverProjectBinding(store, args, deps = {}) {
|
|
224
|
+
const runtime = {
|
|
225
|
+
sessionId: deps.sessionId ?? DEFAULT_DEPS.sessionId,
|
|
226
|
+
writeExclusive: deps.writeExclusive ?? DEFAULT_DEPS.writeExclusive,
|
|
227
|
+
preflight: deps.preflight ?? DEFAULT_DEPS.preflight,
|
|
228
|
+
};
|
|
229
|
+
const projectPath = canonicalDirectory(args.path);
|
|
230
|
+
const markerPath = (0, marker_js_1.markerPath)(projectPath);
|
|
231
|
+
const resolved = await store.resolveProjectLabel(args.label);
|
|
232
|
+
if (resolved.status !== 'found' || resolved.label !== args.label) {
|
|
233
|
+
throw new Error(`Live project label not found: ${args.label}`);
|
|
234
|
+
}
|
|
235
|
+
const existing = localMarkerLabel(projectPath);
|
|
236
|
+
if (existing === args.label) {
|
|
237
|
+
return { label: args.label, projectPath, markerPath, alreadyBound: true };
|
|
238
|
+
}
|
|
239
|
+
if (existing !== null) {
|
|
240
|
+
throw new Error(`${targetMarkerConflict(markerPath, existing).message} Requested project: ${args.label}.`);
|
|
241
|
+
}
|
|
242
|
+
runtime.preflight(projectPath);
|
|
243
|
+
try {
|
|
244
|
+
runtime.writeExclusive(projectPath, markerInput(args.label, args.sessionId ?? runtime.sessionId()));
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
const winner = localMarkerLabel(projectPath);
|
|
248
|
+
if (winner === args.label) {
|
|
249
|
+
return { label: args.label, projectPath, markerPath, alreadyBound: true };
|
|
250
|
+
}
|
|
251
|
+
if (winner !== null) {
|
|
252
|
+
throw new Error(`${targetMarkerConflict(markerPath, winner).message} Requested project: ${args.label}.`);
|
|
253
|
+
}
|
|
254
|
+
throw new Error(`Could not recover project binding for ${args.label} at ${projectPath}: ${errorText(error)}`);
|
|
255
|
+
}
|
|
256
|
+
const verified = localMarkerLabel(projectPath);
|
|
257
|
+
if (verified !== args.label) {
|
|
258
|
+
if (verified !== null) {
|
|
259
|
+
throw new Error(`${targetMarkerConflict(markerPath, verified).message} Requested project: ${args.label}.`);
|
|
260
|
+
}
|
|
261
|
+
throw new Error(`Could not verify recovered project binding for ${args.label} at ${projectPath}`);
|
|
262
|
+
}
|
|
263
|
+
return { label: args.label, projectPath, markerPath, alreadyBound: false };
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=project-creation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-creation.js","sourceRoot":"","sources":["../src/project-creation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TimStore } from 'tim-store';
|
|
2
|
+
export interface PromptSubmitParams {
|
|
3
|
+
prompt: string;
|
|
4
|
+
projectLabel?: string;
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface PromptSubmitResult {
|
|
8
|
+
lines: string[];
|
|
9
|
+
context: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* UserPromptSubmit hook: hybrid FTS retrieval + optional guard warnings.
|
|
13
|
+
* Never throws; returns null when disabled, empty, slow, or on error.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runPromptSubmit(store: TimStore, params: PromptSubmitParams): Promise<PromptSubmitResult | null>;
|
|
16
|
+
//# sourceMappingURL=prompt-submit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-submit.d.ts","sourceRoot":"","sources":["../src/prompt-submit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAS1C,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAyDD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAWpC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runPromptSubmit = runPromptSubmit;
|
|
4
|
+
const tim_core_1 = require("tim-core");
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 1000;
|
|
6
|
+
const RETRIEVAL_TOP_K = 3;
|
|
7
|
+
/** Prompt looks like a planned action — run tim_guard-style failure lookup. */
|
|
8
|
+
const ACTION_PATTERN = /\b(run|deploy|upload|push|delete|migrate|install|spawn|execute|commit|publish|rmapi|restart|drop|truncate)\b/i;
|
|
9
|
+
function excerpt(text, max = 120) {
|
|
10
|
+
const t = text.replace(/\s+/g, ' ').trim();
|
|
11
|
+
return t.length > max ? `${t.slice(0, max - 1)}…` : t;
|
|
12
|
+
}
|
|
13
|
+
function looksLikeAction(prompt) {
|
|
14
|
+
return ACTION_PATTERN.test(prompt);
|
|
15
|
+
}
|
|
16
|
+
function raceWithTimeout(promise, timeoutMs) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const timer = setTimeout(() => resolve(null), timeoutMs);
|
|
19
|
+
promise.then((v) => { clearTimeout(timer); resolve(v); }, () => { clearTimeout(timer); resolve(null); });
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function computePromptContext(store, params) {
|
|
23
|
+
const query = params.prompt.trim();
|
|
24
|
+
if (!query)
|
|
25
|
+
return null;
|
|
26
|
+
const lines = [];
|
|
27
|
+
let hits = await store.search({
|
|
28
|
+
query,
|
|
29
|
+
topK: RETRIEVAL_TOP_K * 3,
|
|
30
|
+
searchType: 'fts',
|
|
31
|
+
});
|
|
32
|
+
if (params.projectLabel) {
|
|
33
|
+
hits = hits.filter(e => store.getProjectLabel(e.id) === params.projectLabel);
|
|
34
|
+
}
|
|
35
|
+
for (const hit of hits.slice(0, RETRIEVAL_TOP_K)) {
|
|
36
|
+
const label = hit.title?.trim() || hit.id;
|
|
37
|
+
lines.push(`TIM erinnert: ${label} — ${excerpt(hit.content || hit.title)}`);
|
|
38
|
+
}
|
|
39
|
+
if (looksLikeAction(query)) {
|
|
40
|
+
const failures = await store.searchFailures(query, {
|
|
41
|
+
projectLabel: params.projectLabel,
|
|
42
|
+
limit: 3,
|
|
43
|
+
});
|
|
44
|
+
for (const f of failures) {
|
|
45
|
+
const kind = typeof f.metadata.kind === 'string' ? f.metadata.kind : 'warning';
|
|
46
|
+
lines.push(`TIM guard (${kind}): ${f.title} [${f.id}] — ${excerpt(f.content)}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (lines.length === 0)
|
|
50
|
+
return null;
|
|
51
|
+
return { lines, context: lines.join('\n') };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* UserPromptSubmit hook: hybrid FTS retrieval + optional guard warnings.
|
|
55
|
+
* Never throws; returns null when disabled, empty, slow, or on error.
|
|
56
|
+
*/
|
|
57
|
+
async function runPromptSubmit(store, params) {
|
|
58
|
+
const config = (0, tim_core_1.loadConfig)();
|
|
59
|
+
if (config.hooks?.promptSubmit?.enabled === false)
|
|
60
|
+
return null;
|
|
61
|
+
const timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
62
|
+
try {
|
|
63
|
+
return await raceWithTimeout(computePromptContext(store, params), timeoutMs);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=prompt-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-submit.js","sourceRoot":"","sources":["../src/prompt-submit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TimStore } from 'tim-store';
|
|
2
|
+
export interface RebalanceSkip {
|
|
3
|
+
reason: 'locked' | 'single-exchange-batch' | 'unrelated' | 'no-boundary';
|
|
4
|
+
batchIndex?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface RebalanceResult {
|
|
7
|
+
moved: number;
|
|
8
|
+
skipped: RebalanceSkip[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Scan exchange-batch boundaries; move the first exchange of batch N (+ agent reply)
|
|
12
|
+
* into batch N-1 when it is topically related to the last exchange of N-1.
|
|
13
|
+
*/
|
|
14
|
+
export declare function rebalanceBatch(store: TimStore, sessionId: string, opts?: {
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}): Promise<RebalanceResult>;
|
|
17
|
+
//# sourceMappingURL=rebalance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebalance.d.ts","sourceRoot":"","sources":["../src/rebalance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAc1C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,GAAG,uBAAuB,GAAG,WAAW,GAAG,aAAa,CAAC;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAgCD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1B,OAAO,CAAC,eAAe,CAAC,CAuD1B"}
|