@nimbalyst/extension-sdk 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/dist/__tests__/editorHostCapabilities.test.d.ts +2 -0
- package/dist/__tests__/editorHostCapabilities.test.d.ts.map +1 -0
- package/dist/__tests__/editorHostCapabilities.test.js +24 -0
- package/dist/__tests__/fileDirectoryTree.test.js +34 -0
- package/dist/__tests__/gitOperationLog.test.d.ts +2 -0
- package/dist/__tests__/gitOperationLog.test.d.ts.map +1 -0
- package/dist/__tests__/gitOperationLog.test.js +51 -0
- package/dist/__tests__/useCollaborativeEditor.offline.test.js +43 -1
- package/dist/agents/AgentProtocol.d.ts +20 -0
- package/dist/agents/AgentProtocol.d.ts.map +1 -1
- package/dist/agents/AgentProtocolHost.d.ts +1 -1
- package/dist/agents/AgentProtocolHost.d.ts.map +1 -1
- package/dist/createReadOnlyHost.d.ts +11 -1
- package/dist/createReadOnlyHost.d.ts.map +1 -1
- package/dist/createReadOnlyHost.js +3 -0
- package/dist/editorHostCapabilities.d.ts +31 -0
- package/dist/editorHostCapabilities.d.ts.map +1 -0
- package/dist/editorHostCapabilities.js +35 -0
- package/dist/externalsPlugin.d.ts.map +1 -1
- package/dist/externalsPlugin.js +1 -5
- package/dist/fileDirectoryTree.d.ts +9 -2
- package/dist/fileDirectoryTree.d.ts.map +1 -1
- package/dist/fileDirectoryTree.js +82 -14
- package/dist/gitOperationLog.d.ts +104 -0
- package/dist/gitOperationLog.d.ts.map +1 -0
- package/dist/gitOperationLog.js +88 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/types/collab.d.ts +31 -2
- package/dist/types/collab.d.ts.map +1 -1
- package/dist/types/comments.d.ts +104 -0
- package/dist/types/comments.d.ts.map +1 -0
- package/dist/types/comments.js +2 -0
- package/dist/types/editor.d.ts +201 -1
- package/dist/types/editor.d.ts.map +1 -1
- package/dist/types/extension.d.ts +49 -0
- package/dist/types/extension.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/panel.d.ts +21 -0
- package/dist/types/panel.d.ts.map +1 -1
- package/dist/useCollaborativeEditor.d.ts +13 -8
- package/dist/useCollaborativeEditor.d.ts.map +1 -1
- package/dist/useCollaborativeEditor.js +92 -74
- package/package.json +14 -2
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire contract and pure selectors for the host's Git operation journal.
|
|
3
|
+
*
|
|
4
|
+
* The journal lives in the Electron main process and is published over two host
|
|
5
|
+
* channels: `git:operation-log:get` (hydration) and `git:operation-log-changed`
|
|
6
|
+
* (live upsert/clear). Both the Git extension's Output tab and Nimbalyst's own
|
|
7
|
+
* menu-bar indicator project the same journal, so the merge and "what is running
|
|
8
|
+
* right now" rules have to agree exactly -- two surfaces disagreeing about
|
|
9
|
+
* whether a push is still in flight is the bug this module exists to prevent.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is pure: no React, no IPC, no host runtime.
|
|
12
|
+
*/
|
|
13
|
+
/** Terminal states are everything except `running`. */
|
|
14
|
+
export type GitOperationStatus = 'running' | 'success' | 'error' | 'interrupted';
|
|
15
|
+
/** Who started the command. Absent on journals written before agent activity existed. */
|
|
16
|
+
export type GitOperationSource = 'nimbalyst' | 'agent';
|
|
17
|
+
/**
|
|
18
|
+
* How the command reached Git. `git` is an app-owned direct invocation with a
|
|
19
|
+
* meaningful `args` array; `shell` is an observed command line whose Git segment
|
|
20
|
+
* we detected but did not spawn ourselves.
|
|
21
|
+
*/
|
|
22
|
+
export type GitOperationExecutor = 'git' | 'shell';
|
|
23
|
+
/** An entry exactly as it crosses the IPC boundary (timestamps are epoch ms). */
|
|
24
|
+
export interface GitOperationLogWireEntry {
|
|
25
|
+
id: string;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
updatedAt: number;
|
|
28
|
+
/** Redacted, display-ready command text. */
|
|
29
|
+
command: string;
|
|
30
|
+
executable: 'git';
|
|
31
|
+
args: string[];
|
|
32
|
+
cwd: string;
|
|
33
|
+
status: GitOperationStatus;
|
|
34
|
+
output: string;
|
|
35
|
+
stdout: string;
|
|
36
|
+
stderr: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
exitCode?: number;
|
|
39
|
+
durationMs?: number;
|
|
40
|
+
source?: GitOperationSource;
|
|
41
|
+
executor?: GitOperationExecutor;
|
|
42
|
+
sessionId?: string;
|
|
43
|
+
provider?: string;
|
|
44
|
+
providerToolCallId?: string;
|
|
45
|
+
}
|
|
46
|
+
export type GitOperationLogEvent = {
|
|
47
|
+
workspacePath: string;
|
|
48
|
+
type: 'upsert';
|
|
49
|
+
entry: GitOperationLogWireEntry;
|
|
50
|
+
} | {
|
|
51
|
+
workspacePath: string;
|
|
52
|
+
type: 'clear';
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Window CustomEvent the host dispatches when the user asks to see Git activity
|
|
56
|
+
* detail (for example from the menu-bar indicator's running-command row).
|
|
57
|
+
*
|
|
58
|
+
* The Git panel owns which tab is showing, and that state is private to the
|
|
59
|
+
* extension bundle. Rather than let the host reach into it, the host states the
|
|
60
|
+
* intent and the panel decides how to honour it. `detail.workspacePath` lets a
|
|
61
|
+
* panel bound to a different workspace ignore the request.
|
|
62
|
+
*/
|
|
63
|
+
export declare const GIT_SHOW_OUTPUT_REQUEST_EVENT = "nimbalyst:git-show-output";
|
|
64
|
+
export interface GitShowOutputRequestDetail {
|
|
65
|
+
workspacePath: string;
|
|
66
|
+
}
|
|
67
|
+
/** The minimum shape the selectors below need. */
|
|
68
|
+
interface MergeableEntry {
|
|
69
|
+
id: string;
|
|
70
|
+
timestamp: number | Date;
|
|
71
|
+
updatedAt: number;
|
|
72
|
+
status: GitOperationStatus;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Fill in metadata that predates the field. A journal written before agent
|
|
76
|
+
* activity existed only ever recorded app-owned direct `git` invocations, so
|
|
77
|
+
* that is what an absent `source`/`executor` means -- resolved here at the
|
|
78
|
+
* projection boundary rather than by rewriting the persisted journal.
|
|
79
|
+
*/
|
|
80
|
+
export declare function normalizeGitOperationEntry(entry: GitOperationLogWireEntry): GitOperationLogWireEntry & {
|
|
81
|
+
source: GitOperationSource;
|
|
82
|
+
executor: GitOperationExecutor;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Fold incoming entries into the current list, newest write per id wins.
|
|
86
|
+
*
|
|
87
|
+
* `updatedAt` is the tiebreak rather than arrival order because hydration and
|
|
88
|
+
* the live subscription race: a `git:operation-log:get` response can land after
|
|
89
|
+
* upserts it predates, and applying it blindly would rewind a finished
|
|
90
|
+
* operation back to `running`.
|
|
91
|
+
*/
|
|
92
|
+
export declare function mergeGitOperationEntries<T extends MergeableEntry>(current: T[], incoming: T[]): T[];
|
|
93
|
+
/** Every entry still in flight, oldest first. */
|
|
94
|
+
export declare function selectRunningGitOperations<T extends MergeableEntry>(entries: T[]): T[];
|
|
95
|
+
/**
|
|
96
|
+
* The entry a single-line indicator should name. Newest start wins: when an
|
|
97
|
+
* agent kicks off a fetch while a push is already running, the thing the user
|
|
98
|
+
* just caused is the more informative label.
|
|
99
|
+
*/
|
|
100
|
+
export declare function selectLatestRunningGitOperation<T extends MergeableEntry>(entries: T[]): T | undefined;
|
|
101
|
+
/** The most recently updated entry that has already settled, if any. */
|
|
102
|
+
export declare function selectLatestTerminalGitOperation<T extends MergeableEntry>(entries: T[]): T | undefined;
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=gitOperationLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitOperationLog.d.ts","sourceRoot":"","sources":["../src/gitOperationLog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,uDAAuD;AACvD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAEjF,yFAAyF;AACzF,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,OAAO,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,OAAO,CAAC;AAEnD,iFAAiF;AACjF,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,KAAK,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAA;CAAE,GAC1E;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7C;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AAEzE,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,kDAAkD;AAClD,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAMD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,wBAAwB,GAC9B,wBAAwB,GAAG;IAC5B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAMA;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,cAAc,EAC/D,OAAO,EAAE,CAAC,EAAE,EACZ,QAAQ,EAAE,CAAC,EAAE,GACZ,CAAC,EAAE,CAWL;AAED,iDAAiD;AACjD,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEtF;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,CAAC,SAAS,cAAc,EACtE,OAAO,EAAE,CAAC,EAAE,GACX,CAAC,GAAG,SAAS,CASf;AAED,wEAAwE;AACxE,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,cAAc,EACvE,OAAO,EAAE,CAAC,EAAE,GACX,CAAC,GAAG,SAAS,CASf"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire contract and pure selectors for the host's Git operation journal.
|
|
3
|
+
*
|
|
4
|
+
* The journal lives in the Electron main process and is published over two host
|
|
5
|
+
* channels: `git:operation-log:get` (hydration) and `git:operation-log-changed`
|
|
6
|
+
* (live upsert/clear). Both the Git extension's Output tab and Nimbalyst's own
|
|
7
|
+
* menu-bar indicator project the same journal, so the merge and "what is running
|
|
8
|
+
* right now" rules have to agree exactly -- two surfaces disagreeing about
|
|
9
|
+
* whether a push is still in flight is the bug this module exists to prevent.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is pure: no React, no IPC, no host runtime.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Window CustomEvent the host dispatches when the user asks to see Git activity
|
|
15
|
+
* detail (for example from the menu-bar indicator's running-command row).
|
|
16
|
+
*
|
|
17
|
+
* The Git panel owns which tab is showing, and that state is private to the
|
|
18
|
+
* extension bundle. Rather than let the host reach into it, the host states the
|
|
19
|
+
* intent and the panel decides how to honour it. `detail.workspacePath` lets a
|
|
20
|
+
* panel bound to a different workspace ignore the request.
|
|
21
|
+
*/
|
|
22
|
+
export const GIT_SHOW_OUTPUT_REQUEST_EVENT = 'nimbalyst:git-show-output';
|
|
23
|
+
function toMillis(timestamp) {
|
|
24
|
+
return typeof timestamp === 'number' ? timestamp : timestamp.getTime();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Fill in metadata that predates the field. A journal written before agent
|
|
28
|
+
* activity existed only ever recorded app-owned direct `git` invocations, so
|
|
29
|
+
* that is what an absent `source`/`executor` means -- resolved here at the
|
|
30
|
+
* projection boundary rather than by rewriting the persisted journal.
|
|
31
|
+
*/
|
|
32
|
+
export function normalizeGitOperationEntry(entry) {
|
|
33
|
+
return {
|
|
34
|
+
...entry,
|
|
35
|
+
source: entry.source ?? 'nimbalyst',
|
|
36
|
+
executor: entry.executor ?? 'git',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Fold incoming entries into the current list, newest write per id wins.
|
|
41
|
+
*
|
|
42
|
+
* `updatedAt` is the tiebreak rather than arrival order because hydration and
|
|
43
|
+
* the live subscription race: a `git:operation-log:get` response can land after
|
|
44
|
+
* upserts it predates, and applying it blindly would rewind a finished
|
|
45
|
+
* operation back to `running`.
|
|
46
|
+
*/
|
|
47
|
+
export function mergeGitOperationEntries(current, incoming) {
|
|
48
|
+
const byId = new Map(current.map((entry) => [entry.id, entry]));
|
|
49
|
+
for (const entry of incoming) {
|
|
50
|
+
const existing = byId.get(entry.id);
|
|
51
|
+
if (!existing || entry.updatedAt >= existing.updatedAt) {
|
|
52
|
+
byId.set(entry.id, entry);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return Array.from(byId.values()).sort((a, b) => toMillis(a.timestamp) - toMillis(b.timestamp));
|
|
56
|
+
}
|
|
57
|
+
/** Every entry still in flight, oldest first. */
|
|
58
|
+
export function selectRunningGitOperations(entries) {
|
|
59
|
+
return entries.filter((entry) => entry.status === 'running');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The entry a single-line indicator should name. Newest start wins: when an
|
|
63
|
+
* agent kicks off a fetch while a push is already running, the thing the user
|
|
64
|
+
* just caused is the more informative label.
|
|
65
|
+
*/
|
|
66
|
+
export function selectLatestRunningGitOperation(entries) {
|
|
67
|
+
let latest;
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
if (entry.status !== 'running')
|
|
70
|
+
continue;
|
|
71
|
+
if (!latest || toMillis(entry.timestamp) >= toMillis(latest.timestamp)) {
|
|
72
|
+
latest = entry;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return latest;
|
|
76
|
+
}
|
|
77
|
+
/** The most recently updated entry that has already settled, if any. */
|
|
78
|
+
export function selectLatestTerminalGitOperation(entries) {
|
|
79
|
+
let latest;
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
if (entry.status === 'running')
|
|
82
|
+
continue;
|
|
83
|
+
if (!latest || entry.updatedAt >= latest.updatedAt) {
|
|
84
|
+
latest = entry;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return latest;
|
|
88
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
export { REQUIRED_EXTERNALS, EXTERNAL_PATTERNS, ROLLUP_EXTERNALS, type RequiredExternal, } from './externals.js';
|
|
26
26
|
export * from './types/index.js';
|
|
27
27
|
export { useEditorLifecycle, type UseEditorLifecycleOptions, type UseEditorLifecycleResult, type DiffState, } from './useEditorLifecycle.js';
|
|
28
|
-
export {
|
|
28
|
+
export { editorHostSupports, editorHostCapabilityGap, } from './editorHostCapabilities.js';
|
|
29
|
+
export { useCollaborativeEditor, COLLAB_INIT_ORIGIN, type UseCollaborativeEditorConfig, type UseCollaborativeEditorResult, type CollaborativeBindingHandle, } from './useCollaborativeEditor.js';
|
|
29
30
|
export { createTextCollabContentAdapter, reconstructCollabContentAdapterFromDescriptor, TEXT_COLLAB_DEFAULT_FIELD, type TextCollabContentAdapterOptions, } from './collab/createTextCollabContentAdapter.js';
|
|
30
31
|
export { applyTextDiff, replaceYText, type ApplyTextEdit, } from './collab/textReplacement.js';
|
|
31
32
|
export { useDocumentPath, type DocumentPathContextValue, } from './documentPath.js';
|
|
@@ -37,4 +38,5 @@ export { buildFileDirectoryTree, getFileDirectoryPaths, getFilePathBasename, get
|
|
|
37
38
|
export { validateExtensionBundle, printValidationResult, type ValidationResult, } from './validate.js';
|
|
38
39
|
export { validateBackendModules, assertBackendModulesValid, effectiveModulePermissions, validateAgentProviders, assertAgentProvidersValid, extractBackendModuleIds, MAX_AGENT_PROVIDERS_PER_EXTENSION, type BackendModuleValidationIssue, type AgentProviderValidationIssue, } from './manifestValidation.js';
|
|
39
40
|
export type { AgentProtocol, ProtocolEvent, ProtocolMessage, ProtocolSession, SessionOptions, ProtocolEventType, ToolResult as ProtocolToolResult, MCPServerConfig, RawProtocolSession, AgentProtocolHost, PermissionMode, McpToolDefinition, } from './agents/index.js';
|
|
41
|
+
export { screenshotService } from '@nimbalyst/runtime';
|
|
40
42
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,SAAS,GACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,SAAS,GACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,8BAA8B,EAC9B,6CAA6C,EAC7C,yBAAyB,EACzB,KAAK,+BAA+B,GACrC,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,eAAe,EACf,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,GACjC,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGhE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,EACjC,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,yBAAyB,CAAC;AAYjC,YAAY,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,UAAU,IAAI,kBAAkB,EAChC,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -28,6 +28,7 @@ export { REQUIRED_EXTERNALS, EXTERNAL_PATTERNS, ROLLUP_EXTERNALS, } from './exte
|
|
|
28
28
|
export * from './types/index.js';
|
|
29
29
|
// Re-export hooks
|
|
30
30
|
export { useEditorLifecycle, } from './useEditorLifecycle.js';
|
|
31
|
+
export { editorHostSupports, editorHostCapabilityGap, } from './editorHostCapabilities.js';
|
|
31
32
|
export { useCollaborativeEditor, COLLAB_INIT_ORIGIN, } from './useCollaborativeEditor.js';
|
|
32
33
|
export { createTextCollabContentAdapter, reconstructCollabContentAdapterFromDescriptor, TEXT_COLLAB_DEFAULT_FIELD, } from './collab/createTextCollabContentAdapter.js';
|
|
33
34
|
export { applyTextDiff, replaceYText, } from './collab/textReplacement.js';
|
|
@@ -46,3 +47,5 @@ export { buildFileDirectoryTree, getFileDirectoryPaths, getFilePathBasename, get
|
|
|
46
47
|
// Re-export validation
|
|
47
48
|
export { validateExtensionBundle, printValidationResult, } from './validate.js';
|
|
48
49
|
export { validateBackendModules, assertBackendModulesValid, effectiveModulePermissions, validateAgentProviders, assertAgentProvidersValid, extractBackendModuleIds, MAX_AGENT_PROVIDERS_PER_EXTENSION, } from './manifestValidation.js';
|
|
50
|
+
// Host-owned native screenshots for every built-in and extension editor.
|
|
51
|
+
export { screenshotService } from '@nimbalyst/runtime';
|
package/dist/types/collab.d.ts
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* @see CollabContentAdapter -- the former name, kept as a deprecated alias.
|
|
31
31
|
*/
|
|
32
32
|
import type { Doc } from 'yjs';
|
|
33
|
+
import type { CommentAnchor } from './comments';
|
|
33
34
|
export type CollabContentFileSource = string | Uint8Array;
|
|
34
35
|
/**
|
|
35
36
|
* Serializable description of a CollabContentAdapter that lets the HOST
|
|
@@ -52,6 +53,17 @@ export interface CollabCodecMigration {
|
|
|
52
53
|
to: number;
|
|
53
54
|
run(yDoc: Doc): void;
|
|
54
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Structured-comment anchor support for headless hosts. Hosts invoke these
|
|
58
|
+
* reads against a detached, disposable Y.Doc snapshot rather than the live
|
|
59
|
+
* collaborative document, so an accidental mutation cannot alter or sync the
|
|
60
|
+
* real document. Codecs should still treat the snapshot as read-only.
|
|
61
|
+
*/
|
|
62
|
+
export interface CollabCommentAnchorCodec {
|
|
63
|
+
handles(anchor: CommentAnchor): boolean;
|
|
64
|
+
getState(snapshot: Doc, anchor: CommentAnchor): 'attached' | 'orphaned';
|
|
65
|
+
describe(snapshot: Doc, anchor: CommentAnchor): string;
|
|
66
|
+
}
|
|
55
67
|
/** @deprecated Renamed to {@link CollabCodecMigration}. */
|
|
56
68
|
export type CollabContentAdapterMigration = CollabCodecMigration;
|
|
57
69
|
export interface CollabCodec<TStructured = unknown> {
|
|
@@ -95,9 +107,26 @@ export interface CollabCodec<TStructured = unknown> {
|
|
|
95
107
|
* `applyStructuredPatch`. */
|
|
96
108
|
toStructured?(yDoc: Doc): TStructured;
|
|
97
109
|
/** Optional: write structured edits back. Paired with
|
|
98
|
-
* `toStructured`. AI-write surface
|
|
99
|
-
* both this
|
|
110
|
+
* `toStructured`. The PREFERRED AI-write surface: implementing
|
|
111
|
+
* both lets an agent edit this document type structurally.
|
|
112
|
+
*
|
|
113
|
+
* It is NOT a gate. When an adapter does not implement the pair,
|
|
114
|
+
* an agent edit falls back to `exportToFile` -> text replacement
|
|
115
|
+
* -> `applyFromFile`, so every adapter is AI-writable whether or
|
|
116
|
+
* not it opted in. Two consequences an adapter author must know:
|
|
117
|
+
*
|
|
118
|
+
* - `applyFromFile` is called with agent-authored content, not
|
|
119
|
+
* just on-disk content, so it must be safe to call on a
|
|
120
|
+
* populated Y.Doc (it already must be) AND must be able to
|
|
121
|
+
* consume its own `exportToFile` output unchanged. That
|
|
122
|
+
* round-trip is asserted for every registered adapter in
|
|
123
|
+
* `codecOnlyHeadlessEdit.test.ts`.
|
|
124
|
+
* - The fallback rewrites the whole document, so a concurrent
|
|
125
|
+
* human edit can interleave. Implement the structured pair to
|
|
126
|
+
* get minimal deltas instead. */
|
|
100
127
|
applyStructuredPatch?(yDoc: Doc, patch: unknown): void;
|
|
128
|
+
/** Optional snapshot-isolated resolver for structured comment anchors. */
|
|
129
|
+
commentAnchors?: CollabCommentAnchorCodec;
|
|
101
130
|
/** Optional: produce a snapshot for revision history. Defaults to
|
|
102
131
|
* `Y.encodeStateAsUpdateV2(yDoc)`. Override if you need a denser
|
|
103
132
|
* snapshot format. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collab.d.ts","sourceRoot":"","sources":["../../src/types/collab.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"collab.d.ts","sourceRoot":"","sources":["../../src/types/collab.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/** Editor-neutral collaborative comment contracts exposed to extensions. */
|
|
2
|
+
export type TextQuoteCommentAnchor = {
|
|
3
|
+
kind: 'text-quote';
|
|
4
|
+
exact: string;
|
|
5
|
+
prefix?: string;
|
|
6
|
+
suffix?: string;
|
|
7
|
+
};
|
|
8
|
+
export type EntityCommentAnchor = {
|
|
9
|
+
kind: 'entity';
|
|
10
|
+
entityType: string;
|
|
11
|
+
entityId: string;
|
|
12
|
+
field?: string;
|
|
13
|
+
labelSnapshot?: string;
|
|
14
|
+
};
|
|
15
|
+
export type CommentAnchor = TextQuoteCommentAnchor | EntityCommentAnchor;
|
|
16
|
+
export type CollaborativeUserCommentActor = {
|
|
17
|
+
kind: 'user';
|
|
18
|
+
userId?: string;
|
|
19
|
+
displayName: string;
|
|
20
|
+
};
|
|
21
|
+
export type CollaborativeAgentCommentActor = {
|
|
22
|
+
kind: 'agent';
|
|
23
|
+
sessionId: string;
|
|
24
|
+
sessionName: string;
|
|
25
|
+
onBehalfOfUserId: string;
|
|
26
|
+
onBehalfOfDisplayName?: string;
|
|
27
|
+
};
|
|
28
|
+
export type CollaborativeCommentActor = CollaborativeUserCommentActor | CollaborativeAgentCommentActor;
|
|
29
|
+
export interface CollaborativeComment {
|
|
30
|
+
readonly actor?: CollaborativeCommentActor;
|
|
31
|
+
readonly author: string;
|
|
32
|
+
readonly clientMutationId?: string;
|
|
33
|
+
readonly content: string;
|
|
34
|
+
readonly deleted: boolean;
|
|
35
|
+
readonly id: string;
|
|
36
|
+
readonly replyToCommentId?: string;
|
|
37
|
+
readonly timeStamp: number;
|
|
38
|
+
readonly type: 'comment';
|
|
39
|
+
}
|
|
40
|
+
export interface CollaborativeCommentThread {
|
|
41
|
+
readonly anchor?: CommentAnchor;
|
|
42
|
+
readonly comments: ReadonlyArray<CollaborativeComment>;
|
|
43
|
+
readonly id: string;
|
|
44
|
+
readonly quote: string;
|
|
45
|
+
readonly resolved: boolean;
|
|
46
|
+
readonly type: 'thread';
|
|
47
|
+
}
|
|
48
|
+
/** The immutable canonical view of the document's top-level comments array. */
|
|
49
|
+
export type CollaborativeCommentsSnapshot = ReadonlyArray<CollaborativeComment | CollaborativeCommentThread>;
|
|
50
|
+
export interface CommentCapabilities {
|
|
51
|
+
read: boolean;
|
|
52
|
+
comment: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface CommentMember {
|
|
55
|
+
userId: string;
|
|
56
|
+
name: string;
|
|
57
|
+
email?: string | null;
|
|
58
|
+
personalOrgId?: string | null;
|
|
59
|
+
}
|
|
60
|
+
export interface CreateCommentThreadInput {
|
|
61
|
+
anchor: CommentAnchor;
|
|
62
|
+
content: string;
|
|
63
|
+
clientMutationId: string;
|
|
64
|
+
mentionedUserIds?: string[];
|
|
65
|
+
}
|
|
66
|
+
export interface CreateCommentThreadResult {
|
|
67
|
+
comment: CollaborativeComment;
|
|
68
|
+
duplicate: boolean;
|
|
69
|
+
thread: CollaborativeCommentThread;
|
|
70
|
+
}
|
|
71
|
+
export interface ReplyToCommentInput {
|
|
72
|
+
threadId: string;
|
|
73
|
+
content: string;
|
|
74
|
+
clientMutationId: string;
|
|
75
|
+
mentionedUserIds?: string[];
|
|
76
|
+
replyToCommentId?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface ReplyToCommentResult {
|
|
79
|
+
comment: CollaborativeComment;
|
|
80
|
+
duplicate: boolean;
|
|
81
|
+
threadId: string;
|
|
82
|
+
}
|
|
83
|
+
export interface MountedCommentAnchorAdapter {
|
|
84
|
+
handles(anchor: CommentAnchor): boolean;
|
|
85
|
+
getState(anchor: CommentAnchor): 'attached' | 'orphaned';
|
|
86
|
+
describe(anchor: CommentAnchor): string;
|
|
87
|
+
focus(anchor: CommentAnchor): boolean | Promise<boolean>;
|
|
88
|
+
}
|
|
89
|
+
export interface CollaborationCommentsService {
|
|
90
|
+
getSnapshot(): CollaborativeCommentsSnapshot;
|
|
91
|
+
subscribe(listener: () => void): () => void;
|
|
92
|
+
getCapabilities(): CommentCapabilities;
|
|
93
|
+
getMentionableMembers(): CommentMember[];
|
|
94
|
+
createThread(input: CreateCommentThreadInput): Promise<CreateCommentThreadResult>;
|
|
95
|
+
reply(input: ReplyToCommentInput): Promise<ReplyToCommentResult>;
|
|
96
|
+
setResolved(threadId: string, resolved: boolean): Promise<void>;
|
|
97
|
+
focusThread(threadId: string): Promise<boolean>;
|
|
98
|
+
openPanel(input?: {
|
|
99
|
+
threadId?: string;
|
|
100
|
+
anchor?: CommentAnchor;
|
|
101
|
+
}): void;
|
|
102
|
+
registerAnchorAdapter(adapter: MountedCommentAnchorAdapter): () => void;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/types/comments.ts"],"names":[],"mappings":"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"}
|