@superblocksteam/vite-plugin-file-sync 2.0.89 → 2.0.90
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-service/agent/prompts/api-prompts.js +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts +2 -2
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +132 -28
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +1 -1
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +44 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +226 -92
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +13 -11
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +33 -3
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.js +8 -3
- package/dist/ai-service/agent/tools/build-debug.js.map +1 -1
- package/dist/ai-service/agent/tools/build-edit-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-edit-file.js +12 -2
- package/dist/ai-service/agent/tools/build-edit-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-list-files.js +1 -1
- package/dist/ai-service/agent/tools/build-list-files.js.map +1 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.js +6 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.js.map +1 -1
- package/dist/ai-service/agent/tools/get-logs.d.ts +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +5 -1
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +3 -0
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts +2 -2
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +3 -3
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata.d.ts +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.d.ts +1 -1
- package/dist/ai-service/agent/tools2/tools/index.d.ts +1 -0
- package/dist/ai-service/agent/tools2/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/index.js +1 -0
- package/dist/ai-service/agent/tools2/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/remember-facts.d.ts +29 -0
- package/dist/ai-service/agent/tools2/tools/remember-facts.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/remember-facts.js +104 -0
- package/dist/ai-service/agent/tools2/tools/remember-facts.js.map +1 -0
- package/dist/ai-service/agent/tools2/types.d.ts +1 -0
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js +1 -0
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +77 -0
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts +22 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js +121 -11
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.d.ts +1 -1
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.js +4 -2
- package/dist/ai-service/app-interface/filesystem/sdk-path-validator.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.d.ts +2 -0
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.js +28 -3
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +9 -3
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/app-skills/helpers.d.ts +32 -0
- package/dist/ai-service/app-skills/helpers.d.ts.map +1 -0
- package/dist/ai-service/app-skills/helpers.js +262 -0
- package/dist/ai-service/app-skills/helpers.js.map +1 -0
- package/dist/ai-service/app-skills/manager.d.ts +60 -0
- package/dist/ai-service/app-skills/manager.d.ts.map +1 -0
- package/dist/ai-service/app-skills/manager.js +203 -0
- package/dist/ai-service/app-skills/manager.js.map +1 -0
- package/dist/ai-service/app-skills/parser.d.ts +53 -0
- package/dist/ai-service/app-skills/parser.d.ts.map +1 -0
- package/dist/ai-service/app-skills/parser.js +82 -0
- package/dist/ai-service/app-skills/parser.js.map +1 -0
- package/dist/ai-service/attachment-upload.d.ts +24 -0
- package/dist/ai-service/attachment-upload.d.ts.map +1 -0
- package/dist/ai-service/attachment-upload.js +75 -0
- package/dist/ai-service/attachment-upload.js.map +1 -0
- package/dist/ai-service/chat/chat-session-store.d.ts +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +82 -0
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/facts/helpers.d.ts +8 -1
- package/dist/ai-service/facts/helpers.d.ts.map +1 -1
- package/dist/ai-service/facts/helpers.js +89 -7
- package/dist/ai-service/facts/helpers.js.map +1 -1
- package/dist/ai-service/facts/knowledge-manager.d.ts +39 -3
- package/dist/ai-service/facts/knowledge-manager.d.ts.map +1 -1
- package/dist/ai-service/facts/knowledge-manager.js +108 -27
- package/dist/ai-service/facts/knowledge-manager.js.map +1 -1
- package/dist/ai-service/features.d.ts +5 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +5 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +20 -0
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +38 -1
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +3 -1
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context.d.ts +2 -0
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +65 -0
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/recording/block-traversal.d.ts +30 -0
- package/dist/ai-service/recording/block-traversal.d.ts.map +1 -0
- package/dist/ai-service/recording/block-traversal.js +118 -0
- package/dist/ai-service/recording/block-traversal.js.map +1 -0
- package/dist/ai-service/recording/index.d.ts +1 -0
- package/dist/ai-service/recording/index.d.ts.map +1 -1
- package/dist/ai-service/recording/index.js +2 -0
- package/dist/ai-service/recording/index.js.map +1 -1
- package/dist/ai-service/recording/snapshot-manager.d.ts +200 -0
- package/dist/ai-service/recording/snapshot-manager.d.ts.map +1 -0
- package/dist/ai-service/recording/snapshot-manager.js +708 -0
- package/dist/ai-service/recording/snapshot-manager.js.map +1 -0
- package/dist/ai-service/recording/storage/session-recording-storage.d.ts +5 -1
- package/dist/ai-service/recording/storage/session-recording-storage.d.ts.map +1 -1
- package/dist/ai-service/recording/storage/session-recording-storage.js +46 -21
- package/dist/ai-service/recording/storage/session-recording-storage.js.map +1 -1
- package/dist/ai-service/sdk-api-templates.d.ts +2 -0
- package/dist/ai-service/sdk-api-templates.d.ts.map +1 -0
- package/dist/ai-service/sdk-api-templates.js +2 -0
- package/dist/ai-service/sdk-api-templates.js.map +1 -0
- package/dist/ai-service/skills/index.d.ts +3 -1
- package/dist/ai-service/skills/index.d.ts.map +1 -1
- package/dist/ai-service/skills/index.js +5 -2
- package/dist/ai-service/skills/index.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js +4 -4
- package/dist/ai-service/state-machine/clark-fsm.d.ts +18 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +1 -0
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +93 -11
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +67 -7
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
- package/dist/ai-service/state-machine/mocks.js +2 -0
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/ai-service/types.d.ts +3 -0
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/ai-service/types.js.map +1 -1
- package/dist/ai-service/util/mode-message.d.ts.map +1 -1
- package/dist/ai-service/util/mode-message.js +3 -0
- package/dist/ai-service/util/mode-message.js.map +1 -1
- package/dist/ai-service/util/rpc-timeout.d.ts +37 -0
- package/dist/ai-service/util/rpc-timeout.d.ts.map +1 -0
- package/dist/ai-service/util/rpc-timeout.js +58 -0
- package/dist/ai-service/util/rpc-timeout.js.map +1 -0
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +72 -21
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-helpers.d.ts +9 -0
- package/dist/file-system-helpers.d.ts.map +1 -1
- package/dist/file-system-helpers.js +21 -0
- package/dist/file-system-helpers.js.map +1 -1
- package/dist/injected-index.d.ts.map +1 -1
- package/dist/injected-index.js +4 -3
- package/dist/injected-index.js.map +1 -1
- package/dist/plugin-options.d.ts +2 -0
- package/dist/plugin-options.d.ts.map +1 -1
- package/dist/plugin-options.js.map +1 -1
- package/dist/snapshot-routes.d.ts +17 -0
- package/dist/snapshot-routes.d.ts.map +1 -0
- package/dist/snapshot-routes.js +247 -0
- package/dist/snapshot-routes.js.map +1 -0
- package/dist/socket-manager.d.ts +1 -0
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +34 -0
- package/dist/socket-manager.js.map +1 -1
- package/package.json +9 -5
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getLogger } from "../../util/logger.js";
|
|
4
|
+
import { factNameToFileName, parseSkillFile, serializeSkillFile, } from "./parser.js";
|
|
5
|
+
/** Relative path from the app root where app skill facts are stored */
|
|
6
|
+
const APP_SKILLS_RELATIVE_DIR = "skills/app";
|
|
7
|
+
/** Virtual path prefix shown to the user/UI */
|
|
8
|
+
const VIRTUAL_PATH_PREFIX = ".superblocks/skills/app";
|
|
9
|
+
/**
|
|
10
|
+
* Manages reading and writing app skill fact files on disk.
|
|
11
|
+
*
|
|
12
|
+
* Facts are stored as markdown files with YAML frontmatter in
|
|
13
|
+
* `<appRootDirPath>/skills/app/*.md`.
|
|
14
|
+
*/
|
|
15
|
+
export class AppSkillsManager {
|
|
16
|
+
appRootDirPath;
|
|
17
|
+
constructor(appRootDirPath) {
|
|
18
|
+
this.appRootDirPath = appRootDirPath;
|
|
19
|
+
}
|
|
20
|
+
get skillsDir() {
|
|
21
|
+
return path.join(this.appRootDirPath, APP_SKILLS_RELATIVE_DIR);
|
|
22
|
+
}
|
|
23
|
+
toVirtualPath(absolutePath) {
|
|
24
|
+
const fileName = path.basename(absolutePath);
|
|
25
|
+
return `${VIRTUAL_PATH_PREFIX}/${fileName}`;
|
|
26
|
+
}
|
|
27
|
+
fromVirtualPath(virtualPath) {
|
|
28
|
+
const fileName = path.basename(virtualPath);
|
|
29
|
+
return path.join(this.skillsDir, fileName);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load all facts from disk. Returns an empty array if the directory doesn't exist.
|
|
33
|
+
*/
|
|
34
|
+
async loadFacts() {
|
|
35
|
+
let entries;
|
|
36
|
+
try {
|
|
37
|
+
entries = await fs.readdir(this.skillsDir);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (err.code === "ENOENT") {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
const facts = [];
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
if (!entry.endsWith(".md"))
|
|
48
|
+
continue;
|
|
49
|
+
const absolutePath = path.join(this.skillsDir, entry);
|
|
50
|
+
try {
|
|
51
|
+
const raw = await fs.readFile(absolutePath, "utf-8");
|
|
52
|
+
const parsed = parseSkillFile(raw);
|
|
53
|
+
if (parsed) {
|
|
54
|
+
facts.push({ ...parsed, path: this.toVirtualPath(absolutePath) });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
getLogger().warn({ absolutePath, error }, "Failed to read or parse skill file");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Sort by createdAt ascending (oldest first)
|
|
62
|
+
facts.sort((a, b) => {
|
|
63
|
+
if (a.createdAt && b.createdAt) {
|
|
64
|
+
return a.createdAt.localeCompare(b.createdAt);
|
|
65
|
+
}
|
|
66
|
+
return 0;
|
|
67
|
+
});
|
|
68
|
+
return facts;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convert loaded AppSkillFact array to AiAppFact array for the UI.
|
|
72
|
+
*/
|
|
73
|
+
static toAiAppFacts(facts) {
|
|
74
|
+
return facts.map((f) => ({
|
|
75
|
+
path: f.path,
|
|
76
|
+
name: f.name,
|
|
77
|
+
description: f.description,
|
|
78
|
+
content: f.content,
|
|
79
|
+
accessType: f.accessType,
|
|
80
|
+
isEnabled: f.isEnabled,
|
|
81
|
+
createdAt: f.createdAt,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find a fact by display name (case-insensitive).
|
|
86
|
+
*/
|
|
87
|
+
async findFactByName(name) {
|
|
88
|
+
const normalizedName = name.trim().toLowerCase();
|
|
89
|
+
if (!normalizedName) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const facts = await this.loadFacts();
|
|
93
|
+
return facts.find((fact) => fact.name.trim().toLowerCase() === normalizedName);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Save a new fact to disk. If a fact with the same name already exists, it will be overwritten.
|
|
97
|
+
*/
|
|
98
|
+
async saveFact(fact) {
|
|
99
|
+
await fs.mkdir(this.skillsDir, { recursive: true });
|
|
100
|
+
const createdAt = new Date().toISOString();
|
|
101
|
+
const fileName = `${factNameToFileName(fact.name)}.md`;
|
|
102
|
+
const absolutePath = path.join(this.skillsDir, fileName);
|
|
103
|
+
const parsed = {
|
|
104
|
+
name: fact.name,
|
|
105
|
+
description: fact.description,
|
|
106
|
+
content: fact.content,
|
|
107
|
+
accessType: "on_demand",
|
|
108
|
+
isEnabled: fact.isEnabled !== false,
|
|
109
|
+
createdAt,
|
|
110
|
+
};
|
|
111
|
+
await fs.writeFile(absolutePath, serializeSkillFile(parsed), "utf-8");
|
|
112
|
+
return {
|
|
113
|
+
...parsed,
|
|
114
|
+
path: this.toVirtualPath(absolutePath),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Update an existing fact by its virtual path.
|
|
119
|
+
*/
|
|
120
|
+
async updateFact(virtualPath, updates) {
|
|
121
|
+
const absolutePath = this.fromVirtualPath(virtualPath);
|
|
122
|
+
const raw = await fs.readFile(absolutePath, "utf-8");
|
|
123
|
+
const parsed = parseSkillFile(raw);
|
|
124
|
+
if (!parsed) {
|
|
125
|
+
throw new Error(`Could not parse fact file at ${virtualPath}`);
|
|
126
|
+
}
|
|
127
|
+
const updated = {
|
|
128
|
+
...parsed,
|
|
129
|
+
name: updates.name,
|
|
130
|
+
description: updates.description,
|
|
131
|
+
content: updates.content,
|
|
132
|
+
};
|
|
133
|
+
await fs.writeFile(absolutePath, serializeSkillFile(updated), "utf-8");
|
|
134
|
+
return {
|
|
135
|
+
...updated,
|
|
136
|
+
path: virtualPath,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Delete a fact file by its virtual path.
|
|
141
|
+
*/
|
|
142
|
+
async deleteFact(virtualPath) {
|
|
143
|
+
const absolutePath = this.fromVirtualPath(virtualPath);
|
|
144
|
+
try {
|
|
145
|
+
await fs.unlink(absolutePath);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (err.code === "ENOENT") {
|
|
149
|
+
// Already gone — not an error
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Toggle the isEnabled field of a fact by its virtual path.
|
|
157
|
+
* Returns the updated AiAppFact.
|
|
158
|
+
*/
|
|
159
|
+
async toggleFact(virtualPath, isEnabled) {
|
|
160
|
+
const absolutePath = this.fromVirtualPath(virtualPath);
|
|
161
|
+
const raw = await fs.readFile(absolutePath, "utf-8");
|
|
162
|
+
const parsed = parseSkillFile(raw);
|
|
163
|
+
if (!parsed) {
|
|
164
|
+
throw new Error(`Could not parse fact file at ${virtualPath}`);
|
|
165
|
+
}
|
|
166
|
+
const updated = { ...parsed, isEnabled };
|
|
167
|
+
await fs.writeFile(absolutePath, serializeSkillFile(updated), "utf-8");
|
|
168
|
+
return {
|
|
169
|
+
...updated,
|
|
170
|
+
path: virtualPath,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Load facts and format them for injection into the system prompt.
|
|
175
|
+
* Only includes facts where isEnabled=true AND accessType="always".
|
|
176
|
+
* Facts with accessType="on_demand" are available but not auto-injected.
|
|
177
|
+
*/
|
|
178
|
+
async loadFactsForPrompt() {
|
|
179
|
+
const facts = await this.loadFacts();
|
|
180
|
+
const alwaysOn = facts.filter((f) => f.isEnabled && f.accessType === "always");
|
|
181
|
+
if (alwaysOn.length === 0) {
|
|
182
|
+
return "";
|
|
183
|
+
}
|
|
184
|
+
const items = alwaysOn
|
|
185
|
+
.map((f) => `### ${f.name}
|
|
186
|
+
${f.description ? `${f.description}\n\n` : ""}${f.content}`)
|
|
187
|
+
.join("\n\n");
|
|
188
|
+
return `<app_knowledge>
|
|
189
|
+
## App-Specific Knowledge
|
|
190
|
+
|
|
191
|
+
The following facts were explicitly saved by the user for this application. They are MANDATORY on every turn and override general defaults.
|
|
192
|
+
|
|
193
|
+
**You MUST:**
|
|
194
|
+
- Apply every enabled app fact regardless of what the task is
|
|
195
|
+
- Treat them as authoritative user-defined requirements, not optional hints
|
|
196
|
+
- If a fact specifies a pattern, style, or constraint: follow it without exception
|
|
197
|
+
- These take precedence over your general defaults, but never over safety guidelines
|
|
198
|
+
|
|
199
|
+
${items}
|
|
200
|
+
</app_knowledge>`;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/ai-service/app-skills/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The frontmatter fields stored in each app skill fact file.
|
|
3
|
+
*/
|
|
4
|
+
export type ParsedSkillFileFrontmatter = {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
/**
|
|
8
|
+
* "always" — injected into every system prompt automatically.
|
|
9
|
+
* "on_demand" — only injected when Clark explicitly retrieves it (default for new facts).
|
|
10
|
+
*/
|
|
11
|
+
accessType: "always" | "on_demand";
|
|
12
|
+
isEnabled: boolean;
|
|
13
|
+
createdAt?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* A parsed app skill fact: frontmatter + body content.
|
|
17
|
+
*/
|
|
18
|
+
export type ParsedSkillFile = ParsedSkillFileFrontmatter & {
|
|
19
|
+
/** The markdown body below the frontmatter */
|
|
20
|
+
content: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* A loaded app skill fact with its disk path.
|
|
24
|
+
*/
|
|
25
|
+
export type AppSkillFact = ParsedSkillFile & {
|
|
26
|
+
path: string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Parse a markdown file that has YAML frontmatter.
|
|
30
|
+
*
|
|
31
|
+
* Expected format:
|
|
32
|
+
* ```
|
|
33
|
+
* ---
|
|
34
|
+
* name: "..."
|
|
35
|
+
* description: "..."
|
|
36
|
+
* accessType: always
|
|
37
|
+
* isEnabled: true
|
|
38
|
+
* createdAt: "..."
|
|
39
|
+
* ---
|
|
40
|
+
*
|
|
41
|
+
* The body content goes here.
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseSkillFile(raw: string): ParsedSkillFile | null;
|
|
45
|
+
/**
|
|
46
|
+
* Serialize a skill fact back to a markdown file string with YAML frontmatter.
|
|
47
|
+
*/
|
|
48
|
+
export declare function serializeSkillFile(fact: ParsedSkillFile): string;
|
|
49
|
+
/**
|
|
50
|
+
* Convert a fact name to a safe file name (kebab-case, no special chars).
|
|
51
|
+
*/
|
|
52
|
+
export declare function factNameToFileName(name: string): string;
|
|
53
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/ai-service/app-skills/parser.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,0BAA0B,GAAG;IACzD,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAI9D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA0ClE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAahE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
2
|
+
const FRONTMATTER_DELIMITER = "---";
|
|
3
|
+
/**
|
|
4
|
+
* Parse a markdown file that has YAML frontmatter.
|
|
5
|
+
*
|
|
6
|
+
* Expected format:
|
|
7
|
+
* ```
|
|
8
|
+
* ---
|
|
9
|
+
* name: "..."
|
|
10
|
+
* description: "..."
|
|
11
|
+
* accessType: always
|
|
12
|
+
* isEnabled: true
|
|
13
|
+
* createdAt: "..."
|
|
14
|
+
* ---
|
|
15
|
+
*
|
|
16
|
+
* The body content goes here.
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function parseSkillFile(raw) {
|
|
20
|
+
const trimmed = raw.trimStart();
|
|
21
|
+
if (!trimmed.startsWith(FRONTMATTER_DELIMITER)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const afterFirstDelimiter = trimmed.slice(FRONTMATTER_DELIMITER.length);
|
|
25
|
+
const endIndex = afterFirstDelimiter.indexOf(`\n${FRONTMATTER_DELIMITER}`);
|
|
26
|
+
if (endIndex === -1) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const yamlStr = afterFirstDelimiter.slice(0, endIndex).trim();
|
|
30
|
+
const content = afterFirstDelimiter
|
|
31
|
+
.slice(endIndex + FRONTMATTER_DELIMITER.length + 1)
|
|
32
|
+
.trimStart();
|
|
33
|
+
let frontmatter;
|
|
34
|
+
try {
|
|
35
|
+
frontmatter = parseYaml(yamlStr) ?? {};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
if (typeof frontmatter.name !== "string" || !frontmatter.name) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
name: frontmatter.name,
|
|
45
|
+
description: typeof frontmatter.description === "string"
|
|
46
|
+
? frontmatter.description
|
|
47
|
+
: "",
|
|
48
|
+
accessType: frontmatter.accessType === "always" ? "always" : "on_demand",
|
|
49
|
+
isEnabled: frontmatter.isEnabled !== false,
|
|
50
|
+
createdAt: typeof frontmatter.createdAt === "string"
|
|
51
|
+
? frontmatter.createdAt
|
|
52
|
+
: undefined,
|
|
53
|
+
content,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Serialize a skill fact back to a markdown file string with YAML frontmatter.
|
|
58
|
+
*/
|
|
59
|
+
export function serializeSkillFile(fact) {
|
|
60
|
+
const frontmatter = {
|
|
61
|
+
name: fact.name,
|
|
62
|
+
description: fact.description,
|
|
63
|
+
accessType: fact.accessType,
|
|
64
|
+
isEnabled: fact.isEnabled,
|
|
65
|
+
};
|
|
66
|
+
if (fact.createdAt) {
|
|
67
|
+
frontmatter.createdAt = fact.createdAt;
|
|
68
|
+
}
|
|
69
|
+
const yamlStr = stringifyYaml(frontmatter).trimEnd();
|
|
70
|
+
return `---\n${yamlStr}\n---\n\n${fact.content}\n`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Convert a fact name to a safe file name (kebab-case, no special chars).
|
|
74
|
+
*/
|
|
75
|
+
export function factNameToFileName(name) {
|
|
76
|
+
return (name
|
|
77
|
+
.toLowerCase()
|
|
78
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
79
|
+
.replace(/^-+|-+$/g, "")
|
|
80
|
+
.slice(0, 60) || "fact");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/ai-service/app-skills/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AA8BtE,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,qBAAqB,EAAE,CAAC,CAAC;IAC3E,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAG,mBAAmB;SAChC,KAAK,CAAC,QAAQ,GAAG,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;SAClD,SAAS,EAAE,CAAC;IAEf,IAAI,WAAoC,CAAC;IACzC,IAAI,CAAC;QACH,WAAW,GAAI,SAAS,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,WAAW,EACT,OAAO,WAAW,CAAC,WAAW,KAAK,QAAQ;YACzC,CAAC,CAAC,WAAW,CAAC,WAAW;YACzB,CAAC,CAAC,EAAE;QACR,UAAU,EAAE,WAAW,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACxE,SAAS,EAAE,WAAW,CAAC,SAAS,KAAK,KAAK;QAC1C,SAAS,EACP,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ;YACvC,CAAC,CAAC,WAAW,CAAC,SAAS;YACvB,CAAC,CAAC,SAAS;QACf,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,MAAM,WAAW,GAA4B;QAC3C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;IACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACzC,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;IACrD,OAAO,QAAQ,OAAO,YAAY,IAAI,CAAC,OAAO,IAAI,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,CACL,IAAI;SACD,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Logger } from "../util/logger.js";
|
|
2
|
+
export interface AttachmentUploadResult {
|
|
3
|
+
fileName: string;
|
|
4
|
+
url: string;
|
|
5
|
+
expirationDate: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Uploads a file to Bucketeer's generic attachments endpoint.
|
|
9
|
+
*/
|
|
10
|
+
export declare function uploadAttachmentToBucketeer({ applicationId, file, prefix, branchId, commitId, superblocksBaseUrl, jwt, logger, }: {
|
|
11
|
+
applicationId: string;
|
|
12
|
+
file: File | Blob | {
|
|
13
|
+
data: string;
|
|
14
|
+
mimeType: string;
|
|
15
|
+
name?: string;
|
|
16
|
+
};
|
|
17
|
+
prefix?: string;
|
|
18
|
+
branchId?: string;
|
|
19
|
+
commitId?: string;
|
|
20
|
+
superblocksBaseUrl: string;
|
|
21
|
+
jwt: string;
|
|
22
|
+
logger: Logger;
|
|
23
|
+
}): Promise<AttachmentUploadResult>;
|
|
24
|
+
//# sourceMappingURL=attachment-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-upload.d.ts","sourceRoot":"","sources":["../../src/ai-service/attachment-upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,EAChD,aAAa,EACb,IAAI,EACJ,MAA6B,EAC7B,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,GAAG,EACH,MAAM,GACP,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAqFlC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getBucketeerUrlFromSuperblocksUrl } from "@superblocksteam/util";
|
|
2
|
+
import { getErrorMeta } from "../util/logger.js";
|
|
3
|
+
import { getScopedToken } from "./util/scoped-token-utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Uploads a file to Bucketeer's generic attachments endpoint.
|
|
6
|
+
*/
|
|
7
|
+
export async function uploadAttachmentToBucketeer({ applicationId, file, prefix = "message-attachment", branchId, commitId, superblocksBaseUrl, jwt, logger, }) {
|
|
8
|
+
let scopedToken;
|
|
9
|
+
try {
|
|
10
|
+
scopedToken = await getScopedToken({
|
|
11
|
+
applicationId,
|
|
12
|
+
superblocksBaseUrl,
|
|
13
|
+
jwt,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
logger.error("[uploadAttachmentToBucketeer] Failed to get scoped token", getErrorMeta(error));
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
let blob;
|
|
21
|
+
let mimeType;
|
|
22
|
+
if (file instanceof File || file instanceof Blob) {
|
|
23
|
+
blob = file;
|
|
24
|
+
mimeType = file.type || "application/octet-stream";
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const isDataUrl = typeof file.data === "string" && file.data.includes(",");
|
|
28
|
+
let base64Data;
|
|
29
|
+
if (isDataUrl) {
|
|
30
|
+
const parts = file.data.split(",");
|
|
31
|
+
const mimePart = parts[0];
|
|
32
|
+
base64Data = parts[1] || "";
|
|
33
|
+
const mimeMatch = mimePart?.match(/data:([^;]+)/);
|
|
34
|
+
mimeType = mimeMatch?.[1] || file.mimeType || "application/octet-stream";
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
base64Data = file.data;
|
|
38
|
+
mimeType = file.mimeType || "application/octet-stream";
|
|
39
|
+
}
|
|
40
|
+
const binaryData = Uint8Array.from(atob(base64Data), (c) => c.charCodeAt(0));
|
|
41
|
+
blob = new Blob([binaryData], { type: mimeType });
|
|
42
|
+
}
|
|
43
|
+
const formData = new FormData();
|
|
44
|
+
formData.append("file", blob);
|
|
45
|
+
formData.append("prefix", prefix);
|
|
46
|
+
if (branchId) {
|
|
47
|
+
formData.append("branchId", branchId);
|
|
48
|
+
}
|
|
49
|
+
if (commitId) {
|
|
50
|
+
formData.append("commitId", commitId);
|
|
51
|
+
}
|
|
52
|
+
const bucketeerUrl = getBucketeerUrlFromSuperblocksUrl(superblocksBaseUrl);
|
|
53
|
+
const uploadUrl = `${bucketeerUrl}/applications/${applicationId}/attachments`;
|
|
54
|
+
const response = await fetch(uploadUrl, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
body: formData,
|
|
57
|
+
headers: {
|
|
58
|
+
Authorization: `Bearer ${scopedToken}`,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
const errorText = await response
|
|
63
|
+
.text()
|
|
64
|
+
.catch(() => "Unable to read error response");
|
|
65
|
+
logger.error(`[uploadAttachmentToBucketeer] Upload failed: status=${response.status}, error=${errorText}`);
|
|
66
|
+
throw new Error(`Attachment upload failed: ${response.statusText}`);
|
|
67
|
+
}
|
|
68
|
+
const result = (await response.json());
|
|
69
|
+
return {
|
|
70
|
+
fileName: result.fileName,
|
|
71
|
+
url: result.url,
|
|
72
|
+
expirationDate: result.expirationDate,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=attachment-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-upload.js","sourceRoot":"","sources":["../../src/ai-service/attachment-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,7 +62,7 @@ export declare class ChatSessionStore {
|
|
|
62
62
|
}): Promise<string>;
|
|
63
63
|
recordUserAcceptance(): Promise<string>;
|
|
64
64
|
recordUserRejection(): Promise<string>;
|
|
65
|
-
recordUserResponse(text: string, responseType: "multi_choice_response" | "plan_response", metadata: {
|
|
65
|
+
recordUserResponse(text: string, responseType: "multi_choice_response" | "confirm_response" | "plan_response", metadata: {
|
|
66
66
|
responseToMessageId: string;
|
|
67
67
|
selectedChoiceIndices?: number[];
|
|
68
68
|
enableTesting?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-session-store.d.ts","sourceRoot":"","sources":["../../../src/ai-service/chat/chat-session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"chat-session-store.d.ts","sourceRoot":"","sources":["../../../src/ai-service/chat/chat-session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -297,6 +297,9 @@ let ChatSessionStore = (() => {
|
|
|
297
297
|
: undefined,
|
|
298
298
|
subtitle: typeof msg.subtitle === "string" ? msg.subtitle : undefined,
|
|
299
299
|
details: typeof msg.details === "string" ? msg.details : undefined,
|
|
300
|
+
factCandidates: Array.isArray(msg.factCandidates)
|
|
301
|
+
? msg.factCandidates
|
|
302
|
+
: undefined,
|
|
300
303
|
};
|
|
301
304
|
}
|
|
302
305
|
else if (msg.type === "multi_choice_response") {
|
|
@@ -320,6 +323,35 @@ let ChatSessionStore = (() => {
|
|
|
320
323
|
};
|
|
321
324
|
return response;
|
|
322
325
|
}
|
|
326
|
+
else if (msg.type === "confirm") {
|
|
327
|
+
return {
|
|
328
|
+
role: msg.role,
|
|
329
|
+
content: msg.content,
|
|
330
|
+
type: "confirm",
|
|
331
|
+
id: typeof msg.id === "string" ? msg.id : undefined,
|
|
332
|
+
timestamp,
|
|
333
|
+
fact: typeof msg.fact === "object" && msg.fact !== null
|
|
334
|
+
? msg.fact
|
|
335
|
+
: undefined,
|
|
336
|
+
title,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
else if (msg.type === "confirm_response") {
|
|
340
|
+
if (typeof msg.responseToMessageId !== "string") {
|
|
341
|
+
this.logger.warn(`[ai-service] Invalid responseToMessageId for confirm_response`);
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
role: msg.role,
|
|
346
|
+
content: msg.content,
|
|
347
|
+
type: "confirm_response",
|
|
348
|
+
id: typeof msg.id === "string" ? msg.id : undefined,
|
|
349
|
+
timestamp,
|
|
350
|
+
responseToMessageId: msg.responseToMessageId,
|
|
351
|
+
approved: Boolean(msg.approved),
|
|
352
|
+
title,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
323
355
|
else if (msg.type === "plan_response") {
|
|
324
356
|
if (typeof msg.responseToMessageId !== "string") {
|
|
325
357
|
this.logger.warn(`[ai-service] Invalid responseToMessageId for plan_response`);
|
|
@@ -419,6 +451,16 @@ let ChatSessionStore = (() => {
|
|
|
419
451
|
facts: msg.facts,
|
|
420
452
|
};
|
|
421
453
|
}
|
|
454
|
+
else if (msg.type === "app_facts_saved") {
|
|
455
|
+
return {
|
|
456
|
+
role: msg.role,
|
|
457
|
+
content: msg.content,
|
|
458
|
+
type: "app_facts_saved",
|
|
459
|
+
id: typeof msg.id === "string" ? msg.id : undefined,
|
|
460
|
+
timestamp,
|
|
461
|
+
factsCount: typeof msg.factsCount === "number" ? msg.factsCount : 0,
|
|
462
|
+
};
|
|
463
|
+
}
|
|
422
464
|
const baseMessage = {
|
|
423
465
|
role: msg.role,
|
|
424
466
|
content: msg.content,
|
|
@@ -675,6 +717,10 @@ let ChatSessionStore = (() => {
|
|
|
675
717
|
baseMessage.selectedChoiceIndices =
|
|
676
718
|
metadata.selectedChoiceIndices;
|
|
677
719
|
}
|
|
720
|
+
else if (responseType === "confirm_response") {
|
|
721
|
+
baseMessage.approved =
|
|
722
|
+
metadata.approved ?? false;
|
|
723
|
+
}
|
|
678
724
|
else if (responseType === "plan_response") {
|
|
679
725
|
baseMessage.approved =
|
|
680
726
|
metadata.approved ?? true;
|
|
@@ -828,6 +874,42 @@ let ChatSessionStore = (() => {
|
|
|
828
874
|
facts: payload.facts,
|
|
829
875
|
};
|
|
830
876
|
}
|
|
877
|
+
else if (payload.type === "multi_choice") {
|
|
878
|
+
const mc = payload;
|
|
879
|
+
message = {
|
|
880
|
+
role: "assistant",
|
|
881
|
+
content: "",
|
|
882
|
+
type: "multi_choice",
|
|
883
|
+
id: messageId,
|
|
884
|
+
timestamp: Date.now(),
|
|
885
|
+
choices: mc.choices,
|
|
886
|
+
...(mc.selectionType ? { selectionType: mc.selectionType } : {}),
|
|
887
|
+
...(mc.subtitle ? { subtitle: mc.subtitle } : {}),
|
|
888
|
+
...(mc.details ? { details: mc.details } : {}),
|
|
889
|
+
...(mc.questionType ? { questionType: mc.questionType } : {}),
|
|
890
|
+
...(mc.factCandidates ? { factCandidates: mc.factCandidates } : {}),
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
else if (payload.type === "confirm") {
|
|
894
|
+
message = {
|
|
895
|
+
role: "assistant",
|
|
896
|
+
content: payload.text,
|
|
897
|
+
type: "confirm",
|
|
898
|
+
id: messageId,
|
|
899
|
+
timestamp: Date.now(),
|
|
900
|
+
fact: payload.fact,
|
|
901
|
+
};
|
|
902
|
+
}
|
|
903
|
+
else if (payload.type === "app_facts_saved") {
|
|
904
|
+
message = {
|
|
905
|
+
role: "assistant",
|
|
906
|
+
content: payload.text,
|
|
907
|
+
type: "app_facts_saved",
|
|
908
|
+
id: messageId,
|
|
909
|
+
timestamp: Date.now(),
|
|
910
|
+
factsCount: payload.factsCount ?? 0,
|
|
911
|
+
};
|
|
912
|
+
}
|
|
831
913
|
else {
|
|
832
914
|
message = {
|
|
833
915
|
role: "assistant",
|