sparkecoder 0.1.118 → 0.1.119
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/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +74 -10
- package/dist/cli.js.map +1 -1
- package/dist/index.js +73 -9
- package/dist/index.js.map +1 -1
- package/dist/server/index.js +73 -9
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.html +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- /package/web/.next/standalone/web/.next/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_ssgManifest.js +0 -0
- /package/web/.next/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_buildManifest.js +0 -0
- /package/web/.next/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{T8x1J_CS0n9FaWBr5GhLe → Bt00m8W4k5F79ALhN700F}/_ssgManifest.js +0 -0
package/dist/server/index.js
CHANGED
|
@@ -1159,7 +1159,7 @@ function loadConfig(configPath, workingDirectory) {
|
|
|
1159
1159
|
...config,
|
|
1160
1160
|
server: {
|
|
1161
1161
|
port: config.server.port,
|
|
1162
|
-
host: config.server.host ?? "
|
|
1162
|
+
host: config.server.host ?? "0.0.0.0",
|
|
1163
1163
|
publicUrl: config.server.publicUrl
|
|
1164
1164
|
},
|
|
1165
1165
|
resolvedWorkingDirectory,
|
|
@@ -1326,7 +1326,7 @@ function createDefaultConfig() {
|
|
|
1326
1326
|
},
|
|
1327
1327
|
server: {
|
|
1328
1328
|
port: 3141,
|
|
1329
|
-
host: "
|
|
1329
|
+
host: "0.0.0.0"
|
|
1330
1330
|
},
|
|
1331
1331
|
databasePath: "./sparkecoder.db"
|
|
1332
1332
|
};
|
|
@@ -7805,6 +7805,44 @@ function getSlackSigningSecret() {
|
|
|
7805
7805
|
function getDefaultOrchestratorName() {
|
|
7806
7806
|
return readSlackConfig()?.defaultOrchestratorName ?? null;
|
|
7807
7807
|
}
|
|
7808
|
+
function getCachedSlackSelfIdentity() {
|
|
7809
|
+
const cfg = readSlackConfig();
|
|
7810
|
+
if (!cfg) return null;
|
|
7811
|
+
if (cachedSelf && cachedSelf.token === cfg.botToken) return cachedSelf.identity;
|
|
7812
|
+
return null;
|
|
7813
|
+
}
|
|
7814
|
+
async function ensureSlackSelfIdentity() {
|
|
7815
|
+
const cfg = readSlackConfig();
|
|
7816
|
+
if (!cfg) return null;
|
|
7817
|
+
if (cachedSelf && cachedSelf.token === cfg.botToken) return cachedSelf.identity;
|
|
7818
|
+
if (selfInflight) return selfInflight;
|
|
7819
|
+
selfInflight = (async () => {
|
|
7820
|
+
try {
|
|
7821
|
+
const res = await fetch("https://slack.com/api/auth.test", {
|
|
7822
|
+
method: "POST",
|
|
7823
|
+
headers: { Authorization: `Bearer ${cfg.botToken}` }
|
|
7824
|
+
});
|
|
7825
|
+
const data = await res.json().catch(() => ({}));
|
|
7826
|
+
if (!data?.ok) {
|
|
7827
|
+
console.warn(`[slack] auth.test failed: ${data?.error || `HTTP ${res.status}`}`);
|
|
7828
|
+
return null;
|
|
7829
|
+
}
|
|
7830
|
+
const identity = {
|
|
7831
|
+
botUserId: String(data.user_id || ""),
|
|
7832
|
+
botId: String(data.bot_id || ""),
|
|
7833
|
+
teamId: data.team_id ? String(data.team_id) : void 0
|
|
7834
|
+
};
|
|
7835
|
+
cachedSelf = { token: cfg.botToken, identity };
|
|
7836
|
+
return identity;
|
|
7837
|
+
} catch (err) {
|
|
7838
|
+
console.warn("[slack] auth.test error:", err?.message || err);
|
|
7839
|
+
return null;
|
|
7840
|
+
} finally {
|
|
7841
|
+
selfInflight = null;
|
|
7842
|
+
}
|
|
7843
|
+
})();
|
|
7844
|
+
return selfInflight;
|
|
7845
|
+
}
|
|
7808
7846
|
function getSlackAllowlistPolicy() {
|
|
7809
7847
|
try {
|
|
7810
7848
|
const cfg = getConfig();
|
|
@@ -7830,11 +7868,13 @@ function getSlackDeniedReplyPolicy() {
|
|
|
7830
7868
|
return { enabled: true, template: DEFAULT_DENIED_TEMPLATE };
|
|
7831
7869
|
}
|
|
7832
7870
|
}
|
|
7833
|
-
var DEFAULT_DENIED_TEMPLATE;
|
|
7871
|
+
var cachedSelf, selfInflight, DEFAULT_DENIED_TEMPLATE;
|
|
7834
7872
|
var init_client3 = __esm({
|
|
7835
7873
|
"src/integrations/slack/client.ts"() {
|
|
7836
7874
|
"use strict";
|
|
7837
7875
|
init_config();
|
|
7876
|
+
cachedSelf = null;
|
|
7877
|
+
selfInflight = null;
|
|
7838
7878
|
DEFAULT_DENIED_TEMPLATE = "Sorry, you don't have permission to use this bot. (Contact the bot owner if you think this is a mistake.)";
|
|
7839
7879
|
}
|
|
7840
7880
|
});
|
|
@@ -7852,9 +7892,19 @@ function isThreadOwned(channel, threadTs) {
|
|
|
7852
7892
|
function stripMention(text) {
|
|
7853
7893
|
return String(text || "").replace(/<@[^>]+>/g, "").trim();
|
|
7854
7894
|
}
|
|
7855
|
-
function
|
|
7895
|
+
function isSelfAuthored(event, self) {
|
|
7896
|
+
if (!self) return true;
|
|
7897
|
+
if (self.botId && event.bot_id && event.bot_id === self.botId) return true;
|
|
7898
|
+
if (self.botUserId && event.user && event.user === self.botUserId) return true;
|
|
7899
|
+
return false;
|
|
7900
|
+
}
|
|
7901
|
+
function slackEventToInboundResult(event, opts = {}) {
|
|
7856
7902
|
if (!event) return { event: null, dropReason: "empty_text" };
|
|
7857
|
-
|
|
7903
|
+
const self = opts.self ?? getCachedSlackSelfIdentity();
|
|
7904
|
+
const isBotAuthored = !!event.bot_id || event.type === "message" && event.subtype === "bot_message";
|
|
7905
|
+
if (isBotAuthored && isSelfAuthored(event, self)) {
|
|
7906
|
+
return { event: null, dropReason: "bot_message" };
|
|
7907
|
+
}
|
|
7858
7908
|
if (event.type === "message" && event.subtype && IGNORED_MESSAGE_SUBTYPES.has(event.subtype)) {
|
|
7859
7909
|
return { event: null, dropReason: "bot_message" };
|
|
7860
7910
|
}
|
|
@@ -7931,7 +7981,6 @@ var init_slack = __esm({
|
|
|
7931
7981
|
}
|
|
7932
7982
|
};
|
|
7933
7983
|
IGNORED_MESSAGE_SUBTYPES = /* @__PURE__ */ new Set([
|
|
7934
|
-
"bot_message",
|
|
7935
7984
|
"message_changed",
|
|
7936
7985
|
"message_deleted",
|
|
7937
7986
|
"channel_join",
|
|
@@ -13655,7 +13704,8 @@ slack.post("/events", async (c) => {
|
|
|
13655
13704
|
updateEvent(auditId, { status: "dropped", dropReason: "duplicate_delivery" });
|
|
13656
13705
|
return c.json({ ok: true });
|
|
13657
13706
|
}
|
|
13658
|
-
const
|
|
13707
|
+
const self = await ensureSlackSelfIdentity();
|
|
13708
|
+
const { event: inbound, dropReason } = slackEventToInboundResult(ev, { self });
|
|
13659
13709
|
if (inbound) {
|
|
13660
13710
|
const isThreadReply = ev.type === "message" && ev.channel_type !== "im" && typeof ev.thread_ts === "string" && ev.thread_ts !== ev.ts;
|
|
13661
13711
|
if (isThreadReply) {
|
|
@@ -14629,13 +14679,15 @@ async function startServer(options = {}) {
|
|
|
14629
14679
|
if (!options.quiet) console.warn(`[scheduler] start skipped: ${err.message}`);
|
|
14630
14680
|
}
|
|
14631
14681
|
const port = options.port || config.server.port;
|
|
14632
|
-
const
|
|
14682
|
+
const envHost = process.env.SPARKECODER_API_HOST || process.env.SPARKECODER_HOST;
|
|
14683
|
+
const host = envHost || options.host || config.server.host || "0.0.0.0";
|
|
14684
|
+
const hostSource = envHost ? process.env.SPARKECODER_API_HOST ? "env SPARKECODER_API_HOST" : "env SPARKECODER_HOST" : options.host ? "--host flag" : config.server.host ? "config.server.host" : "default";
|
|
14633
14685
|
const publicUrl = options.publicUrl || config.server.publicUrl;
|
|
14634
14686
|
const app = await createApp({ quiet: options.quiet });
|
|
14635
14687
|
if (!options.quiet) {
|
|
14636
14688
|
console.log(`
|
|
14637
14689
|
\u{1F680} SparkECoder API Server`);
|
|
14638
|
-
console.log(` \u2192
|
|
14690
|
+
console.log(` \u2192 Binding to ${host}:${port} (source: ${hostSource})`);
|
|
14639
14691
|
if (publicUrl) {
|
|
14640
14692
|
console.log(` \u2192 Public URL: ${publicUrl}`);
|
|
14641
14693
|
}
|
|
@@ -14644,10 +14696,22 @@ async function startServer(options = {}) {
|
|
|
14644
14696
|
console.log(` \u2192 OpenAPI spec: http://${host}:${port}/openapi.json
|
|
14645
14697
|
`);
|
|
14646
14698
|
}
|
|
14699
|
+
if (host === "127.0.0.1" || host === "localhost") {
|
|
14700
|
+
console.log(`[sparkecoder] \u26A0 API bound to ${host} only \u2014 not reachable from outside the machine.`);
|
|
14701
|
+
console.log(`[sparkecoder] For tunnels/reverse proxies (Modal/Fly/Docker), set --host 0.0.0.0 or SPARKECODER_API_HOST=0.0.0.0.`);
|
|
14702
|
+
}
|
|
14647
14703
|
serverInstance = serve({
|
|
14648
14704
|
fetch: app.fetch,
|
|
14649
14705
|
port,
|
|
14650
14706
|
hostname: host
|
|
14707
|
+
}, (info) => {
|
|
14708
|
+
const actual = `${info.address}:${info.port}`;
|
|
14709
|
+
const requested = `${host}:${port}`;
|
|
14710
|
+
if (info.address === "127.0.0.1" && host !== "127.0.0.1" && host !== "localhost") {
|
|
14711
|
+
console.warn(`[sparkecoder] \u2717 API listener bound to ${actual} but ${requested} was requested. External requests will be refused.`);
|
|
14712
|
+
} else {
|
|
14713
|
+
console.log(`[sparkecoder] \u2713 API listening on ${actual}`);
|
|
14714
|
+
}
|
|
14651
14715
|
});
|
|
14652
14716
|
let webPort;
|
|
14653
14717
|
let webStarted;
|