@useactor/core 0.1.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/dist/ai-sdk-provider.d.ts +54 -0
- package/dist/ai-sdk-provider.d.ts.map +1 -0
- package/dist/ai-sdk-provider.js +335 -0
- package/dist/ai-sdk-provider.js.map +1 -0
- package/dist/app-runtime.d.ts +83 -0
- package/dist/app-runtime.d.ts.map +1 -0
- package/dist/app-runtime.js +504 -0
- package/dist/app-runtime.js.map +1 -0
- package/dist/artifacts.d.ts +49 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +50 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/cli-defined-tools.d.ts +17 -0
- package/dist/cli-defined-tools.d.ts.map +1 -0
- package/dist/cli-defined-tools.js +146 -0
- package/dist/cli-defined-tools.js.map +1 -0
- package/dist/codex-oauth-provider.d.ts +30 -0
- package/dist/codex-oauth-provider.d.ts.map +1 -0
- package/dist/codex-oauth-provider.js +453 -0
- package/dist/codex-oauth-provider.js.map +1 -0
- package/dist/events.d.ts +133 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +46 -0
- package/dist/events.js.map +1 -0
- package/dist/feedback.d.ts +29 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +62 -0
- package/dist/feedback.js.map +1 -0
- package/dist/history.d.ts +34 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +118 -0
- package/dist/history.js.map +1 -0
- package/dist/in-memory-runtime.d.ts +12 -0
- package/dist/in-memory-runtime.d.ts.map +1 -0
- package/dist/in-memory-runtime.js +491 -0
- package/dist/in-memory-runtime.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations.d.ts +37 -0
- package/dist/integrations.d.ts.map +1 -0
- package/dist/integrations.js +48 -0
- package/dist/integrations.js.map +1 -0
- package/dist/local-event-logger.d.ts +19 -0
- package/dist/local-event-logger.d.ts.map +1 -0
- package/dist/local-event-logger.js +163 -0
- package/dist/local-event-logger.js.map +1 -0
- package/dist/local-event-schema.d.ts +99 -0
- package/dist/local-event-schema.d.ts.map +1 -0
- package/dist/local-event-schema.js +43 -0
- package/dist/local-event-schema.js.map +1 -0
- package/dist/local-tools.d.ts +99 -0
- package/dist/local-tools.d.ts.map +1 -0
- package/dist/local-tools.js +418 -0
- package/dist/local-tools.js.map +1 -0
- package/dist/mcp-server-config.d.ts +16 -0
- package/dist/mcp-server-config.d.ts.map +1 -0
- package/dist/mcp-server-config.js +75 -0
- package/dist/mcp-server-config.js.map +1 -0
- package/dist/mock-provider.d.ts +8 -0
- package/dist/mock-provider.d.ts.map +1 -0
- package/dist/mock-provider.js +47 -0
- package/dist/mock-provider.js.map +1 -0
- package/dist/model-catalog.d.ts +24 -0
- package/dist/model-catalog.d.ts.map +1 -0
- package/dist/model-catalog.js +92 -0
- package/dist/model-catalog.js.map +1 -0
- package/dist/monoid-integration.d.ts +33 -0
- package/dist/monoid-integration.d.ts.map +1 -0
- package/dist/monoid-integration.js +184 -0
- package/dist/monoid-integration.js.map +1 -0
- package/dist/openai-oauth.d.ts +69 -0
- package/dist/openai-oauth.d.ts.map +1 -0
- package/dist/openai-oauth.js +127 -0
- package/dist/openai-oauth.js.map +1 -0
- package/dist/permission-grant-store.d.ts +7 -0
- package/dist/permission-grant-store.d.ts.map +1 -0
- package/dist/permission-grant-store.js +77 -0
- package/dist/permission-grant-store.js.map +1 -0
- package/dist/permission-grants.d.ts +38 -0
- package/dist/permission-grants.d.ts.map +1 -0
- package/dist/permission-grants.js +93 -0
- package/dist/permission-grants.js.map +1 -0
- package/dist/personas.d.ts +51 -0
- package/dist/personas.d.ts.map +1 -0
- package/dist/personas.js +137 -0
- package/dist/personas.js.map +1 -0
- package/dist/project-tool-registry.d.ts +16 -0
- package/dist/project-tool-registry.d.ts.map +1 -0
- package/dist/project-tool-registry.js +86 -0
- package/dist/project-tool-registry.js.map +1 -0
- package/dist/projects.d.ts +88 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +243 -0
- package/dist/projects.js.map +1 -0
- package/dist/prompt-context.d.ts +13 -0
- package/dist/prompt-context.d.ts.map +1 -0
- package/dist/prompt-context.js +170 -0
- package/dist/prompt-context.js.map +1 -0
- package/dist/proposed-plan.d.ts +24 -0
- package/dist/proposed-plan.d.ts.map +1 -0
- package/dist/proposed-plan.js +74 -0
- package/dist/proposed-plan.js.map +1 -0
- package/dist/providers.d.ts +53 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +31 -0
- package/dist/providers.js.map +1 -0
- package/dist/question-requests.d.ts +39 -0
- package/dist/question-requests.d.ts.map +1 -0
- package/dist/question-requests.js +135 -0
- package/dist/question-requests.js.map +1 -0
- package/dist/renderer-api.d.ts +52 -0
- package/dist/renderer-api.d.ts.map +1 -0
- package/dist/renderer-api.js +2 -0
- package/dist/renderer-api.js.map +1 -0
- package/dist/runtime-tool-execution.d.ts +22 -0
- package/dist/runtime-tool-execution.d.ts.map +1 -0
- package/dist/runtime-tool-execution.js +245 -0
- package/dist/runtime-tool-execution.js.map +1 -0
- package/dist/runtime.d.ts +154 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +184 -0
- package/dist/runtime.js.map +1 -0
- package/dist/secrets.d.ts +75 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +255 -0
- package/dist/secrets.js.map +1 -0
- package/dist/session-actions.d.ts +45 -0
- package/dist/session-actions.d.ts.map +1 -0
- package/dist/session-actions.js +393 -0
- package/dist/session-actions.js.map +1 -0
- package/dist/skills.d.ts +43 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +333 -0
- package/dist/skills.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +17 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/tool-requests.d.ts +58 -0
- package/dist/tool-requests.d.ts.map +1 -0
- package/dist/tool-requests.js +122 -0
- package/dist/tool-requests.js.map +1 -0
- package/dist/tools.d.ts +45 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +50 -0
- package/dist/tools.js.map +1 -0
- package/dist/wyrdos-integration.d.ts +32 -0
- package/dist/wyrdos-integration.d.ts.map +1 -0
- package/dist/wyrdos-integration.js +183 -0
- package/dist/wyrdos-integration.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const openAiCodexReasoningLevels = [
|
|
2
|
+
{
|
|
3
|
+
id: "low",
|
|
4
|
+
label: "Low",
|
|
5
|
+
description: "Fast responses with lighter reasoning",
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
id: "medium",
|
|
9
|
+
label: "Medium",
|
|
10
|
+
description: "Balances speed and reasoning depth for everyday tasks",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: "high",
|
|
14
|
+
label: "High",
|
|
15
|
+
description: "Greater reasoning depth for complex problems",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "xhigh",
|
|
19
|
+
label: "Extra high",
|
|
20
|
+
description: "Extra high reasoning depth for complex problems",
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
const openAiModelCatalog = [
|
|
24
|
+
{
|
|
25
|
+
providerId: "openai",
|
|
26
|
+
modelId: "gpt-5.5",
|
|
27
|
+
contextWindow: 400_000,
|
|
28
|
+
inputLimit: 272_000,
|
|
29
|
+
outputLimit: 128_000,
|
|
30
|
+
defaultReasoningLevel: "medium",
|
|
31
|
+
supportedReasoningLevels: openAiCodexReasoningLevels,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
providerId: "openai",
|
|
35
|
+
modelId: "gpt-5.2",
|
|
36
|
+
contextWindow: 400_000,
|
|
37
|
+
inputLimit: 272_000,
|
|
38
|
+
outputLimit: 128_000,
|
|
39
|
+
defaultReasoningLevel: "medium",
|
|
40
|
+
supportedReasoningLevels: openAiCodexReasoningLevels,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
providerId: "openai",
|
|
44
|
+
modelId: "gpt-5.3-codex",
|
|
45
|
+
contextWindow: 400_000,
|
|
46
|
+
inputLimit: 272_000,
|
|
47
|
+
outputLimit: 128_000,
|
|
48
|
+
defaultReasoningLevel: "medium",
|
|
49
|
+
supportedReasoningLevels: openAiCodexReasoningLevels,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
providerId: "openai",
|
|
53
|
+
modelId: "gpt-5.3-codex-spark",
|
|
54
|
+
contextWindow: 128_000,
|
|
55
|
+
inputLimit: 100_000,
|
|
56
|
+
outputLimit: 32_000,
|
|
57
|
+
defaultReasoningLevel: "medium",
|
|
58
|
+
supportedReasoningLevels: openAiCodexReasoningLevels,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
providerId: "openai",
|
|
62
|
+
modelId: "gpt-5.4",
|
|
63
|
+
contextWindow: 1_050_000,
|
|
64
|
+
inputLimit: 922_000,
|
|
65
|
+
outputLimit: 128_000,
|
|
66
|
+
defaultReasoningLevel: "medium",
|
|
67
|
+
supportedReasoningLevels: openAiCodexReasoningLevels,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
providerId: "openai",
|
|
71
|
+
modelId: "gpt-5.4-mini",
|
|
72
|
+
contextWindow: 400_000,
|
|
73
|
+
inputLimit: 272_000,
|
|
74
|
+
outputLimit: 128_000,
|
|
75
|
+
defaultReasoningLevel: "medium",
|
|
76
|
+
supportedReasoningLevels: openAiCodexReasoningLevels,
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
const modelCatalog = [...openAiModelCatalog];
|
|
80
|
+
export function getModelCatalogEntry(input) {
|
|
81
|
+
return modelCatalog.find((entry) => entry.providerId === input.providerId && entry.modelId === input.modelId);
|
|
82
|
+
}
|
|
83
|
+
export function getCatalogContextWindows(input) {
|
|
84
|
+
return Object.fromEntries(input.modelIds.flatMap((modelId) => {
|
|
85
|
+
const entry = getModelCatalogEntry({
|
|
86
|
+
providerId: input.providerId,
|
|
87
|
+
modelId,
|
|
88
|
+
});
|
|
89
|
+
return entry ? [[modelId, entry.contextWindow]] : [];
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=model-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"AAwBA,MAAM,0BAA0B,GAAG;IACjC;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,uCAAuC;KACrD;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,uDAAuD;KACrE;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,8CAA8C;KAC5D;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,iDAAiD;KAC/D;CACsD,CAAC;AAE1D,MAAM,kBAAkB,GAAG;IACzB;QACE,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,OAAO;QACpB,qBAAqB,EAAE,QAAQ;QAC/B,wBAAwB,EAAE,0BAA0B;KACrD;IACD;QACE,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,OAAO;QACpB,qBAAqB,EAAE,QAAQ;QAC/B,wBAAwB,EAAE,0BAA0B;KACrD;IACD;QACE,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,eAAe;QACxB,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,OAAO;QACpB,qBAAqB,EAAE,QAAQ;QAC/B,wBAAwB,EAAE,0BAA0B;KACrD;IACD;QACE,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,qBAAqB;QAC9B,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,MAAM;QACnB,qBAAqB,EAAE,QAAQ;QAC/B,wBAAwB,EAAE,0BAA0B;KACrD;IACD;QACE,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,OAAO;QACpB,qBAAqB,EAAE,QAAQ;QAC/B,wBAAwB,EAAE,0BAA0B;KACrD;IACD;QACE,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,cAAc;QACvB,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,OAAO;QACpB,qBAAqB,EAAE,QAAQ;QAC/B,wBAAwB,EAAE,0BAA0B;KACrD;CACmD,CAAC;AAEvD,MAAM,YAAY,GAAG,CAAC,GAAG,kBAAkB,CAAU,CAAC;AAEtD,MAAM,UAAU,oBAAoB,CAAC,KAGpC;IACC,OAAO,YAAY,CAAC,IAAI,CACtB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAC3E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAGxC;IACC,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,oBAAoB,CAAC;YACjC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO;SACR,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IntegrationRegistration } from "./integrations.js";
|
|
2
|
+
type ExecRunner = (file: string, args: readonly string[], options: {
|
|
3
|
+
readonly timeout: number;
|
|
4
|
+
readonly maxBuffer: number;
|
|
5
|
+
}) => Promise<{
|
|
6
|
+
readonly stdout: string;
|
|
7
|
+
readonly stderr: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare class MonoidIntegrationCliError extends Error {
|
|
10
|
+
readonly code: "missing_cli" | "cli_failed" | "invalid_payload";
|
|
11
|
+
readonly recoverable = true;
|
|
12
|
+
constructor(code: "missing_cli" | "cli_failed" | "invalid_payload", message: string);
|
|
13
|
+
}
|
|
14
|
+
export declare function createMonoidIntegrationSkeleton(): IntegrationRegistration;
|
|
15
|
+
export interface MonoidReadInput {
|
|
16
|
+
readonly containerId?: string;
|
|
17
|
+
readonly projectId?: string;
|
|
18
|
+
readonly taskId?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function runMonoidContextRead(input: MonoidReadInput, options?: {
|
|
21
|
+
readonly exec?: ExecRunner;
|
|
22
|
+
readonly maxBytes?: number;
|
|
23
|
+
}): Promise<Record<string, unknown>>;
|
|
24
|
+
export declare function runMonoidUpdate(args: readonly string[], options?: {
|
|
25
|
+
readonly exec?: ExecRunner;
|
|
26
|
+
readonly maxBytes?: number;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
readonly ok: boolean;
|
|
29
|
+
readonly args: readonly string[];
|
|
30
|
+
readonly summary: string;
|
|
31
|
+
}>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=monoid-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monoid-integration.d.ts","sourceRoot":"","sources":["../src/monoid-integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAMjE,KAAK,UAAU,GAAG,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAC9D,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,iBAAiB,CAAC;IAChE,QAAQ,CAAC,WAAW,QAAQ;gBAEhB,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,iBAAiB,EAAE,OAAO,EAAE,MAAM;CAKpF;AAaD,wBAAgB,+BAA+B,IAAI,uBAAuB,CAoFzE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE;IACP,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACvB,GACL,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BlC;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE;IACP,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACvB,GACL,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAe/F"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export class MonoidIntegrationCliError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
recoverable = true;
|
|
7
|
+
constructor(code, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.name = "MonoidIntegrationCliError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function createNotWiredResult(toolId) {
|
|
14
|
+
return {
|
|
15
|
+
content: JSON.stringify({
|
|
16
|
+
ok: false,
|
|
17
|
+
code: "integration_not_wired",
|
|
18
|
+
toolId,
|
|
19
|
+
message: "MONOid CLI execution is not wired yet."
|
|
20
|
+
})
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function createMonoidIntegrationSkeleton() {
|
|
24
|
+
const readInputSchema = {
|
|
25
|
+
type: "object",
|
|
26
|
+
additionalProperties: false,
|
|
27
|
+
properties: {
|
|
28
|
+
containerId: { type: "string" },
|
|
29
|
+
projectId: { type: "string" },
|
|
30
|
+
taskId: { type: "string" }
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const writeInputSchema = {
|
|
34
|
+
type: "object",
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
required: ["args"],
|
|
37
|
+
properties: {
|
|
38
|
+
args: {
|
|
39
|
+
type: "array",
|
|
40
|
+
minItems: 1,
|
|
41
|
+
items: { type: "string" }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const tools = [
|
|
46
|
+
{
|
|
47
|
+
id: "monoid_context_read",
|
|
48
|
+
name: "MONOid context read",
|
|
49
|
+
description: "Read compact MONOid context for configured container/project/task refs.",
|
|
50
|
+
inputSchema: readInputSchema,
|
|
51
|
+
permissionPolicy: "never",
|
|
52
|
+
async executor(input) {
|
|
53
|
+
const params = normalizeReadInput(input);
|
|
54
|
+
const context = await runMonoidContextRead(params);
|
|
55
|
+
return {
|
|
56
|
+
content: JSON.stringify({
|
|
57
|
+
context
|
|
58
|
+
})
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "monoid_update",
|
|
64
|
+
name: "MONOid update",
|
|
65
|
+
description: "Execute an approval-gated MONOid CLI write action.",
|
|
66
|
+
inputSchema: writeInputSchema,
|
|
67
|
+
permissionPolicy: "on-request",
|
|
68
|
+
async executor(input) {
|
|
69
|
+
const args = normalizeWriteArgs(input);
|
|
70
|
+
const result = await runMonoidUpdate(args);
|
|
71
|
+
return {
|
|
72
|
+
content: JSON.stringify(result)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
];
|
|
77
|
+
return {
|
|
78
|
+
definition: {
|
|
79
|
+
id: "monoid",
|
|
80
|
+
kind: "monoid",
|
|
81
|
+
name: "MONOid",
|
|
82
|
+
description: "MONOid CLI-backed integration tools.",
|
|
83
|
+
tools: [
|
|
84
|
+
{
|
|
85
|
+
id: "monoid_context_read",
|
|
86
|
+
name: "MONOid context read",
|
|
87
|
+
description: "Read compact MONOid context.",
|
|
88
|
+
inputSchema: readInputSchema,
|
|
89
|
+
permissionPolicy: "never",
|
|
90
|
+
readOnly: true,
|
|
91
|
+
approvalRequired: false
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "monoid_update",
|
|
95
|
+
name: "MONOid update",
|
|
96
|
+
description: "Approval-gated MONOid CLI write action.",
|
|
97
|
+
inputSchema: writeInputSchema,
|
|
98
|
+
permissionPolicy: "on-request",
|
|
99
|
+
readOnly: false,
|
|
100
|
+
approvalRequired: true
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
tools
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export async function runMonoidContextRead(input, options = {}) {
|
|
108
|
+
const exec = options.exec ?? execFileAsync;
|
|
109
|
+
const args = [
|
|
110
|
+
"tasks",
|
|
111
|
+
"list",
|
|
112
|
+
"-o",
|
|
113
|
+
"json",
|
|
114
|
+
...(input.containerId ? ["--container-id", input.containerId] : []),
|
|
115
|
+
...(input.projectId ? ["--project-id", input.projectId] : []),
|
|
116
|
+
...(input.taskId ? ["--task-id", input.taskId] : [])
|
|
117
|
+
];
|
|
118
|
+
try {
|
|
119
|
+
const result = await exec("monoid", args, { timeout: 10_000, maxBuffer: options.maxBytes ?? 128_000 });
|
|
120
|
+
const parsed = JSON.parse(result.stdout);
|
|
121
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
122
|
+
throw new MonoidIntegrationCliError("invalid_payload", "MONOid CLI returned non-object context payload.");
|
|
123
|
+
}
|
|
124
|
+
return parsed;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof MonoidIntegrationCliError) {
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
if (typeof error === "object" && error && "code" in error && error.code === "ENOENT") {
|
|
131
|
+
throw new MonoidIntegrationCliError("missing_cli", "MONOid CLI not found. Install and login before using this tool.");
|
|
132
|
+
}
|
|
133
|
+
if (error instanceof SyntaxError) {
|
|
134
|
+
throw new MonoidIntegrationCliError("invalid_payload", "MONOid CLI returned invalid JSON.");
|
|
135
|
+
}
|
|
136
|
+
throw new MonoidIntegrationCliError("cli_failed", "MONOid CLI context read failed.");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export async function runMonoidUpdate(args, options = {}) {
|
|
140
|
+
const exec = options.exec ?? execFileAsync;
|
|
141
|
+
try {
|
|
142
|
+
const result = await exec("monoid", [...args], {
|
|
143
|
+
timeout: 10_000,
|
|
144
|
+
maxBuffer: options.maxBytes ?? 128_000
|
|
145
|
+
});
|
|
146
|
+
const summary = [result.stdout, result.stderr].filter(Boolean).join("\n").trim().slice(0, 2000);
|
|
147
|
+
return { ok: true, args, summary };
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (typeof error === "object" && error && "code" in error && error.code === "ENOENT") {
|
|
151
|
+
throw new MonoidIntegrationCliError("missing_cli", "MONOid CLI not found. Install and login before using this tool.");
|
|
152
|
+
}
|
|
153
|
+
throw new MonoidIntegrationCliError("cli_failed", "MONOid CLI write execution failed.");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function normalizeReadInput(input) {
|
|
157
|
+
if (!input || typeof input !== "object" || Array.isArray(input)) {
|
|
158
|
+
return {};
|
|
159
|
+
}
|
|
160
|
+
const record = input;
|
|
161
|
+
const containerId = typeof record.containerId === "string" ? record.containerId.trim() : "";
|
|
162
|
+
const projectId = typeof record.projectId === "string" ? record.projectId.trim() : "";
|
|
163
|
+
const taskId = typeof record.taskId === "string" ? record.taskId.trim() : "";
|
|
164
|
+
return {
|
|
165
|
+
...(containerId ? { containerId } : {}),
|
|
166
|
+
...(projectId ? { projectId } : {}),
|
|
167
|
+
...(taskId ? { taskId } : {})
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function normalizeWriteArgs(input) {
|
|
171
|
+
if (!input || typeof input !== "object" || Array.isArray(input)) {
|
|
172
|
+
throw new Error("MONOid update requires an object input.");
|
|
173
|
+
}
|
|
174
|
+
const argsValue = input.args;
|
|
175
|
+
if (!Array.isArray(argsValue) || argsValue.length === 0) {
|
|
176
|
+
throw new Error("MONOid update requires args array.");
|
|
177
|
+
}
|
|
178
|
+
const args = argsValue.map((value) => String(value).trim()).filter(Boolean);
|
|
179
|
+
if (args.length === 0) {
|
|
180
|
+
throw new Error("MONOid update requires at least one non-empty arg.");
|
|
181
|
+
}
|
|
182
|
+
return args;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=monoid-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monoid-integration.js","sourceRoot":"","sources":["../src/monoid-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import type { SecretStore } from "./secrets.js";
|
|
3
|
+
export interface OpenAiOAuthCredential {
|
|
4
|
+
readonly type: "oauth";
|
|
5
|
+
readonly accessToken: string;
|
|
6
|
+
readonly refreshToken?: string;
|
|
7
|
+
readonly expiresAt: string;
|
|
8
|
+
readonly accountId?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface OpenAiOAuthMetadata {
|
|
11
|
+
readonly type: "oauth";
|
|
12
|
+
readonly authenticated: boolean;
|
|
13
|
+
readonly expiresAt?: string;
|
|
14
|
+
readonly accountId?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface PkcePair {
|
|
17
|
+
readonly verifier: string;
|
|
18
|
+
readonly challenge: string;
|
|
19
|
+
readonly method: "S256";
|
|
20
|
+
}
|
|
21
|
+
export interface OAuthTokenResponse {
|
|
22
|
+
readonly access_token: string;
|
|
23
|
+
readonly refresh_token?: string;
|
|
24
|
+
readonly expires_in?: number;
|
|
25
|
+
readonly account_id?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface OpenAiOAuthTokenClient {
|
|
28
|
+
readonly tokenEndpoint?: string;
|
|
29
|
+
readonly clientId: string;
|
|
30
|
+
readonly fetch: typeof fetch;
|
|
31
|
+
readonly now?: () => Date;
|
|
32
|
+
}
|
|
33
|
+
export interface StoreOpenAiOAuthCredentialOptions {
|
|
34
|
+
readonly secretStore: SecretStore;
|
|
35
|
+
readonly secretId: string;
|
|
36
|
+
readonly credential: OpenAiOAuthCredential;
|
|
37
|
+
}
|
|
38
|
+
export interface LoadOpenAiOAuthCredentialOptions {
|
|
39
|
+
readonly secretStore: SecretStore;
|
|
40
|
+
readonly secretId: string;
|
|
41
|
+
}
|
|
42
|
+
export interface RefreshOpenAiOAuthCredentialOptions extends OpenAiOAuthTokenClient {
|
|
43
|
+
readonly credential: OpenAiOAuthCredential;
|
|
44
|
+
}
|
|
45
|
+
export interface EnsureFreshOpenAiOAuthCredentialOptions extends OpenAiOAuthTokenClient {
|
|
46
|
+
readonly secretStore: SecretStore;
|
|
47
|
+
readonly secretId: string;
|
|
48
|
+
readonly skewMs?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface OpenAiOAuthAuthorizationUrlOptions {
|
|
51
|
+
readonly authorizationEndpoint?: string;
|
|
52
|
+
readonly clientId: string;
|
|
53
|
+
readonly redirectUri: string;
|
|
54
|
+
readonly scope?: string;
|
|
55
|
+
readonly state: string;
|
|
56
|
+
readonly pkce: PkcePair;
|
|
57
|
+
}
|
|
58
|
+
export declare function createPkcePair(random?: typeof randomBytes): PkcePair;
|
|
59
|
+
export declare function createOAuthState(): string;
|
|
60
|
+
export declare function createOpenAiOAuthAuthorizationUrl(options: OpenAiOAuthAuthorizationUrlOptions): string;
|
|
61
|
+
export declare function parseOpenAiOAuthCredential(value: string): OpenAiOAuthCredential;
|
|
62
|
+
export declare function storeOpenAiOAuthCredential(options: StoreOpenAiOAuthCredentialOptions): Promise<void>;
|
|
63
|
+
export declare function loadOpenAiOAuthCredential(options: LoadOpenAiOAuthCredentialOptions): Promise<OpenAiOAuthCredential | undefined>;
|
|
64
|
+
export declare function deleteOpenAiOAuthCredential(options: LoadOpenAiOAuthCredentialOptions): Promise<boolean>;
|
|
65
|
+
export declare function refreshOpenAiOAuthCredential(options: RefreshOpenAiOAuthCredentialOptions): Promise<OpenAiOAuthCredential>;
|
|
66
|
+
export declare function ensureFreshOpenAiOAuthCredential(options: EnsureFreshOpenAiOAuthCredentialOptions): Promise<OpenAiOAuthCredential | undefined>;
|
|
67
|
+
export declare function getOpenAiOAuthMetadata(credential: OpenAiOAuthCredential | undefined): OpenAiOAuthMetadata;
|
|
68
|
+
export declare function getOpenAiOAuthHeaders(credential: OpenAiOAuthCredential): Record<string, string>;
|
|
69
|
+
//# sourceMappingURL=openai-oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-oauth.d.ts","sourceRoot":"","sources":["../src/openai-oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
const defaultTokenEndpoint = "https://auth.openai.com/oauth/token";
|
|
3
|
+
const defaultAuthorizationEndpoint = "https://auth.openai.com/oauth/authorize";
|
|
4
|
+
const defaultScope = "openid profile email offline_access";
|
|
5
|
+
export function createPkcePair(random = randomBytes) {
|
|
6
|
+
const verifier = base64Url(random(32));
|
|
7
|
+
const challenge = base64Url(createHash("sha256").update(verifier).digest());
|
|
8
|
+
return { verifier, challenge, method: "S256" };
|
|
9
|
+
}
|
|
10
|
+
export function createOAuthState() {
|
|
11
|
+
return randomUUID();
|
|
12
|
+
}
|
|
13
|
+
export function createOpenAiOAuthAuthorizationUrl(options) {
|
|
14
|
+
const url = new URL(options.authorizationEndpoint ?? defaultAuthorizationEndpoint);
|
|
15
|
+
url.searchParams.set("response_type", "code");
|
|
16
|
+
url.searchParams.set("client_id", options.clientId);
|
|
17
|
+
url.searchParams.set("redirect_uri", options.redirectUri);
|
|
18
|
+
url.searchParams.set("scope", options.scope ?? defaultScope);
|
|
19
|
+
url.searchParams.set("state", options.state);
|
|
20
|
+
url.searchParams.set("code_challenge", options.pkce.challenge);
|
|
21
|
+
url.searchParams.set("code_challenge_method", options.pkce.method);
|
|
22
|
+
return url.toString();
|
|
23
|
+
}
|
|
24
|
+
export function parseOpenAiOAuthCredential(value) {
|
|
25
|
+
const parsed = JSON.parse(value);
|
|
26
|
+
if (parsed.type !== "oauth" ||
|
|
27
|
+
typeof parsed.accessToken !== "string" ||
|
|
28
|
+
!parsed.accessToken ||
|
|
29
|
+
typeof parsed.expiresAt !== "string") {
|
|
30
|
+
throw new Error("Invalid OpenAI OAuth credential.");
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
type: "oauth",
|
|
34
|
+
accessToken: parsed.accessToken,
|
|
35
|
+
expiresAt: parsed.expiresAt,
|
|
36
|
+
...(parsed.refreshToken ? { refreshToken: parsed.refreshToken } : {}),
|
|
37
|
+
...(parsed.accountId ? { accountId: parsed.accountId } : {})
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function storeOpenAiOAuthCredential(options) {
|
|
41
|
+
await options.secretStore.setSecret({
|
|
42
|
+
secretId: options.secretId,
|
|
43
|
+
providerId: "openai",
|
|
44
|
+
label: "OpenAI OAuth",
|
|
45
|
+
value: JSON.stringify(options.credential)
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export async function loadOpenAiOAuthCredential(options) {
|
|
49
|
+
const value = await options.secretStore.getSecret(options.secretId);
|
|
50
|
+
if (!value) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return parseOpenAiOAuthCredential(value);
|
|
54
|
+
}
|
|
55
|
+
export async function deleteOpenAiOAuthCredential(options) {
|
|
56
|
+
return options.secretStore.deleteSecret(options.secretId);
|
|
57
|
+
}
|
|
58
|
+
export async function refreshOpenAiOAuthCredential(options) {
|
|
59
|
+
if (!options.credential.refreshToken) {
|
|
60
|
+
throw new Error("OpenAI OAuth credential has no refresh token.");
|
|
61
|
+
}
|
|
62
|
+
const response = await options.fetch(options.tokenEndpoint ?? defaultTokenEndpoint, {
|
|
63
|
+
method: "POST",
|
|
64
|
+
headers: {
|
|
65
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
66
|
+
},
|
|
67
|
+
body: new URLSearchParams({
|
|
68
|
+
grant_type: "refresh_token",
|
|
69
|
+
client_id: options.clientId,
|
|
70
|
+
refresh_token: options.credential.refreshToken
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new Error(`OpenAI OAuth refresh failed with status ${response.status}.`);
|
|
75
|
+
}
|
|
76
|
+
return credentialFromTokenResponse((await response.json()), options.now ?? (() => new Date()), options.credential);
|
|
77
|
+
}
|
|
78
|
+
export async function ensureFreshOpenAiOAuthCredential(options) {
|
|
79
|
+
const credential = await loadOpenAiOAuthCredential(options);
|
|
80
|
+
if (!credential) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const now = options.now ?? (() => new Date());
|
|
84
|
+
const skewMs = options.skewMs ?? 60_000;
|
|
85
|
+
if (Date.parse(credential.expiresAt) - now().getTime() > skewMs) {
|
|
86
|
+
return credential;
|
|
87
|
+
}
|
|
88
|
+
const refreshed = await refreshOpenAiOAuthCredential({ ...options, credential });
|
|
89
|
+
await storeOpenAiOAuthCredential({ ...options, credential: refreshed });
|
|
90
|
+
return refreshed;
|
|
91
|
+
}
|
|
92
|
+
export function getOpenAiOAuthMetadata(credential) {
|
|
93
|
+
return {
|
|
94
|
+
type: "oauth",
|
|
95
|
+
authenticated: Boolean(credential),
|
|
96
|
+
...(credential?.expiresAt ? { expiresAt: credential.expiresAt } : {}),
|
|
97
|
+
...(credential?.accountId ? { accountId: credential.accountId } : {})
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function getOpenAiOAuthHeaders(credential) {
|
|
101
|
+
return {
|
|
102
|
+
authorization: `Bearer ${credential.accessToken}`,
|
|
103
|
+
...(credential.accountId ? { "chatgpt-account-id": credential.accountId } : {})
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function credentialFromTokenResponse(response, now, previous) {
|
|
107
|
+
if (!response.access_token) {
|
|
108
|
+
throw new Error("OpenAI OAuth token response did not include an access token.");
|
|
109
|
+
}
|
|
110
|
+
const refreshToken = response.refresh_token ?? previous?.refreshToken;
|
|
111
|
+
const accountId = response.account_id ?? previous?.accountId;
|
|
112
|
+
return {
|
|
113
|
+
type: "oauth",
|
|
114
|
+
accessToken: response.access_token,
|
|
115
|
+
expiresAt: new Date(now().getTime() + (response.expires_in ?? 3600) * 1000).toISOString(),
|
|
116
|
+
...(refreshToken ? { refreshToken } : {}),
|
|
117
|
+
...(accountId ? { accountId } : {})
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function base64Url(value) {
|
|
121
|
+
return value
|
|
122
|
+
.toString("base64")
|
|
123
|
+
.replaceAll("+", "-")
|
|
124
|
+
.replaceAll("/", "_")
|
|
125
|
+
.replaceAll("=", "");
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=openai-oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-oauth.js","sourceRoot":"","sources":["../src/openai-oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ActorPathResolverOptions } from "@useactor/storage";
|
|
2
|
+
import { type PermissionGrantStore } from "./permission-grants.js";
|
|
3
|
+
export interface FilePermissionGrantStoreOptions extends ActorPathResolverOptions {
|
|
4
|
+
}
|
|
5
|
+
export declare function getPermissionGrantsPath(options?: FilePermissionGrantStoreOptions): string;
|
|
6
|
+
export declare function createFilePermissionGrantStore(options?: FilePermissionGrantStoreOptions): PermissionGrantStore;
|
|
7
|
+
//# sourceMappingURL=permission-grant-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-grant-store.d.ts","sourceRoot":"","sources":["../src/permission-grant-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;CAAG;AAEpF,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,+BAA+B,GAAG,MAAM,CAEzF;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,+BAAoC,GAC5C,oBAAoB,CA4CtB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { resolveActorHome } from "@useactor/storage";
|
|
5
|
+
import { permissionGrantMatchesRequest, validatePermissionGrant } from "./permission-grants.js";
|
|
6
|
+
export function getPermissionGrantsPath(options) {
|
|
7
|
+
return path.join(resolveActorHome(options), "permission_grants.json");
|
|
8
|
+
}
|
|
9
|
+
export function createFilePermissionGrantStore(options = {}) {
|
|
10
|
+
const filePath = getPermissionGrantsPath(options);
|
|
11
|
+
return {
|
|
12
|
+
async listPermissionGrants() {
|
|
13
|
+
return readPermissionGrantsFile(filePath);
|
|
14
|
+
},
|
|
15
|
+
async savePermissionGrant(grant) {
|
|
16
|
+
const validated = normalizePersistentGrant(validatePermissionGrant(grant));
|
|
17
|
+
const grants = await readPermissionGrantsFile(filePath);
|
|
18
|
+
await writePermissionGrantsFile(filePath, upsertPermissionGrant(grants, validated));
|
|
19
|
+
return validated;
|
|
20
|
+
},
|
|
21
|
+
async deletePermissionGrant(grantId) {
|
|
22
|
+
const grants = await readPermissionGrantsFile(filePath);
|
|
23
|
+
const next = grants.filter((grant) => grant.id !== grantId);
|
|
24
|
+
if (next.length === grants.length) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
await writePermissionGrantsFile(filePath, next);
|
|
28
|
+
return true;
|
|
29
|
+
},
|
|
30
|
+
async deleteMatchingPermissionGrant(request) {
|
|
31
|
+
const grants = await readPermissionGrantsFile(filePath);
|
|
32
|
+
const matching = grants.find((grant) => permissionGrantMatchesRequest(grant, request));
|
|
33
|
+
if (!matching) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
await writePermissionGrantsFile(filePath, grants.filter((grant) => grant.id !== matching.id));
|
|
37
|
+
return matching;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function readPermissionGrantsFile(filePath) {
|
|
42
|
+
let file = "";
|
|
43
|
+
try {
|
|
44
|
+
file = await readFile(filePath, "utf8");
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (isNotFoundError(error)) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
const parsed = JSON.parse(file);
|
|
53
|
+
if (!Array.isArray(parsed)) {
|
|
54
|
+
throw new Error(`Permission grants file must contain an array: ${filePath}`);
|
|
55
|
+
}
|
|
56
|
+
return parsed.map((grant) => validatePermissionGrant(grant));
|
|
57
|
+
}
|
|
58
|
+
function upsertPermissionGrant(grants, grant) {
|
|
59
|
+
return [...grants.filter((existing) => existing.id !== grant.id), grant].sort((first, second) => first.id.localeCompare(second.id));
|
|
60
|
+
}
|
|
61
|
+
function normalizePersistentGrant(grant) {
|
|
62
|
+
if (grant.type !== "allow_always" || grant.sessionId === undefined) {
|
|
63
|
+
return grant;
|
|
64
|
+
}
|
|
65
|
+
const { sessionId: _sessionId, ...rest } = grant;
|
|
66
|
+
return rest;
|
|
67
|
+
}
|
|
68
|
+
async function writePermissionGrantsFile(filePath, grants) {
|
|
69
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
70
|
+
const tempPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${process.pid}.${randomUUID()}.tmp`);
|
|
71
|
+
await writeFile(tempPath, `${JSON.stringify(grants, null, 2)}\n`, "utf8");
|
|
72
|
+
await rename(tempPath, filePath);
|
|
73
|
+
}
|
|
74
|
+
function isNotFoundError(error) {
|
|
75
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=permission-grant-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-grant-store.js","sourceRoot":"","sources":["../src/permission-grant-store.ts"],"names":[],"mappings":"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"}
|