@enfyra/mcp-server 0.2.51 → 0.2.53

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.
Files changed (64) hide show
  1. package/README.md +4 -1
  2. package/dist/lib/config-local-adapters.d.ts +11 -1
  3. package/dist/lib/config-local-adapters.js +5 -3
  4. package/dist/lib/config-local-adapters.js.map +1 -1
  5. package/dist/lib/config-local-types.d.ts +1 -0
  6. package/dist/lib/config-local.js +2 -2
  7. package/dist/lib/config-local.js.map +1 -1
  8. package/dist/lib/dynamic-script-context-contract.d.ts +1 -0
  9. package/dist/lib/dynamic-script-context-contract.js +6 -3
  10. package/dist/lib/dynamic-script-context-contract.js.map +1 -1
  11. package/dist/lib/enfyra-mcp-server.js +3 -0
  12. package/dist/lib/enfyra-mcp-server.js.map +1 -1
  13. package/dist/lib/mcp-example-handlers-hooks.js +22 -10
  14. package/dist/lib/mcp-example-handlers-hooks.js.map +1 -1
  15. package/dist/lib/mcp-instructions.js +1 -0
  16. package/dist/lib/mcp-instructions.js.map +1 -1
  17. package/dist/lib/required-knowledge.d.ts +1 -1
  18. package/dist/lib/required-knowledge.js +19 -4
  19. package/dist/lib/required-knowledge.js.map +1 -1
  20. package/dist/lib/script-workspace.d.ts +2 -0
  21. package/dist/lib/script-workspace.js +116 -0
  22. package/dist/lib/script-workspace.js.map +1 -0
  23. package/dist/lib/source-artifacts.d.ts +1 -0
  24. package/dist/lib/source-artifacts.js +24 -9
  25. package/dist/lib/source-artifacts.js.map +1 -1
  26. package/dist/lib/tool-catalog.d.ts +1 -1
  27. package/dist/lib/tool-catalog.js +8 -27
  28. package/dist/lib/tool-catalog.js.map +1 -1
  29. package/dist/lib/tool-contracts.js +3 -0
  30. package/dist/lib/tool-contracts.js.map +1 -1
  31. package/dist/lib/tool-execution.d.ts +2 -0
  32. package/dist/lib/tool-execution.js +30 -0
  33. package/dist/lib/tool-execution.js.map +1 -0
  34. package/dist/lib/tool-output-contracts.js +2 -0
  35. package/dist/lib/tool-output-contracts.js.map +1 -1
  36. package/dist/lib/toolset-filter.d.ts +1 -1
  37. package/dist/lib/toolset-filter.js +4 -0
  38. package/dist/lib/toolset-filter.js.map +1 -1
  39. package/dist/lib/types.d.ts +1 -0
  40. package/dist/lib/workflow-definitions.d.ts +21 -1
  41. package/dist/lib/workflow-definitions.js +21 -4
  42. package/dist/lib/workflow-definitions.js.map +1 -1
  43. package/dist/lib/workflow-planner.js +9 -0
  44. package/dist/lib/workflow-planner.js.map +1 -1
  45. package/dist/lib/workflow-types.d.ts +1 -1
  46. package/dist/lib/workspace-files.d.ts +9 -0
  47. package/dist/lib/workspace-files.js +160 -0
  48. package/dist/lib/workspace-files.js.map +1 -0
  49. package/dist/lib/workspace-push.d.ts +44 -0
  50. package/dist/lib/workspace-push.js +79 -0
  51. package/dist/lib/workspace-push.js.map +1 -0
  52. package/dist/lib/workspace-remote.d.ts +3 -0
  53. package/dist/lib/workspace-remote.js +52 -0
  54. package/dist/lib/workspace-remote.js.map +1 -0
  55. package/dist/lib/workspace-state.d.ts +35 -0
  56. package/dist/lib/workspace-state.js +89 -0
  57. package/dist/lib/workspace-state.js.map +1 -0
  58. package/dist/lib/workspace-tools.d.ts +2 -0
  59. package/dist/lib/workspace-tools.js +40 -0
  60. package/dist/lib/workspace-tools.js.map +1 -0
  61. package/dist/lib/workspace-types.d.ts +83 -0
  62. package/dist/lib/workspace-types.js +2 -0
  63. package/dist/lib/workspace-types.js.map +1 -0
  64. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import type { WorkspaceArtifact, WorkspaceArtifactRef, WorkspaceDependencies, WorkspaceManifest, WorkspaceObservation, WorkspacePaths, WorkspaceRemoteSource, WorkspaceSourceStatus } from './workspace-types.js';
