@nex-ai/nex 0.1.33 → 0.1.35
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/agent/loop.d.ts +3 -9
- package/dist/agent/loop.js +13 -29
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/queues.d.ts +0 -1
- package/dist/agent/queues.js +0 -3
- package/dist/agent/queues.js.map +1 -1
- package/dist/agent/templates.js +3 -3
- package/dist/agent/templates.js.map +1 -1
- package/dist/index.js +6 -19
- package/dist/index.js.map +1 -1
- package/dist/mcp/channel.d.ts +28 -0
- package/dist/mcp/channel.js +135 -0
- package/dist/mcp/channel.js.map +1 -0
- package/dist/mcp/client.d.ts +20 -0
- package/dist/mcp/client.js +130 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +14 -0
- package/dist/mcp/config.js +33 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/context-files.d.ts +9 -0
- package/dist/mcp/context-files.js +90 -0
- package/dist/mcp/context-files.js.map +1 -0
- package/dist/mcp/file-manifest.d.ts +27 -0
- package/dist/mcp/file-manifest.js +64 -0
- package/dist/mcp/file-manifest.js.map +1 -0
- package/dist/mcp/file-scanner.d.ts +17 -0
- package/dist/mcp/file-scanner.js +77 -0
- package/dist/mcp/file-scanner.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +51 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/rate-limiter.d.ts +14 -0
- package/dist/mcp/rate-limiter.js +60 -0
- package/dist/mcp/rate-limiter.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +42 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session-store.d.ts +16 -0
- package/dist/mcp/session-store.js +70 -0
- package/dist/mcp/session-store.js.map +1 -0
- package/dist/mcp/tools/context.d.ts +3 -0
- package/dist/mcp/tools/context.js +65 -0
- package/dist/mcp/tools/context.js.map +1 -0
- package/dist/mcp/tools/insights.d.ts +3 -0
- package/dist/mcp/tools/insights.js +24 -0
- package/dist/mcp/tools/insights.js.map +1 -0
- package/dist/mcp/tools/integrations.d.ts +3 -0
- package/dist/mcp/tools/integrations.js +27 -0
- package/dist/mcp/tools/integrations.js.map +1 -0
- package/dist/mcp/tools/lists.d.ts +3 -0
- package/dist/mcp/tools/lists.js +101 -0
- package/dist/mcp/tools/lists.js.map +1 -0
- package/dist/mcp/tools/notes.d.ts +3 -0
- package/dist/mcp/tools/notes.js +52 -0
- package/dist/mcp/tools/notes.js.map +1 -0
- package/dist/mcp/tools/records.d.ts +3 -0
- package/dist/mcp/tools/records.js +74 -0
- package/dist/mcp/tools/records.js.map +1 -0
- package/dist/mcp/tools/register.d.ts +3 -0
- package/dist/mcp/tools/register.js +30 -0
- package/dist/mcp/tools/register.js.map +1 -0
- package/dist/mcp/tools/relationships.d.ts +3 -0
- package/dist/mcp/tools/relationships.js +47 -0
- package/dist/mcp/tools/relationships.js.map +1 -0
- package/dist/mcp/tools/scan.d.ts +3 -0
- package/dist/mcp/tools/scan.js +37 -0
- package/dist/mcp/tools/scan.js.map +1 -0
- package/dist/mcp/tools/schema.d.ts +3 -0
- package/dist/mcp/tools/schema.js +108 -0
- package/dist/mcp/tools/schema.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +3 -0
- package/dist/mcp/tools/search.js +8 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/tasks.d.ts +3 -0
- package/dist/mcp/tools/tasks.js +88 -0
- package/dist/mcp/tools/tasks.js.map +1 -0
- package/dist/plugin/auto-capture.js +106 -6
- package/dist/plugin/auto-capture.js.map +1 -1
- package/dist/plugin/auto-recall.js +79 -5
- package/dist/plugin/auto-recall.js.map +1 -1
- package/dist/plugin/auto-register.d.ts +1 -1
- package/dist/plugin/auto-register.js +8 -13
- package/dist/plugin/auto-register.js.map +1 -1
- package/dist/plugin/auto-scan.js +5 -0
- package/dist/plugin/auto-scan.js.map +1 -1
- package/dist/plugin/auto-session-start.d.ts +3 -0
- package/dist/plugin/auto-session-start.js +127 -8
- package/dist/plugin/auto-session-start.js.map +1 -1
- package/dist/plugin/config.d.ts +16 -7
- package/dist/plugin/config.js +20 -16
- package/dist/plugin/config.js.map +1 -1
- package/dist/plugin/context-format.d.ts +0 -4
- package/dist/plugin/context-format.js +0 -4
- package/dist/plugin/context-format.js.map +1 -1
- package/dist/plugin/file-manifest.d.ts +6 -0
- package/dist/plugin/file-manifest.js +16 -0
- package/dist/plugin/file-manifest.js.map +1 -1
- package/dist/plugin/nex-client.js +1 -1
- package/dist/plugin/nex-client.js.map +1 -1
- package/dist/plugin/recall-filter.d.ts +5 -14
- package/dist/plugin/recall-filter.js +44 -32
- package/dist/plugin/recall-filter.js.map +1 -1
- package/dist/plugin/shared.js +31 -22
- package/dist/plugin/shared.js.map +1 -1
- package/dist/tui/app.js +3 -3
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/services/agent-service.d.ts +0 -6
- package/dist/tui/services/agent-service.js +5 -39
- package/dist/tui/services/agent-service.js.map +1 -1
- package/dist/tui/slash-commands.d.ts +0 -2
- package/dist/tui/slash-commands.js +7 -150
- package/dist/tui/slash-commands.js.map +1 -1
- package/dist/tui/views/stream.d.ts +3 -6
- package/dist/tui/views/stream.js +51 -241
- package/dist/tui/views/stream.js.map +1 -1
- package/package.json +6 -4
- package/plugin-commands/integrate.md +15 -10
- package/plugin-commands/recall.md +1 -1
- package/dist/agent/message-router.d.ts +0 -26
- package/dist/agent/message-router.js +0 -114
- package/dist/agent/message-router.js.map +0 -1
- package/dist/agent/orchestrate.d.ts +0 -26
- package/dist/agent/orchestrate.js +0 -87
- package/dist/agent/orchestrate.js.map +0 -1
- package/dist/agent/providers/claude-bridge.d.ts +0 -13
- package/dist/agent/providers/claude-bridge.js +0 -161
- package/dist/agent/providers/claude-bridge.js.map +0 -1
- package/dist/agent/providers/claude-code.d.ts +0 -27
- package/dist/agent/providers/claude-code.js +0 -164
- package/dist/agent/providers/claude-code.js.map +0 -1
- package/dist/agent/providers/claude-worker.d.ts +0 -6
- package/dist/agent/providers/claude-worker.js +0 -28
- package/dist/agent/providers/claude-worker.js.map +0 -1
- package/dist/agent/providers/gemini.d.ts +0 -12
- package/dist/agent/providers/gemini.js +0 -110
- package/dist/agent/providers/gemini.js.map +0 -1
- package/dist/agent/providers/types.d.ts +0 -5
- package/dist/agent/providers/types.js +0 -2
- package/dist/agent/providers/types.js.map +0 -1
- package/dist/agent/tick-manager.d.ts +0 -20
- package/dist/agent/tick-manager.js +0 -50
- package/dist/agent/tick-manager.js.map +0 -1
- package/dist/lib/claude-code-installer.d.ts +0 -8
- package/dist/lib/claude-code-installer.js +0 -76
- package/dist/lib/claude-code-installer.js.map +0 -1
- package/dist/lib/nex-mcp-config.d.ts +0 -21
- package/dist/lib/nex-mcp-config.js +0 -33
- package/dist/lib/nex-mcp-config.js.map +0 -1
- package/dist/tui/components/agent-roster.d.ts +0 -7
- package/dist/tui/components/agent-roster.js +0 -66
- package/dist/tui/components/agent-roster.js.map +0 -1
- package/plugin-commands/add-field.md +0 -12
- package/plugin-commands/artifact.md +0 -14
- package/plugin-commands/create-note.md +0 -10
- package/plugin-commands/create-object.md +0 -10
- package/plugin-commands/create-record.md +0 -11
- package/plugin-commands/create-task.md +0 -10
- package/plugin-commands/insights.md +0 -13
- package/plugin-commands/link-records.md +0 -10
- package/plugin-commands/list-members.md +0 -15
- package/plugin-commands/lists.md +0 -14
- package/plugin-commands/notes.md +0 -13
- package/plugin-commands/record.md +0 -12
- package/plugin-commands/relationships.md +0 -12
- package/plugin-commands/schema.md +0 -12
- package/plugin-commands/search.md +0 -12
- package/plugin-commands/tasks.md +0 -13
- package/plugin-commands/timeline.md +0 -12
- package/plugin-commands/update-field.md +0 -10
- package/plugin-commands/update-record.md +0 -11
- package/plugin-commands/upsert-record.md +0 -13
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerSchemaTools(server, client) {
|
|
3
|
+
server.tool("create_object", "Create a new custom object type definition (e.g. 'Project', 'Deal'). Defines the schema for a new entity type in your workspace.", {
|
|
4
|
+
name: z.string().describe("Display name for the object type"),
|
|
5
|
+
slug: z.string().describe("URL-safe identifier (lowercase, hyphens)"),
|
|
6
|
+
name_plural: z.string().optional().describe("Plural display name"),
|
|
7
|
+
description: z.string().optional().describe("Description of the object type"),
|
|
8
|
+
type: z.enum(["person", "company", "custom", "deal"]).optional().describe("Object category (default: custom)"),
|
|
9
|
+
}, { readOnlyHint: false }, async ({ name, slug, name_plural, description, type }) => {
|
|
10
|
+
const body = { name, slug };
|
|
11
|
+
if (name_plural !== undefined)
|
|
12
|
+
body.name_plural = name_plural;
|
|
13
|
+
if (description !== undefined)
|
|
14
|
+
body.description = description;
|
|
15
|
+
if (type !== undefined)
|
|
16
|
+
body.type = type;
|
|
17
|
+
const result = await client.post("/v1/objects", body);
|
|
18
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
19
|
+
});
|
|
20
|
+
server.tool("get_object", "Get a single object type definition with its attributes. Use this to discover available fields before creating or querying records.", { slug: z.string().describe("Object type slug (e.g. 'person', 'company', 'deal')") }, { readOnlyHint: true }, async ({ slug }) => {
|
|
21
|
+
const result = await client.get(`/v1/objects/${encodeURIComponent(slug)}`);
|
|
22
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
23
|
+
});
|
|
24
|
+
server.tool("list_objects", "List all object type definitions in the workspace. Call this first to discover available object types and their schemas before creating or querying records.", {
|
|
25
|
+
include_attributes: z.boolean().optional().describe("Include attribute definitions in the response"),
|
|
26
|
+
}, { readOnlyHint: true }, async ({ include_attributes }) => {
|
|
27
|
+
const params = new URLSearchParams();
|
|
28
|
+
if (include_attributes)
|
|
29
|
+
params.set("include_attributes", "true");
|
|
30
|
+
const qs = params.toString();
|
|
31
|
+
const path = `/v1/objects${qs ? `?${qs}` : ""}`;
|
|
32
|
+
const result = await client.get(path);
|
|
33
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
34
|
+
});
|
|
35
|
+
server.tool("update_object", "Update an existing object type definition (name, description, plural name).", {
|
|
36
|
+
slug: z.string().describe("Object type slug to update"),
|
|
37
|
+
name: z.string().optional().describe("New display name"),
|
|
38
|
+
name_plural: z.string().optional().describe("New plural display name"),
|
|
39
|
+
description: z.string().optional().describe("New description"),
|
|
40
|
+
}, { readOnlyHint: false }, async ({ slug, name, name_plural, description }) => {
|
|
41
|
+
const body = {};
|
|
42
|
+
if (name !== undefined)
|
|
43
|
+
body.name = name;
|
|
44
|
+
if (name_plural !== undefined)
|
|
45
|
+
body.name_plural = name_plural;
|
|
46
|
+
if (description !== undefined)
|
|
47
|
+
body.description = description;
|
|
48
|
+
const result = await client.patch(`/v1/objects/${encodeURIComponent(slug)}`, body);
|
|
49
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
50
|
+
});
|
|
51
|
+
server.tool("delete_object", "Delete an object type definition and ALL its records. This is destructive and cannot be undone.", { slug: z.string().describe("Object type slug to delete") }, { readOnlyHint: false, destructiveHint: true }, async ({ slug }) => {
|
|
52
|
+
const result = await client.delete(`/v1/objects/${encodeURIComponent(slug)}`);
|
|
53
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
54
|
+
});
|
|
55
|
+
server.tool("create_attribute", "Add a new attribute (field) to an object type. Supports types: text, number, email, phone, url, date, boolean, currency, location, select, social_profile, domain, full_name.", {
|
|
56
|
+
object_slug: z.string().describe("Object type slug to add the attribute to"),
|
|
57
|
+
name: z.string().describe("Display name for the attribute"),
|
|
58
|
+
slug: z.string().describe("URL-safe identifier for the attribute"),
|
|
59
|
+
type: z.enum(["text", "number", "email", "phone", "url", "date", "boolean", "currency", "location", "select", "social_profile", "domain", "full_name"]).describe("Attribute data type"),
|
|
60
|
+
description: z.string().optional().describe("Description of the attribute"),
|
|
61
|
+
options: z.object({
|
|
62
|
+
is_required: z.boolean().optional(),
|
|
63
|
+
is_unique: z.boolean().optional(),
|
|
64
|
+
is_multi_value: z.boolean().optional(),
|
|
65
|
+
use_raw_format: z.boolean().optional(),
|
|
66
|
+
is_whole_number: z.boolean().optional(),
|
|
67
|
+
select_options: z.array(z.object({ name: z.string() })).optional(),
|
|
68
|
+
}).optional().describe("Attribute options"),
|
|
69
|
+
}, { readOnlyHint: false }, async ({ object_slug, name, slug, type, description, options }) => {
|
|
70
|
+
const body = { name, slug, type };
|
|
71
|
+
if (description !== undefined)
|
|
72
|
+
body.description = description;
|
|
73
|
+
if (options)
|
|
74
|
+
body.options = options;
|
|
75
|
+
const result = await client.post(`/v1/objects/${encodeURIComponent(object_slug)}/attributes`, body);
|
|
76
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
77
|
+
});
|
|
78
|
+
server.tool("update_attribute", "Update an existing attribute definition on an object type.", {
|
|
79
|
+
object_slug: z.string().describe("Object type slug"),
|
|
80
|
+
attribute_id: z.string().describe("Attribute ID to update"),
|
|
81
|
+
name: z.string().optional().describe("New display name"),
|
|
82
|
+
description: z.string().optional().describe("New description"),
|
|
83
|
+
options: z.object({
|
|
84
|
+
is_required: z.boolean().optional(),
|
|
85
|
+
select_options: z.array(z.object({ name: z.string() })).optional(),
|
|
86
|
+
use_raw_format: z.boolean().optional(),
|
|
87
|
+
is_whole_number: z.boolean().optional(),
|
|
88
|
+
}).optional().describe("Updated options"),
|
|
89
|
+
}, { readOnlyHint: false }, async ({ object_slug, attribute_id, name, description, options }) => {
|
|
90
|
+
const body = {};
|
|
91
|
+
if (name !== undefined)
|
|
92
|
+
body.name = name;
|
|
93
|
+
if (description !== undefined)
|
|
94
|
+
body.description = description;
|
|
95
|
+
if (options)
|
|
96
|
+
body.options = options;
|
|
97
|
+
const result = await client.patch(`/v1/objects/${encodeURIComponent(object_slug)}/attributes/${encodeURIComponent(attribute_id)}`, body);
|
|
98
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
99
|
+
});
|
|
100
|
+
server.tool("delete_attribute", "Delete an attribute from an object type. This removes the field and its data from all records. Cannot be undone.", {
|
|
101
|
+
object_slug: z.string().describe("Object type slug"),
|
|
102
|
+
attribute_id: z.string().describe("Attribute ID to delete"),
|
|
103
|
+
}, { readOnlyHint: false, destructiveHint: true }, async ({ object_slug, attribute_id }) => {
|
|
104
|
+
const result = await client.delete(`/v1/objects/${encodeURIComponent(object_slug)}/attributes/${encodeURIComponent(attribute_id)}`);
|
|
105
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/mcp/tools/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerSearchTools(server, client) {
|
|
3
|
+
server.tool("search_records", "Search records by name across all object types (person, company, deal, etc.). Returns matches grouped by object type with relevance scores.", { query: z.string().min(1).max(500).describe("Search query (1-500 characters)") }, { readOnlyHint: true }, async ({ query }) => {
|
|
4
|
+
const result = await client.post("/v1/search", { query });
|
|
5
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAoB;IACzE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,6IAA6I,EAC7I,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,EACjF,EAAE,YAAY,EAAE,IAAI,EAAE,EACtB,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerTaskTools(server, client) {
|
|
3
|
+
server.tool("create_task", "Create a new task, optionally linked to records and assigned to users.", {
|
|
4
|
+
title: z.string().min(1).describe("Task title"),
|
|
5
|
+
description: z.string().optional().describe("Task description"),
|
|
6
|
+
priority: z.enum(["low", "medium", "high", "urgent"]).optional().describe("Task priority (default: unspecified)"),
|
|
7
|
+
due_date: z.string().optional().describe("Due date in RFC3339 format"),
|
|
8
|
+
entity_ids: z.array(z.string()).optional().describe("Associated record IDs"),
|
|
9
|
+
assignee_ids: z.array(z.string()).optional().describe("Assigned user IDs"),
|
|
10
|
+
}, { readOnlyHint: false }, async ({ title, description, priority, due_date, entity_ids, assignee_ids }) => {
|
|
11
|
+
const body = { title };
|
|
12
|
+
if (description !== undefined)
|
|
13
|
+
body.description = description;
|
|
14
|
+
if (priority !== undefined)
|
|
15
|
+
body.priority = priority;
|
|
16
|
+
if (due_date !== undefined)
|
|
17
|
+
body.due_date = due_date;
|
|
18
|
+
if (entity_ids)
|
|
19
|
+
body.entity_ids = entity_ids;
|
|
20
|
+
if (assignee_ids)
|
|
21
|
+
body.assignee_ids = assignee_ids;
|
|
22
|
+
const result = await client.post("/v1/tasks", body);
|
|
23
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
24
|
+
});
|
|
25
|
+
server.tool("list_tasks", "List tasks with optional filtering by record, assignee, completion status, or search query.", {
|
|
26
|
+
entity_id: z.string().optional().describe("Filter by associated record ID"),
|
|
27
|
+
assignee_id: z.string().optional().describe("Filter by assignee user ID"),
|
|
28
|
+
search: z.string().optional().describe("Search task titles"),
|
|
29
|
+
is_completed: z.boolean().optional().describe("Filter by completion status"),
|
|
30
|
+
limit: z.number().optional().describe("Max results (1-500, default: 100)"),
|
|
31
|
+
offset: z.number().optional().describe("Pagination offset"),
|
|
32
|
+
}, { readOnlyHint: true }, async ({ entity_id, assignee_id, search, is_completed, limit, offset }) => {
|
|
33
|
+
const params = new URLSearchParams();
|
|
34
|
+
if (entity_id)
|
|
35
|
+
params.set("entity_id", entity_id);
|
|
36
|
+
if (assignee_id)
|
|
37
|
+
params.set("assignee_id", assignee_id);
|
|
38
|
+
if (search)
|
|
39
|
+
params.set("search", search);
|
|
40
|
+
if (is_completed !== undefined)
|
|
41
|
+
params.set("is_completed", String(is_completed));
|
|
42
|
+
if (limit !== undefined)
|
|
43
|
+
params.set("limit", String(limit));
|
|
44
|
+
if (offset !== undefined)
|
|
45
|
+
params.set("offset", String(offset));
|
|
46
|
+
const qs = params.toString();
|
|
47
|
+
const path = `/v1/tasks${qs ? `?${qs}` : ""}`;
|
|
48
|
+
const result = await client.get(path);
|
|
49
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
50
|
+
});
|
|
51
|
+
server.tool("get_task", "Get a single task by ID.", { task_id: z.string().describe("Task ID") }, { readOnlyHint: true }, async ({ task_id }) => {
|
|
52
|
+
const result = await client.get(`/v1/tasks/${encodeURIComponent(task_id)}`);
|
|
53
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
54
|
+
});
|
|
55
|
+
server.tool("update_task", "Update a task's fields. All fields are optional — only provided fields are changed.", {
|
|
56
|
+
task_id: z.string().describe("Task ID to update"),
|
|
57
|
+
title: z.string().optional().describe("New title"),
|
|
58
|
+
description: z.string().optional().describe("New description (empty string clears it)"),
|
|
59
|
+
priority: z.string().optional().describe("New priority (empty string clears it)"),
|
|
60
|
+
due_date: z.string().optional().describe("New due date in RFC3339 format"),
|
|
61
|
+
is_completed: z.boolean().optional().describe("Mark complete/incomplete"),
|
|
62
|
+
entity_ids: z.array(z.string()).optional().describe("Replace associated record IDs"),
|
|
63
|
+
assignee_ids: z.array(z.string()).optional().describe("Replace assignee user IDs"),
|
|
64
|
+
}, { readOnlyHint: false }, async ({ task_id, title, description, priority, due_date, is_completed, entity_ids, assignee_ids }) => {
|
|
65
|
+
const body = {};
|
|
66
|
+
if (title !== undefined)
|
|
67
|
+
body.title = title;
|
|
68
|
+
if (description !== undefined)
|
|
69
|
+
body.description = description;
|
|
70
|
+
if (priority !== undefined)
|
|
71
|
+
body.priority = priority;
|
|
72
|
+
if (due_date !== undefined)
|
|
73
|
+
body.due_date = due_date;
|
|
74
|
+
if (is_completed !== undefined)
|
|
75
|
+
body.is_completed = is_completed;
|
|
76
|
+
if (entity_ids !== undefined)
|
|
77
|
+
body.entity_ids = entity_ids;
|
|
78
|
+
if (assignee_ids !== undefined)
|
|
79
|
+
body.assignee_ids = assignee_ids;
|
|
80
|
+
const result = await client.patch(`/v1/tasks/${encodeURIComponent(task_id)}`, body);
|
|
81
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
82
|
+
});
|
|
83
|
+
server.tool("delete_task", "Archive a task (soft delete). Cannot be undone via API.", { task_id: z.string().describe("Task ID to delete") }, { readOnlyHint: false, destructiveHint: true }, async ({ task_id }) => {
|
|
84
|
+
const result = await client.delete(`/v1/tasks/${encodeURIComponent(task_id)}`);
|
|
85
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/mcp/tools/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,80 @@
|
|
|
8
8
|
*
|
|
9
9
|
* On ANY error: outputs {} and exits 0 (graceful degradation).
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
11
|
+
import { readdirSync, statSync, readFileSync } from "node:fs";
|
|
12
|
+
import { join, extname } from "node:path";
|
|
13
|
+
import { loadConfig, loadScanConfig, isHookEnabled } from "./config.js";
|
|
14
|
+
import { NexClient } from "./nex-client.js";
|
|
15
|
+
import { captureFilter } from "./capture-filter.js";
|
|
16
|
+
import { RateLimiter } from "./rate-limiter.js";
|
|
17
|
+
import { readManifest, writeManifest, isChanged, markIngested } from "./file-manifest.js";
|
|
18
|
+
/** Ingest timeout — 3s leaves buffer within hook timeout */
|
|
19
|
+
const INGEST_TIMEOUT_MS = 3_000;
|
|
20
|
+
const MAX_PLAN_FILES = 2;
|
|
21
|
+
const rateLimiter = new RateLimiter();
|
|
22
|
+
/**
|
|
23
|
+
* Scan .claude/plans/ for changed .md files and ingest up to MAX_PLAN_FILES.
|
|
24
|
+
*/
|
|
25
|
+
async function ingestPlanFiles(client) {
|
|
26
|
+
const scanConfig = loadScanConfig();
|
|
27
|
+
if (!scanConfig.enabled)
|
|
28
|
+
return;
|
|
29
|
+
const plansDir = join(process.cwd(), ".claude", "plans");
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = readdirSync(plansDir, { withFileTypes: true });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return; // No .claude/plans/ dir — normal, skip silently
|
|
36
|
+
}
|
|
37
|
+
const manifest = readManifest();
|
|
38
|
+
let ingested = 0;
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
if (ingested >= MAX_PLAN_FILES)
|
|
41
|
+
break;
|
|
42
|
+
if (!entry.isFile())
|
|
43
|
+
continue;
|
|
44
|
+
if (extname(entry.name).toLowerCase() !== ".md")
|
|
45
|
+
continue;
|
|
46
|
+
const fullPath = join(plansDir, entry.name);
|
|
47
|
+
try {
|
|
48
|
+
const stat = statSync(fullPath);
|
|
49
|
+
if (!isChanged(fullPath, stat, manifest))
|
|
50
|
+
continue;
|
|
51
|
+
if (!rateLimiter.canProceed()) {
|
|
52
|
+
process.stderr.write("[nex-capture] Rate limited — skipping plan file ingest\n");
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
let content = readFileSync(fullPath, "utf-8");
|
|
56
|
+
if (content.length > 100_000) {
|
|
57
|
+
content = content.slice(0, 100_000) + "\n[...truncated]";
|
|
58
|
+
}
|
|
59
|
+
const context = `claude-code-plan:${entry.name}`;
|
|
60
|
+
await client.ingest(content, context, INGEST_TIMEOUT_MS);
|
|
61
|
+
markIngested(fullPath, stat, context, manifest);
|
|
62
|
+
ingested++;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
process.stderr.write(`[nex-capture] Plan file ingest failed (${entry.name}): ${err instanceof Error ? err.message : String(err)}\n`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (ingested > 0) {
|
|
69
|
+
writeManifest(manifest);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
12
72
|
async function main() {
|
|
13
73
|
try {
|
|
14
|
-
|
|
74
|
+
// Read stdin
|
|
75
|
+
const chunks = [];
|
|
76
|
+
for await (const chunk of process.stdin) {
|
|
77
|
+
chunks.push(chunk);
|
|
78
|
+
}
|
|
79
|
+
const raw = Buffer.concat(chunks).toString("utf-8");
|
|
80
|
+
// Check .nex.toml kill switch
|
|
81
|
+
if (!isHookEnabled("capture")) {
|
|
82
|
+
process.stdout.write("{}");
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
15
85
|
let input;
|
|
16
86
|
try {
|
|
17
87
|
input = JSON.parse(raw);
|
|
@@ -20,10 +90,40 @@ async function main() {
|
|
|
20
90
|
process.stdout.write("{}");
|
|
21
91
|
return;
|
|
22
92
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
93
|
+
let cfg;
|
|
94
|
+
try {
|
|
95
|
+
cfg = loadConfig();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
process.stdout.write("{}");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const client = new NexClient(cfg.apiKey, cfg.baseUrl);
|
|
102
|
+
// --- Conversation capture (existing behavior) ---
|
|
103
|
+
const message = input.last_assistant_message?.trim();
|
|
104
|
+
if (message) {
|
|
105
|
+
const filterResult = captureFilter(message);
|
|
106
|
+
if (!filterResult.skipped) {
|
|
107
|
+
if (rateLimiter.canProceed()) {
|
|
108
|
+
try {
|
|
109
|
+
await client.ingest(filterResult.text, "claude-code-conversation", INGEST_TIMEOUT_MS);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
process.stderr.write(`[nex-capture] Ingest failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
process.stderr.write("[nex-capture] Rate limited — skipping conversation ingest\n");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// --- Plan file ingestion ---
|
|
121
|
+
try {
|
|
122
|
+
await ingestPlanFiles(client);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
process.stderr.write(`[nex-capture] Plan file scan error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
126
|
+
}
|
|
27
127
|
process.stdout.write("{}");
|
|
28
128
|
}
|
|
29
129
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-capture.js","sourceRoot":"","sources":["../../src/plugin/auto-capture.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-capture.js","sourceRoot":"","sources":["../../src/plugin/auto-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,31 @@
|
|
|
8
8
|
*
|
|
9
9
|
* On ANY error: outputs {} and exits 0 (graceful degradation).
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
11
|
+
import { loadConfig, isHookEnabled } from "./config.js";
|
|
12
|
+
import { NexClient } from "./nex-client.js";
|
|
13
|
+
import { formatNexContext } from "./context-format.js";
|
|
14
|
+
import { SessionStore } from "./session-store.js";
|
|
15
|
+
import { shouldRecall, recordRecall } from "./recall-filter.js";
|
|
16
|
+
const sessions = new SessionStore();
|
|
17
|
+
/**
|
|
18
|
+
* Check if this is the first prompt for this session.
|
|
19
|
+
* A session with no stored Nex session ID is considered "first prompt"
|
|
20
|
+
* (SessionStart may have already set one, but that's fine — it means
|
|
21
|
+
* baseline context was loaded, and first user prompt still gets recall).
|
|
22
|
+
*/
|
|
23
|
+
function isFirstPrompt(sessionKey) {
|
|
24
|
+
if (!sessionKey)
|
|
25
|
+
return true;
|
|
26
|
+
return !sessions.get(sessionKey);
|
|
27
|
+
}
|
|
12
28
|
async function main() {
|
|
13
29
|
try {
|
|
14
|
-
|
|
30
|
+
// Read stdin
|
|
31
|
+
const chunks = [];
|
|
32
|
+
for await (const chunk of process.stdin) {
|
|
33
|
+
chunks.push(chunk);
|
|
34
|
+
}
|
|
35
|
+
const raw = Buffer.concat(chunks).toString("utf-8");
|
|
15
36
|
let input;
|
|
16
37
|
try {
|
|
17
38
|
input = JSON.parse(raw);
|
|
@@ -21,12 +42,65 @@ async function main() {
|
|
|
21
42
|
process.stdout.write("{}");
|
|
22
43
|
return;
|
|
23
44
|
}
|
|
24
|
-
|
|
25
|
-
if (!
|
|
45
|
+
// Check .nex.toml kill switch
|
|
46
|
+
if (!isHookEnabled("recall")) {
|
|
47
|
+
process.stdout.write("{}");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const prompt = input.prompt?.trim();
|
|
51
|
+
if (!prompt || prompt.length < 5) {
|
|
52
|
+
process.stdout.write("{}");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Skip slash commands
|
|
56
|
+
if (prompt.startsWith("/")) {
|
|
57
|
+
process.stdout.write("{}");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// --- Recall filter: decide if this prompt needs memory recall ---
|
|
61
|
+
const decision = shouldRecall(prompt, isFirstPrompt(input.session_id));
|
|
62
|
+
if (!decision.shouldRecall) {
|
|
26
63
|
process.stdout.write("{}");
|
|
27
64
|
return;
|
|
28
65
|
}
|
|
29
|
-
|
|
66
|
+
let cfg;
|
|
67
|
+
try {
|
|
68
|
+
cfg = loadConfig();
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
process.stderr.write(`[nex-recall] Config error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
72
|
+
process.stdout.write("{}");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const client = new NexClient(cfg.apiKey, cfg.baseUrl);
|
|
76
|
+
// Resolve session ID for multi-turn continuity
|
|
77
|
+
const sessionKey = input.session_id;
|
|
78
|
+
const nexSessionId = sessionKey ? sessions.get(sessionKey) : undefined;
|
|
79
|
+
const result = await client.ask(prompt, nexSessionId, 10_000);
|
|
80
|
+
if (!result.answer) {
|
|
81
|
+
process.stdout.write("{}");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Store session ID for future turns
|
|
85
|
+
if (result.session_id && sessionKey) {
|
|
86
|
+
sessions.set(sessionKey, result.session_id);
|
|
87
|
+
}
|
|
88
|
+
// Record successful recall for debounce
|
|
89
|
+
recordRecall(result.session_id);
|
|
90
|
+
const entityCount = result.entity_references?.length ?? 0;
|
|
91
|
+
const context = formatNexContext({
|
|
92
|
+
answer: result.answer,
|
|
93
|
+
entityCount,
|
|
94
|
+
sessionId: result.session_id,
|
|
95
|
+
});
|
|
96
|
+
// Use hookSpecificOutput for discrete context injection (not shown in transcript)
|
|
97
|
+
const output = JSON.stringify({
|
|
98
|
+
hookSpecificOutput: {
|
|
99
|
+
hookEventName: "UserPromptSubmit",
|
|
100
|
+
additionalContext: context,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
process.stdout.write(output);
|
|
30
104
|
}
|
|
31
105
|
catch (err) {
|
|
32
106
|
process.stderr.write(`[nex-recall] Unexpected error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-recall.js","sourceRoot":"","sources":["../../src/plugin/auto-recall.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auto-recall.js","sourceRoot":"","sources":["../../src/plugin/auto-recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Usage: node dist/auto-register.js <email> [name] [company]
|
|
6
6
|
*
|
|
7
|
-
* On success: prints API key and saves to ~/.nex
|
|
7
|
+
* On success: prints API key and saves to ~/.nex-mcp.json (shared with MCP server).
|
|
8
8
|
* If already registered (API key exists): prints status and exits.
|
|
9
9
|
*/
|
|
10
10
|
export {};
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Usage: node dist/auto-register.js <email> [name] [company]
|
|
6
6
|
*
|
|
7
|
-
* On success: prints API key and saves to ~/.nex
|
|
7
|
+
* On success: prints API key and saves to ~/.nex-mcp.json (shared with MCP server).
|
|
8
8
|
* If already registered (API key exists): prints status and exits.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { loadMcpConfig, persistRegistration, loadBaseUrl, MCP_CONFIG_PATH } from "./config.js";
|
|
11
11
|
import { NexClient } from "./nex-client.js";
|
|
12
12
|
async function main() {
|
|
13
13
|
const email = process.argv[2];
|
|
@@ -17,20 +17,15 @@ async function main() {
|
|
|
17
17
|
console.error("Usage: auto-register.js <email> [name] [company]");
|
|
18
18
|
process.exit(1);
|
|
19
19
|
}
|
|
20
|
-
// Check if already registered
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
// Check if already registered
|
|
21
|
+
const existing = loadMcpConfig();
|
|
22
|
+
if (existing.api_key) {
|
|
23
23
|
console.log("Already registered.");
|
|
24
|
-
console.log(` API key: ${existing.
|
|
24
|
+
console.log(` API key: ${existing.api_key.slice(0, 12)}...`);
|
|
25
25
|
console.log(` Config: ${MCP_CONFIG_PATH}`);
|
|
26
|
-
console.log("\nTo re-register, delete ~/.nex
|
|
26
|
+
console.log("\nTo re-register, delete ~/.nex-mcp.json first.");
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
if (!(err instanceof ConfigError))
|
|
31
|
-
throw err;
|
|
32
|
-
// No API key found — proceed with registration
|
|
33
|
-
}
|
|
34
29
|
const baseUrl = loadBaseUrl();
|
|
35
30
|
console.log(`Registering ${email} at ${baseUrl} ...`);
|
|
36
31
|
try {
|
|
@@ -40,7 +35,7 @@ async function main() {
|
|
|
40
35
|
console.error("Response:", JSON.stringify(result, null, 2));
|
|
41
36
|
process.exit(1);
|
|
42
37
|
}
|
|
43
|
-
// Persist to
|
|
38
|
+
// Persist to shared config
|
|
44
39
|
persistRegistration(result);
|
|
45
40
|
console.log("Registration successful!");
|
|
46
41
|
console.log(` API key: ${result.api_key.slice(0, 12)}...`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-register.js","sourceRoot":"","sources":["../../src/plugin/auto-register.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auto-register.js","sourceRoot":"","sources":["../../src/plugin/auto-register.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,eAAe,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,OAAO,OAAO,MAAM,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEvE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,2BAA2B;QAC3B,mBAAmB,CAAC,MAAiC,CAAC,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,cAAc;YAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,eAAe,eAAe,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/plugin/auto-scan.js
CHANGED
|
@@ -11,6 +11,7 @@ import { loadConfig, loadScanConfig } from "./config.js";
|
|
|
11
11
|
import { NexClient } from "./nex-client.js";
|
|
12
12
|
import { RateLimiter } from "./rate-limiter.js";
|
|
13
13
|
import { scanAndIngest } from "./file-scanner.js";
|
|
14
|
+
import { readManifest, markScanned, writeManifest } from "./file-manifest.js";
|
|
14
15
|
async function main() {
|
|
15
16
|
try {
|
|
16
17
|
// Determine target directory: argv[2] > cwd
|
|
@@ -32,6 +33,10 @@ async function main() {
|
|
|
32
33
|
const rateLimiter = new RateLimiter();
|
|
33
34
|
console.log(`Scanning ${targetDir} ...`);
|
|
34
35
|
const result = await scanAndIngest(client, rateLimiter, targetDir, scanConfig);
|
|
36
|
+
// Mark scan time so session start can skip if fresh
|
|
37
|
+
const manifest = readManifest();
|
|
38
|
+
markScanned(manifest);
|
|
39
|
+
writeManifest(manifest);
|
|
35
40
|
console.log(`Scan complete:`);
|
|
36
41
|
console.log(` Scanned: ${result.scanned} files`);
|
|
37
42
|
console.log(` Ingested: ${result.ingested} files`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/plugin/auto-scan.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/plugin/auto-scan.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE9E,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,4CAA4C;QAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAEnD,IAAI,GAAG,CAAC;QACR,IAAI,CAAC;YACH,GAAG,GAAG,UAAU,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAE/E,oDAAoD;QACpD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,QAAQ,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* a baseline context summary and injects it so the agent "already knows"
|
|
7
7
|
* relevant business context from the first message.
|
|
8
8
|
*
|
|
9
|
+
* On startup/clear: also scans project files and ingests changed ones.
|
|
10
|
+
* On compact/resume: skips file scan (files already ingested, just re-query summary).
|
|
11
|
+
*
|
|
9
12
|
* On ANY error: outputs {} and exits 0 (graceful degradation).
|
|
10
13
|
*/
|
|
11
14
|
export {};
|