@harnessforce/semconv 0.0.0-bootstrap.0 → 0.1.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.
Files changed (39) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +106 -0
  3. package/dist/attributes.d.ts +23 -0
  4. package/dist/attributes.js +28 -0
  5. package/dist/attributes.js.map +1 -0
  6. package/dist/index.d.ts +182 -0
  7. package/dist/index.js +28 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/redaction.d.ts +25 -0
  10. package/dist/redaction.js +70 -0
  11. package/dist/redaction.js.map +1 -0
  12. package/dist/repository.d.ts +1 -0
  13. package/dist/repository.js +46 -0
  14. package/dist/repository.js.map +1 -0
  15. package/dist/schemas/analysis-report.d.ts +47 -0
  16. package/dist/schemas/analysis-report.js +87 -0
  17. package/dist/schemas/analysis-report.js.map +1 -0
  18. package/dist/schemas/common.d.ts +14 -0
  19. package/dist/schemas/common.js +33 -0
  20. package/dist/schemas/common.js.map +1 -0
  21. package/dist/schemas/config-snapshot.d.ts +15 -0
  22. package/dist/schemas/config-snapshot.js +36 -0
  23. package/dist/schemas/config-snapshot.js.map +1 -0
  24. package/dist/schemas/ingest-items.d.ts +36 -0
  25. package/dist/schemas/ingest-items.js +73 -0
  26. package/dist/schemas/ingest-items.js.map +1 -0
  27. package/dist/schemas/session-import.d.ts +23 -0
  28. package/dist/schemas/session-import.js +15 -0
  29. package/dist/schemas/session-import.js.map +1 -0
  30. package/dist/schemas/session-registration.d.ts +25 -0
  31. package/dist/schemas/session-registration.js +19 -0
  32. package/dist/schemas/session-registration.js.map +1 -0
  33. package/dist/schemas/session-usage-summary.d.ts +57 -0
  34. package/dist/schemas/session-usage-summary.js +32 -0
  35. package/dist/schemas/session-usage-summary.js.map +1 -0
  36. package/dist/values.d.ts +4 -0
  37. package/dist/values.js +52 -0
  38. package/dist/values.js.map +1 -0
  39. package/package.json +48 -3
