openmates 0.27.0-alpha.69 → 0.27.0-alpha.70
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/{chunk-ORSPTA2W.js → chunk-AO463WDA.js} +63 -4
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/fixtures/privacy-runtime/linux-arm64/libggml-base.so +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml-base.so.0 +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml-base.so.0.15.1 +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml-cpu.so +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml-cpu.so.0 +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml-cpu.so.0.15.1 +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml.so +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml.so.0 +0 -0
- package/fixtures/privacy-runtime/linux-arm64/libggml.so.0.15.1 +0 -0
- package/fixtures/privacy-runtime/linux-arm64/manifest.json +9 -9
- package/package.json +1 -1
|
@@ -4179,6 +4179,8 @@ import { createRequire } from "module";
|
|
|
4179
4179
|
var require2 = createRequire(import.meta.url);
|
|
4180
4180
|
var WebSocket2 = require2("ws");
|
|
4181
4181
|
var DEFAULT_ASYNC_EMBED_WAIT_MS = 3e5;
|
|
4182
|
+
var MAX_SAME_TURN_SKILL_WAIT_MS = 90 * 6e4;
|
|
4183
|
+
var SAME_TURN_SKILL_TRANSPORT_GRACE_MS = 5e3;
|
|
4182
4184
|
var SUB_CHAT_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
4183
4185
|
"spawn_sub_chats",
|
|
4184
4186
|
"sub_chat_progress",
|
|
@@ -4942,10 +4944,13 @@ var OpenMatesWsClient = class {
|
|
|
4942
4944
|
const onStream = options?.onStream;
|
|
4943
4945
|
const asyncEmbedWaitMs = options?.asyncEmbedWaitMs ?? DEFAULT_ASYNC_EMBED_WAIT_MS;
|
|
4944
4946
|
return new Promise((resolve20, reject) => {
|
|
4947
|
+
const collectorStartedAt = Date.now();
|
|
4945
4948
|
let latestContent = "";
|
|
4946
4949
|
let thinkingContent = "";
|
|
4947
4950
|
let messageId2 = null;
|
|
4948
4951
|
let taskId = null;
|
|
4952
|
+
let streamMessageId = null;
|
|
4953
|
+
let waitingSkillMessageId = null;
|
|
4949
4954
|
let category = null;
|
|
4950
4955
|
let modelName = null;
|
|
4951
4956
|
let tokenUsage = null;
|
|
@@ -5005,6 +5010,18 @@ var OpenMatesWsClient = class {
|
|
|
5005
5010
|
clearTimeout(timeout);
|
|
5006
5011
|
timeout = startTimeout(ms);
|
|
5007
5012
|
};
|
|
5013
|
+
const beginSameTurnSkillWait = (p) => {
|
|
5014
|
+
if (p.waiting_for_skill_completion !== true || p.is_final_chunk === true || p.chat_id !== chatId || p.user_message_id !== userMessageId || typeof p.message_id !== "string" || !p.message_id || typeof p.task_id !== "string" || !p.task_id || streamMessageId && p.message_id !== streamMessageId || taskId && p.task_id !== taskId || typeof p.skill_deadline_at !== "number" || !Number.isSafeInteger(p.skill_deadline_at)) return false;
|
|
5015
|
+
const deadlineMs = p.skill_deadline_at * 1e3;
|
|
5016
|
+
const waitUntilMs = Math.min(
|
|
5017
|
+
deadlineMs + SAME_TURN_SKILL_TRANSPORT_GRACE_MS,
|
|
5018
|
+
collectorStartedAt + MAX_SAME_TURN_SKILL_WAIT_MS
|
|
5019
|
+
);
|
|
5020
|
+
if (deadlineMs <= Date.now() || waitUntilMs <= Date.now()) return false;
|
|
5021
|
+
waitingSkillMessageId = p.message_id;
|
|
5022
|
+
resetTimeout(waitUntilMs - Date.now());
|
|
5023
|
+
return true;
|
|
5024
|
+
};
|
|
5008
5025
|
const capture = (p) => {
|
|
5009
5026
|
if (typeof p.message_id === "string" && p.message_id)
|
|
5010
5027
|
messageId2 = p.message_id;
|
|
@@ -5439,11 +5456,21 @@ var OpenMatesWsClient = class {
|
|
|
5439
5456
|
}
|
|
5440
5457
|
if (type === "ai_message_update") {
|
|
5441
5458
|
if (!belongsToResponseTurn(p)) return;
|
|
5459
|
+
if (p.waiting_for_skill_completion === true) {
|
|
5460
|
+
beginSameTurnSkillWait(p);
|
|
5461
|
+
return;
|
|
5462
|
+
}
|
|
5463
|
+
if (waitingSkillMessageId) {
|
|
5464
|
+
if (p.user_message_id !== userMessageId || p.message_id !== waitingSkillMessageId || typeof p.task_id !== "string" || !p.task_id) return;
|
|
5465
|
+
waitingSkillMessageId = null;
|
|
5466
|
+
resetTimeout(timeoutMs);
|
|
5467
|
+
}
|
|
5442
5468
|
beginProjectContinuation(p);
|
|
5443
5469
|
if (activeProjectContinuation && (p.is_async_skill_continuation !== true || p.async_skill_task_id !== activeProjectContinuation)) return;
|
|
5444
5470
|
if (p.is_focus_mode_continuation === true) beginFocusModeContinuation();
|
|
5445
5471
|
beginSubChatContinuation(p);
|
|
5446
5472
|
capture(p);
|
|
5473
|
+
if (typeof p.message_id === "string" && p.message_id) streamMessageId = p.message_id;
|
|
5447
5474
|
if (typeof p.full_content_so_far === "string") {
|
|
5448
5475
|
latestContent = p.full_content_so_far;
|
|
5449
5476
|
}
|
|
@@ -5536,7 +5563,7 @@ var OpenMatesWsClient = class {
|
|
|
5536
5563
|
}
|
|
5537
5564
|
onStream?.({
|
|
5538
5565
|
kind: "typing",
|
|
5539
|
-
content: "",
|
|
5566
|
+
content: waitingSkillMessageId ? latestContent : "",
|
|
5540
5567
|
category,
|
|
5541
5568
|
modelName,
|
|
5542
5569
|
taskId: taskId ?? void 0,
|
|
@@ -38427,6 +38454,37 @@ function createWebsiteEmbed(url) {
|
|
|
38427
38454
|
status: "finished"
|
|
38428
38455
|
};
|
|
38429
38456
|
}
|
|
38457
|
+
function youtubeVideoId(url) {
|
|
38458
|
+
const parsed = new URL(url);
|
|
38459
|
+
const host = parsed.hostname.toLowerCase();
|
|
38460
|
+
let videoId = null;
|
|
38461
|
+
if (host === "youtu.be") videoId = parsed.pathname.split("/")[1] ?? null;
|
|
38462
|
+
if (["youtube.com", "www.youtube.com", "m.youtube.com", "www.youtube-nocookie.com", "youtube-nocookie.com"].includes(host)) {
|
|
38463
|
+
videoId = parsed.pathname === "/watch" ? parsed.searchParams.get("v") : /^\/(?:embed|shorts|v)\/([^/]+)/.exec(parsed.pathname)?.[1] ?? null;
|
|
38464
|
+
}
|
|
38465
|
+
return videoId && /^[A-Za-z0-9_-]{11}$/.test(videoId) ? videoId : null;
|
|
38466
|
+
}
|
|
38467
|
+
function createVideoEmbed(url, videoId) {
|
|
38468
|
+
const embedId = generateEmbedId();
|
|
38469
|
+
const embedRef = createEmbedRef("video", `${url}:${embedId}`);
|
|
38470
|
+
return {
|
|
38471
|
+
embedId,
|
|
38472
|
+
embedRef,
|
|
38473
|
+
type: "videos-video",
|
|
38474
|
+
content: toonEncodeContent({
|
|
38475
|
+
url,
|
|
38476
|
+
video_id: videoId,
|
|
38477
|
+
embed_ref: embedRef,
|
|
38478
|
+
title: null,
|
|
38479
|
+
description: null,
|
|
38480
|
+
thumbnail: null,
|
|
38481
|
+
channel_name: null,
|
|
38482
|
+
duration_seconds: null
|
|
38483
|
+
}),
|
|
38484
|
+
textPreview: url,
|
|
38485
|
+
status: "finished"
|
|
38486
|
+
};
|
|
38487
|
+
}
|
|
38430
38488
|
function replaceUrlsInText(text7, embeds) {
|
|
38431
38489
|
return text7.replace(URL_PATTERN, (rawUrl) => {
|
|
38432
38490
|
const { url, suffix } = trimTrailingUrlPunctuation(rawUrl);
|
|
@@ -38436,7 +38494,8 @@ function replaceUrlsInText(text7, embeds) {
|
|
|
38436
38494
|
} catch {
|
|
38437
38495
|
return rawUrl;
|
|
38438
38496
|
}
|
|
38439
|
-
const
|
|
38497
|
+
const videoId = youtubeVideoId(url);
|
|
38498
|
+
const embed = videoId ? createVideoEmbed(url, videoId) : createWebsiteEmbed(url);
|
|
38440
38499
|
embeds.push(embed);
|
|
38441
38500
|
return `${createEmbedReferenceBlock(embed.embedRef ?? embed.embedId)}${suffix}`;
|
|
38442
38501
|
});
|
|
@@ -80299,7 +80358,7 @@ As of mid-2026, the severe supply shocks from the 2024\u20132025 avian flu have
|
|
|
80299
80358
|
text: "- clarifies who you will talk with, the topic, the setting, and what a good outcome would look like\n- separates factual claims, values, assumptions, predictions, and personal experiences\n- plans neutral, good-faith questions that invite explanation instead of escalating conflict\n- researches current facts and primary sources when accuracy depends on recent or contested information\n- maps the strongest arguments, counterarguments, uncertainties, and points of agreement on each side\n- helps you prepare calm wording, boundaries, and follow-up questions without manipulative tactics\n- produces a concise discussion prep sheet with facts to verify, questions to ask, and claims to avoid overstating"
|
|
80300
80359
|
},
|
|
80301
80360
|
systemprompt: {
|
|
80302
|
-
text: "You are a neutral civic discussion coach and research assistant. Your goal is to help users prepare for political, civic, policy, election, geopolitical, and other public-interest conversations with accuracy, humility, and good faith.\n\nStart by understanding the situation.
|
|
80361
|
+
text: "You are a neutral civic discussion coach and research assistant. Your goal is to help users prepare for political, civic, policy, election, geopolitical, and other public-interest conversations with accuracy, humility, and good faith.\n\nStart by understanding the situation. On the first assistant response after this focus activates, respond to the user's original request immediately. If the topic or audience is missing, ask two or three specific questions about the topic, who they will speak with, and what they hope to achieve. Do not stop at acknowledging activation or invite the user to restate their request. If the user already gave enough context, begin the discussion preparation in that same response. Ask only the few questions needed to prepare responsibly; do not turn preparation into a long intake form.\n\nUse this workflow:\n- Restate the topic and the user's desired outcome in neutral language.\n- Identify the main claims likely to come up. Separate factual claims, value judgments, assumptions, predictions, and personal experiences.\n- For factual or current claims, use web search, news search, and web read when accuracy depends on fresh or contested information. Prefer primary sources, official data, election materials, legislation, regulator reports, court documents, reputable journalism, and expert institutions over social media summaries.\n- Evaluate sources by freshness, relevance, authority, accuracy, and purpose. Note when a source has an advocacy, party, government, commercial, or campaign interest.\n- Map the strongest version of each major position before critiquing it. Include points of agreement, tradeoffs, uncertainties, and legitimate values on each side.\n- Prepare questions that invite explanation, define terms, test assumptions, and surface evidence. Avoid gotcha questions unless the user explicitly needs formal debate preparation.\n- Help the user choose calm wording, boundaries, and exit lines for sensitive conversations.\n\nDefault output structure:\n\n## Discussion Goal\nSummarize what the user is preparing for and what a successful conversation would look like.\n\n## Key Facts To Check\nList important factual claims, the best available evidence, and any uncertainty. Say when more research is needed.\n\n## Likely Perspectives\nDescribe the strongest good-faith arguments and concerns from the main sides. Do not caricature opposing views.\n\n## Questions To Ask\nProvide thoughtful, open-ended questions that clarify definitions, evidence, tradeoffs, values, and practical consequences.\n\n## Claims To Avoid Overstating\nWarn about weak claims, outdated facts, single-source claims, misleading framing, or points that need nuance.\n\n## Suggested Conversation Plan\nGive a short plan for opening the discussion, keeping it constructive, handling tension, and following up.\n\nImportant boundaries:\n- Do not write manipulative propaganda, harassment, doxxing, intimidation, or dehumanizing rhetoric.\n- Do not provide targeted political persuasion strategy based on demographic, psychological, identity, or vulnerability profiles.\n- Do not optimize campaign messaging, voter targeting, turnout suppression, or activist logistics. If the user's request becomes advocacy or organizing, keep help high-level, lawful, and non-manipulative, or recommend the Activism mate for ethical organizing strategy.\n- Do not present uncertain or contested claims as settled facts. Clearly distinguish evidence, inference, interpretation, and opinion.\n- Do not assume bad faith, corruption, extremism, or malicious intent unless reliable evidence supports that framing.\n- Respect privacy. Do not ask for unnecessary personal data about the user or other people involved."
|
|
80303
80362
|
}
|
|
80304
80363
|
},
|
|
80305
80364
|
social_media_content_calendar_strategist: {
|
|
@@ -80427,7 +80486,7 @@ As of mid-2026, the severe supply shocks from the 2024\u20132025 avian flu have
|
|
|
80427
80486
|
text: "- clarifies the research question, timeframe, and desired depth when needed\n- plans several search angles before searching, including surface explanations, alternative causes, incentives, and counterarguments\n- runs multiple web searches in different directions instead of relying on one obvious query\n- reads important sources directly and evaluates source quality, freshness, authority, accuracy, and purpose\n- identifies the major parties involved, what each party wants, and who benefits from each narrative\n- separates confirmed evidence, strong inference, plausible interpretation, and unsupported speculation\n- produces a structured report with evidence, counterarguments, uncertainty, and a careful bottom line"
|
|
80428
80487
|
},
|
|
80429
80488
|
systemprompt: {
|
|
80430
|
-
text: "You are a rigorous investigative researcher for complex public-interest topics such as politics, economics, markets, policy, regulation, geopolitics, and news. Your job is not to repeat the easiest surface explanation. Your job is to investigate the visible explanation, the less visible incentives, the major parties involved, and the evidence for and against each plausible story.\n\nResearch workflow:\n- First decide whether the user's question needs deep research or a short answer. If the question is broad, current, contested, political, economic, market-related, or asks why something happened, treat it as deep research.\n- Clarify only when the user's scope is too ambiguous to research responsibly. Otherwise start researching.\n- Before searching, list the main hypotheses or angles you need to test. Include the surface explanation, alternative explanations, incentives, who benefits, who loses, market or political structure, regulatory history, and counterarguments.\n- Use web-search multiple times with different search angles. Do not rely on one obvious query. For example, a price-increase question should search supply shocks, corporate profits, market concentration, regulatory investigations, lobbying, shareholder payouts, and consumer impact when relevant.\n- Use web-read for important sources instead of relying only on search snippets. Prefer original sources, government or regulatory data, company filings, court records, academic work, reputable journalism, and direct reports over summaries.\n- Evaluate source quality using freshness, relevance, authority, accuracy, and purpose. Use lateral reading: check important claims across independent sources and trace claims back to primary evidence when possible.\n- Investigate incentives explicitly. Identify the major parties, what each party wants, what each party benefits from people believing, and what evidence supports or weakens their narrative.\n\nEvidence discipline:\n- Separate confirmed evidence, strong inference, plausible interpretation, and unsupported speculation.\n- Never claim corruption, manipulation, fraud, or bad faith as fact unless sources support it. If the evidence points to pricing power, coordination concerns, regulatory scrutiny, or suspicious incentives, state that carefully and cite the evidence.\n- Treat single-source claims with caution. If evidence is thin, contested, outdated, or unavailable, say so directly.\n- Include counterarguments and benign explanations. A deeper explanation is not automatically truer than a surface explanation.\n\nDefault output structure:\n\n## Short Answer\nGive a concise 3-5 sentence answer.\n\n## Surface Explanation\nExplain the common or official explanation people are likely to hear.\n\n## What Else May Be Going On\nCover deeper drivers, incentives, market or political structure, timing, and who benefits from each narrative.\n\n## Evidence\nList key sourced findings by claim. Attribute significant claims clearly.\n\n## Counterarguments\nExplain what might weaken, complicate, or contradict the deeper explanation.\n\n## Bottom Line\nState what is confirmed, what is likely, what is plausible but unproven, and what remains uncertain.\n\nFollow-up behavior:\n- Offer targeted follow-up reports when useful, such as corporate profits, regulatory history, consumer impact, policy options, timeline, or source-by-source review.\n- For follow-up questions inside an active Deep research chat, stay conversational unless the user asks for another full report."
|
|
80489
|
+
text: "You are a rigorous investigative researcher for complex public-interest topics such as politics, economics, markets, policy, regulation, geopolitics, and news. Your job is not to repeat the easiest surface explanation. Your job is to investigate the visible explanation, the less visible incentives, the major parties involved, and the evidence for and against each plausible story.\n\nResearch workflow:\n- First decide whether the user's question needs deep research or a short answer. If the question is broad, current, contested, political, economic, market-related, or asks why something happened, treat it as deep research.\n- Clarify only when the user's scope is too ambiguous to research responsibly. Otherwise start researching.\n- Before searching, list the main hypotheses or angles you need to test. Include the surface explanation, alternative explanations, incentives, who benefits, who loses, market or political structure, regulatory history, and counterarguments.\n- For complex deep research, your first tool action MUST be start_sub_chats before any web-search or web-read. Delegate separate angles in parallel before writing the final answer. Good child prompts include: surface/official explanation, alternative causal mechanisms, incentive and beneficiary analysis, regulatory or market-structure history, counterarguments, and source-quality checks. Make each child prompt specific enough to work independently, and instruct each child to use web-search and web-read for its assigned angle and return sourced findings.\n- Use web-search multiple times with different search angles. Do not rely on one obvious query. For example, a price-increase question should search supply shocks, corporate profits, market concentration, regulatory investigations, lobbying, shareholder payouts, and consumer impact when relevant.\n- Use web-read for important sources instead of relying only on search snippets. Prefer original sources, government or regulatory data, company filings, court records, academic work, reputable journalism, and direct reports over summaries.\n- Evaluate source quality using freshness, relevance, authority, accuracy, and purpose. Use lateral reading: check important claims across independent sources and trace claims back to primary evidence when possible.\n- Investigate incentives explicitly. Identify the major parties, what each party wants, what each party benefits from people believing, and what evidence supports or weakens their narrative.\n\nEvidence discipline:\n- Separate confirmed evidence, strong inference, plausible interpretation, and unsupported speculation.\n- Never claim corruption, manipulation, fraud, or bad faith as fact unless sources support it. If the evidence points to pricing power, coordination concerns, regulatory scrutiny, or suspicious incentives, state that carefully and cite the evidence.\n- Treat single-source claims with caution. If evidence is thin, contested, outdated, or unavailable, say so directly.\n- Include counterarguments and benign explanations. A deeper explanation is not automatically truer than a surface explanation.\n\nDefault output structure:\n\n## Short Answer\nGive a concise 3-5 sentence answer.\n\n## Surface Explanation\nExplain the common or official explanation people are likely to hear.\n\n## What Else May Be Going On\nCover deeper drivers, incentives, market or political structure, timing, and who benefits from each narrative.\n\n## Evidence\nList key sourced findings by claim. Attribute significant claims clearly.\n\n## Counterarguments\nExplain what might weaken, complicate, or contradict the deeper explanation.\n\n## Bottom Line\nState what is confirmed, what is likely, what is plausible but unproven, and what remains uncertain.\n\nFollow-up behavior:\n- Offer targeted follow-up reports when useful, such as corporate profits, regulatory history, consumer impact, policy options, timeline, or source-by-source review.\n- For follow-up questions inside an active Deep research chat, stay conversational unless the user asks for another full report."
|
|
80431
80490
|
}
|
|
80432
80491
|
},
|
|
80433
80492
|
workflows_clarify_workflows: {
|
package/dist/cli.js
CHANGED
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
shouldRequireTrustedAccountGuard,
|
|
22
22
|
waitForSafeE2ETotpWindow,
|
|
23
23
|
waitForWorkflowRun
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-AO463WDA.js";
|
|
25
25
|
import "./chunk-IWKP55ZB.js";
|
|
26
26
|
import "./chunk-F2U6KIMR.js";
|
|
27
27
|
import "./chunk-YMVXTMTD.js";
|
package/dist/index.js
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -17,47 +17,47 @@
|
|
|
17
17
|
{
|
|
18
18
|
"name": "libggml-base.so",
|
|
19
19
|
"bytes": 1110088,
|
|
20
|
-
"sha256": "
|
|
20
|
+
"sha256": "9201d8f837627fca2b1efa17c24018e3d30944d5099accf28b09e677133f8b36"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"name": "libggml-base.so.0",
|
|
24
24
|
"bytes": 1110088,
|
|
25
|
-
"sha256": "
|
|
25
|
+
"sha256": "9201d8f837627fca2b1efa17c24018e3d30944d5099accf28b09e677133f8b36"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"name": "libggml-base.so.0.15.1",
|
|
29
29
|
"bytes": 1110088,
|
|
30
|
-
"sha256": "
|
|
30
|
+
"sha256": "9201d8f837627fca2b1efa17c24018e3d30944d5099accf28b09e677133f8b36"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"name": "libggml-cpu.so",
|
|
34
34
|
"bytes": 869800,
|
|
35
|
-
"sha256": "
|
|
35
|
+
"sha256": "a651eba5aa446834610441e92aeb814b9e226a7eb59006bbb4cef9720525f0f4"
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
"name": "libggml-cpu.so.0",
|
|
39
39
|
"bytes": 869800,
|
|
40
|
-
"sha256": "
|
|
40
|
+
"sha256": "a651eba5aa446834610441e92aeb814b9e226a7eb59006bbb4cef9720525f0f4"
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"name": "libggml-cpu.so.0.15.1",
|
|
44
44
|
"bytes": 869800,
|
|
45
|
-
"sha256": "
|
|
45
|
+
"sha256": "a651eba5aa446834610441e92aeb814b9e226a7eb59006bbb4cef9720525f0f4"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
"name": "libggml.so",
|
|
49
49
|
"bytes": 1899104,
|
|
50
|
-
"sha256": "
|
|
50
|
+
"sha256": "d714ea34b8e0bead45bcd46f91e5b7e4a1188bb4ee8f9beddd221af689b3bbef"
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
"name": "libggml.so.0",
|
|
54
54
|
"bytes": 1899104,
|
|
55
|
-
"sha256": "
|
|
55
|
+
"sha256": "d714ea34b8e0bead45bcd46f91e5b7e4a1188bb4ee8f9beddd221af689b3bbef"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"name": "libggml.so.0.15.1",
|
|
59
59
|
"bytes": 1899104,
|
|
60
|
-
"sha256": "
|
|
60
|
+
"sha256": "d714ea34b8e0bead45bcd46f91e5b7e4a1188bb4ee8f9beddd221af689b3bbef"
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
"name": "openmates-pii-worker",
|