stillmade-sdk 0.1.17 → 0.1.18

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stillmade-sdk",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "description": "StillMade Block SDK, CLI and examples",
5
5
  "license": "PolyForm-Shield-1.0.0",
6
6
  "type": "module",
@@ -7,7 +7,7 @@ export const flowHistorySummary=(entry,placementId)=>({...entry,...projectFlowRe
7
7
  const safePreview=value=>value?redactProjectFlowMediaAddresses(value):null;
8
8
  export const flowInputSummary=input=>({key:input.key,label:input.label,state:input.state,materialized:input.materialized,source:input.source,sourcePlacementId:input.sourcePlacementId,sourceObservation:input.sourceObservation||null,explicit:input.explicit,reason:input.reason,selectionReason:input.selectionReason,valuePolicy:input.valuePolicy,pinned:input.pinned===true,pinRunId:input.pinRunId||null,canPinVersion:input.canPinVersion===true,pinChoices:input.pinChoices?.map(choice=>({runId:choice.runId,resultId:choice.pinSource.resultId||null,label:choice.label,preview:safePreview(choice.preview)}))||[],preview:safePreview(input.preview),candidates:input.candidates.slice(0,3),candidateCount:input.candidateCount,candidateRevision:input.candidateRevision,candidatesOmitted:(input.candidatesOmitted||0)+Math.max(0,input.candidates.length-3)});
9
9
  export const flowOutputSummary=output=>({key:output.key,state:output.state,observation:output.observation||null,availabilityReason:output.availabilityReason||null,preview:safePreview(output.preview)});
10
- export const flowPlacementSummary=item=>({id:item.id,name:item.label,state:item.state,condition:item.condition||null,retainedLoopRuns:safeWorkflowLoopSummaries(item.retainedLoopRuns),localMediaInputs:item.localMediaInputs||[],inputs:item.inputs.slice(0,8).map(flowInputSummary),inputsTotal:item.inputs.length,inputsOffset:0,inputsLimit:8,inputsNextOffset:item.inputs.length>8?8:null,outputs:item.outputs.slice(0,8).map(flowOutputSummary),outputsTotal:item.outputs.length,outputsOffset:0,outputsLimit:8,outputsNextOffset:item.outputs.length>8?8:null,unusedResults:item.unusedResults?.slice(0,3).map(candidate=>({candidateId:candidate.candidateId,kind:candidate.kind,...(candidate.kind==='loop'?{loopRunId:candidate.loopRunId,loopReceiptDigest:candidate.loopReceiptDigest,loopStartPlacementId:candidate.loopStartPlacementId,iteration:candidate.iteration,historical:true,verification:candidate.verification}:{}),...(candidate.selection?{selection:candidate.selection}:{}),runId:candidate.runId,at:candidate.at,reason:candidate.reason,outputDigest:candidate.outputDigest,inputsCount:candidate.inputsCount,outputsCount:candidate.outputsCount,applied:false}))||[],unusedResultsRevision:item.unusedResultsRevision,unusedResultsCount:item.unusedResultsCount,unusedResultsNextOffset:(item.unusedResultsCount||0)>3?3:null,usedInputs:item.usedInputs?.slice(0,8)||null,history:(item.history||[]).slice(0,3).map(entry=>flowHistorySummary(entry,item.id)),historyTotal:(item.history||[]).length,historyOffset:0,historyLimit:3,historyNextOffset:(item.history||[]).length>3?3:null,historyComplete:item.historyComplete===true&&(item.history||[]).length<=3,retainedHistoryComplete:item.historyComplete===true,activity:item.activity});
10
+ export const flowPlacementSummary=item=>({id:item.id,name:item.label,...(item.step?{step:item.step}:{}),state:item.state,condition:item.condition||null,retainedLoopRuns:safeWorkflowLoopSummaries(item.retainedLoopRuns),localMediaInputs:item.localMediaInputs||[],inputs:item.inputs.slice(0,8).map(flowInputSummary),inputsTotal:item.inputs.length,inputsOffset:0,inputsLimit:8,inputsNextOffset:item.inputs.length>8?8:null,outputs:item.outputs.slice(0,8).map(flowOutputSummary),outputsTotal:item.outputs.length,outputsOffset:0,outputsLimit:8,outputsNextOffset:item.outputs.length>8?8:null,unusedResults:item.unusedResults?.slice(0,3).map(candidate=>({candidateId:candidate.candidateId,kind:candidate.kind,...(candidate.kind==='loop'?{loopRunId:candidate.loopRunId,loopReceiptDigest:candidate.loopReceiptDigest,loopStartPlacementId:candidate.loopStartPlacementId,iteration:candidate.iteration,historical:true,verification:candidate.verification}:{}),...(candidate.selection?{selection:candidate.selection}:{}),runId:candidate.runId,at:candidate.at,reason:candidate.reason,outputDigest:candidate.outputDigest,inputsCount:candidate.inputsCount,outputsCount:candidate.outputsCount,applied:false}))||[],unusedResultsRevision:item.unusedResultsRevision,unusedResultsCount:item.unusedResultsCount,unusedResultsNextOffset:(item.unusedResultsCount||0)>3?3:null,usedInputs:item.usedInputs?.slice(0,8)||null,history:(item.history||[]).slice(0,3).map(entry=>flowHistorySummary(entry,item.id)),historyTotal:(item.history||[]).length,historyOffset:0,historyLimit:3,historyNextOffset:(item.history||[]).length>3?3:null,historyComplete:item.historyComplete===true&&(item.history||[]).length<=3,retainedHistoryComplete:item.historyComplete===true,activity:item.activity});
11
11
 
12
12
  export function readFlowAgentPage(flow,{operation,placementId,kind,offset,limit,revision},{projectId,currentRevision,focusedId}={}){
13
13
  if(revision!==currentRevision)throw new Error('The project Flow changed. Inspect Flow again before paging.');
@@ -148,6 +148,9 @@ export function inspectProjectFlow(type,canvas={nodes:[],edges:[]},{projectId=nu
148
148
  const archivedByStage=new Map();
149
149
  for(const entry of canvas.workflowArchive||[])if(entry.step?.id&&entry.node?.data?.blockLastRun){if(!archivedByStage.has(entry.step.id))archivedByStage.set(entry.step.id,[]);archivedByStage.get(entry.step.id).push(entry);}
150
150
  const manifestFor=(stage,node)=>node?.data?.blockPackage?.manifest||(packageForStage(type,stage,[...BUILTIN_BLOCKS,...catalog])?.manifest);
151
+ // The Step (job) a Block sits in, by the name the person sees (October 19, 2026: Chat read
152
+ // Block names only and told a tester her "Upload sermon" Step did not exist).
153
+ const stepOf=new Map((type.groups||[]).filter(group=>typeof group?.label==='string'&&group.label&&Array.isArray(group.stages)).flatMap(group=>group.stages.map(id=>[id,group.label])));
151
154
  const placements=audit.stages.map(row=>{
152
155
  const stage=type.stages.find(item=>item.id===row.id),node=nodes.get(stageNodeId(stage)),manifest=manifestFor(stage,node);
153
156
  const outputs=Object.entries(manifest?.outputs||{}).map(([key,port])=>{
@@ -254,7 +257,7 @@ export function inspectProjectFlow(type,canvas={nodes:[],edges:[]},{projectId=nu
254
257
  const appliedActivity=last?.manualSelection?{applied:true,at:last.at||null,runId:null,...(selectedManually?{selection:selectedManually}:{})}:last?{applied:true,at:last.at||null,runId:last.executionRunId||last.semanticRunId||last.segmentRunId||last.runId||null,skipped:last.skipped===true&&!last.failureRecovery,execution:executionEvidence(last,{conditional:!!stage.condition,outputs:node?.data?.blockOutputs||{}})}:null;
255
258
  const condition=stage.condition?{inputKey:stage.condition.input,inputLabel:manifest?.inputs?.[stage.condition.input]?.description||stage.condition.input,path:stage.condition.path.slice(0,8),operator:stage.condition.operator,outcome:last?(last.skipped===true&&!last.failureRecovery?'skipped':'ran'):'unknown'}:null;
256
259
  const latestFailure=(node?.data?.blockFailedAttempts||[]).slice(-1)[0],failureIsLatest=typeof latestFailure?.runId==='string'&&Number.isFinite(Date.parse(latestFailure.at))&&(!last?.at||latestFailure.at>last.at)&&!failureRecovered(latestFailure),failedActivity=failureIsLatest?{runId:latestFailure.runId.slice(0,160),at:latestFailure.at,code:failureCode(latestFailure),durationMs:Number.isSafeInteger(latestFailure.diagnostic?.durationMs)?Math.max(0,Math.min(86400000,latestFailure.diagnostic.durationMs)):null,...Object.fromEntries(['attempt','batchIndex','batchCount'].filter(key=>failedCounter(latestFailure[key])).map(key=>[key,latestFailure[key]]))}:null;
257
- return {id:row.id,nodeId:stageNodeId(stage),label:row.label,blockId:stage.blockId,version:stage.version,...(manifest?.permissions?.capabilities?.includes('connection.execute')?{connector:true}:{}),transformation:String(manifest?.description||'').slice(0,500),enabled:stage.enabled!==false,state:node?.data?.blockPrivacy?'restricted':active?'working':row.paused?'paused':node?.data?.blockStale||last&&last.digest!==node?.data?.blockDigest?'needs-updating':failureIsLatest?(failureCode(latestFailure)==='EXECUTION_FAILED'?'failed':'needs-recovery'):last?.skipped===true&&!last?.failureRecovery&&stage.condition?'skipped':last?'finished':row.state==='broken'||row.state==='needs-user-input'?'needs-choice':'waiting',...(condition?{condition}:{}),inputs:inputs.map(input=>({...input,valueType:manifest?.inputs?.[input.key]?.type||row.requirements.find(requirement=>requirement.key===input.key)?.requirement?.type||null})),outputs,unusedResults,unusedResultsRevision,unusedResultsCount,unusedResultsOffset,unusedResultsLimit,unusedResultsNextOffset,...(retainedPage?.candidateId?{inspectedRetainedResult}:{}),usedInputs,activity:active?{...(appliedActivity||{}),active,activeRuns,activeRunsOmitted:Math.max(0,(runsByPlacement.get(row.id)||[]).length-activeRuns.length)}:failedActivity?{...(appliedActivity||{}),failedAttempt:failedActivity}:appliedActivity,history:recentHistory,historyComplete,retainedLoopRuns:retainedWorkflowLoopSummaries(canvas,row.id)};
260
+ return {id:row.id,nodeId:stageNodeId(stage),label:row.label,...(stepOf.has(row.id)?{step:stepOf.get(row.id)}:{}),blockId:stage.blockId,version:stage.version,...(manifest?.permissions?.capabilities?.includes('connection.execute')?{connector:true}:{}),transformation:String(manifest?.description||'').slice(0,500),enabled:stage.enabled!==false,state:node?.data?.blockPrivacy?'restricted':active?'working':row.paused?'paused':node?.data?.blockStale||last&&last.digest!==node?.data?.blockDigest?'needs-updating':failureIsLatest?(failureCode(latestFailure)==='EXECUTION_FAILED'?'failed':'needs-recovery'):last?.skipped===true&&!last?.failureRecovery&&stage.condition?'skipped':last?'finished':row.state==='broken'||row.state==='needs-user-input'?'needs-choice':'waiting',...(condition?{condition}:{}),inputs:inputs.map(input=>({...input,valueType:manifest?.inputs?.[input.key]?.type||row.requirements.find(requirement=>requirement.key===input.key)?.requirement?.type||null})),outputs,unusedResults,unusedResultsRevision,unusedResultsCount,unusedResultsOffset,unusedResultsLimit,unusedResultsNextOffset,...(retainedPage?.candidateId?{inspectedRetainedResult}:{}),usedInputs,activity:active?{...(appliedActivity||{}),active,activeRuns,activeRunsOmitted:Math.max(0,(runsByPlacement.get(row.id)||[]).length-activeRuns.length)}:failedActivity?{...(appliedActivity||{}),failedAttempt:failedActivity}:appliedActivity,history:recentHistory,historyComplete,retainedLoopRuns:retainedWorkflowLoopSummaries(canvas,row.id)};
258
261
  });
259
262
  if(retainedResultPage){const placement=placements.find(item=>item.id===retainedResultPage.placementId);if(!placement||placement.unusedResultsRevision!==retainedResultPage.revision||retainedResultPage.operation==='list'&&retainedResultPage.offset>placement.unusedResultsCount||retainedResultPage.candidateId&&!placement.inspectedRetainedResult)throw new Error('This retained result list or exact candidate changed. Inspect Result again.');}
260
263
  if(receiptInputPage){const entry=placements.find(item=>item.id===receiptInputPage.placementId)?.history?.find(item=>projectFlowRunReceiptIdentity(item)===receiptInputPage.receiptId);if(!entry||entry.inputsRevision!==receiptInputPage.revision||!entry.inputs||receiptInputPage.offset>entry.inputsCount)throw new Error('This retained receipt or its captured inputs changed. Inspect the run again.');}