chainlesschain 0.45.81 → 0.47.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/README.md +10 -0
- package/bin/chainlesschain.js +0 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{Analytics-C1AnPdMx.js → Analytics-DgypYeUB.js} +2 -2
- package/src/assets/web-panel/assets/AppLayout-Bzf3mSZI.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-DQyDwGut.css +1 -0
- package/src/assets/web-panel/assets/{Backup-D31iZX3l.js → Backup-Ba9UybpT.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DiXJ3TuK.js → Chat-BwXskT21.js} +1 -1
- package/src/assets/web-panel/assets/Cowork-CXuhlHew.css +1 -0
- package/src/assets/web-panel/assets/Cowork-UmOe7qvE.js +7 -0
- package/src/assets/web-panel/assets/{Cron-DBt1ueXh.js → Cron-JHS-rc-4.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-HPh9FcPt.js → Dashboard-B95cMCO7.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-CKeMmCoT.css +1 -0
- package/src/assets/web-panel/assets/{Git-hwQ1oZHj.js → Git-CSYO0_zk.js} +2 -2
- package/src/assets/web-panel/assets/{Logs-4D9p6PRM.js → Logs-Hxw_K0km.js} +2 -2
- package/src/assets/web-panel/assets/{McpTools-CyAUjbbs.js → McpTools-DIE75TrB.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-BMqOR7S-.js → Memory-C4KVnLlp.js} +2 -2
- package/src/assets/web-panel/assets/{Notes-Cmas8i4E.js → Notes-DuzrHMAk.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-DnSa58Tl.js → Organization-DTq6uF82.js} +4 -4
- package/src/assets/web-panel/assets/{P2P-BxksIBWs.js → P2P-C0hjlhsR.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-Bq5Qn2s3.js → Permissions-Ec0NH-xC.js} +4 -4
- package/src/assets/web-panel/assets/{Projects-B7EM0uPg.js → Projects-U8D0asCS.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-DAwgG5KV.js → Providers-BngtTLvJ.js} +2 -2
- package/src/assets/web-panel/assets/{RssFeed-HSZoRXvS.js → RssFeed-B9NbwCKM.js} +3 -3
- package/src/assets/web-panel/assets/{Security-Cz17qBny.js → Security-BL5Rkr1T.js} +3 -3
- package/src/assets/web-panel/assets/{Services-D2EsLq-v.js → Services-D4MJzLld.js} +2 -2
- package/src/assets/web-panel/assets/{Skills-C9v-f3vZ.js → Skills-CQTOMDwF.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-yMEcU0n7.js → Tasks-DepbJMnL.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-l7SvlKuB.js → Templates-C24PVZPu.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BHWhLWn9.js → Wallet-PQoSpN_P.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-kWhFYaUK.js → WebAuthn-BcuyQ4Lr.js} +4 -4
- package/src/assets/web-panel/assets/WorkflowEditor-C-SvXbHW.js +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-D5bX6woe.css +1 -0
- package/src/assets/web-panel/assets/{antd-D6h4fDFf.js → antd-DEjZPGMj.js} +82 -82
- package/src/assets/web-panel/assets/index-CwvzTTw_.js +2 -0
- package/src/assets/web-panel/assets/{markdown-BZsB-Dsv.js → markdown-CusdXFxb.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/cowork.js +867 -0
- package/src/gateways/ws/action-protocol.js +182 -2
- package/src/gateways/ws/message-dispatcher.js +5 -0
- package/src/gateways/ws/ws-server.js +21 -0
- package/src/lib/cowork-cron.js +474 -0
- package/src/lib/cowork-evomap-adapter.js +121 -0
- package/src/lib/cowork-learning.js +438 -0
- package/src/lib/cowork-mcp-tools.js +182 -0
- package/src/lib/cowork-observe-html.js +108 -0
- package/src/lib/cowork-observe.js +160 -0
- package/src/lib/cowork-share.js +322 -0
- package/src/lib/cowork-task-runner.js +317 -3
- package/src/lib/cowork-task-templates.js +101 -13
- package/src/lib/cowork-template-marketplace.js +205 -0
- package/src/lib/cowork-workflow.js +571 -0
- package/src/lib/provider-options.js +133 -0
- package/src/lib/skill-loader.js +65 -0
- package/src/lib/sub-agent-context.js +54 -2
- package/src/lib/sub-agent-profiles.js +164 -0
- package/src/lib/todo-manager.js +108 -0
- package/src/lib/turn-context.js +95 -0
- package/src/lib/web-fetch.js +224 -0
- package/src/lib/workflow-expr.js +318 -0
- package/src/repl/agent-repl.js +4 -0
- package/src/runtime/agent-core.js +135 -3
- package/src/runtime/coding-agent-contract-shared.cjs +131 -0
- package/src/runtime/coding-agent-policy.cjs +30 -0
- package/src/assets/web-panel/assets/AppLayout-YdvJBMHH.js +0 -1
- package/src/assets/web-panel/assets/AppLayout-cxfKLu-m.css +0 -1
- package/src/assets/web-panel/assets/Cowork-BnrHWwZw.js +0 -7
- package/src/assets/web-panel/assets/Cowork-CcSoS3eX.css +0 -1
- package/src/assets/web-panel/assets/Dashboard-BS-tzGNj.css +0 -1
- package/src/assets/web-panel/assets/index-ByUk2Wmr.js +0 -2
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cowork Template Marketplace — share and install Cowork templates via EvoMap.
|
|
3
|
+
*
|
|
4
|
+
* A "Cowork template" is a serializable subset of the full template object
|
|
5
|
+
* (id, name, category, acceptsFiles, mode, systemPromptExtension,
|
|
6
|
+
* parallelStrategy, debatePerspectives, shellPolicyOverrides, mcpServers +
|
|
7
|
+
* UI fields: icon, description, examples).
|
|
8
|
+
*
|
|
9
|
+
* Published templates are wrapped as EvoMap "genes" with `category: "cowork-template"`
|
|
10
|
+
* so they sit alongside other gene types but can be filtered explicitly.
|
|
11
|
+
*
|
|
12
|
+
* Installed templates are persisted to `.chainlesschain/cowork/user-templates/<id>.json`
|
|
13
|
+
* and merged into the built-in template registry by `cowork-task-templates.js`.
|
|
14
|
+
*
|
|
15
|
+
* @module cowork-template-marketplace
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
existsSync,
|
|
20
|
+
mkdirSync,
|
|
21
|
+
readFileSync,
|
|
22
|
+
writeFileSync,
|
|
23
|
+
readdirSync,
|
|
24
|
+
unlinkSync,
|
|
25
|
+
} from "node:fs";
|
|
26
|
+
import { join } from "node:path";
|
|
27
|
+
|
|
28
|
+
export const _deps = {
|
|
29
|
+
existsSync,
|
|
30
|
+
mkdirSync,
|
|
31
|
+
readFileSync,
|
|
32
|
+
writeFileSync,
|
|
33
|
+
readdirSync,
|
|
34
|
+
unlinkSync,
|
|
35
|
+
// Injected at runtime by CLI to avoid eager evomap-client load
|
|
36
|
+
evomapClient: null,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const EVOMAP_CATEGORY = "cowork-template";
|
|
40
|
+
|
|
41
|
+
// ─── Paths ───────────────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
function _userTemplatesDir(cwd) {
|
|
44
|
+
return join(cwd, ".chainlesschain", "cowork", "user-templates");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function _userTemplateFile(cwd, id) {
|
|
48
|
+
return join(_userTemplatesDir(cwd), `${id}.json`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ─── Serialization ───────────────────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
const SHARED_FIELDS = [
|
|
54
|
+
"id",
|
|
55
|
+
"name",
|
|
56
|
+
"category",
|
|
57
|
+
"acceptsFiles",
|
|
58
|
+
"fileTypes",
|
|
59
|
+
"mode",
|
|
60
|
+
"parallelStrategy",
|
|
61
|
+
"debatePerspectives",
|
|
62
|
+
"systemPromptExtension",
|
|
63
|
+
"shellPolicyOverrides",
|
|
64
|
+
"mcpServers",
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
const UI_FIELDS = ["icon", "description", "examples"];
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Pick the shareable subset of a template (strips internal fields).
|
|
71
|
+
* @param {object} template - Template object from TASK_TEMPLATES or UI metadata
|
|
72
|
+
* @param {object} [uiMeta] - Optional { icon, description, examples }
|
|
73
|
+
*/
|
|
74
|
+
export function toShareableTemplate(template, uiMeta = {}) {
|
|
75
|
+
const out = {};
|
|
76
|
+
for (const f of SHARED_FIELDS) {
|
|
77
|
+
if (template[f] !== undefined) out[f] = template[f];
|
|
78
|
+
}
|
|
79
|
+
for (const f of UI_FIELDS) {
|
|
80
|
+
if (uiMeta[f] !== undefined) out[f] = uiMeta[f];
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Build an EvoMap gene payload for a template.
|
|
87
|
+
* @param {object} template - Shareable template (see toShareableTemplate)
|
|
88
|
+
* @param {object} meta - { author, version, description, tags }
|
|
89
|
+
*/
|
|
90
|
+
export function buildTemplateGene(template, meta = {}) {
|
|
91
|
+
if (!template?.id) throw new Error("template.id is required");
|
|
92
|
+
if (!template?.name) throw new Error("template.name is required");
|
|
93
|
+
return {
|
|
94
|
+
id: `cowork-template-${template.id}`,
|
|
95
|
+
name: template.name,
|
|
96
|
+
description: meta.description || template.description || template.name,
|
|
97
|
+
category: EVOMAP_CATEGORY,
|
|
98
|
+
author: meta.author || "anonymous",
|
|
99
|
+
version: meta.version || "1.0.0",
|
|
100
|
+
tags: Array.isArray(meta.tags) ? meta.tags : [EVOMAP_CATEGORY],
|
|
101
|
+
content: JSON.stringify(template),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Extract a template from a downloaded gene payload.
|
|
107
|
+
* Accepts either { gene, content } or a flat gene object.
|
|
108
|
+
*/
|
|
109
|
+
export function templateFromGene(payload) {
|
|
110
|
+
if (!payload) throw new Error("empty gene payload");
|
|
111
|
+
const gene = payload.gene || payload;
|
|
112
|
+
const content = payload.content ?? gene.content;
|
|
113
|
+
if (!content || typeof content !== "string") {
|
|
114
|
+
throw new Error("gene is missing `content` string");
|
|
115
|
+
}
|
|
116
|
+
let parsed;
|
|
117
|
+
try {
|
|
118
|
+
parsed = JSON.parse(content);
|
|
119
|
+
} catch (err) {
|
|
120
|
+
throw new Error(`gene content is not valid JSON: ${err.message}`);
|
|
121
|
+
}
|
|
122
|
+
if (!parsed?.id || !parsed?.name) {
|
|
123
|
+
throw new Error("gene content is not a valid cowork template");
|
|
124
|
+
}
|
|
125
|
+
return parsed;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ─── Local persistence ──────────────────────────────────────────────────────
|
|
129
|
+
|
|
130
|
+
/** List all installed user templates (as full objects). */
|
|
131
|
+
export function listUserTemplates(cwd) {
|
|
132
|
+
const dir = _userTemplatesDir(cwd);
|
|
133
|
+
if (!_deps.existsSync(dir)) return [];
|
|
134
|
+
const out = [];
|
|
135
|
+
for (const entry of _deps.readdirSync(dir)) {
|
|
136
|
+
if (!entry.endsWith(".json")) continue;
|
|
137
|
+
try {
|
|
138
|
+
const raw = _deps.readFileSync(join(dir, entry), "utf-8");
|
|
139
|
+
const tpl = JSON.parse(raw);
|
|
140
|
+
if (tpl?.id && tpl?.name) out.push({ ...tpl, source: "user" });
|
|
141
|
+
} catch (_e) {
|
|
142
|
+
// Skip malformed files — don't let one bad template break the list
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Save a template to the local user-templates directory. */
|
|
149
|
+
export function saveUserTemplate(cwd, template) {
|
|
150
|
+
if (!template?.id) throw new Error("template.id is required");
|
|
151
|
+
const dir = _userTemplatesDir(cwd);
|
|
152
|
+
_deps.mkdirSync(dir, { recursive: true });
|
|
153
|
+
_deps.writeFileSync(
|
|
154
|
+
_userTemplateFile(cwd, template.id),
|
|
155
|
+
JSON.stringify(template, null, 2),
|
|
156
|
+
"utf-8",
|
|
157
|
+
);
|
|
158
|
+
return template;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Remove an installed user template. Returns true if removed. */
|
|
162
|
+
export function removeUserTemplate(cwd, id) {
|
|
163
|
+
const file = _userTemplateFile(cwd, id);
|
|
164
|
+
if (!_deps.existsSync(file)) return false;
|
|
165
|
+
_deps.unlinkSync(file);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ─── Marketplace operations ──────────────────────────────────────────────────
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Search for templates on an EvoMap hub. Filters to category=cowork-template.
|
|
173
|
+
*/
|
|
174
|
+
export async function searchTemplates(query, { limit = 20 } = {}) {
|
|
175
|
+
const client = _deps.evomapClient;
|
|
176
|
+
if (!client) throw new Error("EvoMap client not configured");
|
|
177
|
+
const results = await client.search(query || "", {
|
|
178
|
+
category: EVOMAP_CATEGORY,
|
|
179
|
+
limit,
|
|
180
|
+
});
|
|
181
|
+
return Array.isArray(results) ? results : [];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Install a template by gene id. Downloads, validates, and saves to local dir.
|
|
186
|
+
* @returns {object} The installed template definition.
|
|
187
|
+
*/
|
|
188
|
+
export async function installTemplate(cwd, geneId) {
|
|
189
|
+
const client = _deps.evomapClient;
|
|
190
|
+
if (!client) throw new Error("EvoMap client not configured");
|
|
191
|
+
const payload = await client.download(geneId);
|
|
192
|
+
const template = templateFromGene(payload);
|
|
193
|
+
saveUserTemplate(cwd, template);
|
|
194
|
+
return template;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Publish a template. Caller provides the shareable template + metadata.
|
|
199
|
+
*/
|
|
200
|
+
export async function publishTemplate(template, meta = {}) {
|
|
201
|
+
const client = _deps.evomapClient;
|
|
202
|
+
if (!client) throw new Error("EvoMap client not configured");
|
|
203
|
+
const gene = buildTemplateGene(template, meta);
|
|
204
|
+
return client.publish(gene);
|
|
205
|
+
}
|