3
+ export declare const WORKSPACE_TABLES: readonly ["enfyra_route_handler", "enfyra_pre_hook", "enfyra_post_hook", "enfyra_flow_step", "enfyra_websocket_event", "enfyra_websocket", "enfyra_oauth_config", "enfyra_bootstrap_script", "enfyra_extension"];
4
+ export declare const workspaceArtifactSchema: z.ZodObject<{
5
+ tableName: z.ZodEnum<["enfyra_route_handler", "enfyra_pre_hook", "enfyra_post_hook", "enfyra_flow_step", "enfyra_websocket_event", "enfyra_websocket", "enfyra_oauth_config", "enfyra_bootstrap_script", "enfyra_extension"]>;
6
+ id: z.ZodString;
7
+ path: z.ZodOptional<z.ZodString>;
8
+ }, "strict", z.ZodTypeAny, {
9
+ path?: string;
10
+ tableName?: "enfyra_extension" | "enfyra_route_handler" | "enfyra_pre_hook" | "enfyra_post_hook" | "enfyra_flow_step" | "enfyra_websocket_event" | "enfyra_websocket" | "enfyra_oauth_config" | "enfyra_bootstrap_script";
11
+ id?: string;
12
+ }, {
13
+ path?: string;
14
+ tableName?: "enfyra_extension" | "enfyra_route_handler" | "enfyra_pre_hook" | "enfyra_post_hook" | "enfyra_flow_step" | "enfyra_websocket_event" | "enfyra_websocket" | "enfyra_oauth_config" | "enfyra_bootstrap_script";
15
+ id?: string;
16
+ }>;
17
+ export declare function sourceRevision(remote: WorkspaceRemoteSource): string;
18
+ export declare function artifactKey(ref: WorkspaceArtifactRef): string;
19
+ export declare function artifactPath(ref: WorkspaceArtifactRef, source: WorkspaceRemoteSource): string;
20
+ export declare function loadWorkspace(paths: WorkspacePaths): WorkspaceManifest;
21
+ export declare function saveWorkspace(paths: WorkspacePaths, manifest: WorkspaceManifest): void;
22
+ export declare function selectArtifacts(manifest: WorkspaceManifest, keys?: string[]): WorkspaceArtifact[];
23
+ export declare function observeArtifact(paths: WorkspacePaths, artifact: WorkspaceArtifact, dependencies: WorkspaceDependencies): Promise<WorkspaceObservation>;
24
+ export declare function observationSummary(observation: WorkspaceObservation): {
25
+ key: string;
26
+ status: WorkspaceSourceStatus;
27
+ language: string;
28
+ sourceField: string;
29
+ localFile: string;
30
+ remoteFile: string;
31
+ localHash: string;
32
+ remoteHash: string;
33
+ baselineHash: string;
34
+ };
35
+ export declare function updateFromRemote(paths: WorkspacePaths, observation: WorkspaceObservation): void;
@@ -0,0 +1,89 @@
1
+ import { relative } from 'node:path';
2
+ import { z } from 'zod';
3
+ import { readWorkspaceFile, safeWorkspacePath, sourceHash, writeWorkspaceFile } from './workspace-files.js';
4
+ import { writeSourceArtifact } from './source-artifacts.js';
5
+ export const WORKSPACE_TABLES = ['enfyra_route_handler', 'enfyra_pre_hook', 'enfyra_post_hook', 'enfyra_flow_step', 'enfyra_websocket_event', 'enfyra_websocket', 'enfyra_oauth_config', 'enfyra_bootstrap_script', 'enfyra_extension'];
6
+ export const workspaceArtifactSchema = z.object({ tableName: z.enum(WORKSPACE_TABLES), id: z.string().min(1).max(200), path: z.string().optional() }).strict();
7
+ const savedArtifactSchema = workspaceArtifactSchema.extend({ key: z.string(), path: z.string(), sourceField: z.string(), language: z.string(), baseline: z.string() });
8
+ const manifestSchema = z.object({ target: z.string(), artifacts: z.array(savedArtifactSchema).max(500) }).strict();
9
+ export function sourceRevision(remote) {
10
+ return sourceHash(JSON.stringify([remote.source, remote.sourceField, remote.language]));
11
+ }
12
+ export function artifactKey(ref) {
13
+ return `${ref.tableName}:${ref.id}`;
14
+ }
15
+ export function artifactPath(ref, source) {
16
+ const kind = ref.tableName.replace(/^enfyra_/, '').replace(/_/g, '-');
17
+ const id = ref.id.replace(/[^a-zA-Z0-9_-]/g, '-').slice(0, 60);
18
+ const extension = source.sourceField === 'code' ? 'vue' : source.language === 'typescript' ? 'ts' : 'js';
19
+ const path = ref.path ?? `${kind}/${id}-${sourceHash(ref.id).slice(0, 8)}.${extension}`;
20
+ if (path.startsWith('.') || path === 'project.json' || path.split('/').some((part) => part.startsWith('.')))
21
+ throw new Error('Artifact path cannot use workspace configuration or state directories.');
22
+ return path;
23
+ }
24
+ export function loadWorkspace(paths) {
25
+ const raw = readWorkspaceFile(paths.projectRoot, paths.manifestPath);
26
+ if (!raw)
27
+ throw new Error('Workspace is not prepared. Call prepare_enfyra_workspace with projectRoot and exact artifact references.');
28
+ const manifest = manifestSchema.parse(JSON.parse(raw));
29
+ if (manifest.target !== paths.target)
30
+ throw new Error('Workspace target differs from the connected Enfyra instance. Use a separate project workspace.');
31
+ const keys = new Set();
32
+ const files = new Set();
33
+ for (const artifact of manifest.artifacts) {
34
+ if (artifact.key !== artifactKey(artifact) || keys.has(artifact.key) || files.has(artifact.path))
35
+ throw new Error('Workspace manifest has invalid or duplicate artifact mappings.');
36
+ artifactPath(artifact, { source: '', sourceField: artifact.sourceField, language: artifact.language });
37
+ safeWorkspacePath(paths.workspaceRoot, artifact.path);
38
+ keys.add(artifact.key);
39
+ files.add(artifact.path);
40
+ }
41
+ return manifest;
42
+ }
43
+ export function saveWorkspace(paths, manifest) {
44
+ writeWorkspaceFile(paths.projectRoot, paths.manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
45
+ }
46
+ export function selectArtifacts(manifest, keys) {
47
+ if (!keys)
48
+ return manifest.artifacts;
49
+ if (!keys.length || new Set(keys).size !== keys.length)
50
+ throw new Error('Select a non-empty list of unique artifact keys.');
51
+ return keys.map((key) => {
52
+ const artifact = manifest.artifacts.find((item) => item.key === key);
53
+ if (!artifact)
54
+ throw new Error(`Artifact is not in this workspace: ${key}`);
55
+ return artifact;
56
+ });
57
+ }
58
+ export async function observeArtifact(paths, artifact, dependencies) {
59
+ const localFile = safeWorkspacePath(paths.workspaceRoot, artifact.path);
60
+ const localSource = readWorkspaceFile(paths.workspaceRoot, artifact.path);
61
+ const remote = await dependencies.read(artifact);
62
+ const remoteRevision = remote ? sourceRevision(remote) : null;
63
+ const localRevision = localSource === null ? null : sourceRevision({ source: localSource, sourceField: artifact.sourceField, language: artifact.language });
64
+ let status;
65
+ if (!remote)
66
+ status = 'remote_missing';
67
+ else if (localSource === null)
68
+ status = 'local_missing';
69
+ else if (localRevision === remoteRevision)
70
+ status = remoteRevision === artifact.baseline ? 'synced' : 'aligned';
71
+ else if (localRevision === artifact.baseline)
72
+ status = 'remote_changed';
73
+ else if (remoteRevision === artifact.baseline)
74
+ status = 'local_changed';
75
+ else
76
+ status = 'conflict';
77
+ const remoteFile = remote ? writeSourceArtifact({ tableName: artifact.tableName, id: artifact.id, fieldName: remote.sourceField, source: remote.source }).tmpFile : null;
78
+ return { artifact, localSource, remote, localRevision, remoteRevision, status, localFile, remoteFile };
79
+ }
80
+ export function observationSummary(observation) {
81
+ return { key: observation.artifact.key, status: observation.status, language: observation.artifact.language, sourceField: observation.artifact.sourceField, localFile: observation.localFile, remoteFile: observation.remoteFile, localHash: observation.localRevision, remoteHash: observation.remoteRevision, baselineHash: observation.artifact.baseline };
82
+ }
83
+ export function updateFromRemote(paths, observation) {
84
+ if (!observation.remote)
85
+ throw new Error('Cannot pull a deleted remote artifact.');
86
+ writeWorkspaceFile(paths.projectRoot, relative(paths.projectRoot, observation.localFile), observation.remote.source, observation.localSource);
87
+ Object.assign(observation.artifact, { baseline: observation.remoteRevision, language: observation.remote.language, sourceField: observation.remote.sourceField });
88
+ }
89
+ //# sourceMappingURL=workspace-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-state.js","sourceRoot":"","sources":["../../src/lib/workspace-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,kBAAkB,CAAU,CAAC;AACjP,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC/J,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACvK,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEnH,MAAM,UAAU,cAAc,CAAC,MAA6B;IAC1D,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAyB;IACnD,OAAO,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAyB,EAAE,MAA6B;IACnF,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACzG,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IACxF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IACvM,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACrE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0GAA0G,CAAC,CAAC;IACtI,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAsB,CAAC;IAC5E,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;IACxJ,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC1C,IAAI,QAAQ,CAAC,GAAG,KAAK,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpL,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvG,iBAAiB,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAqB,EAAE,QAA2B;IAC9E,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA2B,EAAE,IAAe;IAC1E,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAC5H,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAqB,EAAE,QAA2B,EAAE,YAAmC;IAC3H,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,aAAa,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5J,IAAI,MAA6B,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,gBAAgB,CAAC;SAClC,IAAI,WAAW,KAAK,IAAI;QAAE,MAAM,GAAG,eAAe,CAAC;SACnD,IAAI,aAAa,KAAK,cAAc;QAAE,MAAM,GAAG,cAAc,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;SAC3G,IAAI,aAAa,KAAK,QAAQ,CAAC,QAAQ;QAAE,MAAM,GAAG,gBAAgB,CAAC;SACnE,IAAI,cAAc,KAAK,QAAQ,CAAC,QAAQ;QAAE,MAAM,GAAG,eAAe,CAAC;;QACnE,MAAM,GAAG,UAAU,CAAC;IACzB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACzK,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAiC;IAClE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,CAAC,cAAc,EAAE,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAChW,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAqB,EAAE,WAAiC;IACvF,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACnF,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC9I,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,cAAe,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AACrK,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolsetRegistrationState } from './types.js';
2
+ export declare function registerWorkspaceTools(server: any, state: ToolsetRegistrationState, apiUrl: string, projectRoot?: string): import("./workspace-types.js").ScriptWorkspace;
@@ -0,0 +1,40 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { z } from 'zod';
3
+ import { createScriptWorkspace } from './script-workspace.js';
4
+ import { createWorkspaceRemote } from './workspace-remote.js';
5
+ import { workspaceArtifactSchema } from './workspace-state.js';
6
+ import { jsonContent } from './response-format.js';
7
+ export function registerWorkspaceTools(server, state, apiUrl, projectRoot) {
8
+ const workspace = createScriptWorkspace({
9
+ apiUrl,
10
+ projectRoot,
11
+ roots: async () => {
12
+ if (!server.server.getClientCapabilities()?.roots)
13
+ return [];
14
+ const result = await server.server.listRoots();
15
+ return result.roots.map((root) => fileURLToPath(root.uri));
16
+ },
17
+ ...createWorkspaceRemote(apiUrl, state),
18
+ });
19
+ const scope = {
20
+ projectRoot: z.string().optional().describe('Absolute client project directory. Defaults to the selected workspace, configured ENFYRA_MCP_PROJECT_ROOT or one client-provided root; never guesses cwd.'),
21
+ keys: z.array(z.string()).min(1).max(100).optional().describe('Exact workspace artifact keys. Omit to select the prepared inventory.'),
22
+ };
23
+ server.tool('prepare_enfyra_workspace', 'Prepare an ignored project-local enfyra/ source worktree. Adds /enfyra/ and /.tmp/enfyra/ to Git ignore before any source write. Bootstrap with explicit artifact references from discovery; existing workspaces preserve local edits and target binding. Does not create a Git branch or clone the whole instance.', {
24
+ ...scope,
25
+ artifacts: z.array(workspaceArtifactSchema).max(100).optional().describe('Located live records to add. Optional path is relative to enfyra/. Required for a new workspace; use [] before creating new source, or omit to reopen.'),
26
+ }, async (input) => jsonContent(await workspace.prepare(input), { columnar: false }));
27
+ server.tool('inspect_enfyra_workspace', 'Inspect local, last-synced and freshly read live source hashes. Returns synced/local_changed/remote_changed/conflict or missing states, local file paths and project-local .tmp snapshots. Does not overwrite working sources.', scope, async (input) => jsonContent(await workspace.inspect(input), { columnar: false }));
28
+ server.tool('pull_enfyra_sources', 'Refresh missing or unchanged local workspace files from live source. Keeps local edits, conflicts and remotely deleted files intact; never infers server deletion from local deletion. Use inspect_enfyra_workspace to review returned states.', scope, async (input) => jsonContent(await workspace.pull(input), { columnar: false }));
29
+ server.tool('push_enfyra_sources', 'Preview and validate edited workspace sources, then apply the reviewed planId. Requires target confirmation and domain knowledge. Rechecks local/live hashes, uses canonical source writers and verifies each saved source. The plan is consumed before writes; partial failure requires fresh inspection and preview. External writers are not atomically locked.', {
30
+ ...scope,
31
+ apply: z.boolean().optional().default(false),
32
+ planId: z.string().uuid().optional().describe('Required with apply=true; use the current reviewed preview plan and omit keys.'),
33
+ }, async (input) => {
34
+ const result = await workspace.push(input);
35
+ const content = jsonContent(result, { columnar: false });
36
+ return input.apply && !result.complete ? { ...content, isError: true } : content;
37
+ });
38
+ return workspace;
39
+ }
40
+ //# sourceMappingURL=workspace-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-tools.js","sourceRoot":"","sources":["../../src/lib/workspace-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ export interface WorkspaceArtifactRef {
2
+ tableName: string;
3
+ id: string;
4
+ path?: string;
5
+ }
6
+ export interface WorkspaceRemoteSource {
7
+ source: string;
8
+ sourceField: string;
9
+ language: string;
10
+ }
11
+ export interface WorkspaceArtifact extends WorkspaceArtifactRef {
12
+ key: string;
13
+ path: string;
14
+ sourceField: string;
15
+ language: string;
16
+ baseline: string;
17
+ }
18
+ export interface WorkspaceManifest {
19
+ target: string;
20
+ artifacts: WorkspaceArtifact[];
21
+ }
22
+ export interface WorkspaceRequest {
23
+ projectRoot?: string;
24
+ keys?: string[];
25
+ }
26
+ export interface WorkspacePrepareInput extends WorkspaceRequest {
27
+ artifacts?: WorkspaceArtifactRef[];
28
+ }
29
+ export interface WorkspacePushInput extends WorkspaceRequest {
30
+ apply?: boolean;
31
+ planId?: string;
32
+ }
33
+ export interface WorkspaceDependencies {
34
+ apiUrl: string;
35
+ projectRoot?: string;
36
+ roots?: () => Promise<string[]>;
37
+ read: (artifact: WorkspaceArtifactRef) => Promise<WorkspaceRemoteSource | null>;
38
+ validate: (artifact: WorkspaceArtifact, source: string) => Promise<unknown>;
39
+ write: (artifact: WorkspaceArtifact, source: string, expectedSourceHash: string, sourceFile: string) => Promise<unknown>;
40
+ }
41
+ export interface WorkspacePaths {
42
+ projectRoot: string;
43
+ workspaceRoot: string;
44
+ tempRoot: string;
45
+ target: string;
46
+ manifestPath: string;
47
+ planPath: string;
48
+ }
49
+ export type WorkspaceSourceStatus = 'synced' | 'aligned' | 'local_changed' | 'remote_changed' | 'conflict' | 'local_missing' | 'remote_missing';
50
+ export interface WorkspaceObservation {
51
+ artifact: WorkspaceArtifact;
52
+ localSource: string | null;
53
+ remote: WorkspaceRemoteSource | null;
54
+ localRevision: string | null;
55
+ remoteRevision: string | null;
56
+ status: WorkspaceSourceStatus;
57
+ localFile: string;
58
+ remoteFile: string | null;
59
+ }
60
+ export interface WorkspacePushPlan {
61
+ id: string;
62
+ target: string;
63
+ projectRoot: string;
64
+ consumed: boolean;
65
+ items: Array<{
66
+ key: string;
67
+ localRevision: string;
68
+ remoteRevision: string;
69
+ sourceHash: string;
70
+ }>;
71
+ }
72
+ export interface WorkspaceOperationResult {
73
+ action: string;
74
+ complete?: boolean;
75
+ [key: string]: unknown;
76
+ }
77
+ export interface ScriptWorkspace {
78
+ prepare(input: WorkspacePrepareInput): Promise<WorkspaceOperationResult>;
79
+ inspect(input: WorkspaceRequest): Promise<WorkspaceOperationResult>;
80
+ pull(input: WorkspaceRequest): Promise<WorkspaceOperationResult>;
81
+ push(input: WorkspacePushInput): Promise<WorkspaceOperationResult>;
82
+ artifactDirectory(): string | null;
83
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workspace-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-types.js","sourceRoot":"","sources":["../../src/lib/workspace-types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enfyra/mcp-server",
3
- "version": "0.2.51",
3
+ "version": "0.2.53",
4
4
  "description": "MCP server for Enfyra - manage Enfyra instances from MCP-compatible coding tools",
5
5
  "type": "module",
6
6
  "packageManager": "yarn@4.17.0",