Registration of job #188207 read at #5065796
E·19e216717b
This observation identifies the downloaded artifact by SHA-256. Cross-job family counts are not computed here.
Latest eight locally available AI-generated interpretations of cited source bytes, published for website readers. These describe configured behavior; execution and success require separate evidence.
No saved agent code summary is available for these artifact bytes yet.
{
"cid_verified": false,
"downloaded_bytes": 474665,
"downloaded_sha256": "cfe49b66de4d39a1cfdbe07c7a9ac1c9a554700700af8f455b27a2baa51507e9",
"failures": [],
"gateway_index": 0,
"inspection_error": null,
"retrieved_at_ms": 1792941989666,
"state": "retrieved",
"trust": "trusted gateway; UnixFS root not independently verified"
}Registration of job #188207 read at #5065796
E·19e216717b
1741531 bytes · SHA-256 e781cfe7c0df9d37837dbd450743ff9b0f64019ede5c87f9ff5dbeec30efaaae
// This file is compiled to devtools-snippet.js and injected at the beginning
// of user scripts when enableDevtools is true. It overrides console methods to
// forward logs to the Acurast DevTools API.
//
// Placeholder https://api.devtools.acurast.com is replaced at injection time.
;
(() => {
const DEVTOOLS_API_URL = 'https://api.devtools.acurast.com';
const originalConsole = {
log: console.log,
warn: console.warn,
error: console.error,
info: console.info,
debug: console.debug,
};
// --- Auth: obtain a Bearer token from the devtools API ---
let apiKey = null;
const pendingLogs = []; // buffered payloads while awaiting auth
const toHex = (str) => {
let hex = '';
for (let i = 0; i < str.length; i++) {
hex += str.charCodeAt(i).toString(16).padStart(2, '0');
}
return hex;
};
const sendBuffered = () => {
for (const body of pendingLogs.splice(0)) {
httpPOST(`${DEVTOOLS_API_URL}/v1/logs`, body, { 'Content-Type': 'application/json', Authorization: 'Bearer ' + apiKey }, () => { }, (error) => {
originalConsole.error('[devtools] buffered log post failed:', error);
});
}
};
try {
// The full "origin:owner:number" deployment id. The API needs the owner to
// find the job on chain: job storage is keyed by (origin, number) under a
// one-way hasher, so a bare number cannot be resolved there.
const rawId = _STD_.job.getId();
const jobNumber = String(rawId.id);
const origin = rawId.origin;
const jobId = origin && origin.kind && origin.source
? origin.kind + ':' + origin.source + ':' + jobNumber
: jobNumber;
const processorAddress = _STD_.device.getAddress();
const pubKeyHex = _STD_.job.getPublicKeys().ed25519;
const timestamp = String(Math.floor(Date.now() / 1000));
// Bound to the deployment so a captured signature cannot be reused against
// another job.
const message = pubKeyHex + ':' + jobId + ':' + timestamp;
const messageHex = toHex(message);
const signatureHex = _STD_.signers.ed25519.sign(messageHex);
httpPOST(`${DEVTOOLS_API_URL}/v1/auth/api-key`, JSON.stringify({ jobId, processorAddress }), {
'Content-Type': 'application/json',
'X-Signature': signatureHex,
'X-PublicKey': pubKeyHex,
'X-Timestamp': timestamp,
}, (response, _certificate) => {
try {
const parsed = JSON.parse(response);
apiKey = parsed.apiKey;
sendBuffered();
}
catch (_e) {
originalConsole.error('[devtools] failed to parse auth response:', response);
}
}, (error) => {
originalConsole.error('[devtools] auth failed:', error);
});
}
catch (e) {
originalConsole.error('[devtools] auth setup failed:', e?.message ?? String(e));
}
// --- Rate limiting ---
const RATE_LIMIT_MAX = 20;
const RATE_LIMIT_WINDOW_MS = 10000;
let rateBucketStart = Date.now();
let rateBucketCount = 0;
let dropped = 0;
const sendLog = (level, args) => {
const now = Date.now();
if (now - rateBucketStart >= RATE_LIMIT_WINDOW_MS) {
if (dropped > 0) {
enqueue([
{
type: 'warn',
data: `[devtools] rate limit ended: ${dropped} log(s) were dropped`,
timestamp: now,
},
]);
}
rateBucketStart = now;
rateBucketCount = 0;
dropped = 0;
}
if (rateBucketCount >= RATE_LIMIT_MAX) {
dropped++;
return;
}
rateBucketCount++;
try {
const data = args.length === 1 ? args[0] : args;
let serializable;
try {
JSON.stringify(data);
serializable = data;
}
catch {
serializable = String(data);
}
enqueue([{ type: level, data: serializable, timestamp: now }]);
}
catch (_e) {
// Silently ignore serialization errors to avoid breaking user scripts
}
};
const enqueue = (entries) => {
const body = JSON.stringify(entries);
if (apiKey) {
httpPOST(`${DEVTOOLS_API_URL}/v1/logs`, body, { 'Content-Type': 'application/json', Authorization: 'Bearer ' + apiKey }, () => { }, (error) => {
originalConsole.error('[devtools] log post failed:', error);
});
}
else {
pendingLogs.push(body);
}
};
// --- File upload via /v1/files ---
const uploadFile = (filename, content, mimeType, onSuccess, onError) => {
if (!apiKey) {
onError('[devtools] file upload failed: not authenticated yet');
return;
}
// The processor's httpPOST JSON-parses the body regardless of Content-Type,
// so we cannot send multipart/form-data through it. Use fetch + FormData
// instead — fetch sets the Content-Type header (with boundary) automatically.
const formData = new FormData();
formData.append('file', new Blob([content], { type: mimeType }), filename);
fetch(`${DEVTOOLS_API_URL}/v1/files`, {
method: 'POST',
headers: { Authorization: 'Bearer ' + apiKey },
body: formData,
})
.then((res) => res.text().then((text) => ({ ok: res.ok, status: res.status, text })))
.then(({ ok, status, text }) => {
if (!ok) {
onError('[devtools] file upload failed: HTTP ' + status + ' ' + text);
return;
}
try {
onSuccess(JSON.parse(text));
}
catch (_e) {
onError('[devtools] failed to parse upload response: ' + text);
}
})
.catch((err) => {
onError('[devtools] file upload failed: ' + (err?.message ?? String(err)));
});
};
globalThis._DEVTOOLS_ = { uploadFile };
for (const level of Object.keys(originalConsole)) {
;
console[level] = (...args) => {
originalConsole[level](...args);
sendLog(level, args);
};
}
})();
const __import_meta_url=require('url').pathToFileURL(__filename).href;
"use strict";var qj=Object.create;var fE=Object.defineProperty;var $j=Object.getOwnPropertyDescriptor;var zj=Object.getOwnPropertyNames;var jj=Object.getPrototypeOf,Vj=Object.prototype.hasOwnProperty;var ae=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Pe=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}},Xb=(e,t)=>{for(var n in t)fE(e,n,{get:t[n],enumerable:!0})},Gj=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of zj(t))!Vj.call(e,i)&&i!==n&&fE(e,i,{get:()=>t[i],enumerable:!(r=$j(t,i))||r.enumerable});return e};var Nh=(e,t,n)=>(n=e!=null?qj(jj(e)):{},Gj(t||!e||!e.__esModule?fE(n,"default",{value:e,enumerable:!0}):n,e));var p3,f3=ae(()=>{p3="1.2.3"});var qn,up=ae(()=>{f3();qn=class e extends Error{constructor(t,n={}){let r=n.cause instanceof e?n.cause.details:n.cause?.message?n.cause.message:n.details,i=n.cause instanceof e&&n.cause.docsPath||n.docsPath,o=[t||"An error occurred.","",...n.metaMessages?[...n.metaMessages,""]:[],...i?[`Docs: https://abitype.dev${i}`]:[],...r?[`Details: ${r}`]:[],`Version: abitype@${p3}`].join(`
`);super(o),Object.defineProperty(this,"details",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docsPath",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"metaMessages",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shortMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProper
Preview truncated.
77 bytes · SHA-256 484844f77c6a22d7b0462d221d54d73f1c7e25cab3c734a4ae3b8d622d3f8580
Preview truncated.
Linked finalized registration supplies this script URI and block. Reported executions require separate historical observations.
Available on peer-e12710.
Last successful database sync: 25 Oct 17:41 UTC.
A sync timestamp does not confirm remote copies of this object.