@cmodjs/core 0.3.0 → 1.5.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/docs/commands.md +61 -10
- package/docs/dependencies.md +16 -14
- package/docs/hooks.md +64 -29
- package/docs/index.md +29 -25
- package/docs/install-steps.md +13 -9
- package/docs/jobs.md +59 -111
- package/docs/mod.md +227 -175
- package/docs/options.md +2 -2
- package/docs/permissions.md +27 -16
- package/docs/session.md +311 -0
- package/docs/state.md +11 -7
- package/docs/testing.md +68 -23
- package/docs/ui.md +116 -76
- package/jobs/check.d.ts.map +1 -1
- package/jobs/check.js +5 -2
- package/jobs/context.d.ts +7 -8
- package/jobs/context.d.ts.map +1 -1
- package/jobs/context.js +23 -73
- package/jobs/permissions/decide-permission.d.ts +5 -3
- package/jobs/permissions/decide-permission.d.ts.map +1 -1
- package/jobs/permissions/decide-permission.js +6 -4
- package/jobs/permissions/find-project-scope.d.ts +1 -1
- package/jobs/permissions/find-project-scope.d.ts.map +1 -1
- package/jobs/permissions/find-project-scope.js +8 -11
- package/jobs/permissions/match-target.d.ts +2 -2
- package/jobs/permissions/match-target.d.ts.map +1 -1
- package/jobs/permissions.d.ts +1 -1
- package/jobs/permissions.d.ts.map +1 -1
- package/jobs/permissions.js +6 -4
- package/jobs/program.d.ts.map +1 -1
- package/jobs/program.js +14 -4
- package/jobs/prompt.d.ts +4 -2
- package/jobs/prompt.d.ts.map +1 -1
- package/jobs/prompt.js +16 -15
- package/jobs/schedule.d.ts +2 -2
- package/jobs/schedule.d.ts.map +1 -1
- package/jobs/schedule.js +9 -9
- package/jobs/slash-command.d.ts +4 -4
- package/jobs/slash-command.d.ts.map +1 -1
- package/jobs/slash-command.js +14 -9
- package/jobs/status-line.d.ts +1 -11
- package/jobs/status-line.d.ts.map +1 -1
- package/jobs/status-line.js +8 -12
- package/jobs/tool.d.ts +2 -2
- package/jobs/tool.d.ts.map +1 -1
- package/jobs/tool.js +15 -9
- package/mod.d.ts +178 -75
- package/mod.d.ts.map +1 -1
- package/mod.js +127 -3
- package/options.d.ts +2 -2
- package/options.js +19 -19
- package/package.json +3 -3
- package/records.d.ts +13 -8
- package/records.d.ts.map +1 -1
- package/records.js +33 -17
- package/register.d.ts.map +1 -1
- package/register.js +34 -5
- package/runtime/announce.d.ts +18 -0
- package/runtime/announce.d.ts.map +1 -0
- package/runtime/announce.js +68 -0
- package/runtime/before.d.ts +32 -0
- package/runtime/before.d.ts.map +1 -0
- package/runtime/before.js +214 -0
- package/runtime/bound.d.ts +4 -0
- package/runtime/bound.d.ts.map +1 -0
- package/runtime/bound.js +9 -0
- package/runtime/claude.d.ts +4 -2
- package/runtime/claude.d.ts.map +1 -1
- package/runtime/conversations.d.ts +17 -0
- package/runtime/conversations.d.ts.map +1 -0
- package/runtime/conversations.js +563 -0
- package/runtime/deadline.d.ts +0 -1
- package/runtime/deadline.d.ts.map +1 -1
- package/runtime/deadline.js +1 -1
- package/runtime/dependencies.d.ts +2 -0
- package/runtime/dependencies.d.ts.map +1 -1
- package/runtime/dependencies.js +10 -1
- package/runtime/engine.d.ts +13 -0
- package/runtime/engine.d.ts.map +1 -0
- package/runtime/engine.js +10 -0
- package/runtime/grants.d.ts +4 -0
- package/runtime/grants.d.ts.map +1 -1
- package/runtime/grants.js +68 -31
- package/runtime/hooks.d.ts +5 -4
- package/runtime/hooks.d.ts.map +1 -1
- package/runtime/hooks.js +29 -9
- package/runtime/installer.d.ts +1 -1
- package/runtime/installer.d.ts.map +1 -1
- package/runtime/installer.js +17 -14
- package/runtime/lifecycle.d.ts +3 -1
- package/runtime/lifecycle.d.ts.map +1 -1
- package/runtime/lifecycle.js +414 -212
- package/runtime/metadata.d.ts +3 -1
- package/runtime/metadata.d.ts.map +1 -1
- package/runtime/metadata.js +25 -14
- package/runtime/options.d.ts +3 -1
- package/runtime/options.d.ts.map +1 -1
- package/runtime/options.js +4 -4
- package/runtime/programs.d.ts +8 -0
- package/runtime/programs.d.ts.map +1 -1
- package/runtime/programs.js +39 -1
- package/runtime/router.d.ts +2 -1
- package/runtime/router.d.ts.map +1 -1
- package/runtime/router.js +11 -3
- package/runtime/sessions.d.ts +58 -0
- package/runtime/sessions.d.ts.map +1 -0
- package/runtime/sessions.js +433 -0
- package/runtime/state.d.ts +6 -2
- package/runtime/state.d.ts.map +1 -1
- package/runtime/state.js +46 -13
- package/runtime/toaster.d.ts +24 -0
- package/runtime/toaster.d.ts.map +1 -0
- package/runtime/toaster.js +286 -0
- package/runtime/ui.d.ts +6 -17
- package/runtime/ui.d.ts.map +1 -1
- package/runtime/ui.js +62 -118
- package/session/context/context.d.ts +12 -0
- package/session/context/context.d.ts.map +1 -0
- package/session/context/context.js +2 -0
- package/session/context/turn/message/document.d.ts +7 -0
- package/session/context/turn/message/document.d.ts.map +1 -0
- package/session/context/turn/message/document.js +1 -0
- package/session/context/turn/message/message.d.ts +55 -0
- package/session/context/turn/message/message.d.ts.map +1 -0
- package/session/context/turn/message/message.js +178 -0
- package/session/context/turn/message/note.d.ts +8 -0
- package/session/context/turn/message/note.d.ts.map +1 -0
- package/session/context/turn/message/note.js +1 -0
- package/session/context/turn/message/notice.d.ts +6 -0
- package/session/context/turn/message/notice.d.ts.map +1 -0
- package/session/context/turn/message/notice.js +1 -0
- package/session/context/turn/message/prompt.d.ts +8 -0
- package/session/context/turn/message/prompt.d.ts.map +1 -0
- package/session/context/turn/message/prompt.js +1 -0
- package/session/context/turn/message/reply.d.ts +6 -0
- package/session/context/turn/message/reply.d.ts.map +1 -0
- package/session/context/turn/message/reply.js +1 -0
- package/session/context/turn/message/sender.d.ts +14 -0
- package/session/context/turn/message/sender.d.ts.map +1 -0
- package/session/context/turn/message/sender.js +30 -0
- package/session/context/turn/message/skill.d.ts +7 -0
- package/session/context/turn/message/skill.d.ts.map +1 -0
- package/session/context/turn/message/skill.js +1 -0
- package/session/context/turn/message/tool-call.d.ts +9 -0
- package/session/context/turn/message/tool-call.d.ts.map +1 -0
- package/session/context/turn/message/tool-call.js +1 -0
- package/session/context/turn/message/tool-result.d.ts +8 -0
- package/session/context/turn/message/tool-result.d.ts.map +1 -0
- package/session/context/turn/message/tool-result.js +1 -0
- package/session/context/turn/turn.d.ts +13 -0
- package/session/context/turn/turn.d.ts.map +1 -0
- package/session/context/turn/turn.js +2 -0
- package/session/conversation.d.ts +73 -0
- package/session/conversation.d.ts.map +1 -0
- package/session/conversation.js +146 -0
- package/session/goal/goal.d.ts +11 -0
- package/session/goal/goal.d.ts.map +1 -0
- package/session/goal/goal.js +1 -0
- package/session/goal/task.d.ts +16 -0
- package/session/goal/task.d.ts.map +1 -0
- package/session/goal/task.js +3 -0
- package/session/session.d.ts +158 -0
- package/session/session.d.ts.map +1 -0
- package/session/session.js +2 -0
- package/src/jobs/check.ts +7 -4
- package/src/jobs/context.ts +24 -82
- package/src/jobs/permissions/decide-permission.ts +10 -8
- package/src/jobs/permissions/find-project-scope.ts +8 -14
- package/src/jobs/permissions/match-target.ts +3 -3
- package/src/jobs/permissions.ts +8 -6
- package/src/jobs/program.ts +13 -4
- package/src/jobs/prompt.ts +21 -24
- package/src/jobs/schedule.ts +14 -14
- package/src/jobs/slash-command.ts +20 -14
- package/src/jobs/status-line.ts +9 -21
- package/src/jobs/tool.ts +17 -11
- package/src/mod.ts +252 -97
- package/src/options.ts +22 -22
- package/src/records.ts +40 -23
- package/src/register.ts +34 -5
- package/src/runtime/announce.ts +76 -0
- package/src/runtime/before.ts +200 -0
- package/src/runtime/bound.ts +12 -0
- package/src/runtime/claude.ts +7 -2
- package/src/runtime/conversations.ts +579 -0
- package/src/runtime/deadline.ts +2 -2
- package/src/runtime/dependencies.ts +13 -1
- package/src/runtime/engine.ts +23 -0
- package/src/runtime/grants.ts +69 -29
- package/src/runtime/hooks.ts +39 -14
- package/src/runtime/installer.ts +16 -14
- package/src/runtime/lifecycle.ts +413 -201
- package/src/runtime/metadata.ts +37 -14
- package/src/runtime/options.ts +19 -4
- package/src/runtime/programs.ts +40 -1
- package/src/runtime/router.ts +11 -4
- package/src/runtime/sessions.ts +447 -0
- package/src/runtime/state.ts +50 -14
- package/src/runtime/toaster.ts +334 -0
- package/src/runtime/ui.ts +65 -143
- package/src/session/context/context.ts +14 -0
- package/src/session/context/turn/message/document.ts +8 -0
- package/src/session/context/turn/message/message.ts +203 -0
- package/src/session/context/turn/message/note.ts +9 -0
- package/src/session/context/turn/message/notice.ts +7 -0
- package/src/session/context/turn/message/prompt.ts +9 -0
- package/src/session/context/turn/message/reply.ts +7 -0
- package/src/session/context/turn/message/sender.ts +38 -0
- package/src/session/context/turn/message/skill.ts +8 -0
- package/src/session/context/turn/message/tool-call.ts +10 -0
- package/src/session/context/turn/message/tool-result.ts +9 -0
- package/src/session/context/turn/turn.ts +15 -0
- package/src/session/conversation.ts +194 -0
- package/src/session/goal/goal.ts +10 -0
- package/src/session/goal/task.ts +19 -0
- package/src/session/session.ts +141 -0
- package/src/testing/fake-claude.ts +25 -17
- package/src/testing/fake-elements.ts +3 -2
- package/src/testing/fake-files.ts +1 -1
- package/src/testing/fake-sessions.ts +277 -0
- package/src/testing.ts +138 -35
- package/src/ui/components.ts +3 -3
- package/src/ui/elements.ts +22 -8
- package/src/ui/markdown.ts +22 -26
- package/src/ui/places.ts +49 -0
- package/src/utils/call-effects.ts +5 -5
- package/src/utils/changelog.ts +32 -0
- package/src/utils/disposable.ts +3 -0
- package/src/utils/matcher.ts +37 -0
- package/src/utils/metadata.ts +17 -15
- package/src/utils/parse-shell.ts +9 -8
- package/src/utils/paths.ts +21 -4
- package/src/utils/text.ts +4 -0
- package/testing/fake-claude.d.ts +5 -1
- package/testing/fake-claude.d.ts.map +1 -1
- package/testing/fake-claude.js +21 -12
- package/testing/fake-elements.js +4 -2
- package/testing/fake-files.js +1 -1
- package/testing/fake-sessions.d.ts +81 -0
- package/testing/fake-sessions.d.ts.map +1 -0
- package/testing/fake-sessions.js +249 -0
- package/testing.d.ts +34 -13
- package/testing.d.ts.map +1 -1
- package/testing.js +115 -23
- package/ui/components.d.ts +2 -3
- package/ui/components.d.ts.map +1 -1
- package/ui/components.js +3 -3
- package/ui/elements.d.ts.map +1 -1
- package/ui/elements.js +19 -9
- package/ui/markdown.d.ts +35 -33
- package/ui/markdown.d.ts.map +1 -1
- package/ui/markdown.js +14 -16
- package/ui/places.d.ts +43 -0
- package/ui/places.d.ts.map +1 -0
- package/ui/places.js +31 -0
- package/utils/call-effects.d.ts +2 -1
- package/utils/call-effects.d.ts.map +1 -1
- package/utils/call-effects.js +3 -3
- package/utils/changelog.d.ts +9 -0
- package/utils/changelog.d.ts.map +1 -0
- package/utils/changelog.js +29 -0
- package/utils/disposable.d.ts +4 -0
- package/utils/disposable.d.ts.map +1 -0
- package/utils/disposable.js +1 -0
- package/utils/matcher.d.ts +13 -0
- package/utils/matcher.d.ts.map +1 -0
- package/utils/matcher.js +32 -0
- package/utils/metadata.d.ts +3 -3
- package/utils/metadata.js +18 -14
- package/utils/parse-shell.js +9 -7
- package/utils/paths.d.ts +4 -1
- package/utils/paths.d.ts.map +1 -1
- package/utils/paths.js +19 -4
- package/utils/text.d.ts +1 -0
- package/utils/text.d.ts.map +1 -1
- package/utils/text.js +3 -0
- package/src/ui/slots.ts +0 -36
- package/ui/slots.d.ts +0 -208
- package/ui/slots.d.ts.map +0 -1
- package/ui/slots.js +0 -19
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { changelogPage, isObject, marketplaceOf, permissionWords } from '../records.js';
|
|
2
|
+
import { changeLines, changelogSections, unreleased } from '../utils/changelog.js';
|
|
3
|
+
import { ifMissing } from '../utils/paths.js';
|
|
4
|
+
import { listed } from '../utils/text.js';
|
|
5
|
+
import { cmodPluginName } from './dependencies.js';
|
|
6
|
+
export const announcementMs = 10_000;
|
|
7
|
+
const shownChanges = 3;
|
|
8
|
+
export function announcedOf(saved) {
|
|
9
|
+
if (typeof saved === 'string')
|
|
10
|
+
return { version: saved, added: [] };
|
|
11
|
+
if (!isObject(saved) || typeof saved['version'] !== 'string')
|
|
12
|
+
return undefined;
|
|
13
|
+
return { version: saved['version'], added: Array.isArray(saved['added']) ? saved['added'].map(String) : [] };
|
|
14
|
+
}
|
|
15
|
+
export async function announcementOf(claude, plugin, granted, added, previous) {
|
|
16
|
+
const read = (path) => claude.fs.read(`${plugin.root}/${path}`).catch(ifMissing(undefined));
|
|
17
|
+
const manifest = jsonOf(await read('.claude-plugin/plugin.json'));
|
|
18
|
+
const field = (key) => (isObject(manifest) && typeof manifest[key] === 'string' ? manifest[key] : undefined);
|
|
19
|
+
const open = (page) => () => claude.cmod.call({ to: cmodPluginName, method: 'openSettings', input: { mod: plugin.name, ...(page === undefined ? {} : { page }) } });
|
|
20
|
+
if (previous === undefined) {
|
|
21
|
+
const { program, keys } = plugin.steps;
|
|
22
|
+
const rules = (await claude.fs.list(`${plugin.root}/rules`).catch(ifMissing([]))).filter((entry) => entry.kind === 'file' && entry.name.endsWith('.md')).map((entry) => entry.name.slice(0, -'.md'.length)).toSorted();
|
|
23
|
+
const lines = [
|
|
24
|
+
field('description'),
|
|
25
|
+
added.length > 0 ? `Adds ${listed(added)}.` : undefined,
|
|
26
|
+
rules.length > 0 ? `Adds ${rules.length} ${rules.length === 1 ? 'rule' : 'rules'}: ${listed(rules)}.` : undefined,
|
|
27
|
+
program === undefined ? undefined : `Installed the ${program} program.`,
|
|
28
|
+
...Object.entries(keys ?? {}).map(([key, command]) => `Binds ${key} to /${command}.`),
|
|
29
|
+
...[...granted].map((item) => `${permissionWords(item)}.`),
|
|
30
|
+
];
|
|
31
|
+
return { message: 'Installed', ...described(lines), action: { label: 'Settings', onClick: open() } };
|
|
32
|
+
}
|
|
33
|
+
const version = plugin.version ?? '';
|
|
34
|
+
const isCheckout = marketplaceOf(plugin.root, plugin.name) === undefined;
|
|
35
|
+
const sections = changelogSections((await read('CHANGELOG.md')) ?? '');
|
|
36
|
+
const section = sections.find((each) => each.version === version) ?? (isCheckout ? sections.find((each) => each.version === unreleased) : undefined);
|
|
37
|
+
const changes = section === undefined ? [] : changeLines(section.text);
|
|
38
|
+
const nowAdded = added.filter((each) => !previous.added.includes(each));
|
|
39
|
+
const gone = previous.added.filter((each) => !added.includes(each));
|
|
40
|
+
const fallback = previous.added.length === 0 ? [] : [nowAdded.length > 0 ? `Now adds ${listed(nowAdded)}.` : undefined, gone.length > 0 ? `No longer adds ${listed(gone)}.` : undefined];
|
|
41
|
+
const home = await claude.env.home();
|
|
42
|
+
const folder = home !== undefined && plugin.root.startsWith(`${home}/`) ? `~${plugin.root.slice(home.length)}` : plugin.root;
|
|
43
|
+
const repository = field('repository');
|
|
44
|
+
const lines = [
|
|
45
|
+
...(changes.length === 0 ? fallback : changes.length > shownChanges ? [...changes.slice(0, shownChanges), '…'] : changes),
|
|
46
|
+
`From ${previous.version}${isCheckout ? `, loaded from ${folder}` : ''}.`,
|
|
47
|
+
repository === undefined || isCheckout ? undefined : `Release notes: ${repository.replace(/\/$/, '')}/releases/tag/v${version}`,
|
|
48
|
+
];
|
|
49
|
+
return {
|
|
50
|
+
message: `Updated to ${version}`,
|
|
51
|
+
...described(lines),
|
|
52
|
+
...(sections.length > 0 ? { action: { label: 'Changelog', onClick: open(changelogPage) } } : {}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function jsonOf(text) {
|
|
56
|
+
try {
|
|
57
|
+
return text === undefined ? undefined : JSON.parse(text);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (error instanceof SyntaxError)
|
|
61
|
+
return undefined;
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function described(lines) {
|
|
66
|
+
const kept = lines.filter((line) => line !== undefined);
|
|
67
|
+
return kept.length === 0 ? {} : { description: kept.join('\n') };
|
|
68
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Args, Frozen } from 'claude-code';
|
|
2
|
+
import type { Disposable } from '../mod.js';
|
|
3
|
+
import type { ConversationState, SessionChange } from '../session/conversation.js';
|
|
4
|
+
import type { BeforeEvent } from '../session/session.js';
|
|
5
|
+
import type { Claude } from './claude.js';
|
|
6
|
+
import type { Router } from './router.js';
|
|
7
|
+
export type Place = Pick<ConversationState, 'session' | 'context' | 'contextOpenedAt' | 'turn' | 'tasks' | 'taskTurns'>;
|
|
8
|
+
export type Decide = (event: BeforeEvent, change: SessionChange) => Promise<Partial<Answers> | undefined>;
|
|
9
|
+
export type Answers = {
|
|
10
|
+
readonly text: string;
|
|
11
|
+
readonly refuse: string;
|
|
12
|
+
readonly input: Readonly<Record<string, unknown>>;
|
|
13
|
+
readonly result: string;
|
|
14
|
+
readonly owner: {
|
|
15
|
+
readonly model: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export type BeforeHooks = {
|
|
19
|
+
readonly place: () => Promise<Place>;
|
|
20
|
+
readonly wants: (event: BeforeEvent) => Promise<boolean>;
|
|
21
|
+
readonly decide: Decide;
|
|
22
|
+
};
|
|
23
|
+
export declare function relayOf(e: Frozen<Args<'session.receive'>>): string | undefined;
|
|
24
|
+
export declare function installBefore({ claude, router, hooks }: {
|
|
25
|
+
readonly claude: Claude;
|
|
26
|
+
readonly router: Router;
|
|
27
|
+
readonly hooks: BeforeHooks;
|
|
28
|
+
}): Disposable;
|
|
29
|
+
export declare function withAnswer(change: SessionChange, answer: Partial<Answers>): SessionChange;
|
|
30
|
+
export declare function foldAnswers(event: BeforeEvent, change: SessionChange, askers: readonly ((change: SessionChange) => Promise<unknown>)[], report: (error: unknown) => void): Promise<Partial<Answers> | undefined>;
|
|
31
|
+
export declare function answerOf(event: BeforeEvent, answer: unknown): Partial<Answers> | undefined;
|
|
32
|
+
//# sourceMappingURL=before.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"before.d.ts","sourceRoot":"","sources":["../src/runtime/before.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAa3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAY,MAAM,4BAA4B,CAAA;AAE5F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,SAAS,GAAG,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,CAAA;AAEvH,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAAA;AAEzG,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAEhM,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAMrJ,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS,CAG9E;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,UAAU,CAkHtJ;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,aAAa,CAKzF;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAetN;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAoB1F"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { ContextEnd } from '../session/context/context.js';
|
|
2
|
+
import { Document } from '../session/context/turn/message/document.js';
|
|
3
|
+
import { Message, messagesOf, rowOfAppend, withTexts } from '../session/context/turn/message/message.js';
|
|
4
|
+
import { Note } from '../session/context/turn/message/note.js';
|
|
5
|
+
import { Notice } from '../session/context/turn/message/notice.js';
|
|
6
|
+
import { Prompt } from '../session/context/turn/message/prompt.js';
|
|
7
|
+
import { Reply } from '../session/context/turn/message/reply.js';
|
|
8
|
+
import { senderOf } from '../session/context/turn/message/sender.js';
|
|
9
|
+
import { Skill } from '../session/context/turn/message/skill.js';
|
|
10
|
+
import { ToolCall } from '../session/context/turn/message/tool-call.js';
|
|
11
|
+
import { ToolResult } from '../session/context/turn/message/tool-result.js';
|
|
12
|
+
import { TurnEnd } from '../session/context/turn/turn.js';
|
|
13
|
+
import { TaskEnd, TaskStart } from '../session/goal/task.js';
|
|
14
|
+
import { cmodPluginName } from './dependencies.js';
|
|
15
|
+
import { toolInputOf } from './tool-calls.js';
|
|
16
|
+
const appended = [Note, Reply, ToolResult, Notice];
|
|
17
|
+
const relayTag = /^(?:<cross-session-message[^>]*>\s*)?<cmod-relay>([\s\S]*)<\/cmod-relay>(?:\s*<\/cross-session-message>[\s\S]*)?$/;
|
|
18
|
+
export function relayOf(e) {
|
|
19
|
+
const isFromCmod = e.origin.kind === 'peer' && !('teammate' in e.origin) && e.origin.plugin === cmodPluginName;
|
|
20
|
+
return isFromCmod ? relayTag.exec(e.text)?.[1] : undefined;
|
|
21
|
+
}
|
|
22
|
+
export function installBefore({ claude, router, hooks }) {
|
|
23
|
+
const { place, wants, decide } = hooks;
|
|
24
|
+
const now = () => new Date().toISOString();
|
|
25
|
+
const asked = async (event, change) => (await decide(event, change)) ?? {};
|
|
26
|
+
const message = (where, unplaced, task, isInTurn = true) => {
|
|
27
|
+
const turn = isInTurn ? (task === undefined ? where.turn : where.taskTurns[task]) : undefined;
|
|
28
|
+
const context = task === undefined ? where.context : (where.tasks[task]?.context ?? where.context);
|
|
29
|
+
return { type: Message, message: { ...unplaced, session: where.session, context, ...(turn === undefined ? {} : { turn: turn.prompt.id }), ...(task === undefined ? {} : { task }) } };
|
|
30
|
+
};
|
|
31
|
+
const added = [
|
|
32
|
+
router.add('prompt.submit', async (e, next) => {
|
|
33
|
+
if (!(await wants(Prompt)) || e.text.startsWith('/'))
|
|
34
|
+
return next(e);
|
|
35
|
+
const where = await place();
|
|
36
|
+
const answer = await asked(Prompt, message(where, { id: '', at: now(), type: Prompt, text: e.text, from: senderOf(e.origin, false) }, undefined, false));
|
|
37
|
+
if (answer.refuse !== undefined)
|
|
38
|
+
return { drop: answer.refuse };
|
|
39
|
+
return next(answer.text === undefined ? e : { ...e, text: answer.text });
|
|
40
|
+
}),
|
|
41
|
+
router.add('command.run', async (e, next) => {
|
|
42
|
+
if (!(await wants(Prompt)))
|
|
43
|
+
return next(e);
|
|
44
|
+
const typed = e.args === '' ? `/${e.command}` : `/${e.command} ${e.args}`;
|
|
45
|
+
const where = await place();
|
|
46
|
+
const answer = await asked(Prompt, message(where, { id: '', at: now(), type: Prompt, text: typed, from: senderOf(e.origin, false) }, undefined, false));
|
|
47
|
+
if (answer.refuse !== undefined)
|
|
48
|
+
return { text: answer.refuse };
|
|
49
|
+
if (answer.text === undefined || answer.text === typed)
|
|
50
|
+
return next(e);
|
|
51
|
+
const same = new RegExp(`^/${e.command}(?:\\s+|$)`).exec(answer.text);
|
|
52
|
+
if (same !== null)
|
|
53
|
+
return next({ ...e, args: answer.text.slice(same[0].length) });
|
|
54
|
+
void claude.prompt.submit({ text: answer.text });
|
|
55
|
+
return {};
|
|
56
|
+
}),
|
|
57
|
+
router.add('session.receive', async (e, next) => {
|
|
58
|
+
if (!(await wants(Prompt)) || relayOf(e) !== undefined)
|
|
59
|
+
return next(e);
|
|
60
|
+
const where = await place();
|
|
61
|
+
const answer = await asked(Prompt, message(where, { id: '', at: now(), type: Prompt, text: e.text, from: { type: 'session' } }, e.agentId, false));
|
|
62
|
+
if (answer.refuse !== undefined)
|
|
63
|
+
return { consumed: answer.refuse };
|
|
64
|
+
return next(answer.text === undefined ? e : { ...e, text: answer.text });
|
|
65
|
+
}),
|
|
66
|
+
router.add('skill.prompt', async (e, next) => {
|
|
67
|
+
if (!(await wants(Skill)))
|
|
68
|
+
return next(e);
|
|
69
|
+
const where = await place();
|
|
70
|
+
const answer = await asked(Skill, message(where, { id: '', at: now(), type: Skill, name: e.skill, text: e.text }, undefined));
|
|
71
|
+
return answer.text === undefined ? next(e) : { text: answer.text };
|
|
72
|
+
}),
|
|
73
|
+
router.add('prompt.attachment', async (e, next) => {
|
|
74
|
+
if (!(await wants(Document)) || e.type !== 'nested_memory')
|
|
75
|
+
return next(e);
|
|
76
|
+
const where = await place();
|
|
77
|
+
const path = /^Contents of (.+?) \(/.exec(e.text)?.[1] ?? '';
|
|
78
|
+
const answer = await asked(Document, message(where, { id: '', at: now(), type: Document, path, text: e.text }, e.agentId));
|
|
79
|
+
if (answer.refuse !== undefined)
|
|
80
|
+
return { text: null };
|
|
81
|
+
return answer.text === undefined ? next(e) : { text: answer.text };
|
|
82
|
+
}),
|
|
83
|
+
router.add('session.append', async (e, next) => {
|
|
84
|
+
const wanted = new Set((await Promise.all(appended.map(async (event) => ((await wants(event)) ? [event] : [])))).flat());
|
|
85
|
+
if (wanted.size === 0)
|
|
86
|
+
return next(e);
|
|
87
|
+
const row = rowOfAppend({ uuid: e.uuid, door: e.door, origin: e.origin, message: e.message }, now(), '');
|
|
88
|
+
const found = messagesOf(row, e.agentId !== undefined);
|
|
89
|
+
if (!found.some((each) => wanted.has(each.type)))
|
|
90
|
+
return next(e);
|
|
91
|
+
const where = await place();
|
|
92
|
+
const texts = new Map();
|
|
93
|
+
for (const [part, unplaced] of found.entries()) {
|
|
94
|
+
if (!wanted.has(unplaced.type))
|
|
95
|
+
continue;
|
|
96
|
+
const answer = await asked(unplaced.type, message(where, unplaced, e.agentId));
|
|
97
|
+
if (answer.text !== undefined)
|
|
98
|
+
texts.set(part, answer.text);
|
|
99
|
+
}
|
|
100
|
+
return next(texts.size === 0 ? e : { ...e, message: { ...e.message, content: withTexts(row, texts) } });
|
|
101
|
+
}),
|
|
102
|
+
router.add('tool.call', async (e, next) => {
|
|
103
|
+
if (!(await wants(ToolCall)))
|
|
104
|
+
return next(e);
|
|
105
|
+
const where = await place();
|
|
106
|
+
const input = toolInputOf(e);
|
|
107
|
+
const answer = await asked(ToolCall, message(where, { id: e.tool_use_id, at: now(), type: ToolCall, callId: e.tool_use_id, name: e.tool, input, cwd: await claude.session.cwd() }, e.agentId));
|
|
108
|
+
if (answer.refuse !== undefined)
|
|
109
|
+
return { deny: answer.refuse };
|
|
110
|
+
if (answer.result !== undefined)
|
|
111
|
+
return { result: answer.result };
|
|
112
|
+
if (answer.input === undefined)
|
|
113
|
+
return next(e);
|
|
114
|
+
const reserved = Object.fromEntries(Object.entries(e).filter(([key]) => !(key in input)));
|
|
115
|
+
return next({ ...reserved, ...answer.input });
|
|
116
|
+
}),
|
|
117
|
+
router.add('agent.spawn', async (e, next) => {
|
|
118
|
+
if (!(await wants(TaskStart)))
|
|
119
|
+
return next(e);
|
|
120
|
+
const where = await place();
|
|
121
|
+
const task = { id: '', title: e.description, agentType: e.subagentType, model: e.model ?? e.parentModel, openedBy: e.tool_use_id, openedAt: now(), ...(e.parentAgentId === undefined ? {} : { parent: e.parentAgentId }) };
|
|
122
|
+
const answer = await asked(TaskStart, { type: TaskStart, task: { ...task, context: where.context } });
|
|
123
|
+
if (answer.refuse !== undefined)
|
|
124
|
+
return { deny: answer.refuse };
|
|
125
|
+
return next(answer.owner === undefined ? e : { ...e, model: answer.owner.model });
|
|
126
|
+
}),
|
|
127
|
+
router.add('classic.SubagentStop', async (e, next) => {
|
|
128
|
+
if (!(await wants(TaskEnd)) && !(await wants(TurnEnd)))
|
|
129
|
+
return next(e);
|
|
130
|
+
const where = await place();
|
|
131
|
+
const task = where.tasks[e.agent_id];
|
|
132
|
+
if (task === undefined)
|
|
133
|
+
return next(e);
|
|
134
|
+
const turn = where.taskTurns[e.agent_id];
|
|
135
|
+
const ending = (await wants(TaskEnd)) ? await asked(TaskEnd, { type: TaskEnd, task: { ...task, closedAt: now() } }) : {};
|
|
136
|
+
const refuse = ending.refuse ?? ((await wants(TurnEnd)) && turn !== undefined ? (await asked(TurnEnd, { type: TurnEnd, turn: { ...turn, closedAt: now() } })).refuse : undefined);
|
|
137
|
+
const below = await next(e);
|
|
138
|
+
return refuse === undefined ? below : { ...below, block: refuse };
|
|
139
|
+
}),
|
|
140
|
+
router.add('classic.Stop', async (e, next) => {
|
|
141
|
+
if (!(await wants(TurnEnd)))
|
|
142
|
+
return next(e);
|
|
143
|
+
const where = await place();
|
|
144
|
+
if (where.turn === undefined)
|
|
145
|
+
return next(e);
|
|
146
|
+
const answer = await asked(TurnEnd, { type: TurnEnd, turn: { ...where.turn, closedAt: now() } });
|
|
147
|
+
const below = await next(e);
|
|
148
|
+
return answer.refuse === undefined ? below : { ...below, block: answer.refuse };
|
|
149
|
+
}),
|
|
150
|
+
router.add('session.compact', async (e, next) => {
|
|
151
|
+
if (!(await wants(ContextEnd)) || e.trigger === 'precompute')
|
|
152
|
+
return next(e);
|
|
153
|
+
const where = await place();
|
|
154
|
+
const task = e.agentId === undefined ? undefined : where.tasks[e.agentId];
|
|
155
|
+
if (e.agentId !== undefined && task === undefined)
|
|
156
|
+
return next(e);
|
|
157
|
+
const context = task === undefined ? { number: where.context, openedAt: where.contextOpenedAt } : { number: task.context, openedAt: task.contextOpenedAt ?? task.openedAt, task: task.id };
|
|
158
|
+
const answer = await asked(ContextEnd, { type: ContextEnd, context: { ...context, closedAt: now() } });
|
|
159
|
+
return answer.refuse === undefined ? next(e) : { skip: answer.refuse };
|
|
160
|
+
}),
|
|
161
|
+
];
|
|
162
|
+
return { dispose: () => added.forEach((each) => each.dispose()) };
|
|
163
|
+
}
|
|
164
|
+
export function withAnswer(change, answer) {
|
|
165
|
+
if (change.type === Message && answer.text !== undefined)
|
|
166
|
+
return { ...change, message: { ...change.message, text: answer.text } };
|
|
167
|
+
if (change.type === Message && answer.input !== undefined && change.message.type === ToolCall)
|
|
168
|
+
return { ...change, message: { ...change.message, input: answer.input } };
|
|
169
|
+
if (change.type === TaskStart && answer.owner !== undefined)
|
|
170
|
+
return { ...change, task: { ...change.task, model: answer.owner.model } };
|
|
171
|
+
return change;
|
|
172
|
+
}
|
|
173
|
+
export async function foldAnswers(event, change, askers, report) {
|
|
174
|
+
let latest = change;
|
|
175
|
+
let result;
|
|
176
|
+
for (const ask of askers) {
|
|
177
|
+
try {
|
|
178
|
+
const answer = answerOf(event, await ask(latest));
|
|
179
|
+
if (answer === undefined)
|
|
180
|
+
continue;
|
|
181
|
+
result = { ...result, ...answer };
|
|
182
|
+
if (answer.refuse !== undefined || answer.result !== undefined)
|
|
183
|
+
return result;
|
|
184
|
+
latest = withAnswer(latest, answer);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
report(error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
export function answerOf(event, answer) {
|
|
193
|
+
if (typeof answer !== 'object' || answer === null)
|
|
194
|
+
return undefined;
|
|
195
|
+
const given = answer;
|
|
196
|
+
const allowed = {
|
|
197
|
+
prompt: ['text', 'refuse'],
|
|
198
|
+
note: ['text'],
|
|
199
|
+
skill: ['text'],
|
|
200
|
+
document: ['text', 'refuse'],
|
|
201
|
+
reply: ['text'],
|
|
202
|
+
toolCall: ['input', 'result', 'refuse'],
|
|
203
|
+
toolResult: ['text'],
|
|
204
|
+
notice: ['text'],
|
|
205
|
+
taskStart: ['owner', 'refuse'],
|
|
206
|
+
taskEnd: ['refuse'],
|
|
207
|
+
turnEnd: ['refuse'],
|
|
208
|
+
contextEnd: ['refuse'],
|
|
209
|
+
};
|
|
210
|
+
const unread = Object.keys(given).filter((key) => !allowed[event].includes(key));
|
|
211
|
+
if (unread.length > 0)
|
|
212
|
+
throw new Error(`a before(${event}) listener answered ${unread.join(' and ')}, which ${event} does not take. It takes ${allowed[event].map((key) => `{ ${key} }`).join(', ')}.`);
|
|
213
|
+
return given;
|
|
214
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bound.d.ts","sourceRoot":"","sources":["../src/runtime/bound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE3C;AAED,wBAAgB,KAAK,IAAI,OAAO,CAG/B"}
|
package/runtime/bound.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
let current;
|
|
2
|
+
export function bind(imports) {
|
|
3
|
+
current = imports;
|
|
4
|
+
}
|
|
5
|
+
export function bound() {
|
|
6
|
+
if (current === undefined)
|
|
7
|
+
throw new Error("A mod's imports work once its setup runs. Call them from setup or from a hook, never at the top of a module.");
|
|
8
|
+
return current;
|
|
9
|
+
}
|
package/runtime/claude.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type { AgentInfo, AgentSpawnArgs, AgentSpawnResult, Args, EngineInterface, AskOptions, CommandSpec, ConfigRow, ElementTable, FsEntry, FsStat, FsStatOptions, HookStream, HttpInit, HttpResponse, InvalidatableEventName, PaneCloseArgs, PaneOpenArgs, ProcessRunInit, ProcessRunResult, ProcessSpawnChunk, ProcessSpawnRequest, ProcessSpawnResult, RenderSurface, ResolveInput, SessionUsage, Settings, SettingsReadArgs, Timer,
|
|
1
|
+
import type { AgentInfo, AgentSpawnArgs, AgentSpawnResult, Args, EngineInterface, AskOptions, CommandSpec, ConfigRow, ElementTable, FsEntry, FsStat, FsStatOptions, HookStream, HttpInit, HttpResponse, InvalidatableEventName, PaneCloseArgs, PaneOpenArgs, ProcessRunInit, ProcessRunResult, ProcessSpawnChunk, ProcessSpawnRequest, ProcessSpawnResult, RenderSurface, ResolveInput, SessionUsage, Settings, SettingsReadArgs, Timer, ToolSpec, UiCopyArgs, UiFocusArgs, UiFocusResult, UiCopyResult, UiLogOptions, UiOpenResult, UiPane, UiScrollArgs, UiScrollResult } from 'claude-code';
|
|
2
2
|
export type Claude = {
|
|
3
3
|
readonly plugin: {
|
|
4
4
|
readonly name: string;
|
|
5
5
|
readonly root: string;
|
|
6
6
|
};
|
|
7
7
|
readonly ui: {
|
|
8
|
-
toast(text: string, options?: ToastOptions): void;
|
|
9
8
|
status(text: string | undefined): void;
|
|
10
9
|
log(text: string, options?: UiLogOptions): void;
|
|
11
10
|
notice(toolUseId: string, text: string | undefined): void;
|
|
@@ -15,6 +14,8 @@ export type Claude = {
|
|
|
15
14
|
close(pane: PaneCloseArgs): Promise<void>;
|
|
16
15
|
panes(): Promise<readonly UiPane[]>;
|
|
17
16
|
scroll(args: UiScrollArgs): Promise<UiScrollResult>;
|
|
17
|
+
copy(args: UiCopyArgs): Promise<UiCopyResult>;
|
|
18
|
+
focus(args: UiFocusArgs): Promise<UiFocusResult>;
|
|
18
19
|
resolve(e: ResolveInput): ElementTable<RenderSurface>;
|
|
19
20
|
};
|
|
20
21
|
readonly process: {
|
|
@@ -57,6 +58,7 @@ export type Claude = {
|
|
|
57
58
|
surfaces(): Promise<readonly RenderSurface[]>;
|
|
58
59
|
messages: EngineInterface['session']['messages'];
|
|
59
60
|
append: EngineInterface['session']['append'];
|
|
61
|
+
send: EngineInterface['session']['send'];
|
|
60
62
|
};
|
|
61
63
|
readonly prompt: {
|
|
62
64
|
submit: EngineInterface['prompt']['submit'];
|
package/runtime/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/runtime/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,IAAI,EACJ,eAAe,EACf,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,OAAO,EACP,MAAM,EACN,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/runtime/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Args, EventResult, Frozen } from 'claude-code';
|
|
2
|
+
import type { Claude } from './claude.js';
|
|
3
|
+
import type { Router } from './router.js';
|
|
4
|
+
export type Conversations = {
|
|
5
|
+
answer(e: Frozen<Args<'cmod.call'>> & {
|
|
6
|
+
readonly caller?: string;
|
|
7
|
+
}): Promise<EventResult<'cmod.call'> | undefined>;
|
|
8
|
+
moved(): void;
|
|
9
|
+
};
|
|
10
|
+
export declare function serveConversations({ claude, router, store, project, report }: {
|
|
11
|
+
readonly claude: Claude;
|
|
12
|
+
readonly router: Router;
|
|
13
|
+
readonly store: string;
|
|
14
|
+
readonly project: () => string;
|
|
15
|
+
readonly report: (id: string, message: string, error: unknown) => void;
|
|
16
|
+
}): Conversations;
|
|
17
|
+
//# sourceMappingURL=conversations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../src/runtime/conversations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAY5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AA2BzC,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,CAAA;IAClH,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,GAAG,aAAa,CAugBlR"}
|