humanish 0.85.0 → 0.86.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.
@@ -0,0 +1,12 @@
1
+ import type { RunParticipantAssignment } from "./run.js";
2
+ /** Project only authored participant-facing fields. Never pass runtime-composed instructions:
3
+ * they can contain inbox URLs or multiplayer grants. Pick fields explicitly so a task's hidden
4
+ * success criteria cannot cross this evidence boundary, even from an untyped library caller. */
5
+ export declare function participantAssignment(assignment: {
6
+ mission: string;
7
+ focus?: string;
8
+ tasks?: readonly {
9
+ id: string;
10
+ goal: string;
11
+ }[];
12
+ }, scrubKnownValues?: (text: string) => string): RunParticipantAssignment;
@@ -0,0 +1,15 @@
1
+ import { redactText } from "./redaction.js";
2
+ /** Project only authored participant-facing fields. Never pass runtime-composed instructions:
3
+ * they can contain inbox URLs or multiplayer grants. Pick fields explicitly so a task's hidden
4
+ * success criteria cannot cross this evidence boundary, even from an untyped library caller. */
5
+ export function participantAssignment(assignment, scrubKnownValues = (text) => text) {
6
+ const sanitize = (text) => redactText(scrubKnownValues(text));
7
+ return {
8
+ mission: sanitize(assignment.mission),
9
+ ...(assignment.focus === undefined ? {} : { focus: sanitize(assignment.focus) }),
10
+ ...(assignment.tasks === undefined ? {} : {
11
+ tasks: assignment.tasks.map(({ id, goal }) => ({ id: sanitize(id), goal: sanitize(goal) }))
12
+ })
13
+ };
14
+ }
15
+ //# sourceMappingURL=participant-assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"participant-assignment.js","sourceRoot":"","sources":["../src/participant-assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C;;gGAEgG;AAChG,MAAM,UAAU,qBAAqB,CACnC,UAAgG,EAChG,mBAA6C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;IAE3D,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QACrC,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC5F,CAAC;KACH,CAAC;AACJ,CAAC"}
package/dist/run.d.ts CHANGED
@@ -334,6 +334,15 @@ export interface RunDesktopGeometry {
334
334
  /** Public-safe geometry measurement/fill warnings retained with the stream evidence. */
335
335
  warnings?: string[];
336
336
  }
337
+ /** The original participant-facing assignment, before runtime access/coordination details. */
338
+ export interface RunParticipantAssignment {
339
+ mission: string;
340
+ focus?: string;
341
+ tasks?: Array<{
342
+ id: string;
343
+ goal: string;
344
+ }>;
345
+ }
337
346
  export interface RunStream {
338
347
  id: string;
339
348
  simId: string;
@@ -345,6 +354,9 @@ export interface RunStream {
345
354
  surface?: string;
346
355
  /** Adapter-owned scenario/case grouping label. */
347
356
  caseGroup?: string;
357
+ /** Authored/default mission and lane focus, redacted before persistence. Missing on older
358
+ * bundles and uninstrumented routes; never reconstructed from study context or narration. */
359
+ assignment?: RunParticipantAssignment;
348
360
  kind: RunStreamKind;
349
361
  label: string;
350
362
  status: RunSimulationStatus;
package/dist/run.js CHANGED
@@ -5336,12 +5336,23 @@ function isRunStream(value) {
5336
5336
  && isRunSimulationStatus(value.status)
5337
5337
  && (value.transport === "snapshot" || value.transport === "polling" || value.transport === "sse" || value.transport === "pty" || value.transport === "app-server")
5338
5338
  && typeof value.updatedAt === "string"
5339
+ && (value.assignment === undefined || isRunParticipantAssignment(value.assignment))
5339
5340
  && (value.viewport === undefined || isRunViewport(value.viewport))
5340
5341
  && (value.desktopGeometry === undefined || isRunDesktopGeometry(value.desktopGeometry))
5341
5342
  && hasConsistentStreamGeometry(value)
5342
5343
  && Array.isArray(value.artifacts)
5343
5344
  && value.artifacts.every(isRunStreamArtifact);
5344
5345
  }
5346
+ function isRunParticipantAssignment(value) {
5347
+ return isRecord(value)
5348
+ && Object.keys(value).every((key) => key === "mission" || key === "focus" || key === "tasks")
5349
+ && typeof value.mission === "string"
5350
+ && (value.focus === undefined || typeof value.focus === "string")
5351
+ && (value.tasks === undefined || (Array.isArray(value.tasks) && value.tasks.every((task) => isRecord(task)
5352
+ && Object.keys(task).every((key) => key === "id" || key === "goal")
5353
+ && typeof task.id === "string"
5354
+ && typeof task.goal === "string")));
5355
+ }
5345
5356
  function isRunViewport(value) {
5346
5357
  return isRecord(value)
5347
5358
  && isPositiveFiniteNumber(value.width)