@@ -0,0 +1,70 @@
1
+ // privacy-and-retention.md「Redaction」のパターンの種類。並びは当てる順序である。
2
+ export const REDACTION_KINDS = [
3
+ "private_key",
4
+ "connection_string",
5
+ "jwt",
6
+ "api_key",
7
+ "bearer_token",
8
+ "email",
9
+ "phone",
10
+ ];
11
+ const API_KEY_PATTERNS = [
12
+ // Anthropic(sk-ant-)とOpenAI(sk-、sk-proj-)
13
+ "sk-[A-Za-z0-9_-]{20,}",
14
+ "AIza[0-9A-Za-z_-]{35}",
15
+ "gh[pousr]_[A-Za-z0-9]{36,}",
16
+ "github_pat_[A-Za-z0-9_]{22,}",
17
+ "(?:AKIA|ASIA)[0-9A-Z]{16}",
18
+ // HarnessforceのIngestKey(hf_ik_)と、ApiTokenのaccess token(hf_at_)とrefresh token(hf_rt_)
19
+ "hf_(?:ik|at|rt)_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_[A-Za-z0-9_-]{43}",
20
+ ];
21
+ /**
22
+ * 正規表現の正本(privacy-and-retention.md「Redaction」)。上から順に当て、先に伏せた箇所を後の規則で
23
+ * 二重に数えない。接続文字列はemailより先、API keyはBearerより先に当てる。
24
+ * 電話番号は、UUIDと日付の区切りに一致しないよう、前後に`-`と英数字を許さない。
25
+ * 可変長の先頭を持つ規則は、直前が同じ文字種でない位置からだけ始める。途中の位置から何度も走査し直すと、
26
+ * 処理時間が長さの2乗になるためである。
27
+ * patternはglobalであり、`lastIndex`を持つ。`replace`以外(`test`、`exec`)で使う場合は写しを作る。
28
+ */
29
+ export const REDACTION_RULES = [
30
+ {
31
+ kind: "private_key",
32
+ pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----(?:(?!-----BEGIN )[\s\S])*?-----END [A-Z ]*PRIVATE KEY-----/g,
33
+ },
34
+ {
35
+ kind: "connection_string",
36
+ pattern: /(?<![a-z0-9+.-])[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:[^\s/@]+@[^\s"'<>]+/gi,
37
+ },
38
+ {
39
+ kind: "jwt",
40
+ pattern: /(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,
41
+ },
42
+ {
43
+ kind: "api_key",
44
+ pattern: new RegExp(`(?<![A-Za-z0-9])(?:${API_KEY_PATTERNS.join("|")})`, "g"),
45
+ },
46
+ { kind: "bearer_token", pattern: /\bBearer\s+[A-Za-z0-9._~+/-]{16,}=*/g },
47
+ {
48
+ kind: "email",
49
+ pattern: /(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,
50
+ },
51
+ {
52
+ kind: "phone",
53
+ pattern: /(?<![\w+])\+[1-9]\d{7,14}(?!\d)|(?<![\w-])0\d{1,4}-\d{1,4}-\d{4}(?![\w-])/g,
54
+ },
55
+ ];
56
+ /** 一致した箇所を`[REDACTED:<種類>]`に置き換える。countは置き換えた箇所の数。 */
57
+ export function redactText(text, options = {}) {
58
+ const rules = options.skipPhone
59
+ ? REDACTION_RULES.filter(({ kind }) => kind !== "phone")
60
+ : REDACTION_RULES;
61
+ return rules.reduce((current, { kind, pattern }) => {
62
+ let replaced = 0;
63
+ const next = current.text.replace(pattern, () => {
64
+ replaced += 1;
65
+ return `[REDACTED:${kind}]`;
66
+ });
67
+ return { text: next, count: current.count + replaced };
68
+ }, { text, count: 0 });
69
+ }
70
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,aAAa;IACb,mBAAmB;IACnB,KAAK;IACL,SAAS;IACT,cAAc;IACd,OAAO;IACP,OAAO;CACE,CAAC;AAKX,MAAM,gBAAgB,GAAG;IACxB,0CAA0C;IAC1C,uBAAuB;IACvB,uBAAuB;IACvB,4BAA4B;IAC5B,8BAA8B;IAC9B,2BAA2B;IAC3B,sFAAsF;IACtF,gGAAgG;CAChG,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACxD;QACC,IAAI,EAAE,aAAa;QACnB,OAAO,EACN,gGAAgG;KACjG;IACD;QACC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EACN,uEAAuE;KACxE;IACD;QACC,IAAI,EAAE,KAAK;QACX,OAAO,EACN,+EAA+E;KAChF;IACD;QACC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI,MAAM,CAClB,sBAAsB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EACnD,GAAG,CACH;KACD;IACD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,sCAAsC,EAAE;IACzE;QACC,IAAI,EAAE,OAAO;QACb,OAAO,EACN,sEAAsE;KACvE;IACD;QACC,IAAI,EAAE,OAAO;QACb,OAAO,EACN,4EAA4E;KAC7E;CACD,CAAC;AASF,sDAAsD;AACtD,MAAM,UAAU,UAAU,CACzB,IAAY,EACZ,OAAO,GAAkB,EAAE;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;QAC9B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC;QACxD,CAAC,CAAC,eAAe,CAAC;IACnB,OAAO,KAAK,CAAC,MAAM,CAClB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE;YAC/C,QAAQ,IAAI,CAAC,CAAC;YACd,OAAO,aAAa,IAAI,GAAG,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;IACxD,CAAC,EACD,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function normalizeRepository(remoteUrl: string): string | undefined;
@@ -0,0 +1,46 @@
1
+ // semantic-conventions.md「repositoryの正規化」。<host>/<owner>/<name>の3 segmentにならないremote
2
+ // (local path、`file://`、GitLabのsubgroupなど)はundefinedを返す。
3
+ const SCHEME_URL = /^[a-z][a-z0-9+.-]*:\/\//i;
4
+ // scp形式([user@]host:path)。"host://"は上のURLとして扱う。
5
+ const SCP_LIKE = /^(?:[^@/\s]+@)?([^:/\s]+):(?!\/)(.+)$/;
6
+ const HOST = /^[a-z0-9.-]+$/;
7
+ const SEGMENT = /^[A-Za-z0-9_.-]+$/;
8
+ function splitRemote(remote) {
9
+ if (SCHEME_URL.test(remote)) {
10
+ // URL.canParseはNode.js 18.17以降にしか無く、Node.js 18のhookからも使うためtry/catchで判定する。
11
+ let url;
12
+ try {
13
+ url = new URL(remote);
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ return url.protocol === "file:"
19
+ ? undefined
20
+ : { host: url.hostname, path: url.pathname };
21
+ }
22
+ const scp = SCP_LIKE.exec(remote);
23
+ return scp?.[1] && scp[2] ? { host: scp[1], path: scp[2] } : undefined;
24
+ }
25
+ export function normalizeRepository(remoteUrl) {
26
+ const location = splitRemote(remoteUrl.trim());
27
+ if (!location)
28
+ return undefined;
29
+ const lowerHost = location.host.toLowerCase();
30
+ const host = lowerHost === "ssh.github.com" ? "github.com" : lowerHost;
31
+ const segments = location.path
32
+ .replace(/\/+$/, "")
33
+ .replace(/\.git$/, "")
34
+ .replace(/^\/+/, "")
35
+ .split("/");
36
+ if (segments.length !== 2 ||
37
+ !HOST.test(host) ||
38
+ !segments.every((segment) => SEGMENT.test(segment)))
39
+ return undefined;
40
+ // GitHubはownerとnameの大文字と小文字を区別しない。
41
+ const [owner, name] = host === "github.com"
42
+ ? segments.map((segment) => segment.toLowerCase())
43
+ : segments;
44
+ return `${host}/${owner}/${name}`;
45
+ }
46
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,yDAAyD;AACzD,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC9C,gDAAgD;AAChD,MAAM,QAAQ,GAAG,uCAAuC,CAAC;AACzD,MAAM,IAAI,GAAG,eAAe,CAAC;AAC7B,MAAM,OAAO,GAAG,mBAAmB,CAAC;AAEpC,SAAS,WAAW,CACnB,MAAc;IAEd,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,0EAA0E;QAC1E,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACJ,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO;YAC9B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,SAAS,KAAK,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI;SAC5B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,KAAK,CAAC,GAAG,CAAC,CAAC;IACb,IACC,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnD,OAAO,SAAS,CAAC;IAClB,mCAAmC;IACnC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAClB,IAAI,KAAK,YAAY;QACpB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAClD,CAAC,CAAC,QAAQ,CAAC;IACb,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type Static, type TSchema } from "@sinclair/typebox";
2
+ export declare const INTERVENTION_KINDS: readonly ["approval", "continue", "ci_relay", "review_relay", "answer", "other"];
3
+ export declare const LOOP_KINDS: readonly ["issue_to_pr", "ci_fix", "review_response", "test_fix", "lint_fix", "dependency_update"];
4
+ export declare const PROPOSAL_KINDS: readonly ["permissions", "hook", "skill", "rule", "agent", "command", "loop_prompt", "mcp_config", "claude_md"];
5
+ export declare const MEASUREMENTS: readonly ["measured", "not_measured"];
6
+ export declare const AnalysisReportSchema: import("@sinclair/typebox").TObject<{
7
+ agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
8
+ session_id: import("@sinclair/typebox").TString;
9
+ first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ started_at: import("@sinclair/typebox").TString;
11
+ analyzer_version: import("@sinclair/typebox").TString;
12
+ parser_version: import("@sinclair/typebox").TString;
13
+ interventions: import("@sinclair/typebox").TObject<Record<"answer" | "approval" | "ci_relay" | "continue" | "other" | "review_relay", TSchema>>;
14
+ loops: import("@sinclair/typebox").TObject<Record<"ci_fix" | "dependency_update" | "issue_to_pr" | "lint_fix" | "review_response" | "test_fix", TSchema>>;
15
+ mcp_servers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
16
+ server: import("@sinclair/typebox").TString;
17
+ configured: import("@sinclair/typebox").TBoolean;
18
+ measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
19
+ calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
20
+ failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
21
+ failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
22
+ }>, import("@sinclair/typebox").TObject<{
23
+ server: import("@sinclair/typebox").TString;
24
+ configured: import("@sinclair/typebox").TBoolean;
25
+ measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
26
+ calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
27
+ failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
28
+ failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
29
+ }>, import("@sinclair/typebox").TObject<{
30
+ server: import("@sinclair/typebox").TString;
31
+ configured: import("@sinclair/typebox").TBoolean;
32
+ measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
33
+ calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
34
+ failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
35
+ failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
36
+ }>, import("@sinclair/typebox").TObject<{
37
+ server: import("@sinclair/typebox").TString;
38
+ configured: import("@sinclair/typebox").TBoolean;
39
+ measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
40
+ calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
41
+ failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
42
+ failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
43
+ }>]>>;
44
+ proposals: import("@sinclair/typebox").TObject<Record<"agent" | "claude_md" | "command" | "hook" | "loop_prompt" | "mcp_config" | "permissions" | "rule" | "skill", TSchema>>;
45
+ records_skipped: import("@sinclair/typebox").TInteger;
46
+ }>;
47
+ export type AnalysisReport = Static<typeof AnalysisReportSchema>;
@@ -0,0 +1,87 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { Agent, Count, closed, Instant, SemVer, schemaId, Token, } from "./common.js";
3
+ export const INTERVENTION_KINDS = [
4
+ "approval",
5
+ "continue",
6
+ "ci_relay",
7
+ "review_relay",
8
+ "answer",
9
+ "other",
10
+ ];
11
+ export const LOOP_KINDS = [
12
+ "issue_to_pr",
13
+ "ci_fix",
14
+ "review_response",
15
+ "test_fix",
16
+ "lint_fix",
17
+ "dependency_update",
18
+ ];
19
+ export const PROPOSAL_KINDS = [
20
+ "permissions",
21
+ "hook",
22
+ "skill",
23
+ "rule",
24
+ "agent",
25
+ "command",
26
+ "loop_prompt",
27
+ "mcp_config",
28
+ "claude_md",
29
+ ];
30
+ export const MEASUREMENTS = ["measured", "not_measured"];
31
+ const Seconds = Type.Number({ minimum: 0 });
32
+ // semantic-conventions.md「Analysis report」: measuredでは、中央値の元になる件数が0なら中央値はnull、1以上なら数値。
33
+ // not_measuredでは全項目をnullにし、0と区別する。
34
+ const measuredOrNot = (counted, median, others = {}) => {
35
+ const measured = (count, value) => Type.Object({
36
+ measurement: Type.Literal("measured"),
37
+ [counted]: count,
38
+ ...others,
39
+ [median]: value,
40
+ }, closed);
41
+ return Type.Union([
42
+ measured(Type.Literal(0), Type.Null()),
43
+ measured(Type.Integer({ minimum: 1 }), Seconds),
44
+ Type.Object({
45
+ measurement: Type.Literal("not_measured"),
46
+ ...Object.fromEntries([counted, ...Object.keys(others), median].map((k) => [
47
+ k,
48
+ Type.Null(),
49
+ ])),
50
+ }, closed),
51
+ ]);
52
+ };
53
+ const byKind = (kinds, value) => Type.Object(Object.fromEntries(kinds.map((k) => [k, value])), closed);
54
+ const Intervention = measuredOrNot("count", "wait_seconds_median");
55
+ const Loop = measuredOrNot("occurrences", "duration_seconds_median", {
56
+ interventions: Count,
57
+ });
58
+ const mcpVariant = (callsMeasured, failuresMeasured) => Type.Object({
59
+ server: Token(),
60
+ configured: Type.Boolean(),
61
+ measurement: Type.Literal(callsMeasured ? "measured" : "not_measured"),
62
+ calls: callsMeasured ? Count : Type.Null(),
63
+ failures_measurement: Type.Literal(failuresMeasured ? "measured" : "not_measured"),
64
+ failures: failuresMeasured ? Count : Type.Null(),
65
+ }, closed);
66
+ const McpServer = Type.Union([
67
+ mcpVariant(true, true),
68
+ mcpVariant(true, false),
69
+ mcpVariant(false, true),
70
+ mcpVariant(false, false),
71
+ ]);
72
+ const ProposalCount = Type.Object({ shown: Count, applied_detected: Count }, closed);
73
+ export const AnalysisReportSchema = Type.Object({
74
+ agent: Agent,
75
+ session_id: Token(),
76
+ // 記録から取れなければ省略(session registrationのfirst_prompt_idと同じ意味)。
77
+ first_prompt_id: Type.Optional(Token()),
78
+ started_at: Instant,
79
+ analyzer_version: SemVer,
80
+ parser_version: SemVer,
81
+ interventions: byKind(INTERVENTION_KINDS, Intervention),
82
+ loops: byKind(LOOP_KINDS, Loop),
83
+ mcp_servers: Type.Array(McpServer),
84
+ proposals: byKind(PROPOSAL_KINDS, ProposalCount),
85
+ records_skipped: Count,
86
+ }, { $id: schemaId("analysis-report"), ...closed });
87
+ //# sourceMappingURL=analysis-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis-report.js","sourceRoot":"","sources":["../../src/schemas/analysis-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,GACL,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,UAAU;IACV,UAAU;IACV,UAAU;IACV,cAAc;IACd,QAAQ;IACR,OAAO;CACE,CAAC;AACX,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,aAAa;IACb,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,UAAU;IACV,mBAAmB;CACV,CAAC;AACX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,aAAa;IACb,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,aAAa;IACb,YAAY;IACZ,WAAW;CACF,CAAC;AACX,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,cAAc,CAAU,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAE5C,uFAAuF;AACvF,mCAAmC;AACnC,MAAM,aAAa,GAAG,CACrB,OAAe,EACf,MAAc,EACd,MAAM,GAA4B,EAAE,EACnC,EAAE;IACH,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,KAAc,EAAE,EAAE,CACnD,IAAI,CAAC,MAAM,CACV;QACC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACrC,CAAC,OAAO,CAAC,EAAE,KAAK;QAChB,GAAG,MAAM;QACT,CAAC,MAAM,CAAC,EAAE,KAAK;KACf,EACD,MAAM,CACN,CAAC;IACH,OAAO,IAAI,CAAC,KAAK,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;QAC/C,IAAI,CAAC,MAAM,CACV;YACC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;YACzC,GAAG,MAAM,CAAC,WAAW,CACpB,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACpD,CAAC;gBACD,IAAI,CAAC,IAAI,EAAE;aACX,CAAC,CACF;SACD,EACD,MAAM,CACN;KACD,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAA8B,KAAQ,EAAE,KAAc,EAAE,EAAE,CACxE,IAAI,CAAC,MAAM,CACV,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAG9C,EACD,MAAM,CACN,CAAC;AAEH,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;AACnE,MAAM,IAAI,GAAG,aAAa,CAAC,aAAa,EAAE,yBAAyB,EAAE;IACpE,aAAa,EAAE,KAAK;CACpB,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,aAAsB,EAAE,gBAAyB,EAAE,EAAE,CACxE,IAAI,CAAC,MAAM,CACV;IACC,MAAM,EAAE,KAAK,EAAE;IACf,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE;IAC1B,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;IACtE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;IAC1C,oBAAoB,EAAE,IAAI,CAAC,OAAO,CACjC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAC9C;IACD,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;CAChD,EACD,MAAM,CACN,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5B,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;IACvB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;IACvB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;CACxB,CAAC,CAAC;AACH,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAChC,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,EACzC,MAAM,CACN,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAC9C;IACC,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,KAAK,EAAE;IACnB,2DAA2D;IAC3D,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvC,UAAU,EAAE,OAAO;IACnB,gBAAgB,EAAE,MAAM;IACxB,cAAc,EAAE,MAAM;IACtB,aAAa,EAAE,MAAM,CAAC,kBAAkB,EAAE,YAAY,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC;IAC/B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC;IAChD,eAAe,EAAE,KAAK;CACtB,EACD,EAAE,GAAG,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,GAAG,MAAM,EAAE,CAC/C,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const SEMCONV_MAJOR = 0;
2
+ export declare const schemaId: (name: string) => string;
3
+ export declare const Instant: import("@sinclair/typebox").TString;
4
+ export declare const CalendarDate: import("@sinclair/typebox").TString;
5
+ export declare const Sha256Hex: import("@sinclair/typebox").TString;
6
+ export declare const CommitSha: import("@sinclair/typebox").TString;
7
+ export declare const RepositorySlug: import("@sinclair/typebox").TString;
8
+ export declare const SemVer: import("@sinclair/typebox").TString;
9
+ export declare const Token: (maxLength?: number) => import("@sinclair/typebox").TString;
10
+ export declare const Count: import("@sinclair/typebox").TInteger;
11
+ export declare const Agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
12
+ export declare const closed: {
13
+ readonly additionalProperties: false;
14
+ };
@@ -0,0 +1,33 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { INSTANT_PATTERN, TOKEN_PATTERN } from "../values.js";
3
+ // 互換性の単位はmajor(semantic-conventions.md「互換性」)。$idにはmajorだけを含める。
4
+ export const SEMCONV_MAJOR = 0;
5
+ export const schemaId = (name) => `urn:harnessforce:semconv:${SEMCONV_MAJOR}:${name}`;
6
+ export const Instant = Type.String({
7
+ format: "date-time",
8
+ pattern: INSTANT_PATTERN,
9
+ });
10
+ export const CalendarDate = Type.String({
11
+ format: "date",
12
+ pattern: "^\\d{4}-\\d{2}-\\d{2}$",
13
+ });
14
+ export const Sha256Hex = Type.String({ pattern: "^[0-9a-f]{64}$" });
15
+ export const CommitSha = Type.String({
16
+ pattern: "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
17
+ });
18
+ // <host>/<owner>/<name>(semantic-conventions.md「repositoryの正規化」)。owner/nameだけの2segmentは拒否する。
19
+ export const RepositorySlug = Type.String({
20
+ pattern: "^[a-z0-9.-]+/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$",
21
+ });
22
+ export const SemVer = Type.String({
23
+ pattern: "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$",
24
+ });
25
+ // minLengthとmaxLengthは、JSON Schemaの定義どおりcode pointで数える。
26
+ export const Token = (maxLength = 256) => Type.String({ minLength: 1, maxLength, pattern: TOKEN_PATTERN });
27
+ export const Count = Type.Integer({ minimum: 0 });
28
+ export const Agent = Type.Union([
29
+ Type.Literal("claude_code"),
30
+ Type.Literal("codex"),
31
+ ]);
32
+ export const closed = { additionalProperties: false };
33
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9D,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CACxC,4BAA4B,aAAa,IAAI,IAAI,EAAE,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,eAAe;CACxB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,wBAAwB;CACjC,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,iCAAiC;CAC1C,CAAC,CAAC;AACH,6FAA6F;AAC7F,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,+CAA+C;CACxD,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,0CAA0C;CACnD,CAAC,CAAC;AACH,wDAAwD;AACxD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CACxC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;CACrB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAW,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ export declare const COMPONENT_KINDS: readonly ["skill", "rule", "agent", "command", "hook", "permissions", "mcp_server", "model", "workflow"];
3
+ export declare const CONFIG_SOURCES: readonly ["managed", "user", "repository", "local", "plugin"];
4
+ export declare const ConfigSnapshotSchema: import("@sinclair/typebox").TObject<{
5
+ agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
6
+ session_id: import("@sinclair/typebox").TString;
7
+ components: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
8
+ kind: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"agent" | "command" | "hook" | "mcp_server" | "model" | "permissions" | "rule" | "skill" | "workflow">[]>;
9
+ id: import("@sinclair/typebox").TString;
10
+ version: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
11
+ hash: import("@sinclair/typebox").TString;
12
+ source: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"local" | "managed" | "plugin" | "repository" | "user">[]>;
13
+ }>>;
14
+ }>;
15
+ export type ConfigSnapshot = Static<typeof ConfigSnapshotSchema>;
@@ -0,0 +1,36 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { Agent, closed, Sha256Hex, schemaId, Token } from "./common.js";
3
+ export const COMPONENT_KINDS = [
4
+ "skill",
5
+ "rule",
6
+ "agent",
7
+ "command",
8
+ "hook",
9
+ "permissions",
10
+ "mcp_server",
11
+ "model",
12
+ "workflow",
13
+ ];
14
+ // Claude Codeのsettingsのscopeに対応する収集元(managed/user/repository/local)とplugin。
15
+ export const CONFIG_SOURCES = [
16
+ "managed",
17
+ "user",
18
+ "repository",
19
+ "local",
20
+ "plugin",
21
+ ];
22
+ const Component = Type.Object({
23
+ kind: Type.Union(COMPONENT_KINDS.map((k) => Type.Literal(k))),
24
+ id: Token(),
25
+ // permissionsやmodelはversionを持たないため任意とする。
26
+ version: Type.Optional(Token(64)),
27
+ hash: Sha256Hex,
28
+ source: Type.Union(CONFIG_SOURCES.map((s) => Type.Literal(s))),
29
+ }, closed);
30
+ export const ConfigSnapshotSchema = Type.Object({
31
+ // 構成を収集したsession。RunとConfigSnapshotはこのagent/session_idで結ぶ。
32
+ agent: Agent,
33
+ session_id: Token(),
34
+ components: Type.Array(Component, { minItems: 1 }),
35
+ }, { $id: schemaId("config-snapshot"), ...closed });
36
+ //# sourceMappingURL=config-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-snapshot.js","sourceRoot":"","sources":["../../src/schemas/config-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,aAAa;IACb,YAAY;IACZ,OAAO;IACP,UAAU;CACD,CAAC;AACX,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,SAAS;IACT,MAAM;IACN,YAAY;IACZ,OAAO;IACP,QAAQ;CACC,CAAC;AAEX,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC5B;IACC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,EAAE,EAAE,KAAK,EAAE;IACX,yCAAyC;IACzC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9D,EACD,MAAM,CACN,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAC9C;IACC,2DAA2D;IAC3D,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,KAAK,EAAE;IACnB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;CAClD,EACD,EAAE,GAAG,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,GAAG,MAAM,EAAE,CAC/C,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ export declare const STATUS_CATEGORIES: readonly ["backlog", "unstarted", "started", "done", "canceled"];
3
+ export declare const ACTIVITY_EVENT_TYPES: readonly ["issue.created", "issue.status_changed", "issue.assigned", "issue.updated", "pull_request.opened", "pull_request.merged", "pull_request.closed", "review.submitted", "commit.pushed", "ci.completed", "release.published", "run.started", "run.completed", "plan.updated", "decision.recorded", "config.changed", "evaluation.recorded"];
4
+ export declare const ENTITY_TYPES: readonly ["issue", "pull_request", "ci_run", "run", "trace", "artifact"];
5
+ export declare const IngestIssueSchema: import("@sinclair/typebox").TObject<{
6
+ external_id: import("@sinclair/typebox").TString;
7
+ project_key: import("@sinclair/typebox").TString;
8
+ identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
9
+ title: import("@sinclair/typebox").TString;
10
+ description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
11
+ status_category: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
12
+ raw_status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
+ is_blocked: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
14
+ assignee: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
+ priority: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
16
+ due_on: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
17
+ parent_external_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
+ url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
+ source_updated_at: import("@sinclair/typebox").TString;
20
+ }>;
21
+ export type IngestIssue = Static<typeof IngestIssueSchema>;
22
+ export declare const IngestEventSchema: import("@sinclair/typebox").TObject<{
23
+ event_id: import("@sinclair/typebox").TString;
24
+ event_type: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
25
+ occurred_at: import("@sinclair/typebox").TString;
26
+ actor_type: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
27
+ actor_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
28
+ entity: import("@sinclair/typebox").TObject<{
29
+ type: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
30
+ id: import("@sinclair/typebox").TString;
31
+ }>;
32
+ payload: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
33
+ correlation_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
34
+ causation_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
35
+ }>;
36
+ export type IngestEvent = Static<typeof IngestEventSchema>;
@@ -0,0 +1,73 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { EXECUTION_ACTOR_TYPES } from "../attributes.js";
3
+ import { CalendarDate, closed, Instant, schemaId, Token } from "./common.js";
4
+ const literals = (values) => Type.Union(values.map((v) => Type.Literal(v)));
5
+ export const STATUS_CATEGORIES = [
6
+ "backlog",
7
+ "unstarted",
8
+ "started",
9
+ "done",
10
+ "canceled",
11
+ ];
12
+ export const ACTIVITY_EVENT_TYPES = [
13
+ "issue.created",
14
+ "issue.status_changed",
15
+ "issue.assigned",
16
+ "issue.updated",
17
+ "pull_request.opened",
18
+ "pull_request.merged",
19
+ "pull_request.closed",
20
+ "review.submitted",
21
+ "commit.pushed",
22
+ "ci.completed",
23
+ "release.published",
24
+ "run.started",
25
+ "run.completed",
26
+ "plan.updated",
27
+ "decision.recorded",
28
+ "config.changed",
29
+ "evaluation.recorded",
30
+ ];
31
+ export const ENTITY_TYPES = [
32
+ "issue",
33
+ "pull_request",
34
+ "ci_run",
35
+ "run",
36
+ "trace",
37
+ "artifact",
38
+ ];
39
+ export const IngestIssueSchema = Type.Object({
40
+ external_id: Token(),
41
+ // 存在しないkeyの要素は拒否する(Harnessforce側でのDB検証。schemaはToken形式だけを保証する)。
42
+ project_key: Token(),
43
+ identifier: Type.Optional(Token(300)),
44
+ title: Type.String({ minLength: 1, maxLength: 1000 }),
45
+ description: Type.Optional(Type.String({ maxLength: 100_000 })),
46
+ status_category: literals(STATUS_CATEGORIES),
47
+ raw_status: Type.Optional(Type.String({ maxLength: 200 })),
48
+ is_blocked: Type.Optional(Type.Boolean()),
49
+ assignee: Type.Optional(Token()),
50
+ priority: Type.Optional(Type.String({ maxLength: 100 })),
51
+ due_on: Type.Optional(CalendarDate),
52
+ parent_external_id: Type.Optional(Token()),
53
+ // 画面にlinkとして出すため、schemeはhttpとhttpsに限る(semantic-conventions.md「Issue」)。WHATWG URLはschemeを小文字へ揃えるため大文字も許す。
54
+ url: Type.Optional(Type.String({
55
+ format: "uri",
56
+ pattern: "^[Hh][Tt][Tt][Pp][Ss]?:",
57
+ maxLength: 2048,
58
+ })),
59
+ source_updated_at: Instant,
60
+ }, { $id: schemaId("ingest-issue"), ...closed });
61
+ export const IngestEventSchema = Type.Object({
62
+ event_id: Token(),
63
+ event_type: literals(ACTIVITY_EVENT_TYPES),
64
+ occurred_at: Instant,
65
+ actor_type: literals(EXECUTION_ACTOR_TYPES),
66
+ actor_id: Type.Optional(Token()),
67
+ // idは内部IDではなく送信元でのID(sender-side)。解決はingest APIで届いたExternalRefの中だけで行う。
68
+ entity: Type.Object({ type: literals(ENTITY_TYPES), id: Token() }, closed),
69
+ payload: Type.Optional(Type.Record(Type.String(), Type.Unknown())),
70
+ correlation_id: Type.Optional(Token()),
71
+ causation_id: Type.Optional(Token()),
72
+ }, { $id: schemaId("ingest-event"), ...closed });
73
+ //# sourceMappingURL=ingest-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest-items.js","sourceRoot":"","sources":["../../src/schemas/ingest-items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ export declare const SessionImportSchema: import("@sinclair/typebox").TObject<{
3
+ agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
4
+ session_id: import("@sinclair/typebox").TString;
5
+ first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
6
+ repository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
+ branch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
+ commit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
9
+ issue_identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ started_at: import("@sinclair/typebox").TString;
11
+ source: import("@sinclair/typebox").TLiteral<"import">;
12
+ ended_at: import("@sinclair/typebox").TString;
13
+ model: import("@sinclair/typebox").TString;
14
+ input_tokens: import("@sinclair/typebox").TInteger;
15
+ output_tokens: import("@sinclair/typebox").TInteger;
16
+ tool_calls: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
17
+ tool: import("@sinclair/typebox").TString;
18
+ calls: import("@sinclair/typebox").TInteger;
19
+ failures: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
20
+ }>>;
21
+ parser_version: import("@sinclair/typebox").TString;
22
+ }>;
23
+ export type SessionImport = Static<typeof SessionImportSchema>;
@@ -0,0 +1,15 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { Count, closed, Instant, SemVer, schemaId, Token } from "./common.js";
3
+ import { registrationProperties } from "./session-registration.js";
4
+ const ToolCallSummary = Type.Object({ tool: Token(128), calls: Count, failures: Type.Optional(Count) }, closed);
5
+ export const SessionImportSchema = Type.Object({
6
+ ...registrationProperties,
7
+ source: Type.Literal("import"),
8
+ ended_at: Instant,
9
+ model: Token(128),
10
+ input_tokens: Count,
11
+ output_tokens: Count,
12
+ tool_calls: Type.Array(ToolCallSummary),
13
+ parser_version: SemVer,
14
+ }, { $id: schemaId("session-import"), ...closed });
15
+ //# sourceMappingURL=session-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-import.js","sourceRoot":"","sources":["../../src/schemas/session-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAClC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAClE,MAAM,CACN,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAC7C;IACC,GAAG,sBAAsB;IACzB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC9B,QAAQ,EAAE,OAAO;IACjB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IACjB,YAAY,EAAE,KAAK;IACnB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;IACvC,cAAc,EAAE,MAAM;CACtB,EACD,EAAE,GAAG,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,CAC9C,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ export declare const REGISTRATION_SOURCES: readonly ["hook", "cli", "mcp", "import"];
3
+ export declare const registrationProperties: {
4
+ agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
5
+ session_id: import("@sinclair/typebox").TString;
6
+ first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
+ repository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
+ branch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
9
+ commit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ issue_identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
11
+ source: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"cli" | "hook" | "import" | "mcp">[]>;
12
+ started_at: import("@sinclair/typebox").TString;
13
+ };
14
+ export declare const SessionRegistrationSchema: import("@sinclair/typebox").TObject<{
15
+ agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
16
+ session_id: import("@sinclair/typebox").TString;
17
+ first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
+ repository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
+ branch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
+ commit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
21
+ issue_identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
22
+ source: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"cli" | "hook" | "import" | "mcp">[]>;
23
+ started_at: import("@sinclair/typebox").TString;
24
+ }>;
25
+ export type SessionRegistration = Static<typeof SessionRegistrationSchema>;
@@ -0,0 +1,19 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { Agent, CommitSha, closed, Instant, RepositorySlug, schemaId, Token, } from "./common.js";
3
+ export const REGISTRATION_SOURCES = ["hook", "cli", "mcp", "import"];
4
+ export const registrationProperties = {
5
+ agent: Agent,
6
+ session_id: Token(),
7
+ first_prompt_id: Type.Optional(Token()),
8
+ repository: Type.Optional(RepositorySlug),
9
+ branch: Type.Optional(Token()),
10
+ commit: Type.Optional(CommitSha),
11
+ issue_identifier: Type.Optional(Token(300)),
12
+ source: Type.Union(REGISTRATION_SOURCES.map((s) => Type.Literal(s))),
13
+ started_at: Instant,
14
+ };
15
+ export const SessionRegistrationSchema = Type.Object(registrationProperties, {
16
+ $id: schemaId("session-registration"),
17
+ ...closed,
18
+ });
19
+ //# sourceMappingURL=session-registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registration.js","sourceRoot":"","sources":["../../src/schemas/session-registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACN,KAAK,EACL,SAAS,EACT,MAAM,EACN,OAAO,EACP,cAAc,EACd,QAAQ,EACR,KAAK,GACL,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,KAAK,EAAE;IACnB,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;IAChC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,UAAU,EAAE,OAAO;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;IAC5E,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC;IACrC,GAAG,MAAM;CACT,CAAC,CAAC"}