@gramatr/mcp 0.8.11 → 0.9.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/dist/bin/gramatr-mcp.d.ts +1 -0
- package/dist/bin/gramatr-mcp.d.ts.map +1 -1
- package/dist/bin/gramatr-mcp.js +81 -0
- package/dist/bin/gramatr-mcp.js.map +1 -1
- package/dist/hooks/generated/schema-constants.d.ts +2 -2
- package/dist/hooks/generated/schema-constants.d.ts.map +1 -1
- package/dist/hooks/generated/schema-constants.js +2 -2
- package/dist/hooks/generated/schema-constants.js.map +1 -1
- package/dist/hooks/lib/git-remote-parser.d.ts +65 -0
- package/dist/hooks/lib/git-remote-parser.d.ts.map +1 -0
- package/dist/hooks/lib/git-remote-parser.js +172 -0
- package/dist/hooks/lib/git-remote-parser.js.map +1 -0
- package/dist/hooks/lib/gramatr-hook-utils.d.ts +1 -1
- package/dist/hooks/lib/gramatr-hook-utils.d.ts.map +1 -1
- package/dist/hooks/lib/gramatr-hook-utils.js +4 -5
- package/dist/hooks/lib/gramatr-hook-utils.js.map +1 -1
- package/dist/hooks/lib/hook-state.d.ts +21 -0
- package/dist/hooks/lib/hook-state.d.ts.map +1 -1
- package/dist/hooks/lib/hook-state.js +46 -0
- package/dist/hooks/lib/hook-state.js.map +1 -1
- package/dist/hooks/lib/project-file.d.ts +22 -0
- package/dist/hooks/lib/project-file.d.ts.map +1 -0
- package/dist/hooks/lib/project-file.js +44 -0
- package/dist/hooks/lib/project-file.js.map +1 -0
- package/dist/hooks/lib/session.d.ts +17 -1
- package/dist/hooks/lib/session.d.ts.map +1 -1
- package/dist/hooks/lib/session.js +65 -2
- package/dist/hooks/lib/session.js.map +1 -1
- package/dist/hooks/lib/sync-projects.d.ts +32 -0
- package/dist/hooks/lib/sync-projects.d.ts.map +1 -0
- package/dist/hooks/lib/sync-projects.js +120 -0
- package/dist/hooks/lib/sync-projects.js.map +1 -0
- package/dist/hooks/lib/types.d.ts +4 -0
- package/dist/hooks/lib/types.d.ts.map +1 -1
- package/dist/hooks/session-end.d.ts.map +1 -1
- package/dist/hooks/session-end.js +9 -2
- package/dist/hooks/session-end.js.map +1 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +24 -2
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/user-prompt-submit.d.ts.map +1 -1
- package/dist/hooks/user-prompt-submit.js +11 -1
- package/dist/hooks/user-prompt-submit.js.map +1 -1
- package/dist/setup/generated/instruction-blocks.d.ts +15 -1
- package/dist/setup/generated/instruction-blocks.d.ts.map +1 -1
- package/dist/setup/generated/instruction-blocks.js +15 -1
- package/dist/setup/generated/instruction-blocks.js.map +1 -1
- package/dist/setup/instructions.d.ts.map +1 -1
- package/dist/setup/instructions.js +13 -1
- package/dist/setup/instructions.js.map +1 -1
- package/package.json +1 -1
|
@@ -75,6 +75,15 @@ export interface SessionLogEntry {
|
|
|
75
75
|
agent_name: string | null;
|
|
76
76
|
synced_at: string | null;
|
|
77
77
|
}
|
|
78
|
+
export interface LocalProject {
|
|
79
|
+
id: string;
|
|
80
|
+
slug: string;
|
|
81
|
+
git_remote: string | null;
|
|
82
|
+
directory: string | null;
|
|
83
|
+
org_id: string | null;
|
|
84
|
+
created_at: string;
|
|
85
|
+
updated_at: string;
|
|
86
|
+
}
|
|
78
87
|
/** Lean shape received from server during session-start sync (Issue #720). */
|
|
79
88
|
export interface RemoteSessionRecord {
|
|
80
89
|
id: string;
|
|
@@ -164,4 +173,16 @@ export declare function migrateProjectId(oldProjectId: string, newProjectId: str
|
|
|
164
173
|
export declare function markSessionSynced(sessionId: string, syncedAt?: string): void;
|
|
165
174
|
/** Count total sessions for a project (for "Session #N" display). */
|
|
166
175
|
export declare function getProjectSessionCount(projectId: string): number;
|
|
176
|
+
/** Upsert a project record in the local SQLite database. */
|
|
177
|
+
export declare function upsertLocalProject(project: {
|
|
178
|
+
id: string;
|
|
179
|
+
slug: string;
|
|
180
|
+
git_remote?: string | null;
|
|
181
|
+
directory?: string | null;
|
|
182
|
+
org_id?: string | null;
|
|
183
|
+
}): void;
|
|
184
|
+
/** Look up a project by its slug. */
|
|
185
|
+
export declare function getLocalProjectBySlug(slug: string): LocalProject | null;
|
|
186
|
+
/** Look up a project by its directory path. */
|
|
187
|
+
export declare function getLocalProjectByDirectory(directory: string): LocalProject | null;
|
|
167
188
|
//# sourceMappingURL=hook-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-state.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/hook-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IAEpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"hook-state.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/hook-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -132,6 +132,18 @@ function getDb() {
|
|
|
132
132
|
CREATE UNIQUE INDEX IF NOT EXISTS session_log_session_id
|
|
133
133
|
ON session_log(session_id)
|
|
134
134
|
WHERE session_id IS NOT NULL;
|
|
135
|
+
|
|
136
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
137
|
+
id TEXT PRIMARY KEY,
|
|
138
|
+
slug TEXT NOT NULL,
|
|
139
|
+
git_remote TEXT,
|
|
140
|
+
directory TEXT,
|
|
141
|
+
org_id TEXT,
|
|
142
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
143
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
144
|
+
);
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_projects_slug ON projects(slug);
|
|
146
|
+
CREATE INDEX IF NOT EXISTS idx_projects_directory ON projects(directory);
|
|
135
147
|
`);
|
|
136
148
|
// Migrate existing DBs: add columns that were added after initial schema.
|
|
137
149
|
// These are no-ops if the column already exists (SQLite 3.37+ IF NOT EXISTS).
|
|
@@ -460,4 +472,38 @@ export function getProjectSessionCount(projectId) {
|
|
|
460
472
|
.get(projectId);
|
|
461
473
|
return row?.cnt ?? 0;
|
|
462
474
|
}
|
|
475
|
+
// ── Projects — local project identity persistence (#947) ──
|
|
476
|
+
/** Upsert a project record in the local SQLite database. */
|
|
477
|
+
export function upsertLocalProject(project) {
|
|
478
|
+
getDb().prepare(`
|
|
479
|
+
INSERT INTO projects (id, slug, git_remote, directory, org_id, updated_at)
|
|
480
|
+
VALUES (@id, @slug, @git_remote, @directory, @org_id, datetime('now'))
|
|
481
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
482
|
+
slug = excluded.slug,
|
|
483
|
+
git_remote = COALESCE(excluded.git_remote, projects.git_remote),
|
|
484
|
+
directory = COALESCE(excluded.directory, projects.directory),
|
|
485
|
+
org_id = COALESCE(excluded.org_id, projects.org_id),
|
|
486
|
+
updated_at = datetime('now')
|
|
487
|
+
`).run(p({
|
|
488
|
+
id: project.id,
|
|
489
|
+
slug: project.slug,
|
|
490
|
+
git_remote: project.git_remote ?? null,
|
|
491
|
+
directory: project.directory ?? null,
|
|
492
|
+
org_id: project.org_id ?? null,
|
|
493
|
+
}));
|
|
494
|
+
}
|
|
495
|
+
/** Look up a project by its slug. */
|
|
496
|
+
export function getLocalProjectBySlug(slug) {
|
|
497
|
+
const row = getDb()
|
|
498
|
+
.prepare('SELECT * FROM projects WHERE slug = ? ORDER BY updated_at DESC LIMIT 1')
|
|
499
|
+
.get(slug);
|
|
500
|
+
return row ?? null;
|
|
501
|
+
}
|
|
502
|
+
/** Look up a project by its directory path. */
|
|
503
|
+
export function getLocalProjectByDirectory(directory) {
|
|
504
|
+
const row = getDb()
|
|
505
|
+
.prepare('SELECT * FROM projects WHERE directory = ? ORDER BY updated_at DESC LIMIT 1')
|
|
506
|
+
.get(directory);
|
|
507
|
+
return row ?? null;
|
|
508
|
+
}
|
|
463
509
|
//# sourceMappingURL=hook-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-state.js","sourceRoot":"","sources":["../../../src/hooks/lib/hook-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"hook-state.js","sourceRoot":"","sources":["../../../src/hooks/lib/hook-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* project-file.ts — Read/write `.gramatr/project.json` for local project identity (#947).
|
|
3
|
+
*
|
|
4
|
+
* This file persists the server-resolved project UUID and slug to the project
|
|
5
|
+
* directory so subsequent sessions can resolve the project locally without
|
|
6
|
+
* asking the server.
|
|
7
|
+
*/
|
|
8
|
+
export interface ProjectFileData {
|
|
9
|
+
project_id: string;
|
|
10
|
+
slug: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Write `{projectDir}/.gramatr/project.json` with the resolved project identity.
|
|
14
|
+
* Creates the `.gramatr/` directory if it does not exist.
|
|
15
|
+
*/
|
|
16
|
+
export declare function writeProjectFile(projectDir: string, data: ProjectFileData): void;
|
|
17
|
+
/**
|
|
18
|
+
* Read `{projectDir}/.gramatr/project.json`.
|
|
19
|
+
* Returns null if the file does not exist or contains invalid JSON.
|
|
20
|
+
*/
|
|
21
|
+
export declare function readProjectFile(projectDir: string): ProjectFileData | null;
|
|
22
|
+
//# sourceMappingURL=project-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-file.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/project-file.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAOhF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAa1E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* project-file.ts — Read/write `.gramatr/project.json` for local project identity (#947).
|
|
3
|
+
*
|
|
4
|
+
* This file persists the server-resolved project UUID and slug to the project
|
|
5
|
+
* directory so subsequent sessions can resolve the project locally without
|
|
6
|
+
* asking the server.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
const PROJECT_FILE_NAME = 'project.json';
|
|
11
|
+
const GRAMATR_DIR = '.gramatr';
|
|
12
|
+
/**
|
|
13
|
+
* Write `{projectDir}/.gramatr/project.json` with the resolved project identity.
|
|
14
|
+
* Creates the `.gramatr/` directory if it does not exist.
|
|
15
|
+
*/
|
|
16
|
+
export function writeProjectFile(projectDir, data) {
|
|
17
|
+
const dir = join(projectDir, GRAMATR_DIR);
|
|
18
|
+
if (!existsSync(dir)) {
|
|
19
|
+
mkdirSync(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
const filePath = join(dir, PROJECT_FILE_NAME);
|
|
22
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read `{projectDir}/.gramatr/project.json`.
|
|
26
|
+
* Returns null if the file does not exist or contains invalid JSON.
|
|
27
|
+
*/
|
|
28
|
+
export function readProjectFile(projectDir) {
|
|
29
|
+
const filePath = join(projectDir, GRAMATR_DIR, PROJECT_FILE_NAME);
|
|
30
|
+
try {
|
|
31
|
+
if (!existsSync(filePath))
|
|
32
|
+
return null;
|
|
33
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
34
|
+
const parsed = JSON.parse(raw);
|
|
35
|
+
if (typeof parsed.project_id !== 'string' || typeof parsed.slug !== 'string') {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return { project_id: parsed.project_id, slug: parsed.slug };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=project-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-file.js","sourceRoot":"","sources":["../../../src/hooks/lib/project-file.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AACzC,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,IAAqB;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC9C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -18,6 +18,15 @@ export declare function normalizeSessionStartResponse(response: SessionStartResp
|
|
|
18
18
|
export declare function prepareProjectSessionState(options: {
|
|
19
19
|
git: GitContext;
|
|
20
20
|
}): PreparedProjectSession;
|
|
21
|
+
/**
|
|
22
|
+
* Attempt to resolve the project UUID from local caches before calling the server.
|
|
23
|
+
* Checks: (1) .gramatr/project.json, (2) SQLite by slug, (3) SQLite by directory.
|
|
24
|
+
* Returns the UUID if found, or null if the server must resolve it.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveLocalProjectUuid(options: {
|
|
27
|
+
directory: string;
|
|
28
|
+
projectName?: string;
|
|
29
|
+
}): string | null;
|
|
21
30
|
export declare function startRemoteSession(options: {
|
|
22
31
|
clientType: string;
|
|
23
32
|
sessionId?: string;
|
|
@@ -26,12 +35,19 @@ export declare function startRemoteSession(options: {
|
|
|
26
35
|
gitRemote: string;
|
|
27
36
|
gitBranch?: string;
|
|
28
37
|
directory: string;
|
|
38
|
+
/** Pre-resolved UUID from local cache — lets the server skip resolution. */
|
|
39
|
+
projectUuid?: string;
|
|
29
40
|
}): Promise<SessionStartResponse | null>;
|
|
30
41
|
export declare function loadProjectHandoff(projectId: string): Promise<HandoffResponse | null>;
|
|
31
42
|
/**
|
|
32
43
|
* Persist the server-resolved project_id back to settings.json.
|
|
33
44
|
* The server may assign a stable UUID the first time a project is registered;
|
|
34
45
|
* storing it locally ensures all subsequent sessions use the same ID.
|
|
46
|
+
*
|
|
47
|
+
* Also persists to local SQLite projects table and `.gramatr/project.json`
|
|
48
|
+
* so subsequent sessions can resolve the project identity without the server (#947).
|
|
35
49
|
*/
|
|
36
|
-
export declare function persistSessionRegistration(rootDir: string, response: SessionStartResponse | null
|
|
50
|
+
export declare function persistSessionRegistration(rootDir: string, response: SessionStartResponse | null, options?: {
|
|
51
|
+
gitRemote?: string;
|
|
52
|
+
}): GmtrConfig | null;
|
|
37
53
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,UAAU,EAKhB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,UAAU,EAKhB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAKxE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAChD;IACD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,OAAO,YAAY,EAAE,mBAAmB,EAAE,CAAC;CAC5D,CAQA;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,GAAG,EAAE,UAAU,CAAC;CACjB,GAAG,sBAAsB,CA2CzB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,GAAG,IAAI,CAkChB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAgBvC;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAU3F;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,oBAAoB,GAAG,IAAI,EACrC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,UAAU,GAAG,IAAI,CAiCnB"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createDefaultConfig, deriveProjectId, migrateConfig, now, readGmtrConfig, writeGmtrConfig, } from './gramatr-hook-utils.js';
|
|
2
2
|
import { callTool } from '../../proxy/local-client.js';
|
|
3
|
-
import { migrateProjectId } from './hook-state.js';
|
|
3
|
+
import { getLocalProjectByDirectory, getLocalProjectBySlug, migrateProjectId, upsertLocalProject } from './hook-state.js';
|
|
4
4
|
import { extractToolPayload } from './tool-envelope.js';
|
|
5
|
+
import { readProjectFile, writeProjectFile } from './project-file.js';
|
|
5
6
|
export function normalizeSessionStartResponse(response) {
|
|
6
7
|
return {
|
|
7
8
|
interactionId: response?.interaction_id || response?.interactionId || null,
|
|
@@ -51,6 +52,46 @@ export function prepareProjectSessionState(options) {
|
|
|
51
52
|
created,
|
|
52
53
|
};
|
|
53
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Attempt to resolve the project UUID from local caches before calling the server.
|
|
57
|
+
* Checks: (1) .gramatr/project.json, (2) SQLite by slug, (3) SQLite by directory.
|
|
58
|
+
* Returns the UUID if found, or null if the server must resolve it.
|
|
59
|
+
*/
|
|
60
|
+
export function resolveLocalProjectUuid(options) {
|
|
61
|
+
// 1. Try project.json (fastest — no SQLite needed)
|
|
62
|
+
try {
|
|
63
|
+
const projectFile = readProjectFile(options.directory);
|
|
64
|
+
if (projectFile?.project_id) {
|
|
65
|
+
return projectFile.project_id;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Non-critical — fall through
|
|
70
|
+
}
|
|
71
|
+
// 2. Try SQLite by slug (derived from project name)
|
|
72
|
+
if (options.projectName) {
|
|
73
|
+
try {
|
|
74
|
+
const localProject = getLocalProjectBySlug(options.projectName);
|
|
75
|
+
if (localProject?.id) {
|
|
76
|
+
return localProject.id;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Non-critical — fall through
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 3. Try SQLite by directory
|
|
84
|
+
try {
|
|
85
|
+
const localProject = getLocalProjectByDirectory(options.directory);
|
|
86
|
+
if (localProject?.id) {
|
|
87
|
+
return localProject.id;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Non-critical — fall through
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
54
95
|
export async function startRemoteSession(options) {
|
|
55
96
|
try {
|
|
56
97
|
const raw = await callTool('gramatr_session_start', {
|
|
@@ -61,6 +102,7 @@ export async function startRemoteSession(options) {
|
|
|
61
102
|
...(options.gitBranch ? { git_branch: options.gitBranch } : {}),
|
|
62
103
|
directory: options.directory,
|
|
63
104
|
...(options.sessionId ? { session_id: options.sessionId } : {}),
|
|
105
|
+
...(options.projectUuid ? { project_uuid: options.projectUuid } : {}),
|
|
64
106
|
});
|
|
65
107
|
return extractToolPayload(raw);
|
|
66
108
|
}
|
|
@@ -81,8 +123,11 @@ export async function loadProjectHandoff(projectId) {
|
|
|
81
123
|
* Persist the server-resolved project_id back to settings.json.
|
|
82
124
|
* The server may assign a stable UUID the first time a project is registered;
|
|
83
125
|
* storing it locally ensures all subsequent sessions use the same ID.
|
|
126
|
+
*
|
|
127
|
+
* Also persists to local SQLite projects table and `.gramatr/project.json`
|
|
128
|
+
* so subsequent sessions can resolve the project identity without the server (#947).
|
|
84
129
|
*/
|
|
85
|
-
export function persistSessionRegistration(rootDir, response) {
|
|
130
|
+
export function persistSessionRegistration(rootDir, response, options) {
|
|
86
131
|
const config = readGmtrConfig(rootDir);
|
|
87
132
|
if (!config)
|
|
88
133
|
return null;
|
|
@@ -98,6 +143,24 @@ export function persistSessionRegistration(rootDir, response) {
|
|
|
98
143
|
catch { /* non-critical */ }
|
|
99
144
|
}
|
|
100
145
|
}
|
|
146
|
+
// Persist project identity to SQLite + project.json when we have a UUID and slug (#947)
|
|
147
|
+
const projectId = response?.project_id || config.project_id;
|
|
148
|
+
const slug = response?.project_slug;
|
|
149
|
+
if (projectId && slug) {
|
|
150
|
+
try {
|
|
151
|
+
upsertLocalProject({
|
|
152
|
+
id: projectId,
|
|
153
|
+
slug,
|
|
154
|
+
git_remote: options?.gitRemote ?? null,
|
|
155
|
+
directory: rootDir,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch { /* non-critical — SQLite may not have projects table on older installs */ }
|
|
159
|
+
try {
|
|
160
|
+
writeProjectFile(rootDir, { project_id: projectId, slug });
|
|
161
|
+
}
|
|
162
|
+
catch { /* non-critical — directory may not be writable */ }
|
|
163
|
+
}
|
|
101
164
|
return config;
|
|
102
165
|
}
|
|
103
166
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/hooks/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,eAAe,EAGf,aAAa,EACb,GAAG,EACH,cAAc,EACd,eAAe,GAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/hooks/lib/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sync-projects.ts — Client-side project sync heartbeat (#997).
|
|
3
|
+
*
|
|
4
|
+
* Fetches recently-updated projects from the server and upserts them into
|
|
5
|
+
* the local SQLite cache. Called on session-start (always) and periodically
|
|
6
|
+
* during active sessions (every 5 minutes).
|
|
7
|
+
*
|
|
8
|
+
* Graceful degradation: if the server is unreachable, skips silently.
|
|
9
|
+
*/
|
|
10
|
+
/** Periodic sync interval (ms). 5 minutes. */
|
|
11
|
+
export declare const SYNC_INTERVAL_MS: number;
|
|
12
|
+
/**
|
|
13
|
+
* Fetch projects updated since the last sync from the server and upsert
|
|
14
|
+
* them into the local SQLite cache.
|
|
15
|
+
*
|
|
16
|
+
* @returns Number of projects updated, or 0 on failure.
|
|
17
|
+
*/
|
|
18
|
+
export declare function syncProjectsFromServer(): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* Start periodic project sync (every 5 minutes).
|
|
21
|
+
* Safe to call multiple times — only one timer will be active.
|
|
22
|
+
*/
|
|
23
|
+
export declare function startPeriodicSync(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Stop periodic project sync. Primarily for tests.
|
|
26
|
+
*/
|
|
27
|
+
export declare function stopPeriodicSync(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Reset internal state. For tests only.
|
|
30
|
+
*/
|
|
31
|
+
export declare function _resetSyncState(): void;
|
|
32
|
+
//# sourceMappingURL=sync-projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-projects.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/sync-projects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,QAAgB,CAAC;AA8B9C;;;;;GAKG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CA8D9D;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAYxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sync-projects.ts — Client-side project sync heartbeat (#997).
|
|
3
|
+
*
|
|
4
|
+
* Fetches recently-updated projects from the server and upserts them into
|
|
5
|
+
* the local SQLite cache. Called on session-start (always) and periodically
|
|
6
|
+
* during active sessions (every 5 minutes).
|
|
7
|
+
*
|
|
8
|
+
* Graceful degradation: if the server is unreachable, skips silently.
|
|
9
|
+
*/
|
|
10
|
+
import { getServerUrl, getToken } from '../../server/auth.js';
|
|
11
|
+
import { upsertLocalProject } from './hook-state.js';
|
|
12
|
+
// ── Constants ────────────────────────────────────────────────────────────────
|
|
13
|
+
/** Sync request timeout (ms). */
|
|
14
|
+
const SYNC_TIMEOUT_MS = 5000;
|
|
15
|
+
/** Periodic sync interval (ms). 5 minutes. */
|
|
16
|
+
export const SYNC_INTERVAL_MS = 5 * 60 * 1000;
|
|
17
|
+
/** SQLite key for last sync timestamp — stored as a project with a well-known ID. */
|
|
18
|
+
const SYNC_META_PROJECT_ID = '__sync_meta__';
|
|
19
|
+
const SYNC_META_SLUG = '__sync_meta__';
|
|
20
|
+
// ── Internal state ───────────────────────────────────────────────────────────
|
|
21
|
+
let _lastSyncAt = null;
|
|
22
|
+
let _periodicTimer = null;
|
|
23
|
+
// ── Core sync function ───────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Fetch projects updated since the last sync from the server and upsert
|
|
26
|
+
* them into the local SQLite cache.
|
|
27
|
+
*
|
|
28
|
+
* @returns Number of projects updated, or 0 on failure.
|
|
29
|
+
*/
|
|
30
|
+
export async function syncProjectsFromServer() {
|
|
31
|
+
try {
|
|
32
|
+
const serverUrl = getServerUrl();
|
|
33
|
+
const token = getToken();
|
|
34
|
+
// Build URL with optional since parameter
|
|
35
|
+
const url = new URL(`${serverUrl}/api/v1/projects/sync`);
|
|
36
|
+
if (_lastSyncAt) {
|
|
37
|
+
url.searchParams.set('since', _lastSyncAt);
|
|
38
|
+
}
|
|
39
|
+
const headers = {
|
|
40
|
+
Accept: 'application/json',
|
|
41
|
+
};
|
|
42
|
+
if (token) {
|
|
43
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
44
|
+
}
|
|
45
|
+
const response = await fetch(url.toString(), {
|
|
46
|
+
headers,
|
|
47
|
+
signal: AbortSignal.timeout(SYNC_TIMEOUT_MS),
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
const data = (await response.json());
|
|
53
|
+
if (!data.projects || data.projects.length === 0) {
|
|
54
|
+
// Update last sync even when there are no new projects
|
|
55
|
+
if (data.synced_at) {
|
|
56
|
+
_lastSyncAt = data.synced_at;
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
// Upsert each project into local SQLite
|
|
61
|
+
let updated = 0;
|
|
62
|
+
for (const project of data.projects) {
|
|
63
|
+
try {
|
|
64
|
+
upsertLocalProject({
|
|
65
|
+
id: project.id,
|
|
66
|
+
slug: project.slug,
|
|
67
|
+
org_id: project.org_id,
|
|
68
|
+
});
|
|
69
|
+
updated++;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Non-critical — individual project upsert failure should not stop the rest
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Record sync timestamp for next delta sync
|
|
76
|
+
if (data.synced_at) {
|
|
77
|
+
_lastSyncAt = data.synced_at;
|
|
78
|
+
}
|
|
79
|
+
return updated;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Graceful failure — server unreachable, network error, timeout
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ── Periodic sync ────────────────────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Start periodic project sync (every 5 minutes).
|
|
89
|
+
* Safe to call multiple times — only one timer will be active.
|
|
90
|
+
*/
|
|
91
|
+
export function startPeriodicSync() {
|
|
92
|
+
if (_periodicTimer)
|
|
93
|
+
return;
|
|
94
|
+
_periodicTimer = setInterval(() => {
|
|
95
|
+
syncProjectsFromServer().catch(() => {
|
|
96
|
+
// Silent — periodic sync is best-effort
|
|
97
|
+
});
|
|
98
|
+
}, SYNC_INTERVAL_MS);
|
|
99
|
+
// Allow the process to exit even if the timer is running
|
|
100
|
+
if (_periodicTimer && typeof _periodicTimer === 'object' && 'unref' in _periodicTimer) {
|
|
101
|
+
_periodicTimer.unref();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Stop periodic project sync. Primarily for tests.
|
|
106
|
+
*/
|
|
107
|
+
export function stopPeriodicSync() {
|
|
108
|
+
if (_periodicTimer) {
|
|
109
|
+
clearInterval(_periodicTimer);
|
|
110
|
+
_periodicTimer = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Reset internal state. For tests only.
|
|
115
|
+
*/
|
|
116
|
+
export function _resetSyncState() {
|
|
117
|
+
_lastSyncAt = null;
|
|
118
|
+
stopPeriodicSync();
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=sync-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-projects.js","sourceRoot":"","sources":["../../../src/hooks/lib/sync-projects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,gFAAgF;AAEhF,iCAAiC;AACjC,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,8CAA8C;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,qFAAqF;AACrF,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAC7C,MAAM,cAAc,GAAG,eAAe,CAAC;AAEvC,gFAAgF;AAEhF,IAAI,WAAW,GAAkB,IAAI,CAAC;AACtC,IAAI,cAAc,GAA0C,IAAI,CAAC;AAmBjE,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QAEzB,0CAA0C;QAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,SAAS,uBAAuB,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;QAErD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,uDAAuD;YACvD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,wCAAwC;QACxC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,kBAAkB,CAAC;oBACjB,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,4EAA4E;YAC9E,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,cAAc;QAAE,OAAO;IAC3B,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,sBAAsB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;YAClC,wCAAwC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAErB,yDAAyD;IACzD,IAAI,cAAc,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,OAAO,IAAI,cAAc,EAAE,CAAC;QACtF,cAAc,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,cAAc,EAAE,CAAC;QACnB,aAAa,CAAC,cAAc,CAAC,CAAC;QAC9B,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,IAAI,CAAC;IACnB,gBAAgB,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -21,6 +21,10 @@ export interface RemoteSessionRecord {
|
|
|
21
21
|
}
|
|
22
22
|
export interface SessionStartResponse {
|
|
23
23
|
project_id?: string;
|
|
24
|
+
/** Server-resolved project slug (e.g. "gramatr/gramatr"). */
|
|
25
|
+
project_slug?: string;
|
|
26
|
+
/** True when the server created a new project record for this session. */
|
|
27
|
+
project_is_new?: boolean;
|
|
24
28
|
interaction_id?: string;
|
|
25
29
|
interactionId?: string;
|
|
26
30
|
entity_id?: string;
|